此文意图:记录一下如何用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
如图所示,成功反编译,华为应用商城的apk并没有加固保护,所以可以直接拿到反编译dex得到的smali源码,反编译结束默认会在apktool 命令的当前目录生成apk同名的文件夹,此处生成的是1,看一下反编译之后的文件夹里有哪些东西?如下图:
这时新建一个文件夹hw_src,将smali文件夹下面的所有子文件夹复制到hw_src文件夹下,然后在AS中打开一个新的工程,如下图去选中刚才我们新建的那个目录hw_src:
导入成功之后,我们需要标记一个新工程的源码根目录,好让AS 进行一下项目的基本配置,具体操作如下:
- 右击hw_src,弹出一个对话框
- 在上面弹出的对话框里选择Mark Direcotry as>
- 然后选择Sources Root
OK,这里我们已经完成项目的基本配置了。
配图说明:
这里我们调试的时候AS里只是将它当成一个普通的JDK项目来进行的,因此我们还需要给它配置一下JDK,如下图:
但要进行调试还需要配置一下Run/Debug Configuration,先简要描述一下:
- 点击AS顶部的菜单Run
- 在弹出的对话框选择Edit Configuration,这时会弹出新的对话框Run/Debug Configurations
- 点击+
- 选择点击+之后出现的对话框里的Remote
- 对当前新建的Configuration进行适当配置,这里我们给他起名:hw-debug,将端口号改成8700,如下图所示:
- 点击AS顶部的菜单Run
到这里的时候工程的所有配置可以说是都完成了,但是,要调试还缺少个关键的AS插件(关联smali工程和运行在Android设备上的进程)smalidea,目前(2017年10月22日 15:39:51)最新版本是0.05,它才是我们可以在AS里直接动态调试smali的关键。可以在这里下载之后从AS的Plugins里选择安装:
当然也可以直接在AS的Plugins里在线安装,安装好之后就可以调试了?恩,对了一半,这才是PC端的准备工作,一般来说手机里运行的软件是release版的,非root的手机里运行是不可以直接调试的,所以我们还需要准备一个可以在Android设备上运行的apk。这里就说一下非root环境下要如何调试,按下面的步骤准备一个可以debug的apk:
先将AndroidManifest.xml里的android:debuggable=”false”改成true,如果没有这个属性,则自己加上android:debuggable=”true”
然后在工程的启动Activity的onCreate的smail代码里插入smail代码:
invoke-static {}, Landroid/os/Debug;->waitForDebugger()V
这样我们就找到了“MainActivity”,这里之所以给“MainActivity”加引号是因为有些启动界面可能不是这名字,例如QQ的是SplashActivity,估计很多app都有SplashActivity这个启动界面类,ok,言归正传,我们找到smail文件要去插入上面那句代码,注意了,此处应该切换到文件管理器界面去找smali源码文件了,走起
ok找到之后在onCreate方法里插入smail代码。
3.修改完Manifest和smali源码之后,我们使用apktool回编译修改生成新的apk,回编译命令:
apktool.bat b 1
回编译完成生成的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关联起来,才会继续执行,看一张截图:
OK,到此就算是结束了,我们已经可以在没有源码的情况下成功调试其他第三方的App了,当然这里没有涉及到加固之类的,所以才能进行的如此顺利,后面找时间分析一下加固的情况如何脱壳。
附上参考链接
http://blog.youkuaiyun.com/jiangwei0910410003/article/details/51456735 (这里的作者是大神)
https://github.com/JesusFreke/smali/wiki/smalidea
最后,看完两篇引用,你会发现我啥都没干,(☄⊙ω⊙)☄,所以只是记录。