Android逆向从未如此简单

哈,又标题党了。。不过我必定竭尽所能,写一篇最亲民的入门文章。javascript

本文仅供学习交流之用,切勿用于非法用途,读者若运用所学知识,进行非法任何商业目的或者非法牟利,一切责任由操做者自行承担,与本人无关。但愿读者仅仅从了解原理,保护自身APP尽可能减小危害出发来阅读本文。php

本文发布自wing的地方酒馆,转载请注明出处。java

本文以一个最简单的例子,来教给你们Android逆向入门的一些知识。因此首先咱们须要准备一个APK,作的简单一些,就是一个EditText,已经一个按钮,模拟验证注册码。android

当验证码填写正确的时候,则提示验证成功,错误的时候,则验证失败。git

如今,咱们将列举数种办法,攻破验证,来让咱们输入任何密码就验证成功。github

神兵利器

若是你嫌命令行很差用(这是个很差的开始),那么还能够用整合到一块儿的可视化工具AndroidCrackTool github.com/Jermic/Andr…算法

首先,把咱们的apk用ApkTool给反编译了,进入目录发现有如下文件夹express


其中,smali文件夹里,放的都是dex反编译出来的smali文件,若是想改变应用的逻辑,只须要修改smali再从新打包便可。接下来,介绍几种突破方法。


寻找切入点

直接寻找法

将apk里面的dex文件脱离,而后使用dex2jar转换为jar文件。安全

在代码里,咱们能够很明显看到,onClick方法内,进行了验证码的判断。此时咱们已经找到切入点。app


资源引用法

通常apk的代码不会如此简单,确定有不少复杂的代码,这时候如何去寻找切入点呢,其实咱们能够根据引用的资源来寻找,好比咱们注册失败的时候会提示注册失败,这时候,咱们去res文件夹下找string。

<string name="failed">注册失败</string>复制代码

发现name为failed,而后再去public文件里寻找对应的id,找到了

<public type="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打出来,验证码不是就本身出来了吗,哈哈。 代码以下:


深刻敌营

这绝对是重头戏,什么叫作深刻敌营呢?就是打入敌军内部,这里说的就是动态调试拉~ 直接debug smali,看看各个寄存器里的值,你说腻害不腻害~

首先,你须要有个2.3如下的AS,由于smaliidea这个插件不支持2.3,而后安装这个插件。

接下来,把逆向出来的AndroidManifest.xml文件作一点小修改,给他加入一句

<application android:debuggable="true"/>复制代码

以后从新打包,安装到手机上。接下来把整个逆向出来的项目导入到AS中。

将smali文件夹添加为source root。

接下来Run->Edit Configurations 添加Remote,稍等要修改端口。

这时,打开ddms,看到端口为8600,这时候把窗口里的端口改成8600.

将sdk改成10.

接下来,点击debug按钮,就能够动态调试了。

接下来就是打断点,在生成验证码以后,打上断点,而后点击按钮。

就能够打印出来函数调用栈,各个寄存器等信息,这时候咱们使用evaluate expression 打印出v0的值:

能够看到,与咱们以前代码猜测结果一致,验证码为"0318",到此,咱们就完成了这个验证系统的逆向。

结语

到此,本篇文章的内容就结束了,但愿各位读者不要去运用这些知识去作坏事,天网恢恢。 反而咱们应该思考的是怎么去防止别人破坏咱们的APP,好比增长混淆程度,签名校验,加固等等,虽然这些也能被破解,可是会增长难度。毕竟安全这件事,防君子不防小人。房子的门能够被撬开,但是我上班出门仍然会关门。

若是你喜欢个人文章,请多关注我,也能够加入个人Android酒馆来讨论Android技术:425983695

参考:

《Android软件安全与逆向分析》
www.zybuluo.com/oro-oro/not…

相关文章
相关标签/搜索