1.对apk使用apktool反编译出可调试的smali代码到out文件夹

apktool -d d 定点加粉丝_com.mingniu.wxddjfs_440.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属性的值,该值则为其应用的主类。如下面的例子,主类为 .ui.HomeActivity

<activity android:label="@string/app_name" android:name=".ui.HomeActivity" android:screenOrientation="portrait" android:windowSoftInputMode="stateHidden">

            <intent-filter>

                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>

            </intent-filter>

        </activity>

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

grep -rn "HomeActivity" * 找到主类文件,   

用文本编辑工具打开主类文件,找到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

apktool  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代码这里,这行代码的意思是一直挂起中,等待调试器。

adb install debug.sign.apk

 

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

 

  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即为调试该程序的端口。

用DDMS没有获得调试端口信息,我用的是monitor,如下图

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

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

    1) 菜单Run ->Debug Configurations

    2) 双击Remote Java Application,Host处默认localhost就行,Port填第10步得到的8611,然后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://code.google.com/p/android-apktool/wiki/SmaliDebugging

反编译apk + eclipse中调试smali的更多相关文章

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

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

  2. 【转】一步一步带你反编译apk,并教你修改smali和重新打包

    一.工具介绍: 1.apktool:aapt.exe,apktool.bat,apktool.jar;三个在同一目录结合使用,用来反编译apk,apk重新打包: 2.dex2jar:该工具作用是将cl ...

  3. Uubuntu 14.04 LTS反编译apk

    使用apktool反编译apk 1.安装apktool apktool是Google提供的APK编译工具,能够反编译及回编译apk,需要Java环境的支持(在此不再赘述Java的安装与配置,详见< ...

  4. Atitit.反编译apk android源码以及防止反编译apk

    Atitit.反编译apk android源码以及防止反编译apk 1.1. Tool  apk逆向助手1 1.2. 二.使用dex2jar + jd-gui 得到apk的java源码1 1.3. 用 ...

  5. 反编译apk 修改 合成

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 反编译apk帮助文档 准备工具 dex2jar(dex转换jar工具),下载地址: ht ...

  6. 反编译apk

    一.反编译Apk得到Java源代码 首先要下载两个工具:dex2jar和JD-GUI 前者是将apk中的classes.dex转化成Jar文件,而JD-GUI是一个反编译工具,可以直接查看Jar包的源 ...

  7. Android 反编译apk 详解

    测试环境: win 7 使用工具: CSDN上下载地址: apktool (资源文件获取)  下载          dex2jar(源码文件获取) 下载        jd-gui  (源码查看)  ...

  8. Xamarin android如何反编译apk文件

    Xamarin android 如何反编译 apk文件 这里推荐一款XamarinAndroid开发的小游戏,撸棍英雄,游戏很简单,的确的是有点大.等一下我们来翻翻译这个Xamarin Android ...

  9. 如何反编译APK?

    1.概述 一些商业的app都包含很多精美的图片还有一些比较好的配置文件,以前某师兄就说过apk把后缀改为zip,然后解压一下就可以获得很多图片资源,但是这时候你打开一下解压出来的xml资源全是乱码.通 ...

随机推荐

  1. 偏于SQL语句的 sqlAlchemy 增删改查操作

    ORM 江湖 曾几何时,程序员因为惧怕SQL而在开发的时候小心翼翼的写着sql,心中总是少不了恐慌,万一不小心sql语句出错,搞坏了数据库怎么办?又或者为了获取一些数据,什么内外左右连接,函数存储过程 ...

  2. ibatis中integer类型

    假如java代码中设置的返回类型是integer类型,ibatis实际上返回的是BigDecimal,也就是说  ibatis转换成integer默认是bigdecimal类型的

  3. python操作word(改课文格式)【最终版】

    python操作word的一些方法,前面写了一些感悟,有点跑题,改了下题目,方便能搜索到.心急的可以直接拉到最后看代码,我都加了比较详细的注释. 从8.3号早上9点,到8.8号下午5点半下班,终于把这 ...

  4. C++基本功之Operator

    废话不多说,这次讲的是 Operator overload. 关于operator, 在 < The C++ Programing Language > 里的描述,可以用做overload ...

  5. Nginx + Lua + 共享内存

    转自:http://blog.csdn.net/lxb_champagne/article/details/17099383 lua_package_path "/usr/local/sha ...

  6. 点击edittext并显示其内容

    package com.example.sum;//sum import com.example.sum.R;//sum import android.app.Activity; import and ...

  7. java-I/O File类(5)-Reader和Writer、OutputStreamWriter 、BufferedWriter、字节流和字符流的区别

      标签: outputstreamwriterreader字符file方法 2015-05-14 23:06 469人阅读 评论(0) 收藏 举报  分类: 孙鑫-java基础(16)  I-O(4 ...

  8. 转载:基于Redis实现分布式锁

    转载:基于Redis实现分布式锁  ,出处: http://blog.csdn.net/ugg/article/details/41894947 背景在很多互联网产品应用中,有些场景需要加锁处理,比如 ...

  9. 【mysql】一次有意思的数据库查询分析。

    本文是在做一家汽车配件的电商网站时,大体情景是一个List.php页面,该页面分页列出部分配件并统计总数量用于分页. 当然该页面中也可以指定一下查询条件,如适配的车辆品牌.车系.排量.年份等,一件商品 ...

  10. Mac 文件读写权限问题 OSError: Operation not permitted

    Mac在OS X 10.11以后加入了Rootless功能,主要是限制了root权限,阻止用户对部分路径下的目录进行更改.受到限制的有以下目录: /System /bin /sbin /usr (ex ...