Smalidea无源代码调试 android 应用

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 插件代码例如以下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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);
 
            }
        });
    }
 
}

效果例如以下图

假设遇到例如以下错误

Adb rejected connection to client

能够使用重新启动 adb server 来解决

adb kill-server

adb start-server

调试应用


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

  • 使用 baksmali 反编译应用

    baksmali myapp.apk -o ~/projects/myapp/src
    
  • 转到 IDEA 中,导入新project,选中之前的文件夹

    ~/projects/myapp
    

  • 导入时选择Create project from existing sources

  • 成功导入project后右键点击 src 文件夹,设定Mark Directory As->Sources Root

  • 打开Module setting设置相应的 JDK

  • 安装debug应用

    adb install com.zkj.guimi.apk
    
  • 找到debug应用进程,启动应用

    假设不用 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),更改debugport为8700

  • Run->Debug

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

  • 断点触发后就能够单步调试

reference

posted on 2017-05-17 20:58  wgwyanfs  阅读(201)  评论(0编辑  收藏  举报

导航