0%

动态调试smali代码

导出smali代码

  • 将被调试的apk(此处使用的是吾爱-教我兄弟学Android逆向中的例子)拖入AndroidKiller,等待反编译好

  • 工程管理->smali上右键打开文件路径,将smali文件夹复制出来,并更名为src

设置Android Studio

  • 下载ideasmali插件
    插件下载:链接:https://pan.baidu.com/s/1htl26qS 密码:0pre(同样来源于吾爱那位兄弟)

  • 安装插件
    打开File->Setting->plugins,在右边会看见一个齿轮图标,点击然后选择Install Plugin from Disk...,选中下载的文件即可完成安装

  • 用Android Studio打开src文件夹,右键Project中的src,选择Make Directory as–Sources Root

进行调试

  • 打开虚拟机,将被调试的apk装入虚拟机

  • 打开Android Device Monitor
    点击sdk->tools->monitor.bat

  • 在AndroidKiller中打开AndroidManifest.xml
    在其中找到android:debuggable="true",若为false则改为true,若无则添加

    记录下包名和入口的Activity名(我这包名hfdcxy.com.myapplication,入口的Activity名:hfdcxy.com.myapplication.MainActivity)

  • 打开命令行,输入命令adb shell am start -D -n hfdcxy.com.myapplication/hfdcxy.com.myapplication.MainActivity,此时虚拟机进入Waiting For Debugger模式

  • 记录下类似下图的两个值,然后关掉Android Device Monitor;或者通过adb shell ps进行查看(进程名为包名的PID)

  • 打开命令行,输入命令adb forward tcp:8700 jdwp:4414(这里 jdwp是自己Android Device Monitor中要调试app的Online值 )

  • 配置Android Studio的SDK
    File->Project Structure->Project SDK中进行选择

  • 打开Run–>Edit Configurations->+->Remote,设置名称(任意,我设置为了Smali),端口(8700),点击OK

  • 下好断点,点击Run->Debug "Smali"或者右上方的绿色小虫子图标

  • 虚拟机会运行起来,进行操作后(我这是输入账号、密码后按下按钮)会停在断点处

  • 可通过点击Run->Debug "Smali"或者右上方的绿色小虫子图标进行反复调试,F8为下一步

  • 点击Variables中的眼镜按钮即可打开Watches窗口,在其中点击+并输入寄存器的编号即可查看寄存器当前的值

遇到的问题

  • 打开Android Device Monitor时弹框Could not open Selected VM debug port (8700). Make sure you do not have another instance of DDMS or of the eclipse plugin running. If it’s being used by something else, choose a new port number in the preferences.
    解决办法:关掉Android Studio重新打开

  • AndroidKiller无法连接模拟器的问题
    在cmd中进行adb devices也没有反应
    解决办法:将android-sdk-windows->platform-tools下的adb.exeAndroidKiller->bin->adb下的adb.exe以及模拟器下(我用的是逍遥,在Microvirt->MEmu下)的adb.exe全替换为一个adb.exe(我用的是android-sdk-windows->platform-tools下的adb.exe,因为比较新)

  • 对于有些软件有反编译、签名验证或者有壳,则进行修改AndroidManifest.xml中的android:debuggable="true"无法实现

    根据android的官方文档,如果调试一个APK,必须满足以下两个条件中的任何一个:
    1 APK的AndroidManifest.xml文件中的Application标签包含android:debuggable="true"

    2 /default.prop中的ro.debuggable=1(修改boot.img等)

    因此当1不生效的时候可考虑2方法