本帖最后由 小试锋芒 于 2013-8-19 10:42 编辑
声明:本文章仅做技术研究,请勿用于非法用途。
这个游戏在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中:
[Java] 纯文本查看 复制代码 .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文件中:
[Java] 纯文本查看 复制代码 .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
|