使用Android Sutdio 调试smali源码

此文意图:记录一下如何用Android Studio(下文都用AS作为Android Studio的简称,这里我用的AS版本是2.3.3)调试smali代码,方便后面查阅,没有针对哪家apk的意思。

首先先用apktool反编译一个apk得到smail文件,这里我用的apk是华为应用市场的apk。

为了输入命令方便我把apk重命名成1.apk,然后使用apktool工具进行反编译。命令如下 :

apktoo.bat d -f 1.apk

使用Android Sutdio 调试smali源码_第1张图片
如图所示,成功反编译,华为应用商城的apk并没有加固保护,所以可以直接拿到反编译dex得到的smali源码,反编译结束默认会在apktool 命令的当前目录生成apk同名的文件夹,此处生成的是1,看一下反编译之后的文件夹里有哪些东西?如下图:

使用Android Sutdio 调试smali源码_第2张图片
这时新建一个文件夹hw_src,将smali文件夹下面的所有子文件夹复制到hw_src文件夹下,然后在AS中打开一个新的工程,如下图去选中刚才我们新建的那个目录hw_src:
使用Android Sutdio 调试smali源码_第3张图片

导入成功之后,我们需要标记一个新工程的源码根目录,好让AS 进行一下项目的基本配置,具体操作如下:

  1. 右击hw_src,弹出一个对话框
  2. 在上面弹出的对话框里选择Mark Direcotry as>
  3. 然后选择Sources Root
  4. OK,这里我们已经完成项目的基本配置了。

    配图说明:
    使用Android Sutdio 调试smali源码_第4张图片

    这里我们调试的时候AS里只是将它当成一个普通的JDK项目来进行的,因此我们还需要给它配置一下JDK,如下图:
    使用Android Sutdio 调试smali源码_第5张图片

    但要进行调试还需要配置一下Run/Debug Configuration,先简要描述一下:

    1. 点击AS顶部的菜单Run
      使用Android Sutdio 调试smali源码_第6张图片
    2. 在弹出的对话框选择Edit Configuration,这时会弹出新的对话框Run/Debug Configurations
    3. 点击+
    4. 选择点击+之后出现的对话框里的Remote
      使用Android Sutdio 调试smali源码_第7张图片
    5. 对当前新建的Configuration进行适当配置,这里我们给他起名:hw-debug,将端口号改成8700,如下图所示:
      使用Android Sutdio 调试smali源码_第8张图片

到这里的时候工程的所有配置可以说是都完成了,但是,要调试还缺少个关键的AS插件(关联smali工程和运行在Android设备上的进程)smalidea,目前(2017年10月22日 15:39:51)最新版本是0.05,它才是我们可以在AS里直接动态调试smali的关键。可以在这里下载之后从AS的Plugins里选择安装:
使用Android Sutdio 调试smali源码_第9张图片

当然也可以直接在AS的Plugins里在线安装,安装好之后就可以调试了?恩,对了一半,这才是PC端的准备工作,一般来说手机里运行的软件是release版的,非root的手机里运行是不可以直接调试的,所以我们还需要准备一个可以在Android设备上运行的apk。这里就说一下非root环境下要如何调试,按下面的步骤准备一个可以debug的apk:

  1. 先将AndroidManifest.xml里的android:debuggable=”false”改成true,如果没有这个属性,则自己加上android:debuggable=”true”

    使用Android Sutdio 调试smali源码_第10张图片

  2. 然后在工程的启动Activity的onCreate的smail代码里插入smail代码:
    invoke-static {}, Landroid/os/Debug;->waitForDebugger()V
    ,这句对应的java代码就是:Debug.waitForDebugger(),中文意思:等待调试。我们先去Manifest里找一下哪个是“MainActivity”,我们搜一下字符串launcher(为什么搜launcher,自己思考吧,hin hin),
    使用Android Sutdio 调试smali源码_第11张图片
    这样我们就找到了“MainActivity”,这里之所以给“MainActivity”加引号是因为有些启动界面可能不是这名字,例如QQ的是SplashActivity,估计很多app都有SplashActivity这个启动界面类,ok,言归正传,我们找到smail文件要去插入上面那句代码,注意了,此处应该切换到文件管理器界面去找smali源码文件了,走起

    使用Android Sutdio 调试smali源码_第12张图片
    ok找到之后在onCreate方法里插入smail代码。
    使用Android Sutdio 调试smali源码_第13张图片
    3.修改完Manifest和smali源码之后,我们使用apktool回编译修改生成新的apk,回编译命令:

  apktool.bat b 1

使用Android Sutdio 调试smali源码_第14张图片
回编译完成生成的apk没有签名,也没有进行对齐,那么先签名,这里用.jks证书签名,zip_align对齐,具体命令如下:

  • 签名,签名命令:
    jarsigner -verbose -keystore E:\keystore\akeychat_android_app.jks -signedjar 1-signed.apk 1.apk 【key_store_alias】

    E:\keystore\akeychat_android_app.jks是签名证书所在路径,
    1-signed.apk是签名之后将要生成的apk文件名,1.apk是将要被签名的apk文件名,最后key_store_alias是签名证书的alias,举个栗子,加入keystore的alias是android_debug,那么上述的签名命令行就是:
    jarsigner -verbose -keystore E:\keystore\akeychat_android_app.jks -signedjar 1-signed.apk 1.apk android_debug

  • 字节对齐
    zipalign -f 4 1-signed.apk 1-signed-aligned.apk,此处1-signed-aligned.apk是签名之后生成的apk文件名,zipalign是放在Android_SDK/build-tools/25.0.3/目录下,这里25.0.3就是build-tool的版本号,用哪个版本的编译随意,只要能通过即可。

apk准备好之后,将修改过的apk安装到手机中,然后打开App,此时因为前面我们修改的那句smali代码,app会处于等待调试器连接状态,直到我们点击AS中的debug按钮让调试器和App关联起来,才会继续执行,看一张截图:
使用Android Sutdio 调试smali源码_第15张图片

OK,到此就算是结束了,我们已经可以在没有源码的情况下成功调试其他第三方的App了,当然这里没有涉及到加固之类的,所以才能进行的如此顺利,后面找时间分析一下加固的情况如何脱壳。

附上参考链接

http://blog.csdn.net/jiangwei0910410003/article/details/51456735 (这里的作者是大神)
https://github.com/JesusFreke/smali/wiki/smalidea

最后,看完两篇引用,你会发现我啥都没干,(☄⊙ω⊙)☄,所以只是记录。

你可能感兴趣的:(安卓开发,逆向工程)