[Android] 拳皇97 for Android 破解分析
声明:本文章仅做技术研究,请勿用于非法用途。
这个游戏在Android上闲着无聊的时候玩玩还是不错的,只是有很多限制,都是需要购买游戏币才能玩。所以接下来就来破解之。
用到的工具:APKTOOL、Notepad++、JD-GUI。
程序首次登陆时会赠送2枚游戏币,完了就得买游戏币才能玩,另外开启各种模式的时候也需要大量的游戏币,因此破解的关键是破解程序的游戏币值。
1、用APKTOOL反编译apk。
2、注意到程序画面的右上角,会显示:“游戏币:2”,按图索骥,搜索关键字”游戏币:“,在strings.xml中:
3、再次搜索对应的字符串"coin_num",在public.xml中:
4、下面查找在smali文件中哪里调用了字符串”游戏币:”,搜索0x7f080008,在如下地方找到:
5、在smali\com\iava\game\menu\CoinActivity.smali中:
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来读取相关代码:
7、显而易见,com.iava.game.a.y.f()是获取游戏币值的方法,来到com.iava.game.a类,也即com.iava.game.data.CoinManage类
8、查看f()方法的具体实现:
9、可见,f()的返回值由h()来决定,再看h()方法的具体实现:
10、返回值就是游戏币的值,那么只要我们强制让这个返回值为一个固定的大的值比方8888,那么游戏币就永远都是8888,也就达到了破解的目的了。
11、下面对应到相应的smali文件中修改,在\smali\com\iava\game\data\CoinManage.smali文件中:
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,签名,测试之,破解完成。
附破解后的APK:
http://pan.baidu.com/share/link?shareid=4202997888&uk=604460222