利用IDA动态调试

将APP包里的classes.dex解压到任意一目录,然后拖进IDA。等待IDA加载分析完毕,点击Debugger->Debugger Options如图

android 逆向 apk动态调试 apk动态调试工具_xml

按图所示勾选在进程入口挂起,然后点击Set specific options 填入APP包名称和入口activity 如图:

android 逆向 apk动态调试 apk动态调试工具_xml_02

其中包的名称和入口activity 都可以通过APK改之理里的AndroidManifest.xml 文件获取:


1



2



3


<manifestxmlns:android="http://schemas.android.com/apk/res/android"package="com.example.simpleencryption">

    <applicationandroid:allowBackup="true"android:debuggable="true"android:icon="@drawable/creakme_bg2"android:label="@string/app_name"android:theme="@style/AppTheme">

        <activityandroid:label="@string/app_name"android:name=".MainActivity">




然后在IDA点击Debugger->Process Options



android 逆向 apk动态调试 apk动态调试工具_android_03


其他默认不变,端口这里改为8700。这里默认端口是23946,我在这里困扰了很久,就是因为这个端口没有改为8700所致。然后我们看看这个8700端口是怎么来的。在Android SDK里提供了一款工具DDMS,用来监视APP的运行状态和结果。在SDK的TOOLS目录有个DDMS.BAT的脚步,运行后就会启动DDMS。由于我的本机安装了SDK的ADT插件,DDMS集成到了Eclips中,打开Eclips->Open perspective->ddms就启动了DDMS。


如图所示:


android 逆向 apk动态调试 apk动态调试工具_安全_04



在DDMS选中某个进程后面就会注释出它的调试端口,本机这里是8700。



到此所有的工作就准备就绪,然后就可以下断点来调试该APP了。我们在APK改之理中在com目录下查看smali文件 发现MainActivity.smali里有一个感兴趣的函数getPwdFromPic(),那么我们就对它下断以跟踪APP的运行。

所以要提前下断点,否则什么也看不到,可以例如,在对应的activity的oncreate的方法里全局搜索然后,找到相应的字符,然后打一个断点。例如需找MainActivity.onCreate(),然后点击F9(即为绿色三角)的时候,就好进入相应的断点。

在IDA里搜索字符串getPwdFromPic,发现onClick有调用该函数

我们在onClick 函数开始位置按F2下断如图:




android 逆向 apk动态调试 apk动态调试工具_xml_05





android 逆向 apk动态调试 apk动态调试工具_android_06

调试过程中有一个问题出现了很多次,浪费了我大量的时间,就在写文章的时候,操作时还是遇到了这样的问题。就是点击启动后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打开本地变量窗口,如图:

android 逆向 apk动态调试 apk动态调试工具_android 逆向 apk动态调试_07




然后按F7或F8单步跟踪程序流程,同时可以观察到变量值的变化,也可以在IDA右键选择图形视图,可以看到整个APP执行的流程图:


android 逆向 apk动态调试 apk动态调试工具_android_08




然后在IDA点击Debugger->Process Options



如上图所示 变量窗口中我们输入了123 被转化成的密码是么广亡,pw变量也显示出了正确的密码,其实这个时候已经很容易判断出正确密码了。