Android安全讲座第七层 [一] 破解加过壳的APK应用

     android应用中的apk的安全问题一直遭人诟病,各种破解,各种汉化,并且有了ida pro这样的逆天工具,对于android应用的破解简直就是小儿科了。但是事物都是两方面的,有矛就有盾,逐渐的apk的加壳工具也产生了,目前我在反编译应用的时候发现越来越多的应用加壳了。导致破解的难度加大,甚至很多时候不能破解。


     前面说过,事物就是两个方面的,所谓魔高一尺,道高一丈,安全和反安全一直在相互的促进,这里就以技术的角度来谈谈apk加壳后的应用如何破解。


     反编译apk应用,目前最有名的就是apktool 工具了,这个工具集成了反编译dex文件,数字签名等各种功能,一个命令就能反编译apk应用,一个命令就能打包apk应用,而破解的人啊只需要修改修改里面得smali文件或者xml文件就能达到自己的目的。但是这一切都是对于没有加壳过的apk应用。对于加过壳的apk应用来说,反编译dex这一关就出现了问题。


    而反编译dex文件,apktool 使用的是baksmali 这个jar包,目前apktool 1.5.2


Apktool v1.5.2 - a tool for reengineering Android apk files

Copyright 2010 Ryszard Wi?niewski <[email protected]>

with smali v1.4.1, and baksmali v1.4.1


   使用的是baksmali 是v1.4.1,在反编译android apk应用中的dex文件的时候,会出现这样的错误


D:\android\baksmali>java -jar baksmali-1.4.2.jar classes261.dex -o classes261


UNEXPECTED TOP-LEVEL EXCEPTION:

org.jf.dexlib.Util.ExceptionWithContext: 6

       at org.jf.dexlib.Util.ExceptionWithContext.withContext(ExceptionWithContext.java:54)

       at org.jf.dexlib.Code.InstructionIterator.IterateInstructions(InstructionIterator.java:91)

       at org.jf.dexlib.CodeItem.readItem(CodeItem.java:154)

       at org.jf.dexlib.Item.readFrom(Item.java:77)

       at org.jf.dexlib.OffsettedSection.readItems(OffsettedSection.java:48)

       at org.jf.dexlib.Section.readFrom(Section.java:143)

       at org.jf.dexlib.DexFile.<init>(DexFile.java:431)

       at org.jf.baksmali.main.main(main.java:280)

Caused by: java.lang.ArrayIndexOutOfBoundsException: 6

       at org.jf.dexlib.Code.Format.Instruction23x.<init>(Instruction23x.java:61)

       at org.jf.dexlib.Code.Format.Instruction23x.<init>(Instruction23x.java:37)

       at org.jf.dexlib.Code.Format.Instruction23x$Factory.makeInstruction(Instruction23x.java:90)

       at org.jf.dexlib.Code.InstructionIterator.IterateInstructions(InstructionIterator.java:82)

       ... 6 more

Error occured at code address 8

code_item @0x1e484


到网上搜索一下,发现很多论坛和破解者会请教这个问题,甚至有些人认为这个是baksamli这个软件的bug,将这个问题提交给baksmali项目。但,问题产生的根源却不是这样的。


问题产生的根源是,这些应用加了壳,而加壳的工具提供者

见下面的

http://www.apkbus.com/android-141297-1-1.html

这个网页的说明,就是说android的apk 通过上面文章中介绍的工具进行了加壳,而加过壳的apk应用也有很明显的标识。


在apk中有 apkprotect.com 这个目录表示这个是加壳了的应用,而加壳后的应用会在classes.dex这个文件中加入一些自己的垃圾类,或者方法,比如加入一段

public String test()

{

   int i = 100;

   return;

}


其实这段代码在java编译器编译的时候是通不过的,生成的汇编代码页很无厘头,所以造成baksmali在反编译的时候会出现错误或者崩溃。


ok 找到了原理了,现在说一下解决方法:


好在baksmali的开发者也发现了这个问题,但是加壳的方法千千万万,本身是很难以补丁的方式来解决这个问题,所以即便是破解者提交了这个bug给baksmali开发小组,baksmali小组最新版本依然没有进行修补(主要是也没有什么好方法修补)。但是最新的baksmali版本 baksmali-2.0.2.jar 采用了一种比较妥协但是很实用的方法。


就是解析不了的java类采用了省略过的态度,我不解析了。

报告一个错以后直接跳过得了,并且这种方法其实很聪明的一种选择,一般加壳工具将这样垃圾类塞进去后,是不会让应用逻辑来调用的,所以最后的smali文件即便少解析了这个类,其实对于跑整个逻辑也没有问题。


命令如下:

java -jar baksmali-2.0.2.jar -o outclasses14  out.dex




所以在解析以后其实生成的smali文件里面得android 反编译文件就能够撑得起整个应用了。所以这里就可以使用 smali-2.0.2.jar 这个工具重新打包回来生成dex 文件。


命令如下

java -jar smali-2.0.2.jar -o out.dex outclasses14


当然由于加了壳,加壳工具在一些应用逻辑中的类中也加了一些垃圾方法。导致baksmali在解析的时候会生成smali 打包时报错的smali文件,导致无法打包。


D:\android\baksmali>java -jar smali-2.0.2.jar -o sb261_tuoke.dex classe261

classe261\a\a\a\d\f.smali[40,4] return-void-barrier is an odexed instruction. You cannot reassembl

a disassembled odex file unless it has been deodexed.

classe261\android\support\a.smali[26,49] Error for input '@': Invalid text

classe261\android\support\a.smali[26,43] mismatched input 'vtable' expecting VTABLE_INDEX

classe261\android\support\a.smali[39,0] sget-volatile is an odexed instruction. You cannot reassem

e a disassembled odex file unless it has been deodexed.

classe261\android\support\v4\a\g.smali[36,33] Error for input '@': Invalid text

classe261\android\support\v4\a\g.smali[36,27] mismatched input 'vtable' expecting VTABLE_INDEX

classe261\android\support\v4\d\f.smali[27,4] iput-volatile is an odexed instruction. You cannot re

semble a disassembled odex file unless it has been deodexed.


出现这样的错误,不要着急,直接把方法干掉,让smali文件能够编译通过生成最后的dex文件即可。


当然这样生成的dex文件,可以直接使用baksmali文件在生成*.smali文件


这一步做完以后,基本上最核心的部分就已经破解掉了,当然还需要将原来的apk应用重新签名,签名之前用rar打开apk应用,将里面的classes.dex 替换成签名smali 文件打包的dex文件,删除掉里面得META-INF文件,使用auto-signed 工具重新进行一下签名即可


命令如下

java -jar signapk.jar testkey.x509.pem testkey.pk8 update.zip update_signed.zip


剩下需要的事情就可以使用apktool 这个工具进行继续开发,当然理论上apktool 需要使用最新的baksmali 和smali 工具,这点我尚未测试和修改。


工具见附件






你可能感兴趣的:(android,破解加过壳的APK应用)