利用IDA动态调试
将APP包里的classes.dex解压到任意一目录,然后拖进IDA。等待IDA加载分析完毕,点击Debugger->Debugger Options如图
按图所示勾选在进程入口挂起,然后点击Set specific options 填入APP包名称和入口activity 如图:
其中包的名称和入口activity 都可以通过APK改之理里的AndroidManifest.xml 文件获取:
1
2
3
|
< manifest xmlns:android = "http://schemas.android.com/apk/res/android" package = "com.example.simpleencryption" >
< application android:allowBackup = "true" android:debuggable = "true" android:icon = "@drawable/creakme_bg2" android:label = "@string/app_name" android:theme = "@style/AppTheme" >
< activity android:label = "@string/app_name" android:name = ".MainActivity" >
|
然后在IDA点击Debugger->Process Options
如图所示:
到此所有的工作就准备就绪,然后就可以下断点来调试该APP了。我们在APK改之理中在com目录下查看smali文件 发现MainActivity.smali里有一个感兴趣的函数getPwdFromPic(),那么我们就对它下断以跟踪APP的运行。
所以要提前下断点,否则什么也看不到,可以例如,在对应的activity的oncreate的方法里全局搜索然后,找到相应的字符,然后打一个断点。例如需找MainActivity.onCreate(),然后点击F9(即为绿色三角)的时候,就好进入相应的断点。
在IDA里搜索字符串getPwdFromPic,发现onClick有调用该函数
我们在onClick 函数开始位置按F2下断如图:
调试过程中有一个问题出现了很多次,浪费了我大量的时间,就在写文章的时候,操作时还是遇到了这样的问题。就是点击启动后IDA提示can’t bind socket,琢磨了很久终于找到原因了,当打开过一次DDMS后 每次启动Eclips都会启动DDMS 而8700端口正是被这个DDMS给占用了,然后每次都会启动失败,解决办法就是 虚拟机运行起来后关闭掉Eclips,这时一切就正常了!
事例中是一个APP crackme 提示输入密码才能进入正确界面。这个时候我们输入123,点击登陆,IDA中断在了我们设置断点的地方,这时选中ida->debugger->use source level debugger,然后点击ida->debugger->debugger windows->locals打开本地变量窗口,如图:
如上图所示 变量窗口中我们输入了123 被转化成的密码是么广亡,pw变量也显示出了正确的密码,其实这个时候已经很容易判断出正确密码了。