标签:des android style blog http io os ar 使用
对于《Debugging Android Application》一文中最后附上的练习,我采用了另一种静态方法绕开原有的逻辑去破解。主要的过程如下:
利用apktool将练习的runtime.apk文件反编译,生成的smali格式的反汇编代码,接着从smali文件的代码中寻找突破口,修改程序,再利用apktool重新编译生成apk文件并签名,最后运行测试。
首先安装原应用程序测试功能,当输入正确的PIN码时,就如下左图所示,而输入错误的PIN码时,就如下右图所示。
程序破解的目标是无论输入什么PIN码值,程序都反馈“Correct PIN entered”.
1.apktool.用于apk文件的反编译和重新编译
2.签名工具-signapk。重新编译打包的apk文件是没有签名的,不能安装测试,因此需要有工具对apk文件签名。
此前,我已经将apktool添加到系统的PATH环境变量中,以便直接使用。接着运行以下命令:
apktool d runtime.apk
就会生成一个新目录runtime,该目录下有以下的目录和文件
res目录存放程序中所有的资源文件,smali目录存放了程序所有的反汇编代码。
阅读smali目录下的文件,由于该程序比较简单,可以容易猜测出主文件是\smali\com\FS\runtime1目录下的MainActivity.smali文件
打开文件需找突破口。
在先前测试原应用程序时可以发现,当输入错误的PIN码时,会弹出 "Incorrect PIN please try again later"提示,而输入正确的PIN码时,会弹出"Correct PIN entered"提示。因此,可以在代码中寻找这些关键的提示,来确定不同的逻辑代码段。
根据代码中85行和107行的提示,确定了以上两段代码,并且可以发现78行的条件跳转指令if-eqz v1, :cond_1(如果v1寄存器的值为0,则跳转到cond_1标号处),由此推断出从该指令跳转到cond_1即为输入错误PIN码的情况,而顺序执行下来的就是输入正确PIN码的情况。综上判断,指令if-eqz v1, :cond_1为程序的破解点,只要把该行删除,无论输入何值,程序都不会跳转到输出错误提示的代码段中,即达到我们破解的目标:无论输入什么PIN码值,程序都反馈“Correct PIN entered”。
保存退出后,开始重新编译打包成apk文件,在runtime的上级目录下运行命令:
apktool b runtime
编译成功。在runtime目录下有一个dist目录,里面存放着编译成功的apk文件。接下来就是为apk文件签名。我是利用了Android源码包里的签名工具signapk.jar进行签名的。同时利用源码包里的testkey.pk8和testkey.x509.pem,使用三者生成一个signapk.bat,只要将signapk.jar、testkey.pk8、testkey.x509.pem和signapk.bat放在同一目录下,并且将该目录添加到系统的PATH环境变量中,就可以直接使用了。
运行以下命令:
signapk runtime.apk
成功的话就会生成一个签名过的apk,名字叫signed.apk。
最后进行安装测试。开启安卓模拟器后运行命令:
adb install signed.apk
安装成功。测试。
输入任意字符,点击Check按钮,都会输出提示”Correct PIN entered”
破解成功!
标签:des android style blog http io os ar 使用
原文地址:http://www.cnblogs.com/sevenr/p/4034365.html