Android逆向系列之动态调试(零)–入门篇

111111111

由于第一篇动态调试写的比较急,没有详细介绍一些知识,所以补充这一篇入门篇。

一、什么是动态调试
动态的意思就是指通过在真实或模拟环境中执行程序进行分析的方法,多用于性能测试、功能测试、内存泄露测试等方面。
百度百科:动态调试是指软件作者利用集成环境(IDE)自带的调试器跟踪自己软件的运行,来协助解决自己软件的错误

同样的,动态调试分为Java层和native层动态调试
Java层动态调试主要是调试smali文件
native层动态调试主要是调试so文件

二、定位关键代码

1、信息反馈法

所谓信息反馈法,是指先运行目标程序,然后根据程序运行时给出的反馈信息作为突破口寻找关键代码。例如运行目标程序并输入错误的注册码时,会弹出提示“无效用户名或注册码”,这就是程序反馈给我们的信息。通常情况下,程序中用到的字符串会存储在String.xml文件或者硬编码到程序代码中,如果是前者的话,字符串在程序中会以id 的形式访问,只需在反汇编代码中搜索字符串的id 值即可找到调用代码处;如果是后者的话,在反汇编代码中直接搜索字符串即可。
如果想快速找到某一个按钮或者某个界面的相关代码,即仍旧是找到ID值,再通过JEB等工具进行查找,那么如何找到id值,这里可以使用工具uiautomatorviewer.bat(SDK)

2、特征函数法

这种定位代码的方法与信息反馈法类似。在信息反馈法中,无论程序给出什么样的反馈信息,终究是需要调用Android SDK 中提供的相关API 函数来完成的。比如弹出注册码错误的提示信息就需要调用Toast.MakeText().Show()方法,在反汇编代码中直接搜索Toast应该很快就能定位到调用代码,如果 Toast在程序中有多处的话,可能需要分析人员逐个甄别。

3、顺序查看法

顺序查看法是指从软件的启动代码开始,逐行的向下分析,掌握软件的执行流程,这种分析方法在病毒分析时经常用到。

4、代码注入法

详细的有smali代码注入或者动态修改程序,一般都可归结为代码注入,详见 <一>smali代码注入

5、栈追踪法

利用输出时的栈跟踪信息,通过查看栈上的函数调用序列来理解方法的执行流程

6、Methon Profiling

主要是使用ptrace来进行,相应的有hook等等技术

备注:以上总结来自<Android软件安全与逆向分析>

三、工具、环境
1.常见的环境有 apktool+eclipse/idea/android studio/netbeans 这部分我会挑一两个进行介绍,其实实际的操作差别也不大,只要熟悉一种就可以了。

2.IDA pro + DDMS 主要用来调试so文件,当然也可以调试dex文件,不过大材小用的感觉了。

3.linux环境下的andbug/gdb+gdb_server

4.其他:gikdbg/cygwin+ndk-gdb

5.hook技术: Xposed\Cydia Substrate\自定义hook
这里我把hook技术归类为动态调试,其实有点勉强,这里只是顺便一提,这应该归属于动态注入一类比较合适,之后再进行区分。

四、小结
动态调试遇到的问题相对静态分析来说,可能就多了很多,加上加固、反调试等技术,使得动态调试会非常难,不同的环境需要有强大的耐心去分析,技术基础是一方面,有时候,运气也是一方面。但是,既然问题多,说明他能解决的问题也多,比如可以dump dex、可以脱壳等等,强大的方法总是在对抗中不断地进步。

本文属原创,转载请注明来自 tasfa.cn 如有问题请联系 root@tasfa.cn

《Android逆向系列之动态调试(零)–入门篇》有2个想法

发表评论

电子邮件地址不会被公开。

You must enable javascript to see captcha here!