Android逆向第二天

Android逆向第二天

smali基础语法

  1. 寄存器 p0 this p1,p2... 参数 v0,v1,... 局部变量

  2. 数据类型 在smali代码中数据类型以类型描述符来表示 ① 基本类型 int ­> I float ­> F boolean ­> Z void ­>V

② 引用类型 String ­> Ljava/lang/String; int[] ­> [I int ­> [[I

  1. 字段和方法表示

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文件格式相关转换的批处理。 ④jd­gui,Java反编译工具界面版,可以反编译Jar文件生成Java源码

AndroidKiller中反编译出现问题的解决方法

一般反编译出错都是AndroidKiller中的apktool出的问题,所以解决方法有4:

  1. 更新apktool到最新版本

  2. 分析apktool的错误提示信息,进一步排错

  3. 如果没有明确的提示,就只能对照apktool源码进一步分析问题 或者 分步解决,就是修改完smali之后,先使用smali.jar汇编成dex文件 再把dex替换到apk中,重新签名

  4. 如果还是无法反编译,就单独将apk中的dex文件拷贝出来,使用baksmali.jar反 编译。

Android逆向­日志分析法­破解收费金币

一定要!!先打开工具Monitor,F:AndroidSdk oolslibmonitor-x86_64

然后再打开夜神模拟器,这样Monitor才能找到模拟器。

然后运行捕鱼APK

Monitor就会开始自己捕获消息了

我们的目的就是想要获得更多的金币,所以在游戏中金币商城中点击购买金币,查看 日志信息

1569309504375

当点击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)的函数,查看源码

1569312109406

会发现:在支付错误函数附近有支付成功,支付 取消等函数,我们通过将支付成功的代码完全复制到支付失败函数中,来查看是否能 成功,发现成功获得了金币!想要跟进一步,我们选择了分析支付错误(payFaild)函数 和支付成功(paySuccess)函数的代码

1569312131339

1569312139240

经过测试,发现失败函数跟成功函数不同的0和1,决定了是否购买金币成功,更改const/4 v1 0x0位置上的0为1.随后的函数调用了这个参数invoke­static {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/cocos2d­x debug info(1319): order = 5125374 我们有”order = ”日志输出的函数中有OderFinish函数调用。假设,order函数前面弹出 对话框,我们可以将order函数的无用代码直接跳过,执行OderFinish函数。

1569313161828

经过测试,成功购买金币,并且没有弹出对话框。所以order函数中跳过的代码应该有 弹出对话框的代码。

1569313174677

可以查看消息处理函数,增加更多的功能。

Android逆向­增加了自己购买金币的提示信息 由于在order函数中有发送消息的代码,我们可以修改发送消息的ID,然后在修改过休 息处理函数中对应的消息ID处理代码,将我们自己的提示信息写入其中。 我们将发送的消息ID改成10005,即0x2715。消息发送,执行的是弹出购买失败的信 息,现在我们将购买失败的信息,改成自己的信息即可。 在order函数中先发送消息,然后再执行OderFinish函数。

1569313199667

Android逆向­增加游戏启动的提示信息

在入口类LogoActivity中的onCreate函数的末尾,插入Toast调用代码即可。 使用AndroidKiller中的模板插入即可。

1569313223844

修改自己想输出信息

弹出效果:

1569313252289

Android逆向­动态调试smali代码

使用AndroidStudio可以动态调试Smali代码,需要用到一个插件smalidea­0.05.zip

1569321752298

1.安装插件: 选择从硬盘安装

1569321770726

2.将smali代码所在的目录导入AndroidStudio中,并在入口类中下断点 ,记得选择导入

1569321912555

一直ok下一步。有个地方要记得选择导入而不是创建

1569321941117

1569321949530

3.安装apk (可能会找不到设备的时候,试着把模拟器高级设置选择手机模式) Adb install xxx.apk 以调试方式启动apk adb shell am start ­D ­n com.bufish.org/.LogoActivity

1569322003435

4.在AndroidMonitor中现在调试进程,设置调试端口为8700

1569322019093

5.在AndroidStudio增加一个新的调试配置

1569322031912

1569322043636

修改调试配置中的连接端口为8700,以及修改调试配置的名称

1569322058799

6.使用工具栏中的debug按钮,进行连接调试。

1569322071724

连接成功之后,控制台有显示,断点也会断下

1569322083031

调试过程中,可以查看寄存器的值

1569322096852

Android逆向­动态附加调试smali代码

前提条件:apk中的清单文件中application标签中有debug属性 android:debuggable="true" 需要关闭Android Monitor,需要首先运行一下apk,然后调试方式启动apk adb shell am start ­D ­n com.bluelesson.apkcrackme/.MainActivity 在AndroidStudio中直接附加进程

1569322150034

连接成功之后,可以看到控制台显示的端口是随机端口

1569322167329

调试的过程中可以在变量窗口中增加当前函数中使用到的寄存器,查看其值

1569322180916

END

原文地址:https://www.cnblogs.com/ltyandy/p/11584428.html