# Smalidea无源码调试 android 应用

Author: 乌云历史资料库 (@wooyun_archive)
Published: 2015-07-22T08:52:00Z
Canonical: https://wepostx.com/topics/916

> 乌云历史资料归档
>
> **原始作者：** 瘦蛟舞
> **原始编号：** superkieran-wooyundrops:654
> **原始发布时间：** 2015-07-22 16:52
> **声明：内容仅用于技术研究和个人使用，版权归 wooyun.org。**

---

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

### 已有功能

- 语法高亮/错误提示

- 字节码级别调试
- 断点

- 单步调试

- 寄存器查看

- 本地窗口 java 语法支持,debug 模式下同样支持

- 支持跳转,方便追踪变量/函数/类.(Xref也支持)

- 查找用法

- 重命名

- 从 java 代码引用 smali 类

- 错误反馈...

### 安装

- 下载插件[smalidea](https://bitbucket.org/JesusFreke/smali/downloads)

- 进入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 插件代码如下

```text
#!java 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); } }); } }
```
效果如下图

![原文图片](/media/2016/06/14a0ddb72f8c6d1887d52607cc642768)

如果遇到如下错误

```text
Adb rejected connection to client
```
可以使用重启 adb server 来解决

```text
adb kill-server adb start-server
```
如果调试中遇到如下错误,确保关闭了其他 IDE 或者 DDMS,解除端口占用
[[原始图片缺失：2015072710025976770.png]](http://drops.wooyun.org/wp-content/uploads/2015/07/error1.png)

### 调试应用

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

- 使用 baksmali 反编译应用

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

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

```text
~/projects/myapp
```

![原文图片](/media/2016/06/c91c549041fd2ff6ab89a84662f6eb02)

- 导入时选择Create project from existing sources

![原文图片](/media/2016/06/14dbfef0246d1c73638e5bf79e6a227e)

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

![原文图片](/media/2016/06/e3b2d6d14be050dd6da0013f3f07b2cf)

- 打开Module setting设置对应的 JDK

![原文图片](/media/2016/06/394a85d4c012371881feebc5c9c745b5)

- 安装debug应用

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

- 找到debug应用进程,启动应用

![原文图片](/media/2016/06/7a026bafd23ef09c2607a5262f4d6281)

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

```text
» 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

![原文图片](/media/2016/06/9b6c9f67598d1eb43ee97fcbe08dcc8a)

- Run->Debug
Connected to the target VM, address: 'localhost:8700', transport: 'socket'

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

![原文图片](/media/2016/06/b360140805744504a87a2443d5379154)

### reference

[http://www.kanxue.com/bbs/showthread.php?p=1338639](http://www.kanxue.com/bbs/showthread.php?p=1338639)
[https://github.com/JesusFreke/smali/wiki/smalidea](https://github.com/JesusFreke/smali/wiki/smalidea)
[https://github.com/pylerSM/XInstaller](https://github.com/pylerSM/XInstaller)

## Replies
