本文以一个最简单的例子,来教给大家Android逆向入门的一些知识。所以首先我们需要准备一个APK,做的简单一些,就是一个EditText,已经一个按钮,模拟验证注册码。
当验证码填写正确的时候,则提示验证成功,错误的时候,则验证失败。
现在,我们将列举数种办法,攻破验证,来让我们输入任何密码就验证成功。
神兵利器
· ShakaApktool https://github.com/rover12421/ShakaApktool
· Dex2Jar https://github.com/pxb1988/dex2jar
· Smali https://github.com/JesusFreke/smali
· SmaliIDEA https://bitbucket.org/JesusFreke/smali/downloads/
如果你嫌命令行不好用(这是个不好的开始),那么还可以用整合到一起的可视化工具AndroidCrackToo
https://github.com/Jermic/Android-Crack-Tool
首先,把我们的apk用ApkTool给反编译了,进入目录发现有以下文件夹
其中,smali文件夹里,放的都是dex反编译出来的smali文件,如果想改变应用的逻辑,只需要修改smali再重新打包即可。接下来,介绍几种突破方法。
寻找切入点直接寻找法
将apk里面的dex文件脱离,然后使用dex2jar转换为jar文件。
在代码里,我们可以很明显看到,onClick方法内,进行了验证码的判断。此时我们已经找到切入点。
资源引用法
一般apk的代码不会如此简单,肯定有很多复杂的代码,这时候如何去寻找切入点呢,其实我们可以根据引用的资源来寻找,比如我们注册失败的时候会提示注册失败,这时候,我们去res文件夹下找string。
1. <stringname="failed">注册失败</string>
发现name为failed,然后再去public文件里寻找对应的id,找到了
1. <publictype="string" name="failed" id="0x7f060022" />
将这个16进制的id转化为10进制,得到2131099682,在逆向得到的jar文件,索引这个id,发现正好有引用,所以这一区域是关键代码区域.
猜测法
逆向离不开猜测,找到目标页面,假设要获取一个点击事件,那么就猜测类型为Button的属性,在混淆代码里,只有一个button叫做a,那么只要找这个a的点击事件即可。
到现在我们已经有了切入点,接下来要开始达成我们的目的了,那就是改变代码逻辑。
向代码开刀
既然我们已经抓住了切入点,如何去破解这个注册码到底是多少呢,接下来向大家介绍几种开刀方法。
直接分析法
看到混淆代码,阅读之,发现这个注册码是根据日期生成的,所以我们只需要人算出来当前日期输入即可。
当然这种方法缺陷很大,因为一般算法不会如此简单。
偷梁换柱法
既然找到了判断点,我们去阅读smali代码。
注意第48行,这里是执行了方法a(),也就是生成key的方法,把返回值交给了V0,后面所有逻辑都是根据这个判断的,所以我们可以把v0给偷偷替换掉,假设我们替换为”123”,这样我们输入123,就可以通过验证了,代码如下:
酒后真言法
什么叫做酒后真言?就是喝多了让他自己吐出来真心话,那么我们怎么让他吐出来真心话呢?当然是打log了,嘿嘿嘿,我们只要在v0后面打一条log,把这个v0打出来,验证码不是就自己出来了吗,哈哈。 代码如下:
当验证码填写正确的时候,则提示验证成功,错误的时候,则验证失败。
现在,我们将列举数种办法,攻破验证,来让我们输入任何密码就验证成功。
神兵利器
· ShakaApktool https://github.com/rover12421/ShakaApktool
· Dex2Jar https://github.com/pxb1988/dex2jar
· Smali https://github.com/JesusFreke/smali
· SmaliIDEA https://bitbucket.org/JesusFreke/smali/downloads/
如果你嫌命令行不好用(这是个不好的开始),那么还可以用整合到一起的可视化工具AndroidCrackToo
https://github.com/Jermic/Android-Crack-Tool
首先,把我们的apk用ApkTool给反编译了,进入目录发现有以下文件夹
其中,smali文件夹里,放的都是dex反编译出来的smali文件,如果想改变应用的逻辑,只需要修改smali再重新打包即可。接下来,介绍几种突破方法。
寻找切入点直接寻找法
将apk里面的dex文件脱离,然后使用dex2jar转换为jar文件。
在代码里,我们可以很明显看到,onClick方法内,进行了验证码的判断。此时我们已经找到切入点。
资源引用法
一般apk的代码不会如此简单,肯定有很多复杂的代码,这时候如何去寻找切入点呢,其实我们可以根据引用的资源来寻找,比如我们注册失败的时候会提示注册失败,这时候,我们去res文件夹下找string。
1. <stringname="failed">注册失败</string>
发现name为failed,然后再去public文件里寻找对应的id,找到了
1. <publictype="string" name="failed" id="0x7f060022" />
将这个16进制的id转化为10进制,得到2131099682,在逆向得到的jar文件,索引这个id,发现正好有引用,所以这一区域是关键代码区域.
猜测法
逆向离不开猜测,找到目标页面,假设要获取一个点击事件,那么就猜测类型为Button的属性,在混淆代码里,只有一个button叫做a,那么只要找这个a的点击事件即可。
到现在我们已经有了切入点,接下来要开始达成我们的目的了,那就是改变代码逻辑。
向代码开刀
既然我们已经抓住了切入点,如何去破解这个注册码到底是多少呢,接下来向大家介绍几种开刀方法。
直接分析法
看到混淆代码,阅读之,发现这个注册码是根据日期生成的,所以我们只需要人算出来当前日期输入即可。
当然这种方法缺陷很大,因为一般算法不会如此简单。
偷梁换柱法
既然找到了判断点,我们去阅读smali代码。
注意第48行,这里是执行了方法a(),也就是生成key的方法,把返回值交给了V0,后面所有逻辑都是根据这个判断的,所以我们可以把v0给偷偷替换掉,假设我们替换为”123”,这样我们输入123,就可以通过验证了,代码如下:
酒后真言法
什么叫做酒后真言?就是喝多了让他自己吐出来真心话,那么我们怎么让他吐出来真心话呢?当然是打log了,嘿嘿嘿,我们只要在v0后面打一条log,把这个v0打出来,验证码不是就自己出来了吗,哈哈。 代码如下: