使用IDEA动态调试smali代码
原创,转载请注明出处。
一般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代码的更多相关文章
- 动态调试smali代码学习记录
预备知识 DDMS Dalvik Debug Monitor Serivce,Dalvik调试监控服务,为Android SDK提供的一款拥有监控Dalvik虚拟机的调试软件,启动文件位于<An ...
- 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代码就欲哭无泪了 ...
- iOS程序 防止动态调试和代码注入
http://ruixiazun.blog.163.com/blog/static/9068791820141173588694/ iPhone真实的运行环境是没有sys/ptrace.h抛出.ptr ...
随机推荐
- [Angular 2] Interpolation: check object exists
In Angular2, sometime we use @Output to pass data to parent component, then parent may pass the data ...
- android GestureDetector 手势的判断
import android.app.Activity;import android.os.Bundle;import android.util.Log;import android.view.Ges ...
- chmod
0表示没有权限,1表示可执行权限,2表示可写权限,4表示可读权限数字与字符对应关系如下:r=4,w=2,x=1若要rwx属性则4+2+1=7若要rw-属性则4+2=6:若要r-x属性则4+1=5命令: ...
- Linux命令 tar 打包解压缩
--打包:tartar -cvf 命名文件.tar 要压缩的目录tar -xvf 要解压的包.tartar -tf 要查看的包.tartar -f 包.tar -r file ...
- 服务 进程间通讯 IPC AIDL Parcelable 简介
1.IBinder和Binder是什么鬼? 我们来看看官方文档怎么说: 中文翻译: IBinder是远程对象的基本接口,是为了高性能而设计的轻量级远程调用机制的核心部分. 但他不仅用于远程调用,也用 ...
- 服务 远程服务 AIDL 进程间通讯 IPC
Activity aidl接口文件 package com.bqt.aidlservice; interface IBinderInterface { /* 更改文件后缀为[.aidl]去掉 ...
- C#。5 结构体
结构体:相当于是我们自己定义的一种复杂的类型. 常见简单类型:int... double float bool char string 常见复杂类型:DateTime 数组类型 生活中大部份的对象 ...
- JAVA泛型解释
理解Java泛型最简单的方法是把它看成一种便捷语法,能节省你某些Java类型转换(casting)上的操作: 1 List<Apple> box = ...; 2 Apple apple ...
- ASP.net导出Excel的几种方式
2.导出多个sheet页的Excel 在Office Excel 中设计好 导出的格式,然后另存为xml电子表格,然后用记事本打开保存的xml文件,复制内容放入程序Response.Write() 输 ...
- Visual Studio 2015开发Android App问题集锦
Visual Studio 2015开发Android App 启动调试始终无法完成应用部署的解决方案 创建一个Android App项目后,直接启动调试发现Visual Studio Emulato ...