Smalidea无源码调试 android 应用

admin 2019年5月7日21:41:10评论318 views字数 2215阅读7分23秒阅读模式
摘要

smalidea是一款 IntelliJ IDEA/Android Studio的 smali 插件要调试一个apk里面的dex代码,必须满足以下两个条件中的任何一个:

smalidea是一款 IntelliJ IDEA/Android Studio的 smali 插件

已有功能


  • 语法高亮/错误提示
  • 字节码级别调试
    • 断点
    • 单步调试
    • 寄存器查看
    • 本地窗口 java 语法支持,debug 模式下同样支持
  • 支持跳转,方便追踪变量/函数/类.(Xref也支持)
  • 查找用法
  • 重命名
  • 从 java 代码引用 smali 类
  • 错误反馈...

安装


  • 下载插件smalidea
  • 进入IntelliJ IDEA/Android Studio开始安装插件,进入Settings->Plugins点击Install plugin from disk选中下载好的压缩包.
  • 点击apply

开启应用调试


要调试一个apk里面的dex代码,必须满足以下两个条件中的任何一个:

  • apk中的AndroidManifest.xml文件中的Application标签包含属性android:debuggable=”true”
  • /default.prop中ro.debuggable的值为1

可选方案:

  • apktool 反编译app 后在AndroidManifest.xml文件中插入android:debuggable=”true”
  • hook system debug (Xinstaller)
  • 修改boot.img

个人觉得改 boot.img和二次打包比较麻烦,所以这里采用 hook 方式达到开启所有应用调试的目的,xposed 插件代码如下

public class Debug implements IXposedHookLoadPackage {      public boolean debugApps = true ;     public static final int DEBUG_ENABLE_DEBUGGER = 0x1;     public String tag = "IDG";      @Override     public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {          if(lpparam.appInfo == null ||                 (lpparam.appInfo.flags & (ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_UPDATED_SYSTEM_APP)) !=0){             return;         }          tag = tag + lpparam.packageName;          XposedBridge.hookAllMethods(Process.class, "start", new XC_MethodHook() {             @Override             protected void beforeHookedMethod(MethodHookParam param) throws Throwable {                  int id = 5;                 int flags = (Integer) param.args[id];                  Log.d(tag,"flags is : "+flags);                  if (debugApps) {                     if ((flags & DEBUG_ENABLE_DEBUGGER) == 0) {                         flags |= DEBUG_ENABLE_DEBUGGER;                     }                 }                  param.args[id] = flags;                 Log.d(tag,"flags changed : "+flags);              }         });     }  } 

效果如下图

Smalidea无源码调试 android 应用

如果遇到如下错误

Adb rejected connection to client 

可以使用重启 adb server 来解决

adb kill-server  adb start-server 

如果调试中遇到如下错误,确保关闭了其他 IDE 或者 DDMS,解除端口占用

[Smalidea无源码调试 android 应用

调试应用


注意:IDEA 14.1及以上版本才支持单步调试

  • 使用 baksmali 反编译应用

    ```
    baksmali myapp.apk -o ~/projects/myapp/src

    ``` * 转到 IDEA 中,导入新工程,选中之前的目录

    ```
    ~/projects/myapp

    ```

    Smalidea无源码调试 android 应用

  • 导入时选择Create project from existing sources

    Smalidea无源码调试 android 应用

  • 成功导入工程后右键点击 src 目录,设定Mark Directory As->Sources Root

    Smalidea无源码调试 android 应用

  • 打开Module setting设置对应的 JDK

    Smalidea无源码调试 android 应用

  • 安装debug应用

    ```
    adb install com.zkj.guimi.apk

    ``` * 找到debug应用进程,启动应用

    Smalidea无源码调试 android 应用

    如果不用 ddms 可以使用如下步骤:

    ```
    » adb shell am start -D -W -n com.zkj.guimi/.ui.SplashScreen
    » adb shell ps |grep guimi 1 ↵
    u0_a157 9879 242 883420 36360 ffffffff 00000000 S com.zkj.guimi
    » adb forward tcp:8700 jdwp:9879

    ``` * 在 IDEA 配置远程调试(Run->Edit Configurations),更改debug端口为8700

    Smalidea无源码调试 android 应用

  • Run->Debug

    Connected to the target VM, address: 'localhost:8700', transport: 'socket'

  • 断点触发后就可以单步调试

    Smalidea无源码调试 android 应用

reference


http://www.kanxue.com/bbs/showthread.php?p=1338639

https://github.com/JesusFreke/smali/wiki/smalidea

https://github.com/pylerSM/XInstaller

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2019年5月7日21:41:10
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Smalidea无源码调试 android 应用https://cn-sec.com/archives/58516.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息