从来没有想过反编译apk是来的如此方便,并且还可以修改后重新编译运行,这比在win下修改pe容易多了,感谢apktool和smali工具的作者提供这么好的工具。

跟踪apk一般的做法是在反编译的smali代码中插入log输出,然后重新编译运行看输出日志,这种方法费时费力,如果能够实时调试是最好的了。搜了一下,目前比较好的方法是使用NetBeans+DDMS。我尝试过可以调试,但不大认识NetBeans的操作,eclipse估计很多人都会吧,其实设置跟NetBeans大同小异。

调试步骤:

1.对apk使用apktool反编译出可调试的smali代码到out文件夹,目前apktool最新的版本是2.0.0b7。

java -jar apktool_2.0.0b7.jar d -d test.apk -o out

这里必须使用-d参数,这样反编译出来的代码后缀均是java,因为只有java文件才能被eclipse/netbeans识别调试。

2.设置调试标记和寻找主类

在输出的out文件夹中,用文本编辑工具打开AndroidManifest.xml,在application节点中设置属性android:debuggable="true"。

继续在AndroidManifest.xml中,搜索以下关键字

<intent-filter><action android:name="android.intent.action.MAIN"/><category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>

找到含有以上信息的activity节点,记录其android:name属性的值,该值则为其应用的主类。如下面的例子,主类为com.acids.helloworld.MainActivity。

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.acids.helloworld"><application android:debuggable="true" android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme"><activity android:label="@string/app_name" android:name="com.acids.helloworld.MainActivity"><intent-filter><action android:name="android.intent.action.MAIN"/><category android:name="android.intent.category.LAUNCHER"/></intent-filter></activity></application>
</manifest>

3.在主类的onCreate事件中添加调试等待。

用文本编辑工具打开主类文件,找到onCreate方法,在第一句前插入invoke-static {}, Landroid/os/Debug;->waitForDebugger()V,记得添加a=0;//的前缀保持上下一致,结果如下:

a=0;// # virtual methods
a=0;// .method protected onCreate(Landroid/os/Bundle;)V
a=0;//     invoke-static {}, Landroid/os/Debug;->waitForDebugger()V
a=0;//
a=0;//     .locals 1
a=0;//     .param p1, "savedInstanceState"    # Landroid/os/Bundle;
a=0;//
a=0;//     .prologue
a=0;//     .line 11
a=0;//     invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V

4.保存文件,用apktool重新编译打包为debug.apk

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

5.对debug.apk签名(需要下载签名工具),我把签名工具放在了signapk文件夹下,生成debug.sign.apk

java -jar .\signapk\signapk.jar .\signapk\testkey.x509.pem .\signapk\testkey.pk8 .\debug.apk .\debug.sign.apk

6.上传debug.sign.apk至手机或模拟器,然后安装并运行。这时你会看到程序运行后停留在白屏界面,这时不要动设备和退出程序,因为程序现在是运行到刚才添加的waitForDebugger代码这里,这行代码的意思是一直挂起中,等待调试器。

下面开始设置实时调试的环境。

7.启动eclipse,构建java项目

1) File -> New -> Project -> Java Project -> Next

2) Project Name随便起,Use default location选项去掉,Location选择out文件夹,然后Next

3) 把smali文件夹设为Source Folder,然后Finish

8.在eclipse中,打开第2步找到的主类,并找到onCreate方法,在waitForDebugger后面的第一个方法开始添加断点。如下图

9.打开DDMS(路径在%android-sdks%\tools\ddms.bat),如果在第6步中运行了修改后的程序,在DDMS的设备列表中会显示可以调试的程序。

对应程序最后一栏为8600/8700,其中8600即为调试该程序的端口。

10.现在要做的就是把代码与调试程序关联即可。 回到eclipse,配置远程调试

1) 菜单Run -> Debug -> Debug Configurations

2) 双击Remote Java Application,Host处默认localhost就行,Port填第10步得到的8600,然后Apply -> Debug。

11.这时eclipse自动切换至debug视图,并看到程序已经运行并中断在下一行可执行的代码了,相关的变量可以直接查看了。

总结

已经可以用eclipse调试smali了,上面的例子是从程序开头的地方开始调试,但要调试到自己所关心地方的代码处确实麻烦。建议先用jd-gui等软件直接查看反编译的java代码,确定要调试的位置后,再进入smali定位断点并实时调试,就可以事半功倍。如果不需要在程序的开头调试的话,建议把第三部的代码注释掉。

相关工具可以在这里下载

apktool: https://code.google.com/p/android-apktool/

dex2jar: https://code.google.com/p/dex2jar/

jd-gui: http://jd.benow.ca/

转载请注明原文地址:http://www.cnblogs.com/litou/p/3539281.html

转载于:https://www.cnblogs.com/litou/p/3539281.html

[Android]反编译apk + eclipse中调试smali相关推荐

  1. android反编译APK后,是smali文件,能反编译成dex文件

    我也面临相同的问题,但目前还没找到类似反编译smali文件的方法,一般得到dex文件只需要用WinRAR或其他压缩软件打开apk文件就能得到.但也有例外好像,技术先进了,今天遇到个apk用WinRAR ...

  2. android反编译apk文件

    android反编译apk文件 android运行的是.dex文件的二进制码,java运行的是.class文件的码,那么android是怎么将.java格式的文件转换为.dex的文件?------&g ...

  3. Android反编译apk修改版本号重新打包签名详细教程(超详细)

    文章目录 一.反编译工具介绍 1:apktool 获取资源文件 2:dex2jar(源码文件获取) 3:jd-gui 查看APK中classes.dex转化成出的jar文件,即源码文件 二.apkto ...

  4. 如何查看apk安装包源代码??Android反编译apk,解包,打包,签名一体化实测 ,修改图片音频软件名称版本号等入门

    首先下载反编译工具包 下载地址 链接:  https://zly520.lanzoui.com/ibtuxhf7rab 一.反编译工具介绍 首先 如果你想改动图片音频之类的,见末尾! 1.apktoo ...

  5. Android 反编译 apk

    反编译需要使用到三个工具,获取apk里面的资源使用apktool,反编译Java代码使用dex2jar,查看反编译之后的jar文件使用jd-gui. 1.apktool工具可以反编译apk文件,然后拿 ...

  6. Android 反编译Apk提取XML文件

    Apktool https://ibotpeaches.github.io/Apktool/install/ 下载地址:Apktool https://bitbucket.org/iBotPeache ...

  7. Android 反编译APK详解

    目录 一,所需工具 二,Apk反编译获取源码 三,apk反编译获取资源文件 四,反编译apk获取资源文件方式二 附 一,所需工具 apktool (资源文件获取)  下载路径:https://ibot ...

  8. android apk xml文件,Android 反编译Apk提取XML文件

    Apktool 下载地址:Apktool 打开cmd终端:java -jar apktool_2.3.3.jar  d xxx.apk 示例: D:\TOOL\Android反编译工具[全]\2018 ...

  9. Android 反编译apk文件(转)

    需要的工具: apktool:将apk文件反编译成原始的目录文件 地址:http://code.google.com/p/android-apktool/downloads/list dex2jar: ...

最新文章

  1. 字符串编辑距离(Edit Distance)
  2. python数据分析常用的算法_萌新向Python数据分析及数据挖掘 第三章 机器学习常用算法 第二节 线性回归算法 (上)理解篇...
  3. serverlet filter
  4. 十招搞定SQL2K安全
  5. java pdfbox 解析报错_pdfbox 读取文件报错 java.io.IOException: Page tree root must be a dictionary...
  6. 如何化身BAT面试收割机?不吃透都对不起自己
  7. nginx 配置虚拟主机
  8. 中兴b860a拆机_【中兴ZXV10B860A魔盒外观展示】接口|线材|插线_摘要频道_什么值得买...
  9. 网页加载CAD图纸的两个方案对比说明
  10. css黄金色渐变值,金色的rgb值是多少
  11. python的类,复现assert和eval成功失败原因
  12. 逻辑题(持续更新中)
  13. 【转载】正则表达式好文【30分钟教程】
  14. 网络-单播、多播(组播)和广播的区别
  15. 网易邮箱服务器邮箱协议,网易邮箱全面支持Exchange协议
  16. Mary_Morton [XCTF-PWN][高手进阶区]CTF writeup攻防世界题解系列17
  17. 流程图制作: BPMN流程图在线绘制
  18. python爬财务数据_会计终于不用被老板催着做报表,现在95%的财务都在悄悄办这事了!...
  19. 复旦计算机课程谁的好,复旦大学计算机研究生导师有哪些
  20. 微信小程序一秒学会制作table表格

热门文章

  1. 机器学习笔记(十三)半监督学习
  2. MapReduce基础开发之二数据去重和排序
  3. Leetcode 217. 存在重复元素 解题思路及C++实现
  4. 如何求一个数的因数 c语言代码,【代码】求一个数的因数和、求优化、顺便也供新人参考算法...
  5. php定义枚举,PHP中Enum(枚举)用法实例详解
  6. 计算机组成原理——概述3
  7. JS知识点笔记-常用方法
  8. 入门写博客之markdown语法
  9. CTFshow 反序列化 web270
  10. CTFshow php特性 web149