使用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 ...
随机推荐
- C++ lambda 表达式传递的变量默认不可变
我遇到例如以下问题: int count=0; listener->onTouchMoved=[count](Touch* t,Event* e){ count++; log("onT ...
- Linux 与 BSD 有什么不同?
Linux 与 BSD 有什么不同? 这篇文章是别人写的,并做了一点修改. 汉澳sinox就是基于bsd开发的,因此能够理解为一个bsd分支,可是由于sinox不开源,被排除在外.bsd不是商业软件, ...
- VB.NET入门基础
众所周知,Visual Basic.NET是由Visual Basic发展而来,这两者之间的升级使得Visual Basic语言发生了革命性的变革,使得由基于对象编程的Visual Basic过渡到了 ...
- OpenSSL之PKey的EVP封装
在Openssl中,非对称加密涉及到两个密钥.一个为公开的密钥(公钥),一个为非公开的密钥.而OpenSSL中非对称加密算法有RSA.DSA.ECC,他们的原理不同,因此其密钥结构不同.下面我们列出我 ...
- Mybatis高级映射、动态SQL及获得自增主键
一.动态SQL 相信大家在用mybatis操作数据库时时都会碰到一个问题,假如现在我们有一个关于作者的list authorList,需要根据authorList里已有的作者信息在数据库中查询相应作者 ...
- Tips:javascript 图片放大和取得尺寸
1)获取图片尺寸 <img src="http://img.my.csdn.net/uploads/201309/03/1378223257_7957.jpg" alt=&q ...
- NSData的一些用法
//NSData遵循NSCopying NSCoding协议,它提供面向对象的数组存储为字节 //适用与读写文件,而读写文件的时候需要一个缓冲区,而NSDate就提供了这么一个缓存区 //定义一个ch ...
- 开发日志_Jan.9
今天主要工作为修改昨天的碰撞引擎不符合预期的部分. 经过了昨天的工作,碰撞算法已经初见雏形.但是主要有两个问题: 碰撞反弹的方向与预期不符合 碰撞后球与机器人存在一个"黏在一起"的 ...
- jquery中attr与pror
- WPF合并资源字典
1.合并多个外部资源字典成为本地字典 示例代码 <Page.Resources> <ResourceDictionary> <ResourceDictionary.Mer ...