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 中,导入新工程,选中之前的目录

~/projects/myapp

  • 导入时选择Create project from existing sources

  • 成功导入工程后右键点击 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),更改debug端口为8700

  • Run->Debug

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

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

reference


 

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

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

https://github.com/pylerSM/XInstaller

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值