zoukankan      html  css  js  c++  java
  • 反编译apk + eclipse中调试smali

    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% oolsddms.bat),如果在第6步中运行了修改后的程序,在DDMS的设备列表中会显示可以调试的程序。

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

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

    image

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

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

        1) 菜单Run ->Debug Configurations

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

    image

     

    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

  • 相关阅读:
    基于select的IO多路复用并发模型
    (p ython +tcp+tcp)文件传输
    udp协议与进程结合(群聊)
    python递归拷贝目录和线程拷贝目录
    利用线程对文件进行分割
    tcp与线程结合
    tcp 文件传输
    mysql数据库 (使用) 测试题
    json写入文件
    ArcEngine——获取要素几何(非游标方式)
  • 原文地址:https://www.cnblogs.com/cute/p/4092701.html
Copyright © 2011-2022 走看看