zoukankan      html  css  js  c++  java
  • [Android] 拳皇97 for Android 破解分析

    声明:本文章仅做技术研究,请勿用于非法用途。

    这个游戏在Android上闲着无聊的时候玩玩还是不错的,只是有很多限制,都是需要购买游戏币才能玩。所以接下来就来破解之。
    用到的工具:APKTOOL、Notepad++、JD-GUI。

    程序首次登陆时会赠送2枚游戏币,完了就得买游戏币才能玩,另外开启各种模式的时候也需要大量的游戏币,因此破解的关键是破解程序的游戏币值。
    图一.png

    图二.png

    1、用APKTOOL反编译apk。

    2、注意到程序画面的右上角,会显示:“游戏币:2”,按图索骥,搜索关键字”游戏币:“,在strings.xml中:
    图三.jpg

    3、再次搜索对应的字符串"coin_num",在public.xml中:
    图四.jpg

    4、下面查找在smali文件中哪里调用了字符串”游戏币:”,搜索0x7f080008,在如下地方找到:
    图五.jpg

    5、在smalicomiavagamemenuCoinActivity.smali中:

    [Java] 纯文本查看 复制代码
    吾爱破解论坛[LCG][LSG] http://www.52pojie.cn
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    .method private a()V
        .locals 4
     
        const v0, 0x7f06001b
     
        invoke-virtual {p0, v0}, Lcom/iava/game/menu/CoinActivity;->findViewById(I)Landroid/view/View;
     
        move-result-object v0
     
        check-cast v0, Landroid/widget/TextView;
     
        iput-object v0, p0, Lcom/iava/game/menu/CoinActivity;->a:Landroid/widget/TextView;
     
        iget-object v0, p0, Lcom/iava/game/menu/CoinActivity;->a:Landroid/widget/TextView;
     
        if-eqz v0, :cond_0
     
        sget-object v0, Lcom/iava/game/a;->y:Lcom/iava/game/data/CoinManage;
     
        invoke-virtual {v0}, Lcom/iava/game/data/CoinManage;->f()I
     
        move-result v0
     
        if-gtz v0, :cond_1
     
        iget-object v0, p0, Lcom/iava/game/menu/CoinActivity;->a:Landroid/widget/TextView;
     
        const/4 v1, 0x4
     
        invoke-virtual {v0, v1}, Landroid/widget/TextView;->setVisibility(I)V
     
        :cond_0
        :goto_0
        return-void
     
        :cond_1
        iget-object v0, p0, Lcom/iava/game/menu/CoinActivity;->a:Landroid/widget/TextView;
     
        const/4 v1, 0x0
     
        invoke-virtual {v0, v1}, Landroid/widget/TextView;->setVisibility(I)V
     
        iget-object v1, p0, Lcom/iava/game/menu/CoinActivity;->a:Landroid/widget/TextView;
     
        new-instance v2, Ljava/lang/StringBuilder;
     
        invoke-virtual {p0}, Lcom/iava/game/menu/CoinActivity;->getResources()Landroid/content/res/Resources;
     
        move-result-object v0
     
        const v3, 0x7f080008
     
            //“游戏币:”
        invoke-virtual {v0, v3}, Landroid/content/res/Resources;->getText(I)Ljava/lang/CharSequence;
     
        move-result-object v0
     
        check-cast v0, Ljava/lang/String;
     
        invoke-static {v0}, Ljava/lang/String;->valueOf(Ljava/lang/Object;)Ljava/lang/String;
     
        move-result-object v0
     
        invoke-direct {v2, v0}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V
     
        sget-object v0, Lcom/iava/game/a;->y:Lcom/iava/game/data/CoinManage;
     
            //获取游戏币的值
        invoke-virtual {v0}, Lcom/iava/game/data/CoinManage;->f()I
     
        move-result v0
     
        invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;
     
        move-result-object v0
     
        invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
     
        move-result-object v0
     
        invoke-virtual {v1, v0}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V
     
        goto :goto_0
    .end method



    6、smali文件不适合阅读,用jd-GUI来读取相关代码:
    图六.jpg

    7、显而易见,com.iava.game.a.y.f()是获取游戏币值的方法,来到com.iava.game.a类,也即com.iava.game.data.CoinManage类
    图七.jpg

    8、查看f()方法的具体实现:
    图八.jpg

    9、可见,f()的返回值由h()来决定,再看h()方法的具体实现:
    图九.jpg

    10、返回值就是游戏币的值,那么只要我们强制让这个返回值为一个固定的大的值比方8888,那么游戏币就永远都是8888,也就达到了破解的目的了。

    11、下面对应到相应的smali文件中修改,在smalicomiavagamedataCoinManage.smali文件中:

    [Java] 纯文本查看 复制代码
    吾爱破解论坛[LCG][LSG] http://www.52pojie.cn
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    .method private h()I
        .locals 2
     
        sget-object v0, Lcom/iava/game/a;->x:Lcom/iava/game/data/a;
     
        invoke-virtual {v0}, Lcom/iava/game/data/a;->al()V
     
        invoke-virtual {p0}, Lcom/iava/game/data/CoinManage;->a()I
     
        move-result v0
     
        const v1, -0x55555556
     
        xor-int/2addr v0, v1
     
            //强制返回8888(0x22B8)
            const v0,0x22B8
        return v0
    .end method


    12、保存修改,重建APK,签名,测试之,破解完成。
    图十.png

    图十一.png

    附破解后的APK:
    http://pan.baidu.com/share/link?shareid=4202997888&uk=604460222

  • 相关阅读:
    flex>导航
    flex>图表控件
    Struts2>Cannot find the tag library descriptor for /strutstags
    jsp>Smartupload例子代码
    flex>MXML语法
    解决JBoss只能通过localhost(127.0.0.1)而不能通过IP访问
    jsp>tomcat配置虚拟目录
    JSF>概述
    Struts2>中文乱码
    flex>HttpService
  • 原文地址:https://www.cnblogs.com/develop/p/3556101.html
Copyright © 2011-2022 走看看