Android逆向第二天
Android逆向第二天
smali基础语法
寄存器 p0 this p1,p2... 参数 v0,v1,... 局部变量
数据类型 在smali代码中数据类型以类型描述符来表示 ① 基本类型 int > I float > F boolean > Z void >V
② 引用类型 String > Ljava/lang/String; int[] > [I int > [[I
字段和方法表示
MainActivity类中的num(类型为int)字段 表示方法:所在类>字段名:字段的类型 Lcom/bluelesson/MainActivity;>num:I String类中equals方法 表示方法:所在类>方法名(参数类型)返回类型 Ljava/lang/String;>equals(Ljava/lang/Object;)Z
Android逆向工具AndroidKiller介绍
AndroidKiller是一个集成了多个工具的逆向集合。包括: ①Adb,用于连接Android设备,安装重打包之后的apk ②Apktool,用于反编译apk,生成smali代码和解码后的xml文件,还要带有签名工具 其内部可以增加多个ApkTool版本,有一个修改版比较不错,ShakaApktool.jar ③Dex2jar,用于将dex文件转为jar文件,方便java反编译工具反编译源码。除此之 外,其还提供了很多Android文件格式相关转换的批处理。 ④jdgui,Java反编译工具界面版,可以反编译Jar文件生成Java源码
AndroidKiller中反编译出现问题的解决方法
一般反编译出错都是AndroidKiller中的apktool出的问题,所以解决方法有4:
更新apktool到最新版本
分析apktool的错误提示信息,进一步排错
如果没有明确的提示,就只能对照apktool源码进一步分析问题 或者 分步解决,就是修改完smali之后,先使用smali.jar汇编成dex文件 再把dex替换到apk中,重新签名
如果还是无法反编译,就单独将apk中的dex文件拷贝出来,使用baksmali.jar反 编译。
Android逆向日志分析法破解收费金币
一定要!!先打开工具Monitor,F:\Android\Sdk\tools\lib\monitor-x86_64
然后再打开夜神模拟器,这样Monitor才能找到模拟器。
然后运行捕鱼APK
Monitor就会开始自己捕获消息了
我们的目的就是想要获得更多的金币,所以在游戏中金币商城中点击购买金币,查看 日志信息
当点击4元购买40000金币时,弹出对话框的日志信息如下
8: D/cocos2d‐x debug info(1319): event_id=buyMoney, label=400
8: D/cocos2d‐x debug info(1319): GameJni order payCode = 2 num= 1
8: D/cocos2d‐x debug info(1319): order = 5125374
8: D/(1319): GamePay sendOrder payCode = 5125374
8: D/cocos2d‐x debug info(1319): context.payType = 1
8: D/cocos2d‐x debug info(1319): payCode = 5125374
8: D/TAG(1319): DX payCode in DXSend == 5125374
8: D/dalvikvm(1319): GC_FOR_ALLOC freed 547K, 83% free 3877K/21612K,
paused 3ms, total 17ms
当点击确认按钮时,日志信息
10‐21 08:57:37.065: D/cocos2d‐x debug info(1294): Failed DX_payCode2
== 5125374
10‐21 08:57:37.065: D/cocos2d‐x debug info(1294): FaildCode == 1211
10‐21 08:57:37.069: D/cocos2d‐x debug info(1294): orderFinish code =
2result= 0
根据日志,用Android Killer用搜索字符串找到了支付错误(payFaild)的函数,查看源码
会发现:在支付错误函数附近有支付成功,支付 取消等函数,我们通过将支付成功的代码完全复制到支付失败函数中,来查看是否能 成功,发现成功获得了金币!想要跟进一步,我们选择了分析支付错误(payFaild)函数 和支付成功(paySuccess)函数的代码
经过测试,发现失败函数跟成功函数不同的0和1,决定了是否购买金币成功,更改const/4 v1 0x0位置上的0为1.随后的函数调用了这个参数invokestatic {v0, v1}, Lcom/payCom/org/GameJni;>OderFinish(II)V, 这个函数就是 关键函数。
更改完,Android skiller记得按下CRTL+S保存再反编译。连接设备记得把夜神模拟器里面的adb那3个文件(nod_adb.exe(原本是adb.exe,夜神模拟器名字改成nod_adb.exe了)AdbWinApi.dll,AdbWinUsbApi.dll)替换成跟系统的adb相同的。否则会找不到设备。
Android逆向去掉游戏的对话框
捕鱼游戏中关键的函数OderFinish的调用可以获取金币。那我们只需要在调用弹出对 话框的代码之前,调用OderFinish函数即可。 根据日志,可以找一些比较靠前的日志输出,一般这个时候还没有弹出对话框。 8: D/cocos2dx debug info(1319): order = 5125374 我们有”order = ”日志输出的函数中有OderFinish函数调用。假设,order函数前面弹出 对话框,我们可以将order函数的无用代码直接跳过,执行OderFinish函数。
经过测试,成功购买金币,并且没有弹出对话框。所以order函数中跳过的代码应该有 弹出对话框的代码。
可以查看消息处理函数,增加更多的功能。
Android逆向增加了自己购买金币的提示信息 由于在order函数中有发送消息的代码,我们可以修改发送消息的ID,然后在修改过休 息处理函数中对应的消息ID处理代码,将我们自己的提示信息写入其中。 我们将发送的消息ID改成10005,即0x2715。消息发送,执行的是弹出购买失败的信 息,现在我们将购买失败的信息,改成自己的信息即可。 在order函数中先发送消息,然后再执行OderFinish函数。
Android逆向增加游戏启动的提示信息
在入口类LogoActivity中的onCreate函数的末尾,插入Toast调用代码即可。 使用AndroidKiller中的模板插入即可。
修改自己想输出信息
弹出效果:
Android逆向动态调试smali代码
使用AndroidStudio可以动态调试Smali代码,需要用到一个插件smalidea0.05.zip
1.安装插件: 选择从硬盘安装
2.将smali代码所在的目录导入AndroidStudio中,并在入口类中下断点 ,记得选择导入
一直ok下一步。有个地方要记得选择导入而不是创建
3.安装apk (可能会找不到设备的时候,试着把模拟器高级设置选择手机模式) Adb install xxx.apk 以调试方式启动apk adb shell am start D n com.bufish.org/.LogoActivity
4.在AndroidMonitor中现在调试进程,设置调试端口为8700
5.在AndroidStudio增加一个新的调试配置
修改调试配置中的连接端口为8700,以及修改调试配置的名称
6.使用工具栏中的debug按钮,进行连接调试。
连接成功之后,控制台有显示,断点也会断下
调试过程中,可以查看寄存器的值
Android逆向动态附加调试smali代码
前提条件:apk中的清单文件中application标签中有debug属性 android:debuggable="true" 需要关闭Android Monitor,需要首先运行一下apk,然后调试方式启动apk adb shell am start D n com.bluelesson.apkcrackme/.MainActivity 在AndroidStudio中直接附加进程
连接成功之后,可以看到控制台显示的端口是随机端口
调试的过程中可以在变量窗口中增加当前函数中使用到的寄存器,查看其值
END