一、什么是动态调试
动态的意思就是指通过在真实或模拟环境中执行程序进行分析的方法,多用于性能测试、功能测试、内存泄露测试等方面。
百度百科:动态调试是指软件作者利用集成环境(IDE)自带的调试器跟踪自己软件的运行,来协助解决自己软件的错误
同样的,动态调试分为Java层和native层动态调试
Java层动态调试主要是调试smali文件
native层动态调试主要是调试so文件
二、定位关键代码
代码注入法:详细的有smali代码注入或者动态修改程序,一般都可归结为代码注入,详见 <一>smali代码注入
栈追踪法:利用输出时的栈跟踪信息,通过查看栈上的函数调用序列来理解方法的执行流程
Methon Profiling:主要是使用ptrace来进行,相应的有hook等等技术
三、工具、环境
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、可以脱壳等等,强大的方法总是在对抗中不断地进步。 |