Android逆向-日志分析法-破解收费金币
日志分析法-破解收费金币
先打开工具Monitor,然后再打开夜神模拟器,运行捕鱼APK
我们的目的就是想要获得更多的金币,所以在游戏中金币商城中点击购买金币,查看日志信
息
当点击4元购买40000金币时,弹出对话框的日志信息如下
8: D/cocos2d-x debug info(1319): event_id2 8: D/cocos2d-x debug info(1319): GameJni order payCode = 2 num= 1 3 8: D/cocos2d-x debug info(1319): order = 5125374 4 8: D/(1319): GamePay sendOrder payCode = 5125374 5 8: D/cocos2d-x debug info(1319): context.payType = 1 6 8: D/cocos2d-x debug info(1319): payCode = 5125374 7 8: D/TAG(1319): DX payCode in DXSend == 5125374 8 8: D/dalvikvm(1319): GC_FOR_ALLOC freed 547K, 83% free 3877K/21612K, paused 3ms, tot
当点击确认按钮时,日志信息
10-21 08:57:37.065: D/cocos2d-x debug info(1294): Failed DX_payCode22 10-21 08:57:37.065: D/cocos2d-x debug info(1294): FaildCode == 1211 3 10-21 08:57:37.069: D/cocos2d-x debug info(1294): orderFinish code = 2result= 0
根据日志,找到了支付错误(payFaild)的函数,在支付错误函数附近有支付成功,支付取消
等函数,我们通过将支付成功的代码完全复制到支付失败函数中,来查看是否能成功,发现
成功获得了金币!想要跟进一步,我们选择了分析支付错误(payFaild)函数和支付成功
(paySuccess)函数的代码
经过测试,发现第一个值得不同决定了是否购买金币成功,而第一个值下面调用的是
invoke-static {v0, v1}, Lcom/payCom/org/GameJni;->OderFinish(II)V, 这个函数就是关键函数。
Android逆向-去掉游戏的对话框
捕鱼游戏中关键的函数OderFinish的调用可以获取金币。那我们只需要在调用弹出对话框的
代码之前,调用OderFinish函数即可。
根据日志,可以找一些比较靠前的日志输出,一般这个时候还没有弹出对话框。
8: D/cocos2d-x debug info(1319): order = 5125374
我们有”order = ”日志输出的函数中有OderFinish函数调用。假设,order函数前面弹出对话
框,我们可以将order函数的无用代码直接跳过,执行OderFinish函数。
经过测试,成功购买金币,并且没有弹出对话框。所以order函数中跳过的代码应该有弹出对
话框的代码。
可以查看消息处理函数,增加更多的功能。
Android逆向-增加了自己购买金币的提示信息
由于在order函数中有发送消息的代码,我们可以修改发送消息的ID,然后在修改过休息处理
函数中对应的消息ID处理代码,将我们自己的提示信息写入其中。
我们将发送的消息ID改成10005,即0x2715。消息发送,执行的是弹出购买失败的信息,现
在我们将购买失败的信息,改成自己的信息即可。
在order函数中先发送消息,然后再执行OderFinish函数。
其他修改方法
程序执行流程
GameJni.order
IAPListener.order
iapHandler.sendMessage
GamePay.sendOrder
IAPListener.sendOrder
DXSend
修改396行 3 #sget-object v0, Lcom/payCom/org/GamePay;->mListener:Lcom/payCom/org/IAPListener
#invoke-virtual {v0, p0, p1}, Lcom/payCom/org/IAPListener;->order(II)V
const/4 v1, 0x1
invoke-static {p0, v1}, Lcom/payCom/org/GameJni;->OderFinish(II)V
IAPListener.sendOrder
开始代码加 goto :cond_2
修改609行 const/4 v1, 0x1
IAPListener.order
修改366行 const/16 v3, 0x271a
注释掉407行 #if-ne v0, v1, :cond_0
在424行添加代码
const/4 v0, 0x1
invoke-static {p1, v0}, Lcom/payCom/org/GameJni;->OderFinish(II)V
Android逆向-增加游戏启动的提示信息
在入口类LogoActivity中的onCreate函数的末尾,插入Toast调用代码即可。
使用AndroidKiller中的模板插入即可。
修改自己想输出信息
const-string v0, "15pb \u6355\u9c7c\u8fbe\u4eba\u4e13\u4e1a\u7248 \u6b22\u8fce\
const/4 v1, 0x1
invoke-static {p0, v0, v1},
Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)
move-result-object v0
invoke-virtual {v0}, Landroid/widget/Toast;->show()V
Android逆向-动态调试smali代码
使用AndroidStudio可以动态调试Smali代码,需要用到一个插件smalidea-0.06.zip
1.打开插件选项
1.安装插件
2.将smali代码所在的目录导入AndroidStudio中,并在入口类中下断点
3.安装apk
Adb install xxx.apk
以调试方式启动apk
adb shell am start -D -n com.bufish.org/.LogoActivity
4.在AndroidMonitor中现在调试进程,设置调试端口为8700
5.在AndroidStudio增加一个新的调试配置
修改调试配置中的连接端口为8700,以及修改调试配置的名称
这个地方一定要注意顺序:
① 使用androidstudio导入smali代码,创建项目
② 打开进程管理器,杀死adb.exe
③ 打开monitor
④ 打开模拟器
6.使用工具栏中的debug按钮,进行连接调试。
连接成功之后,控制台有显示,断点也会断下
调试过程中,可以查看寄存器的值
Android逆向-动态附加调试smali代码
前提条件:
① apk中的清单文件中application标签中有debug属性
android:debuggable=“true”
或者 整个android系统是debug版本
② 关闭Android Monitor
调试步骤:
首先运行一下apk,然后调试方式启动apk
adb shell am start -D -n com.bluelesson.apkcrackme/.MainActivity
在AndroidStudio中直接附加进程
连接成功之后,可以看到控制台显示的端口是随机端口
调试的过程中可以在变量窗口中增加当前函数中使用到的寄存器,查看其值
这个地方一定要注意顺序:
① 使用androidstudio导入smali代码,创建项目
② 打开进程管理器,杀死adb.exe
③ 打开模拟器
不使用android monitor的方法
- 查看进程端口
adb shell “ps | grep ctf.bobdylan” - 转发端口
adb forward tcp:8700 jdwp:2143
有一定的成功率,可能会失败