Android逆向从未如此简单

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

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

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

本文以一个最简单的例子,来教给大家Android逆向入门的一些知识。所以首先我们需要准备一个APK,做的简单一些,就是一个EditText,已经一个按钮,模拟验证注册码。

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

现在,我们将列举数种办法,攻破验证,来让我们输入任何密码就验证成功。

神兵利器

如果你嫌命令行不好用(这是个不好的开始),那么还可以用整合到一起的可视化工具AndroidCrackTool https://github.com/Jermic/Android-Crack-Tool

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

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


寻找切入点

直接寻找法

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

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


资源引用法

一般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软件安全与逆向分析》

https://www.zybuluo.com/oro-oro/note/167401

时间: 2024-10-29 19:12:13

Android逆向从未如此简单的相关文章

Android 逆向初探(一)

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Helvetica; color: #000000 } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Helvetica; color: #000000; min-height: 13.0px } span.s1 { } span.Apple-tab-span { white-space: pre } 逆向分析是一门技术,也是一门艺

Android逆向之动态调试so库JNI_Onload函数-----基于IDA实现

之前看过吾爱破解论坛一个关于Android'逆向动态调试的经验总结帖,那个帖子写的很好,对Android的脱壳和破解很有帮助,之前我们老师在上课的时候也讲过集中调试的方法,但是现在不太实用.对吾爱破解论坛的该贴,我也是看了很多遍,自己也查了不少资料,但是自己动手的时候总觉比较繁琐,并且很多细节的地方没有注意到,按照那个帖子尝试了几遍但是却出现了错误(后面会提到),今天周末重新拾起来试了试,终于把遇到的问题给解决了,顺便做个记录以免忘记了,其中的一些细节我也不是太明白,忘知道的人给指出. 第一步.

【转】Android逆向之动态调试总结

一.在SO中关键函数上下断点 刚学逆向调试时.大多都满足于在SO中某关键函数上下断点.然后通过操作应用程序,去触发这个断点,然后进行调试 详细的步骤可以参见非虫大大的<Android软件安全与逆向分析> 简单说:在libsyclover.so文件中有一个函数jnicall1.每次单击按钮的时候,便会调用此函数. 1.静态载入此so文件,找到函数的偏移地址为:0x132C <ignore_js_op> 2.执行android_server3.端口转发 adb forward tcp:

Android逆向分析初体验

一.    准备知识 1.             懂Java Android开发. 2.             懂NDK ,C 语言 Android 动态链接库.SO开发. 3.             懂Android反编译Smali 语法. 4.             懂adb 和 jdb 等等工具使用. 5.             懂IDA 调试(远程动态调试APK和本地静态调试.SO文件) 6.             懂Arm汇编语法(因为移动设备芯片是Arm架构的,不是Int

低版本系统兼容的ActionBar(五)设置ActionBar的全套样式,从未如此简单过

     设定ActionBar的样式,是我们必须掌握的技能,在之前我们可能都需要一行一行的写代码,然后在模拟器上测试效果,但是现在我们有个一个很棒的工具来设定样式.设定ActionBar样式的工作从未如此简单过! http://romannurik.github.io/AndroidAssetStudio/index.html 进入后我们就可以直接在可视化的界面中进行修改了,设定好后直接下载压缩包.复制到res目录下即可.最后要记得把Application或者Activity的主题修改为你做的

Android逆向-Android基础逆向(2-2)

[toc] #0x00 前言##不知所以然,请看Android逆向-Android基础逆向(1)Android逆向-Android基础逆向(2)##以及java系列:Android逆向-java代码基础(1)Android逆向-java代码基础(2)Android逆向-java代码基础(3)Android逆向-java代码基础(4)Android逆向-java代码基础(5)Android逆向-java代码基础(6)Android逆向-java代码基础(7)Android逆向-java代码基础(8

Android逆向系列文章— Android基础逆向(6)

本文作者:HAI_ 0×00 前言 不知所以然,请看 Android逆向-Android基础逆向(1) Android逆向-Android基础逆向(2) Android逆向-Android基础逆向(2-2) Android逆向-Android基础逆向(2-3补充篇) Android逆向-Android基础逆向(3) Android逆向-Android基础逆向(4) Android逆向-Android基础逆向(4-2) Android逆向-Android基础逆向(5) 以及java系列: Andr

android逆向入门及工具下载

本文所用到的工具下载: 链接:http://pan.baidu.com/s/1i3uw4NN 密码:8hz5 最近在研究如何逆向android的app,于是就有了这篇android逆向入门的总结回馈互联网. 由于Android的.apk文件实际上就是一个zip文件,修改文件后缀后直接可以打开,效果如下图所示: 里面包含了的文件有: META-INF:这个文件夹是用于保存签名文件,确保包的完整性的 res:apk所要用的资源文件,都是原封不动地保存,我们可以直接提取出来,做汉化时就可以直接阅读st

Android peferenceActivity 自定义标题简单方法

Android peferenceActivity 自定义标题简单方法 peferenceActivity 完全使用定义好的布局. 因此不能简单象其它好窗口进行自定,现在我们需要加 一个自定义标题,比如象其它窗口一样加一个统一topbar. 假设这个topbar的布局是 title.xml 一.标准自定义标题栏方法 Android 提供自定义标题栏方法 我们简单实现. @Override protected void onCreate(Bundle savedInstanceState) { f