预备知识

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下完成。

 
 

  1. 使用Baksmali或apktool反编译apk文件,得到Smali代码。如果需要重新打包apk,推荐使用apktool。以下默认采用apktool。
  2. 把反汇编结果,在AS中当成现有工程打开。工程目录如下:

     
     

  3. 将smail文件夹标记为"Source Root"

     
     

    这里简单补充下,阅读代码的小技巧。

    在.method字段,使用"Find Usage"功能,可以定位该方法的所有调用者。

     
     

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

     
     

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

     
     

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

     
     

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

     
     

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

     
     

    如果没有,请自行补充,再使用apktool打包签名。

     
     

  6. 安装并启动应用,PC端使用adb jdwp命令查看目标进程的PID(最后一个),需要使用ctrl + c结束该命令。

    之后使用以下命令,绑定远程调试端口:

adb forward tcp:8700 jdwp:<PID>

TCP的端口号,是刚刚配置远程调试配置时填写的。<PID>是刚刚查询的结果。

 
 

或者通过以下命令,也可以获取调试进程的PID:

adb shell ps | findstr "<packageName>"

<packageName>是apk的包名,命令结果的第二列就是进程的PID。

 
 

  1. 在目标代码下断点:

     
     

    启动调试:

     
     

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

    之后调试步骤,与正常调试一样。

    release编译的apk,抹除了参数名和局部变量名,需要手动添加watch变量,watch寄存器查看。

    (应该是插件的bug,导致p寄存器(入参寄存器)值显示不正常)

     
     

  2. 如果调试过程中,修改了代码。需要使用apktool重新打包,重新安装。之后重复6步骤,开始调试。
  3. 调试结束后,建议使用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代码学习记录的更多相关文章

  1. 使用IDEA动态调试smali代码

    原创,转载请注明出处. 一般java ide(如eclipse.idea)都可用来进行smali的动态调试,这里选择IDEA. 第1步:使用apktool反编译apk java -jar apktoo ...

  2. Android Studio动态调试smali代码

    工具: Android Studio版本: 3.0.1 smalidea插件: https://github.com/JesusFreke/smali/wiki/smalidea. 反编译工具:本节先 ...

  3. 动态调试smali代码

    Android Killer对应用进行反编译为smali代码,看看Manifest文件中application标签里面是否有android:debuggable="true",没有 ...

  4. Android studio动态调试smali

    前面介绍了使用IDA动态调试smali,这种方法设置简单,不用重打包,用起来方便,但是如果变量类型设置错误则会马上退出调试,这是让人不爽的地方,而使用Android studio则不会.   0x01 ...

  5. Android调试系列—使用android studio调试smali代码

    1.工具介绍 使用工具 android killer:用于反编译apk包,得到smali代码 android studio:调试smali代码工具,或者使用idea,android studio就是在 ...

  6. Netbeans 6.8 + apktool_2.0.0b9 动态调试smali文件

    前言 很早就知道用Netbeans能够单步调试smali,一直拖到现在才真正的自己实现了一次~ 下面是详细步骤! 0×1 环境及工具 a.apktool_2.0.0b9 下载地址:http://con ...

  7. android动态调试samli代码(转)

    转载自看雪http://bbs.pediy.com/showthread.php?t=189610,非常感谢原作者分享! 跟踪apk一般的做法是在反编译的smali代码中插入log输出,然后重新编译运 ...

  8. AndroidStudio+ideasmali动态调试smali汇编

    0x00    前言 之前对于app反编译的smali汇编语言都是静态分析为主,加上一点ida6.6的动态调试,但是ida的调试smali真的像鸡肋一样,各种不爽,遇到混淆过的java代码就欲哭无泪了 ...

  9. Array方面Js底层代码学习记录

    一..clear() →Array function clear() { this.length = 0; return this; } 返回清除item的空数组. 例子: var fruits = ...

随机推荐

  1. C语言基础知识【C语言教程】

    2017年7月7日23:15:51外边下雨,突然想学习c语言,所以刷一遍基础. 笔记:C 语言教程1.C 语言是一种通用的.面向过程式的计算机程序设计语言.1972 年,为了移植与开发 UNIX 操作 ...

  2. jquery基础研究学习【HTML】

    jQuery HTMLjQuery 捕获jQuery 设置jQuery 添加元素jQuery 删除元素jQuery CSS 类jQuery css() 方法jQuery 尺寸 笔记:

  3. a byte of vim -- 学习摘要

    说在前面的话 -- a byte of vim 是我见过的最介绍vim 最好的书,想了解强大的vim的人,或者是已经在使用vim而打算进一步了解的人,我感觉都应该看看这个,内容精炼但涵盖非常广,--& ...

  4. phpcms的基础知识和配置

    一.设置界面 1.站点设置:相当于服务器上的站点 (1)站点修改:“关键词”和“描述”的修改,便于网络优化和搜索引擎对本网站的搜索. (2)点击站点后边的修改,模板的修改,引用自己模板 2.基本设置: ...

  5. smarty模板 变量 运算符 表达式 流程控制 函数

    ① 从配置文件中读取配置: 1,在模板页面加载配置文件 html页面 不是php页面<{config_load file='fo.conf'}> 2,在需要用到配置的地方加<{#si ...

  6. python脚本分析nginx访问日志

    日志格式如下: 223.74.135.248 [11/May/2017:11:19:47 +0800] "POST /login/getValidateCode HTTP/1.1" ...

  7. rpc接口和http接口的区别和联系

    1 什么是http接口 http接口是基于http协议的post和get接口. 2 什么是rpc接口 rpc接口就相当于调用本地接口一样调用远程服务的接口. 3 常用的rpc框架 thrift 自动代 ...

  8. Js版json解析

    JsonDecoder={ pos:0, isDigit:function(ch){ return ( ch >= '0' && ch <= '9' )||( ch == ...

  9. 《linux 内核全然剖析》 fork.c 代码分析笔记

    fork.c 代码分析笔记 verifiy_area long last_pid=0; //全局变量,用来记录眼下最大的pid数值 void verify_area(void * addr,int s ...

  10. html_dom类读取

    上传类文件以后,有三种方式调用这个类:从url中加载html文档从字符串中加载html文档从文件中加载html文档 复制代码 代码如下: <?php// 新建一个Dom实例$html = new ...