wxpayer 发表于 2018-12-23 19:53

带大家学习一波骚操作之让游戏自己告诉我们修改哪(InjectLog工具使用&小白必学)

本帖最后由 wxpayer 于 2018-12-23 20:01 编辑

1.      InjectLog工具介绍(介绍部分直接抄大哥的了,懒~)这个工具是charlessimonyi大神在一篇博文中设计的。原文:https://blog.csdn.net/charlessimonyi/article/details/52027563这里使用的吾爱大哥优化的工具原贴地址:https://www.52pojie.cn/thread-743758-1-1.html组成以及运行包括InjectLog.smali、smalihook.py和InjectLog.bat,一共3个文件。其中InjectLog.smali是需要放到逆向工程里的smali文件,smalihook.py负责在所有smali文件中插入调用,InjectLog.bat是实现一键操作的批处理。使用时,上述3个文件放到andriodkiller根目录,InjectLog.bat可添加为andriodkiller自定义工具。电脑中安装python3.0以上版本,并设置环境变量。优缺点。这个工具属于LOG分析方法。作用简单说就是把JAVA层运行过的所有方法名(包括包名类名),按照运行先后顺序在LOG中输出出来。它可以做到:把所有执行过的方法打印出来,所有没打印出来的方法,我们能确定它没执行过!所以,这个工具虽然是静态方法,但一定程度上可以达到动态分析的效果,特别是对分析app运作流程(如内购)有奇效。已知和需要注意的问题,A.如果app对系统LOG做过手脚关闭输出的话,需要想办法解开B.极少数的方法名在LOG中打印不出来C.这个工具是JAVA层的,只对smali起作用D.方法名高度混淆的不好使E.多dex的还不支持,不是injectlog不能用于多dex,而是我不会写多dex的批处理,有懂的可以自己优化一下(大哥原话,借用一下)。2.      破解样本(割绳子:魔法)选择这个游戏的原因,这个游戏无论ZFB还是WX购买,支付失败也能看到一些弹窗,还有一些提示,在安装包里也能找到定义的地方,但是dex里完全找不到调用方法,猜测可能在so里调用或者以其他方式加密了,不管是哪种方式都不容易下手,实践证明还是打log比较容易。工具安装步骤
在Androidkiller工具栏点击自定义

空白区域鼠标右键点击添加,将工具名称和路径填好就可以了


接下来进入主题使用工具打好log后,回编译会失败,但是classses.dex是可以编译成功的,用360压缩打开安装包替换即可,最后重新签名。进入游戏购买看一下,点击取消,使用ddms查看log输出我们看下log日志信息

这里就截取一部分图片了,其他的都是一样的,发现一直都是输出这几句日志,我们进入smali查看没有发现相关内购代码,找到对应方法删除invoke-static{},Lcom/hook/testsmali/InjectLog;->PrintFunc()V这行代码


回编译重新测试,还是有这样的方法,同样把log打印方法删掉。这里不进行赘述,自行测试,经过好几次修改,运行程序。

12-22 20:38:34.517: D/InjectLog(26606): com.mygamez.billing.ChinaBillingPayCallback$1.onResult(ChinaBillingPayCallback.java)12-22 20:38:34.517: D/InjectLog(26606):com.mygamez.billing.BillingResult.<init>(BillingResult.java)12-22 20:38:34.517: D/InjectLog(26606):com.mygamez.billing.BillingResult.setResultCode(BillingResult.java)12-22 20:38:34.518: D/InjectLog(26606):com.mygamez.billing.BillingResult.setBillingIndex(BillingResult.java)12-22 20:38:34.520: D/InjectLog(26606):com.mygamez.billing.BillingResult.setOrderId(BillingResult.java)12-22 20:38:34.521: D/InjectLog(26606):com.mygamez.billing.BillingResult.setReturningObject(BillingResult.java)12-22 20:38:34.521: D/InjectLog(26606):com.mygamez.billing.BillingResult.setCode(BillingResult.java)12-22 20:38:34.521: D/InjectLog(26606):com.mygamez.common.Log.i(Log.java)12-22 20:38:34.521: D/InjectLog(26606):com.mygamez.billing.BillingResult.toJSON(BillingResult.java)12-22 20:38:34.521: D/InjectLog(26606):com.mygamez.common.Log.i(Log.java)12-22 20:38:34.522: D/InjectLog(26606):com.mygamez.billing.AbstractChinaBillingPayCallback.launchResultReceived(AbstractChinaBillingPayCallback.java)12-22 20:38:34.522: D/InjectLog(26606):com.mygamez.billing.BillingResult.getResultCode(BillingResult.java)12-22 20:38:34.522: D/InjectLog(26606):com.mygamez.common.Settings.getReceiptApiUpdateJSON(Settings.java)12-22 20:38:34.522: D/InjectLog(26606):com.mygamez.billing.BillingResult.getResultCode(BillingResult.java)12-22 20:38:34.523: D/InjectLog(26606): com.mygamez.billing.BillingResult.getOrderId(BillingResult.java)12-22 20:38:34.523: D/InjectLog(26606):com.google.gson.GsonBuilder.<init>(GsonBuilder.java)12-22 20:38:34.523: D/InjectLog(26606):com.google.gson.GsonBuilder.create(GsonBuilder.java)12-22 20:38:34.524: D/InjectLog(26606):com.google.gson.GsonBuilder.addTypeAdaptersForDate(GsonBuilder.java)12-22 20:38:34.524: D/InjectLog(26606):com.google.gson.Gson.<init>(Gson.java)12-22 20:38:34.524: D/InjectLog(26606):com.google.gson.internal.ConstructorConstructor.<init>(ConstructorConstructor.java)12-22 20:38:34.524: D/InjectLog(26606):com.google.gson.Gson.longAdapter(Gson.java)12-22 20:38:34.525: D/InjectLog(26606):com.google.gson.internal.bind.TypeAdapters.newFactory(TypeAdapters.java)12-22 20:38:34.525: D/InjectLog(26606):com.google.gson.internal.bind.TypeAdapters$33.<init>(TypeAdapters.java)12-22 20:38:34.525: D/InjectLog(26606):com.google.gson.Gson.doubleAdapter(Gson.java)12-22 20:38:34.525: D/InjectLog(26606):com.google.gson.Gson$1.<init>(Gson.java)12-22 20:38:34.526: D/InjectLog(26606):com.google.gson.TypeAdapter.<init>(TypeAdapter.java)12-22 20:38:34.526: D/InjectLog(26606):com.google.gson.internal.bind.TypeAdapters.newFactory(TypeAdapters.java)12-22 20:38:34.526: D/InjectLog(26606):com.google.gson.internal.bind.TypeAdapters$33.<init>(TypeAdapters.java)12-22 20:38:34.526: D/InjectLog(26606):com.google.gson.Gson.floatAdapter(Gson.java)12-22 20:38:34.526: D/InjectLog(26606):com.google.gson.Gson$2.<init>(Gson.java)12-22 20:38:34.527: D/InjectLog(26606):com.google.gson.TypeAdapter.<init>(TypeAdapter.java)12-22 20:38:34.527: D/InjectLog(26606):com.google.gson.internal.bind.TypeAdapters.newFactory(TypeAdapters.java)12-22 20:38:34.527: D/InjectLog(26606):com.google.gson.internal.bind.TypeAdapters$33.<init>(TypeAdapters.java)12-22 20:38:34.527: D/InjectLog(26606):com.google.gson.Gson.atomicLongAdapter(Gson.java)12-22 20:38:34.527: D/InjectLog(26606):com.google.gson.Gson$4.<init>(Gson.java)
在上面的方法中发现这样一个方法,打开看一下com.mygamez.billing.BillingResult.getResultCode在开头看到了BILLING_RESULT_SUCCESS:I = 0x1,定义成功的返回值为1


继续查看我们的getResultCode方法,只有一句代码,返回我们的支付结果


修改很简单,也很粗暴,直接添加一句const v0,1那就无论支付结果是什么,最终都为1,也就是成功


最后保存,去除短信发送权限(该游戏没有短信支付方式,去除或者不去除都无所谓了),安装重新测试,购买成功!感谢大哥提供的工具@winding 最后给上大家工具和样本链接:链接:https://pan.baidu.com/s/1I7cGAkh217G5IM4icXeIzA
提取码:et59

wxpayer 发表于 2018-12-23 20:08

CrazyXyu 发表于 2018-12-23 20:05
我是一楼?顶一下

欢迎欢迎

CrazyXyu 发表于 2018-12-23 20:05

我是一楼?顶一下

兜兜里有糖糖 发表于 2018-12-23 20:22

惊呆!!!!表示已经惊呆了。哈哈哈,楼主是大神!学习!

faker635 发表于 2018-12-23 20:25

666666666666666666666

米老头 发表于 2018-12-23 20:40

谢谢分享支持一波。

涛之雨 发表于 2018-12-23 20:42

真的是受够了静态分析。。。。。
楼主让我又看到了希望

barrya11en 发表于 2018-12-23 20:47

哈哈,楼主是大神!学习!

zxy453326 发表于 2018-12-23 20:59

谢谢楼主分享

yangdashuo 发表于 2018-12-23 21:18


谢谢楼主分享
页: [1] 2 3 4 5 6 7 8 9
查看完整版本: 带大家学习一波骚操作之让游戏自己告诉我们修改哪(InjectLog工具使用&小白必学)