[Android]反编译apk + eclipse中调试smali
从来没有想过反编译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..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..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
[Android]反编译apk + eclipse中调试smali的更多相关文章
- 反编译apk + eclipse中调试smali
1.对apk使用apktool反编译出可调试的smali代码到out文件夹 apktool -d d 定点加粉丝_com.mingniu.wxddjfs_440.apk -o out 这里必须使用-d ...
- Android 反编译apk 详解
测试环境: win 7 使用工具: CSDN上下载地址: apktool (资源文件获取) 下载 dex2jar(源码文件获取) 下载 jd-gui (源码查看) ...
- Android 反编译apk
工具介绍: apktool 作用:资源文件获取,可以提取出图片文件和布局文件进行使用查看 下载地址:https://bitbucket.org/iBotPeaches/apktool/downl ...
- Android 反编译Apk提取XML文件
Apktool https://ibotpeaches.github.io/Apktool/install/ 下载地址:Apktool https://bitbucket.org/iBotPeache ...
- Android反编译apk并重新打包签名(Mac环境)
工具下载 apktool :https://ibotpeaches.github.io/Apktool/install dex2jar:https://github.com/pxb1988/dex2j ...
- Android反编译APK
http://blog.csdn.net/vipzjyno1/article/details/21039349/ 关于被加壳工具添加我的apk如何脱壳 http://www.blogfshare.co ...
- android 反编译(dex 和 odex),非脑残转帖,绝对可靠
Android 反编译 反编译odex文件(比如framework.odex),若是反编译dex,直接第4步 1.因为反编译odex的工具在D:\Develop tools\android反编译工具\ ...
- Android反编译调试源码
Android反编译调试源码 1. 反编译得到源码 直接在windows 命令行下输入命令java -jar apktool_2.0.0.jar d -d 小米运动_1.4.641_1058.apk ...
- Atitit.反编译apk android源码以及防止反编译apk
Atitit.反编译apk android源码以及防止反编译apk 1.1. Tool apk逆向助手1 1.2. 二.使用dex2jar + jd-gui 得到apk的java源码1 1.3. 用 ...
随机推荐
- [css]后台管理系统布局
知识点: 绝对定位+overflowhidden 整体思路 三大块 pg-header---需要固定 (height:48px) pg-content menu 右侧菜单-需要固定(width:200 ...
- 谷歌上不去了,长久解决方式。能够稳定高速上Google和Gmail
稳定上Google的神器 国内Google很不稳定.速度慢且常常上不去,通过"我要上Google".能够安全稳定地使用Google.Gmail.Google+等平时须要特殊手段才干 ...
- The Way to Go读书笔记_第4章_基本结构和基本数据类型
“_”标识符 _ 本身就是一个特殊的标识符,被称为空白标识符.它可以像其他标识符那样用于变量的声明或赋值(任何类型都可以赋值给它),但任何赋给这个标识符的值都将被抛弃,因此这些值不能在后续的代码中使用 ...
- linux学习笔记命令篇1---命令ls
前言: linux中接触最多的就是命令和文件. 命令 命令是有其格式的, 一般格式是command [option] parameter1 parameter2 [paramete3 ...]: 注 ...
- 请说出ArrayList,Vector, LinkedList的存储性能和特性
请说出ArrayList,Vector, LinkedList的存储性能和特性 解答:ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都 ...
- Windows Server2008R2中导入Excel
使用Microsoft.ACE.OLEDB对Excel进行操作: string strConn = "Provider=Microsoft.ACE.OLEDB.12.0;" + & ...
- The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Cha
The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Cha ...
- 第9步:ASMCA创建磁盘组
注意,创建磁盘组时需要以grid用户身份执行,在那之前可能需要以root身份执行xhost+,即命令: 代码1 [root@sgdb1~]# xhost+ [root@sgdb1~]# su – gr ...
- VC++ 带界面的ActiveX控件
一.新建MFC ActiveX工程OleHasInterface: 二.新建一个对话框资源,ID为 IDD_FORMVIEW,关联类CActXInterfaceDlg,基类CDialog: 三.设计对 ...
- oralce函数
1.trunc函数处理数字和日期TRUNC(NUMBER[,DECIMAL]) 数字格式TRUNC(DATE[,FOMAT]) 日期格式2.round函数(四舍五入)ROUND(NUMBER[,DEC ...