前言
最近一直在学习Android逆向方面的知识,了解了APK的逆向流程,决定那小米的米家对讲APP开刀作为练手。这次仅仅是对米家对讲机APP进行反编译和回编译操作,不涉及到代码的注入。
开刀工具
1.常用逆向工具
apktool:反编译的利器
dex2jar:将dex转化成jar
jd-gui:很好的查看jar文件的工具
IDA:收费的最全破解利器(分析dex和so都可以)
2.逆向破解流程
(1).拿到一个APK,先使用apktool进行反编译,输入指令
apktool.bat b test.apk得到smali文件和其他的一些资源文件。
(2).将apk文件后缀名(.apk)改写成.zip文件,然后解压得到
classes.dex文件。
(3).将classes.dex文件拷贝到dex2jar路径下,运行指令(dex2jar
classes.dex)得到jar文件。
(4).使用jd-gui文件打开jar文件即可以看到java源代码。
(5).如果要对源代码进行修改,则需要在smali文件基础上改动,修
改的前提是需要懂smali语法。
(6).回编译。对文件再次打包签名生产新的apk,使用指令
(apktool.bat b test -o new_test.apk)进行回编译,其中test为反
编译后得到的含有smali的文件。
(7).签名。目前android签名有两个工具,分别为jarsign工具签名和
signapk工具签名。这两种签名方式大致区别如下:
a.jarsign是Java本生自带的一个工具,他可以对jar进行签名的。而
signapk是后面专门为了Android应用程序apk进行签名
的工具。
b.jarsign工具签名时使用的是keystore文件,signapk工具签名时
使用的是pk8,x509.pem文件。
在这里我使用的是signapk进行签名的,签名是必须将pk8,x509.pem两个文件放在同一个目录下,使用指令(java -jar signapk.jar testkey.x509.pem testkey.pk8 debug.apk debug.sig.apk)进行签名。这两个文件会在文章的尾部给出的共享资源下载地址提供下载,至于第一种签名方式详细解看一下博客链接地址。
关于签名的详细讲解可以查看尼古拉斯赵四大神的博客,博客地址为
http://www.wjdiankong.cn/android%E7%AD%BE%E5%90%8D%E6%9C%BA%E5%88%B6%E4%B9%8B-%E7%AD%BE%E5%90%8D%E8%BF%87%E7%A8%8B%E8%AF%A6%E8%A7%A3/
http://www.wjdiankong.cn/android%E7%AD%BE%E5%90%8D%E6%9C%BA%E5%88%B6%E4%B9%8B-%E7%AD%BE%E5%90%8D%E9%AA%8C%E8%AF%81%E8%BF%87%E7%A8%8B%E8%AF%A6%E8%A7%A3/
Smali文件分析
当我们使用apktool工具反编译后会得到smali文件,smali文件中包含了自己写的代码以及使用的第三方库,如下图,其中com开头一般是自己编写的代码对应的smali文件,下面的图中还包括了butterknife和okhttp3一些第三方框架。
文件结构.png现在开始了分析自己编写的代码以及使用的一些资源文件,分析之前先瞅一下smali的真面容,如下图
Paste_Image.png
初次看肯定有种懵逼的感觉,不过学习下smali基础语法就会觉得小菜一碟。在samli文件中可以看出当我们每编写的一个类都会对应一个smali文件,同时也包括资源文件,在资源文件下如drawable和layout中的xml文件也会生产唯一对应的smali文件,这种文件一般以R$文件包名命名,如layout文件为R$layout.smali,同时也包括所有的id也会生成R$id.smali文件。如下图
Paste_Image.png在我们反编译的过后的资源文件中,有两个文件很重要,分别是public.xml和ids.xml,它保存了一个资源id的值及名称,如上图中的高亮部分的代码(const v0,0x7f10011)在smali文件中调用资源文件时时通过值去调用的,我们都知道在java文件中设置布局文件只需要通过R.layout+文件名去调用资源文件,而在smali文件通过十六机制值调用,而在public.xml中将文件名与值进行关联,而同时在ids.xml中声明。这两个文件当我们在进行hook代码时中涉及到添加资源文件时很关键,当我们添加了新的资源文件,都必须在这两个文件中进行声明,分配想要的十六进制值,然后在调用的地方进行调用,这两个文件一般都是values文件夹下。
牛刀初试
接下来我们就拿米家对讲机APP开刀。
(1)首先将下载好的apk 和apktool放在同一个目录文件下,输入指令(apktool.bat d test.apk)的到smali文件。
上图为反编译后的文件目录,从文件中可以看有两个smali文件目录,可以猜测到该app的方法数超过了65536的限制,在编译时编译出两个dex文件,在第二步得到dex文件来验证下我们的猜测。
(2)将Apk文件后缀改为.zip文件。然后解压得出dex文件。
通过解压后可以看出果然存在两个dex文件,验证了我们第一步的猜想。
(3)将dex文件和dex2jar放在同一个目录下得到,输入指令(dex2jar classes.dex)jar文件,然后使用jd-gui打开该文件。
(4)现在如果们想进行代码hook,那就可以在smali代码的基础上进行修改,不过一般不建议直接修改smali代码,一般都是写好Java代码然后转换成smali代码进行注入。java转smali咋Android studuio中有插件(jJava2Smali),装插件后就可以轻松实现啦。我么这里不进行代码的注入,仅仅对该文件进行回编译得到新的apk。选择文件输入指令(apktool.bat b test -0 my_unsigned_test.apk)生产apk。在回编译时我们遇到一个错误 :
No resource found that matches the given name '@android style/Animation.LockScreen和No resource found that matches the given name '@android style/Animation.OptionsPanel
导致回编译不能成功,刚开始以为该APK做了防止二次打包进行的校验,后来查阅资料知道是由于该APK引用第三库导致的。正确的解决方法在将
Animation.LockScreen和Animation.OptionsPanel声明的地方删掉,回编译通过。这个调用的一般格式如下
<style name="Base.TextAppearance.AppCompat.Widget.Button.Borderless.Colored" parent="@android:style/Animation.OptionsPanel" />
<style name="Base.TextAppearance.AppCompat.Widget.Button.Colored" parent="@android:style/Animation.LockScreen" />
(5)将未签名的Apk进行签名。
经过以上的简单五步就实现了对米家对讲机APP的简单逆向分析。
最后放大招,现在网上有很多奖反编译继承在一起的逆向工具,将所有文件继承与右键,分析很方便,如下图
网友评论