1.简介
调跳无源码apk,通过修改smali文件添加打印log, 很费劲,而且效率很低,现在通过apktool + eclipse 能够动态的调试smali 文件,能够进行单步,断点,查看寄存器操作。
2. 反编译apk
apktool.bat d -d NewTest.apk
这里必须使用-d参数,这样反编译出来的代码后缀均是java,因为只有java文件才能被eclipse/netbeans识别调试3.添加调试属性到AndroidManifest.xml
打开AndroidManifest.xml,在application节点中设置属性android:debuggable="true"
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.newtest" platformBuildVersionCode="22" platformBuildVersionName="5.1.1-1819727">
<application android:allowBackup="true" android:debuggable="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme">
<activity android:label="@string/app_name" android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
4.在Activity 中添加等待调试代码
当然了,你也可以在其他的地方添加等待调试代码,比如你可以在Application 类中加入,这样,你就可以设置断点在Application 类里面。
调试等待代码: 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;// .locals 1
a=0;// .param p1, "savedInstanceState" # Landroid/os/Bundle;
a=0;//
a=0;// .prologue
a=0;// .line 12
a=0;// invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V
5.重新打包,签名,安装apk, 运行apk
重新打包也要添加-d 参数
6.设置eclipse来进行调试
启动eclipse,创建java项目
1) File -> New -> Project -> Java Project -> Next
2) Project Name随便起,Use default location选项去掉,Location选择out文件夹,然后Next
3) 把smali文件夹设为Source Folder,然后Finish
4)在eclipse中,打开第2步找到的主类,并找到onCreate方法,在waitForDebugger后面的第一个方法开始添加断点。如下图
6) 关联代码与调试程序,配置远程调试
1) 菜单Run -> Debug -> Debug Configurations
2) 双击Remote Java Application,Project选择要关联的项目,Host处默认localhost就行,Port填上面得到的8602,然后Apply -> Debug。
然后eclipse自动切换至debug视图,并看到程序已经运行并中断在下一行可执行的代码了,相关的变量可以直接查看了。