Android apk仿反编译套路(一)

作者: hellsam | 来源:发表于2018-03-22 20:19 被阅读532次

    反编译Apk时你是否遇到过下图中的错误,反编译进行到AndroidManifest.xml就报错了,然后就没有然后了。

    pic001.png

    这是因为该apk的AndroidManifest.xml文件被特殊处理过,导致apktool在反编译时报错。

    我们知道AndroidManifest.xml是以AXML格式存在于apk中的,而AXML文件的魔数(前4个字节)为0x03000800

    apktool在反编译AndroidManifest.xml前会先判断魔数是否符合条件,不符合会直接抛出异常并终止反编译。

    apktool源码中看确实如此:

        //ExtDataInput
        public void skipCheckInt(int expected) throws IOException {
            int got = readInt();
            if (got != expected) {
                throw new IOException(String.format(
                    "Expected: 0x%08x, got: 0x%08x", expected, got));
            }
        }
    
        //AXmlResourceParser
        private final void doNext() throws IOException {
            // Delayed initialization.
            if (m_strings == null) {
                //就是在这里调用skipCheckInt判断魔数
                m_reader.skipCheckInt(CHUNK_AXML_FILE);
    
                /*
                 * chunkSize
                 */
                m_reader.skipInt();
                m_strings = StringBlock.read(m_reader);
                m_namespaces.increaseDepth();
                m_operational = true;
            }
            ...
    

    利用apktool这一“特性”,我们就可以通过修改AndroidManifest.xml的魔数来防止反编译。

    如何修改Apk中AndroidManifest.xml魔数?

    1. apktool d -r xxx.apk(-r指不反编译资源)通过该命令反编译目标apk.
    2. 010Editor打开AndroidManifest.xml文件。如下图:
    pic002.png
    1. 将第一个字节从03修改为01后保存。
    2. apktool b xxx通过该命令重新编译,之后对生成的apk重新签名后就可以正常安装/发布了。
    3. 此时再用apktool反编译生成的apk文件就会发现无法正常反编译了。

    那遇到这种apk该如何正确反编译呢?

    大致有两种方案:

    1. 先将AndroidManifest.xml文件的魔数修改为0x03000800,再用apktool继续反编译。
    1. 修改apktool源码。
      找到源码中校验魔数的代码(见前文的代码段),然后可以简单粗暴的添加异常捕捉。

      private final void doNext() throws IOException {
      // Delayed initialization.
      if (m_strings == null) {
          try{
              m_reader.skipCheckInt(CHUNK_AXML_FILE);
          }catch (Throwable t){
              t.printStackTrace();
          }
      
          /*
           * chunkSize
           */
          m_reader.skipInt();
          m_strings = StringBlock.read(m_reader);
          m_namespaces.increaseDepth();
          m_operational = true;
      }
      ...
      

    附:

    apktool源码地址:https://github.com/iBotPeaches/Apktool

    AndroidManifest.xml被修改过的apk下载地址:http://7u2ne2.com1.z0.glb.clouddn.com/demo.apk

    修改过的apktool下载地址:http://7u2ne2.com1.z0.glb.clouddn.com/apktool.zip

    010Editor下载地址:http://www.sweetscape.com/010editor/mac_osx.html

    相关文章

      网友评论

      • 4lwin:请问下,为什么这样修改后,程序还可以正常运行?
        是因为Android解析Manifest文件时,只会去判断文件名称AndroidManifest.xml,而不会查看文件格式?
        4lwin:@hellsam 好的,多谢回复 :smirk:
        hellsam:魔数只是表示这个文件是什么格式的,并不影响文件内容。再深入的原因我也没去研究:joy:
      • 35d4de9f3e0b:厉害了。期待后续教程
        hellsam:谢谢支持

      本文标题:Android apk仿反编译套路(一)

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