火柴人联盟内购自检测破解经验分享
本帖最后由 jokers 于 2015-12-16 19:41 编辑在论坛里潜伏了很久,第一次发帖,内容比较简单,希望可以跟大家一起交流讨论,也希望有大神看看有什么可以改善的地方,指点一二。
0x0
工具:androidkiller
样本:火柴人联盟V1.4.1
0x1
首先,将样本拖入androidkiller中,看一下样本的大概结构。然后运行样本,用androidkiller看运行时的log信息,如果软件的开发者有留下什么关键信息的话可以帮助我们更快破解软件。因为我们现在主要是破解软件的内购,所以我们先看看购买东西时有什么log信息
游戏进行消费时的界面:
取消支付:
取消支付时的log信息:
最主要的应该就是这几行了,尤其是test rechager failure 这一行
在代码中搜索rechager failure这个这个字符串,可以搜到两个结果,
根据搜到的结果看过去,可以看到这样的代码
有个if-ne p1, v0, :cond_0这样的判断语句,即p1与v0不相等则跳转到cond_0,看看cond_0
其中\u8ba1\u8d39\u5931\u8d25\u3002\u3002转化为文本就是 计费失败。。也就是说只要不跳转到cond_0就行了,所以将上面的if-ne p1, v0, :cond_0这一行语句去掉就行了。重打包安装运行试试
0x2
ok,可以购买成功了,第一个目标完成了,但是这个软件有检验是否被篡改过的功能,所以在不断网的情况下打开会弹出下面的窗口
这个问题也不难解决,弹出的窗口有两个按钮,确定和退出,在代码中搜索“确定”这个字符串的unicode,可以得到两个结果
都在popKuangInfo这个方法里面,并且这个方法中还有“有侵权”这个字符串,所以基本可以确定是通过调用这个方法检测的,
原本的代码是
invoke-virtual {v3}, Landroid/app/Activity;->isFinishing()Z
move-result v3
if-nez v3, :cond_0
就是用isFinishing()Z函数检测样本是否完整,若完整则返回1,若不完整则返回0,将返回值赋给v3,判断v3是否等于0,若不等于0则跳转到cond_0,然后退出函数,所以这里只要将if-nez v3, :cond_0改成goto :cond_0,无论返回值是什么都跳转到cond_0退出函数就可以了。
所以第二步完成了,最后一步,让程序消费时不弹出支付弹窗直接完成支付
0x3
这个软件是用easymobi进行支付的,进行支付时需要先初始化EMPayManager才行,我们可以从这里下手,我们可以看到有这样一个类Lcn/easymobi/android/pay/common/EMPayManager;里面有这些方法
其中initMerge(Landroid/content/Context;II)V是判断用户手机运营商并选择支付方式的,也就是在弹出支付窗口时会先调用这个方法,只要阻止这个方法被调用就可以完成目标,
一共有两个地方调用了这个方法,第一个是注释语句可以无视,直接跳到第二处
发现有这样一行
invoke-static {p0, v3, v4}, Lcn/easymobi/android/pay/common/EMPayManager;->initMerge(Landroid/content/Context;II)V
把这一行去掉就可以了,去掉这一行后会造成选择支付方式失败而无法完成支付,但是由于我们第一步里已经修改了逻辑,所以无论支付的结果怎么样都会跳到支付成功。
第一次发帖,很多地方表达得不是很好,也有很多地方可能有更好的方法去改动,希望大家可以一起讨论。
最后附上样本与完成品
链接: http://pan.baidu.com/s/1eRnageQ 密码: ycmc
这里再附上修改了图标,加载界面,加了有米广告的版本,在点击购买物品时就会弹出广告,对有兴趣的童鞋可以拆包看看,
链接: http://pan.baidu.com/s/1dEd8MA1 密码: t5ph
fa00x 发表于 2016-1-4 13:47
大神,支持继续更新一下版本
大神不敢当,我也想继续弄,只是现在年底了,工作太忙了没时间,有时间再填坑。 13929861564 发表于 2016-1-8 14:25
已经失效了 吗?直接crash掉了
不是失效,之前也有几位朋友反馈说会崩溃,可能跟手机系统或者SIM卡运营商有关,但是我自己用几个手机试玩时没发现,没办法查看crash时的错误信息,所以比较难修复。 我爱沙发皮肤好好啦啦啦啦 啊哈哈!好东西!感谢分享 膜拜,学到了,火柴人一直都不会,谢谢大神啊 厉害啊,膜拜大神啊!!! 用模拟器去试试看 感谢分享 一买东西就闪退 支持点赞,收藏拿走!!