美文网首页
一次逆向分析之旅

一次逆向分析之旅

作者: 一只小菜鸟的进阶之路 | 来源:发表于2017-05-31 20:40 被阅读0次

    前言

    最近一直在学习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文件。

    Paste_Image.png

    上图为反编译后的文件目录,从文件中可以看有两个smali文件目录,可以猜测到该app的方法数超过了65536的限制,在编译时编译出两个dex文件,在第二步得到dex文件来验证下我们的猜测。
      (2)将Apk文件后缀改为.zip文件。然后解压得出dex文件。

    Paste_Image.png

      通过解压后可以看出果然存在两个dex文件,验证了我们第一步的猜想。
      (3)将dex文件和dex2jar放在同一个目录下得到,输入指令(dex2jar classes.dex)jar文件,然后使用jd-gui打开该文件。

    Paste_Image.png

      (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的简单逆向分析。
    最后放大招,现在网上有很多奖反编译继承在一起的逆向工具,将所有文件继承与右键,分析很方便,如下图

    Paste_Image.png

    逆向分析工具下载地址:链接: http://pan.baidu.com/s/1kUErd8F 密码: xr6a

    相关文章

      网友评论

          本文标题:一次逆向分析之旅

          本文链接:https://www.haomeiwen.com/subject/apzxfxtx.html