对于《Debugging Android Application》一文中最后附上的练习,我采用了另一种静态方法绕开原有的逻辑去破解。主要的过程如下:

  利用apktool将练习的runtime.apk文件反编译,生成的smali格式的反汇编代码,接着从smali文件的代码中寻找突破口,修改程序,再利用apktool重新编译生成apk文件并签名,最后运行测试。

  首先安装原应用程序测试功能,当输入正确的PIN码时,就如下左图所示,而输入错误的PIN码时,就如下右图所示。

  

  程序破解的目标是无论输入什么PIN码值,程序都反馈“Correct PIN entered”.

需要用到的工具

  1.apktool.用于apk文件的反编译和重新编译

  2.签名工具-signapk。重新编译打包的apk文件是没有签名的,不能安装测试,因此需要有工具对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”

  破解成功!

最新文章

  1. 使用vs2008搭建php扩展环境
  2. requirejs按需加载angularjs文件
  3. 开发错误记录10: Butterknife8.1.0 提示NullPointerException空指针
  4. Python中的GIL
  5. This application is modifying the autolayout engine from a background thread, which can lead to engine corruption and weird crashes. This will cause an exception in a future release.
  6. matlab cross 3*1 向量叉乘
  7. 61. Rotate List
  8. 【原生态跨平台:ASP.NET Core 1.0(非Mono)在 Ubuntu 14.04 服务器上一对一的配置实现-篇幅1】
  9. UVA 10285 Longest Run on a Snowboard(记忆化搜索)
  10. 与众不同 windows phone (29) - Communication(通信)之与 OData 服务通信
  11. 黑马程序员—创建JDBC框架及原理分析
  12. echarts4.0折线图让某个点闪烁
  13. applium安装过程中遇到的问题及解决方法。
  14. 前端JS 与 后台C# 之间JSON序列化与反序列化(笔记)
  15. 2018-2019-2 网络对抗技术 20165320 Exp5 MSF基础应用
  16. char是所有类型中最短的 char多为8位,
  17. 中文乱码与字体库windows
  18. 尚硅谷springboot学习2-微服务
  19. 搭建ZooKeeper
  20. 执行automake时报错 error while making link: Operation not supported

热门文章

  1. AIDL原理分析
  2. 抓住CoAP协议的“心”
  3. GoF23:单例模式(singleton)
  4. 记jmeter接口测试动态获取验证码
  5. 带你看看Java的锁(一)-ReentrantLock
  6. C# 基础至集合-数组、List<T>、ArrayList、LinkedList、HashMap的一些区别
  7. Day_11【集合】扩展案例4_删除长度大于5的字符串,删除元素包含0-9数字的字符串
  8. R语言:日薪和应发工资
  9. 设计模式之GOF23访问者模式
  10. jsp 中文乱码????解决