动态调试smali代码学习记录
预备知识
DDMS
Dalvik Debug Monitor Serivce,Dalvik调试监控服务,为Android SDK提供的一款拥有监控Dalvik虚拟机的调试软件,启动文件位于<Andorid SDK>/tools/monitor.bat(低版本的SDK为ddms.bat)
adb forward命令
用于创建一个端口映射,将本地端口(PC端口)映射到远程端口(手机端口),例如:
|
adb forward tcp:8001 tcp:8002 |
之后PC端访问8001端口的数据包,会自动转发到手机的8002端口。
adb还提供了reverse命令,操作与forward相反,将远程端口(手机端口)映射到本地端口(PC端口),例如:
|
adb reverser tcp:8001 tcp:8002 |
之后手段端访问8001端口的数据包,会自动转发到电脑的8002端口。
其他带参命令可以参考adb的帮助文档:

JDWP
Java Debug Wire Protocol,Java调试线程协议,定义了调试器(debugger)和被调试的 Java 虚拟机(target vm)之间的通信协议。详细请参考:
https://www.ibm.com/developerworks/cn/java/j-lo-jpda3/
Dalvik虚拟机会启动一个JDWP线程,用于远程调试。远程调试器可以通过JDWP端口号,调试指定进程。每个可调试的进程的PID就是其JDWP的端口号。可以使用adb jdwp命令查看所有可以调试的进程PID(需要使用ctrl + c退出)。
动态调试Smali代码
参考作者的说明:
https://github.com/JesusFreke/smali/wiki/smalidea
本次调试在Windows 10 + AS 3.2.1下完成。
- 使用Baksmali或apktool反编译apk文件,得到Smali代码。如果需要重新打包apk,推荐使用apktool。以下默认采用apktool。
- 把反汇编结果,在AS中当成现有工程打开。工程目录如下:

- 将smail文件夹标记为"Source Root"

这里简单补充下,阅读代码的小技巧。
在.method字段,使用"Find Usage"功能,可以定位该方法的所有调用者。

在方法类型上,使用"Declaration",可以定位方法的定义处。

- 创建一个远程调试的配置:

点击"+",新建一个配置,选择"Remote"模板,配置名可以任意命名,这里取名为SmaliDebug。

端口号可以任意指定,只要不被其他进程占用,通常使用8700(DDMS使用的调试端口号)。

- 确认调试apk的AndroidManifest.xml文件中,<application>标签的android:debuggable属性为true:

如果没有,请自行补充,再使用apktool打包签名。
- 安装并启动应用,PC端使用adb jdwp命令查看目标进程的PID(最后一个),需要使用ctrl + c结束该命令。
之后使用以下命令,绑定远程调试端口:
|
adb forward tcp:8700 jdwp:<PID> |
TCP的端口号,是刚刚配置远程调试配置时填写的。<PID>是刚刚查询的结果。
或者通过以下命令,也可以获取调试进程的PID:
|
adb shell ps | findstr "<packageName>" |
<packageName>是apk的包名,命令结果的第二列就是进程的PID。

- 在目标代码下断点:

启动调试:

手机端操作app,触发断点:

之后调试步骤,与正常调试一样。
release编译的apk,抹除了参数名和局部变量名,需要手动添加watch变量,watch寄存器查看。
(应该是插件的bug,导致p寄存器(入参寄存器)值显示不正常)
- 如果调试过程中,修改了代码。需要使用apktool重新打包,重新安装。之后重复6步骤,开始调试。
- 调试结束后,建议使用adb forward --remove-all命令,清理端口绑定。
如果你在Linux调试,作者给出了一条命令,可以在启动app后,一步完成端口绑定:
|
adb forward tcp:8700 jdwp:$(timeout 0.5 adb jdwp | tail -n 1) |
解释下这条命令:
$()会执行括号内的命令,将命令的运行结果作为值。
timeout命令会执行一个子命令,如果子命令没有在规定时间内(这里是0.5秒)完成,直接杀死。
tail -n 1,输出输入内容的最后一行,这里通过管道,将jdwp作为输入。
合起来,"$(timeout 0.5 adb jdwp | tail -n 1)"就是adb jdwp输出的最后一行,并自动结束jdwp命令。
动态调试smali代码学习记录的更多相关文章
- 使用IDEA动态调试smali代码
原创,转载请注明出处. 一般java ide(如eclipse.idea)都可用来进行smali的动态调试,这里选择IDEA. 第1步:使用apktool反编译apk java -jar apktoo ...
- Android Studio动态调试smali代码
工具: Android Studio版本: 3.0.1 smalidea插件: https://github.com/JesusFreke/smali/wiki/smalidea. 反编译工具:本节先 ...
- 动态调试smali代码
Android Killer对应用进行反编译为smali代码,看看Manifest文件中application标签里面是否有android:debuggable="true",没有 ...
- Android studio动态调试smali
前面介绍了使用IDA动态调试smali,这种方法设置简单,不用重打包,用起来方便,但是如果变量类型设置错误则会马上退出调试,这是让人不爽的地方,而使用Android studio则不会. 0x01 ...
- Android调试系列—使用android studio调试smali代码
1.工具介绍 使用工具 android killer:用于反编译apk包,得到smali代码 android studio:调试smali代码工具,或者使用idea,android studio就是在 ...
- Netbeans 6.8 + apktool_2.0.0b9 动态调试smali文件
前言 很早就知道用Netbeans能够单步调试smali,一直拖到现在才真正的自己实现了一次~ 下面是详细步骤! 0×1 环境及工具 a.apktool_2.0.0b9 下载地址:http://con ...
- android动态调试samli代码(转)
转载自看雪http://bbs.pediy.com/showthread.php?t=189610,非常感谢原作者分享! 跟踪apk一般的做法是在反编译的smali代码中插入log输出,然后重新编译运 ...
- AndroidStudio+ideasmali动态调试smali汇编
0x00 前言 之前对于app反编译的smali汇编语言都是静态分析为主,加上一点ida6.6的动态调试,但是ida的调试smali真的像鸡肋一样,各种不爽,遇到混淆过的java代码就欲哭无泪了 ...
- Array方面Js底层代码学习记录
一..clear() →Array function clear() { this.length = 0; return this; } 返回清除item的空数组. 例子: var fruits = ...
随机推荐
- Laravel开发:Laravel核心——Ioc服务容器源码解析(服务器绑定)
服务容器的绑定 bind 绑定 bind 绑定是服务容器最常用的绑定方式,在 上一篇文章中我们讨论过,bind 的绑定有三种: 绑定自身 绑定闭包 绑定接口 今天,我们这篇文章主要从源码上讲解 Ioc ...
- MySQL的max()函数使用时遇到的小问题
通常我们获取某个表的某个字段最大值时可以使用max()函数. 使用场景举例: 获取某个表id的最大值:SQL: SELECT max(id) FROM table_name; SELECT max(` ...
- Android 与H5之间的js交互
之前项目做过一些Android和Html5之间js交互方面的东西,今天有时间就总结一下: 一.为什么要进行js交互: 为了方便原生开发和Html之间数据传递,在静态页面的情况下可以改变原生开发的页面: ...
- ubuntu16.04下hive安装与配置
Hive是什么? 由Facebook开源用于解决海量 结构化日志的数据统计: Hive是基于Hadoop的一个 数据仓库工具,可以将结构化的数据文件映射 成一张表,并提供类SQL查询功能: 构建在Ha ...
- Cloneable 和clone的区别和联系
设计模式----原型模式时候,涉及到的复制克隆, Cloneable 接口,内部是没有任何方法的, 这个接口其实是一个标记性的接口,和Serializable是一样的,都是标记使用, 在类实现了这个C ...
- cookie的坑
HTTP Cookie 设置了secure , 该cookie只能在HTTPS通道下被写入浏览器. HTTPS Cookie 设置了secure , 该cookie只能 ...
- eclipse svn 分支合并到主干
最近公司产品上线,整个系统架构包含有七八个子系统,并且子系统都是集群部署.所以每次升级维护都要确保尽可能不出问题.因为整个系统刚上线不久,意味着新系统不定期有BUG需修复,但新功能模块也在持续的开发中 ...
- Javaweb--- EL表达式 JSTL标准标签库
一.EL表达式(expression language): 语法 ${...} jsp中page指令有一个属性叫isELIgnored, 用来标记此页面是否忽略EL表达式, 默认为false 举个例 ...
- JVM虚拟机调参
一.堆大小设置JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制:系统的可用虚拟内存限制:系统的可用物理内存限制.32位系统下,一般限制在1.5G~2G:64为 ...
- TS视频一
ts文件 ts文件为传输流文件,视频编码主要格式h264/mpeg4,音频为acc/MP3. ts文件分为三层:ts层Transport Stream.pes层 Packet Elemental St ...