您的位置:首页 > 移动开发 > Android开发

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

2013-12-19 17:12 225 查看
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 <brut.alll@gmail.com>
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 工具,这点我尚未测试和修改。

工具见附件

附件:http://down.51cto.com/data/2363893
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息