首页 > 技术文章 > [Android] 拳皇97 for Android 破解分析

develop 2014-02-19 16:10 原文

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

这个游戏在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、在smali\com\iava\game\menu\CoinActivity.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文件中修改,在\smali\com\iava\game\data\CoinManage.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

推荐阅读