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-serveradb start-server

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

调试应用


注意: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

原文地址: http://drops.wooyun.org/tips/7181

Smalidea无源码调试 android 应用相关推荐

  1. Smalidea+IntelliJ IDEA/Android Studio无源码调试

    smalidea是一个IntelliJ IDEA/Android Studio smali语言插件,可实现动态调试smali代码. github地址:https://github.com/JesusF ...

  2. JEB 无源码调试 以dvm smali字节码方式,Demo尝试

    关于调试器看不到进程,无法attach的问题,网上也有很多教程,基本是修改ro.debugable =1  ,ro.secure = 0 让adbd有root权限 attach到其他进程,涉及到要修改 ...

  3. Windbg无源码调试驱动

    文章目录 准备工具 修改OEP 修改校验和 开始调试 准备工具 windbg调试器 一台搭建好双机调试环境的虚拟机 任意一个能运行驱动的软件 CFF Explorer LoadPE 修改OEP 首先随 ...

  4. dnspy调试神器在IIS中无源码调试c#程序

    1. Download dnSpy 6.1.8 dnSpy分32位和64位,根据需要进行下载.下载完dnSpy压缩包之后解压如下 建议右键使用管理员权限运行dnSpy.exe 此时选择菜单项 调试 & ...

  5. 无源码动态调试APK

    0x00 工具准备 1.apktool 2.netbeans或者Intelij(android studio)     ;这里使用netbeans作为例子 3.ddms 4.apk签名工具 0x01 ...

  6. 如何调试Android Native Framework

    原文: https://zhuanlan.zhihu.com/p/24867284 如何调试Android Native Framework weishu 7 个月前 半年前写了一篇文章,介绍 如何调 ...

  7. java 广告sdk开发_supersonicads广告sdk逆向分析以及无源码debug java

    0x00 背景 最近看到一个小游戏,但是它使用了supersonicads的sdk,广告极其多,非常烦,所以我就逆向了一下它,顺便分析了一下supersonicads的工作原理. 0x01 super ...

  8. Android FrameWork学习(二)Android系统源码调试

    点击打开链接 通过上一篇 Android FrameWork学习(一)Android 7.0系统源码下载\编译 我们了解了如何进行系统源码的下载和编译工作. 为了更进一步地学习跟研究 Android ...

  9. 自己动手调试Android源码(超简单)

    在自己动手编译Android最新源码一文中,我们为自己编译了一份最新的Android源码.很多时候,我们编译源码的目的不仅仅是尝试一番,而是希望对其进行调试,并修改源码,看看其中一些关键机制的运行原理 ...

最新文章

  1. MPB:林科院袁志林组-​枫香-真菌互作培养体系构建
  2. x86 X64指令集之间的关系
  3. p2596 书架(Treap)
  4. C#教程3:基本语言结构
  5. Hibernate持久化对象三种状态
  6. C/C++ OpenCV均值滤波
  7. java eight,Java语法基础学习DayEight
  8. World Wind入门
  9. 计算机网络(二)—— 物理层(1、2、3):物理层的基本概念、物理层的下面的传输媒体、传输方式
  10. 万用表的灵活使用,不仅只有基本使用方法!
  11. Java 8 Update 91 (8u91)
  12. strings.Builder 源码阅读与分析
  13. 今天的一点杂感-20220414
  14. picpick尺子像素大小精度不够准确_picpick尺子像素大小精度不够准确_【论文解读】像素级分割里程碑算法——FCN全卷积神经网络......
  15. 秒杀tomcat优化
  16. Python写个小游戏:蛇棋(下)
  17. 阅读真题 | 真题阅读 做题记录 一
  18. a21_scala 匿名子类
  19. DateUtils学习笔记
  20. 漏洞概述-0day漏洞利用原理(0)

热门文章

  1. 卡尔曼滤波MATLAB代码实现
  2. 给eth0增加一个IP
  3. python调用可执行文件
  4. linux系统-软链接与硬链接区别
  5. ALEX net 解读
  6. 云炬随笔20180419
  7. 林华达视角-概率图模型与计算机视觉
  8. PIC单片机入门_输入输出端口详解
  9. 串口通信模块5:串口操作自定义类(3)
  10. GPS服务端解析程序编写日记之--vs2010中多种语言开发及调试的若干注意事项