原创,转载请注明出处。

一般java ide(如eclipse、idea)都可用来进行smali的动态调试,这里选择IDEA。

第1步:使用apktool反编译apk

java -jar apktool_2.0.0rc4.jar d -d 123.apk -o out

注意:

apktool的版本问题,有的版本没有-d选项

-d选项代表反编译出来后缀是.java而不是.smali,但也不是真正的java代码,这样是让IDEA识别出java文件然后使用JDWP进行远程调试,如下:

第2步:更改debug属性及在入口添加waitDebug

2.1

更改AndroidManifest.xml中的android:debuggable=”true”

2.2

找到入口Activity,在其onCreate方法开始处添加android.os.Debug.waitForDebugger();

对应的smali代码为:

invoke-static {}, Landroid/os/Debug;->waitForDebugger()V

第3步:重打包并签名

java -jar apktool_2.0.0rc4.jar b -d out -o debug.apk

java -jar signapk.jar pub.pem prv.pk8 debug.apk signed.apk

第4步:新建java工程,导入smali代码,并在关键位置下断

4.1

新建java项目,项目位置填为之前反编译出的out目录

4.2

找到关键位置下断点,这个“关键位置“就具体情况具体分析了。

这里以示例apk为例下在onClick函数处。

第5步:远程调试

5.1

打开ddms,然后运行程序。

手机会出现对话框或白屏来等待调试

ddms出现如下情景:

红色小虫代表此进程正等待调试

29954为pid

8600为此进程的远程机器调试端口号,8700为通用备用端口号

5.2

配置远程调试选项

Host:localhost

Port:8600

调试模式:Attach

项目:out

这里说一下调试模式Attach和listen的区别,Attach是调试服务端(被调试程序运行的机器)启动一个端口等待我们(调试客户端)去连接,Listen是我们(调试客户端)监听一个端口,当调试服务端准备好了就会连接进行调试。一般习惯选择Attach。

5.3

开始调试

这里介绍一下JDWP协议,JDB Client(被调试程序)在被调试时会启动jdwp线程通过JDWP协议与JDB Server(调试端)进行通信,JDWP协议用于传输调试的行号及局部变量等信息,这个就是为什么一开始反编译为java文件也可以调试的原因了。

当开始调试时红色小虫会变为绿色,说明已经连接上远程调试服务端了。

输入用户名admin和密码abc123

然后在下方就可以看到,左侧为程序的方法调用栈区,显示了程序执行到断点处所调用过的方法,越下面的方法被调用的越早。右侧为方法的变量及值,可以右键更改。可以看到刚刚输入的用户名admin和密码abc123。

使用F8单步调试,F7单步跳入,shift+F8单步跳出

接下来就不多说了。

总结:

这篇文章也是初步的介绍了一下apk的动态调试方法,然而调试、反调试、反反调试处于不断的对抗当中,了解java及android中调试系统的原理以及破除反调试的方法才能从容面对各种坑。

动态分析一般会比静态分析效率更高,但是现在一般程序也不会这么轻易就能调试起来,比如设各种坑让人难以调试,核心算法逐渐写到so里(可以使用ida动态调)。在逆向分析时,还得动静结合,多思考,多学习。

使用IDEA动态调试smali代码的更多相关文章

  1. 动态调试smali代码学习记录

    预备知识 DDMS Dalvik Debug Monitor Serivce,Dalvik调试监控服务,为Android SDK提供的一款拥有监控Dalvik虚拟机的调试软件,启动文件位于<An ...

  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. iOS程序 防止动态调试和代码注入

    http://ruixiazun.blog.163.com/blog/static/9068791820141173588694/ iPhone真实的运行环境是没有sys/ptrace.h抛出.ptr ...

随机推荐

  1. Java 泛型数组

    Java 不支持泛型数组.也就是说, List<String>[] ls = new ArrayList<String>[10]; 是不支持的,而 List<String ...

  2. [Cocos2d-x v3.x]序列帧动画

      简单介绍 Cocos2d-x中.动画的详细内容是依靠精灵显示出来的,为了显示动态图片,我们须要不停切换精灵显示的内容.通过把静态的精灵变为动画播放器从而实现动画效果. 动画由帧组成,每一帧都是一个 ...

  3. Nuget找不到服务器

    Nuget的新地址 http://nuget-prod-v2gallery.trafficmanager.net/api/v2/

  4. C# Interface显式实现和隐式实现

    c#中对接口的实现方式有两种:隐式实现和显式实现,之前一直没仔细看过,今天查了些资料,在这里整理一下. 隐式实现的例子 interface IChinese { string Speak(); } p ...

  5. ado.net 数据库连接的两方式种

    DataAdapter: string connectionString = "data source=127.0.0.1;Database=dong;user id=sa;password ...

  6. Python时间戳和日期

    import time localtime=time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time())) prin ...

  7. 将GridView中的数据导出到Excel代码与注意事项

    //gv:需要导出数据的GridView,filename:导出excel文件名 public void ExportToExcel(GridView gv, string filename) { s ...

  8. IIS发布程序,出现:请求的内容似乎是脚本,因而将无法由静态文件处理程序来处理解决方案

    windows 7(或者windows 2008)+iis7.5 出现如下错误的解决方法: 错误描述:请求的内容似乎是脚本,因而将无法由静态文件处理程序来处理 解决方法: 打开cmd命令窗口,执行如下 ...

  9. 触发器内insert,delete,update判断执行不同的内容

    create trigger tr_aon afor insert,update,delere asbegin IF EXISTS(SELECT 1 FROM inserted) AND NOT EX ...

  10. TEXT类型

    创建文档document.createTextNode("直接就是想打的文本") 然后用 appendChild() 再然后就是一些其他的方法 appendData(a)在a里面直 ...