反编译apk + eclipse中调试smali

[Android]反编译apk + eclipse中调试smali


Admin
2014年2月10日
名人名言:大概思想的放射,总是以孕育思想的力量为准的,头脑要把思想送到什么地方,思想便落在什么地方,准确性不下于从炮身里飞出的弹丸,效果却各个不同。有些娇嫩的个性,思想可以钻进去损坏组织;也有些武装坚强的个性,铜墙铁壁式的头脑,旁人的意志打上去只能颓然堕下,好像炮弹射着城墙一样;还有软如棉花的个性,旁人的思想一碰到它便失掉作用,犹如炮弹落在堡垒外的泥沟里。——巴尔扎克 

    从来没有想过反编译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/


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值