我破解了一个Android应用程序以免费理发

2023-11-03 02:40

本文主要是介绍我破解了一个Android应用程序以免费理发,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Android应用程序主要由捆绑在一起的一堆二进制文件组成,这些二进制文件是由已编译的Kotlin或Java代码构建的。 原始的源代码可以通过位于Google搜索页面顶部的几个轻量级工具轻松重建。

如果您是一个快乐的Android开发人员,并且没有足够谨慎地将最佳安全实践应用于您的项目,那么您将永远不会高兴。 您认为所有宝贵的秘密都会安全地隐藏在您的代码中,有动机的人可以并且会在野外对您使用。 这正是这家理发店连锁店的Android应用程序所发生的事情。

开发人员无视各种安全最佳实践,结果导致在短短几个小时内,我就能够进行反编译,反向工程并识别出几个漏洞,任何人都可以利用这些漏洞来实现每个黑客的目的。追求人生的梦想:终生免费理发!

在这里,我将向您介绍整个黑客过程,向您展示遵循安全最佳实践的重要性以及简单的决定如何极大地增加对Android应用程序进行反向工程和利用的难度。

这个理发店连锁店的应用程序有一个非常简单的用途:用户可以在可用的商店预订发型,每10个发型,用户可以one for free获得one for free

到目前为止,它们看起来都像是应用程序要做的非常好的任务。 但是,在安装应用程序并查看我的个人资料页面后,有一条非常明确且有趣的消息:赠品只能通过应用程序生成-不能由任何其他平台生成-并且还可以在用户需要时使用:需要在付费时出示应用程序。

这则消息肯定引起了我的注意。

因此,为了满足我的好奇心,我下载并反编译了apk。
假设我看了一下代码,也许可以以一些创造性的方式使用该应用程序。

我是对的:我发现完全是一团糟。

在对应用程序进行反编译并对代码进行反向工程之后,我确定了几个漏洞。 稍后,我将一步一步地讨论原始开发人员可以采取哪些措施来防止这种情况:

  1. 无需代码混淆,使其真正易于反向工程
  2. 没有证书或任何类型的应用程序完整性检查,使后端无法发现被篡改的客户端应用程序
  3. 在客户端应用上实施的重要业务逻辑,无需在后端进行进一步的确认检查
  4. 代码上的硬编码秘密使后端的私有api暴露出来并易于利用

APK文件

首先将Kotlin和Java源代码编译为.class文件,该文件由bytecode指令组成。 传统上,这些字节码指令将直接在JVM上执行。 但是,Android应用程序是在Android Runtime上执行的,该Android Runtime使用的指令不兼容,因此需要执行额外的Dexing步骤,将.class文件转换为单个.dex文件。

这是编译过程:


反编译APK

在线上有几种工具可以反编译apks ,并将.dex文件转换为可读的Kotlin或Java代码。 生成的反编译代码是理解目标应用程序功能的切入点,但可能不是100%可用的代码。 换句话说,您可以阅读源代码,但不能真正使用它来修改,重新编译和构建原始应用程序。

apk的decompilation步骤:

但是,由于我真的很想apktool代码,因此无论如何,我还是使用apktool来反编译apk及其.dex文件的内容(上述步骤1和2)

$  apktool d target_app.apk

如前所述, .dex文件是平台真正理解的格式。 但是,读取或修改二进制代码并不容易,因此有一些其他工具可以将其与人类可读的表示形式相互转换。 最常见的人类可读格式是称为Smali的汇编语言 这是apktool输出并存储在/smali文件夹中的格式。

这是一个smali文件的样子:

Smali文件是我们稍后将要编辑的文件,但不清楚地是我们希望对整个应用程序进行逆向工程的文件。 除非我们被迫这样做。

为了查看可以帮助我进行逆向工程过程的更友好的代码,我使用dex2jar将这些smali文件转换为标准.class文件(上面的步骤3):

$  dex2jar decompiled_app/build/apk/classes.dex

bo! 正如原始开发人员所写的那样,我现在可以以非常熟悉的格式访问完整的应用程序源代码。

现在,让我们看看我发现了什么

漏洞1:不会混淆代码!

混淆最小化是用于减少未使用的代码并缩短应用程序类和成员名称的策略-通常通过将它们替换为无意义的东西-不仅使它很难阅读,而且进一步减小了应用程序的大小。

如果您不进行任何形式的代码混淆处理,则几乎可以将您的私有存储库的访问权限授予黑客。

在这种特殊情况下,理解和遵循代码,识别第三方技术以及用于认证它们的秘密非常简单。

使用某种混淆工具(如ProGuard可以很容易地避免这种情况,这至少会使黑客的生活更加艰难,并迫使他们投入更多的精力来对代码进行逆向工程。

这是应用混淆[ 2 ]之前和之后的代码的样子:

漏洞2:硬编码的机密

我看过的第一个类,实际上是一个称为CLIENT_SECRET的硬编码变量,该变量以后将用于验证对后端的每个Http调用。

突然之间,我现在可以访问整个应用程序的私有api来四处寻找新的攻击媒介。

如果您确实需要在客户端应用程序上存储机密信息以提供某种身份验证,则可以通过在代码上进行硬编码来以多种方式避免这种情况,而不会破坏这些机密信息。
有几种众所周知的方法,例如使用对称密钥派生策略或基于密码的密钥派生函数

在这里可以找到关于这些方法的非常详细的很好的视图。

漏洞3:客户端应用上的重要业务逻辑,无需在后端进行确认检查

这就是事情变得有趣的地方...继续寻求最好的发型-我不必支付的费用-我仍然必须找到一些漏洞,该漏洞将使该应用程序为我免费生成一个发型预订。

在花了大约一个小时的时间来查看代码之后,这是我所学到的:

  • 后端存储所有ShopsUser信息
  • 后端存储每个用户的Bookings
  • 客户端应用通过REST调用检索每个用户的所有Bookings
  • 每个对后端的REST调用均由硬编码的client_secret和用户特定的basic_auth凭据标识

现在,蛋糕上的樱桃:

  • 客户端应用通过计算User已成功进行了多少次预订,而不是后端,确定何时授予freebie
  • freebie只是一个标准的booking REST电话,带有一个额外的flag表明预订可free haircut

在这一点上,您可以猜测当我Swift将预订flag设置为true的booking api发布POST时,后端响应是什么:

> 200 OK!

在看了这么多错误之后,我承认我并不感到惊讶。

我们可以从中学到的是,通过让您的client app调用诸如以下的重要决定: 当需要授予免费预订时,您实际上是将宝贵的业务规则放在整个用户旅程中最脆弱的一端。

更糟糕的是,当您仍然有机会时,不要在后端验证REST调用。 显然,在接受和存储从客户端应用程序传入的任何内容之前,必须先验证用户是否已完成并支付足够的预订费用来获得免费的预订。

这将我引到最后但并非最不重要的漏洞:

漏洞4:没有客户端应用程序完整性检查

如果要在客户端应用程序上编写重要的业务逻辑决策-顺便说一句,这是完全错误的-至少可以做的是建立某种机制来验证应用程序的真实性。

上面的许多漏洞都可以通过某种客户端应用程序完整性检查来缓解,从而使后端服务器可以验证api调用何时来自合法应用程序,并丢弃来自受感染应用程序的api调用。 通过使用应用的发布证书对请求进行签名,可以轻松实现这一目标。

每个Android APK均使用发布证书签名。 如果重新编译了apk并通过代码更改再次对其进行了重新编译,则类似于我在此处描述的过程,新的重新编译的apk必须使用不同的证书签名,因为黑客将无法访问用于对原始apk进行签名的原始证书。仅原始开发人员拥有的合法应用程序。

另外,Google本身也提供应用许可服务 帮助您验证当前应用是从Play商店还是从其他未知来源(黑客)安装的。

更改Smali程序集文件并重新编译APK

因此,既然我们对黑客感到满意,并且知道了应在何处放置恶意代码,那么该是编辑一些汇编文件并重新编译整个程序的时候了。 还记得smali吗?

apktool每个.class输出一个.smali文件,因此至少很容易浏览并确定应在何处进行更改。 但是,从现在开始,您就自己一个人了:如果您不熟悉某种汇编语言,这可能是一个非常痛苦的过程。

我很高兴我不必为自己被篡改的预订请求进行太多更改。 仅添加几个flags并删除几个:gotos就足够了。

完成编辑后,只需再次使用apktool重新编译所有内容:

$ apktool b -f decompiled_app -o hacked_app.apk

生成一个随机密钥对,以对重新编译的应用程序进行签名,如下所示:

$ keytool -genkey -v -keystore some_ks.keystore -alias some_alias -keyalg RSA -keysize 2048 -validity 1000

签名重新编译的应用程序,我用过jarsigner

$ jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore some_ks.keystore hacked_app.apk some_alias

而且你很好走!

就是这个。 这是欢乐的时刻。 我已经做过黑客从未做过的事。 我可以坐下来安装我的被篡改的应用程序,用我被篡改的请求调用理发店专用api,最后,我可以预订免费理发!

这是值得的! (假设)

结论

这是为了表明,如果您不采取必要的预防措施来保护您的知识产权和业务逻辑,那么窃取您的秘密是多么容易,并且代码通常容易受到攻击。 网上广泛提供了几种利用工具以及如何正确使用它们的常识,这意味着如果您的应用程序被黑,这不仅是运气问题,不是,这只是时间问题。

因此,您最好开始花一些时间来学习最佳做法。 否则,您只是在敞开大门让别人真正利用您的代码,并可能对您的业务造成重大损失。 不仅像我在这里那样出于教学目的显示它。

翻译自: https://hackernoon.com/i-hacked-an-android-app-to-get-a-free-haircut-q91e3yaq

这篇关于我破解了一个Android应用程序以免费理发的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/dfsgwe1231/article/details/107260539
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/335010

相关文章

Android NDK版本迭代与FFmpeg交叉编译完全指南

《AndroidNDK版本迭代与FFmpeg交叉编译完全指南》在Android开发中,使用NDK进行原生代码开发是一项常见需求,特别是当我们需要集成FFmpeg这样的多媒体处理库时,本文将深入分析A... 目录一、android NDK版本迭代分界线二、FFmpeg交叉编译关键注意事项三、完整编译脚本示例四

Android与iOS设备MAC地址生成原理及Java实现详解

《Android与iOS设备MAC地址生成原理及Java实现详解》在无线网络通信中,MAC(MediaAccessControl)地址是设备的唯一网络标识符,本文主要介绍了Android与iOS设备M... 目录引言1. MAC地址基础1.1 MAC地址的组成1.2 MAC地址的分类2. android与I

Android 实现一个隐私弹窗功能

《Android实现一个隐私弹窗功能》:本文主要介绍Android实现一个隐私弹窗功能,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 效果图如下:1. 设置同意、退出、点击用户协议、点击隐私协议的函数参数2. 《用户协议》、《隐私政策》设置成可点击的,且颜色要区分出来res/l

Android实现一键录屏功能(附源码)

《Android实现一键录屏功能(附源码)》在Android5.0及以上版本,系统提供了MediaProjectionAPI,允许应用在用户授权下录制屏幕内容并输出到视频文件,所以本文将基于此实现一个... 目录一、项目介绍二、相关技术与原理三、系统权限与用户授权四、项目架构与流程五、环境配置与依赖六、完整

Android 12解决push framework.jar无法开机的方法小结

《Android12解决pushframework.jar无法开机的方法小结》:本文主要介绍在Android12中解决pushframework.jar无法开机的方法,包括编译指令、框架层和s... 目录1. android 编译指令1.1 framework层的编译指令1.2 替换framework.ja

Android开发环境配置避坑指南

《Android开发环境配置避坑指南》本文主要介绍了Android开发环境配置过程中遇到的问题及解决方案,包括VPN注意事项、工具版本统一、Gerrit邮箱配置、Git拉取和提交代码、MergevsR... 目录网络环境:VPN 注意事项工具版本统一:android Studio & JDKGerrit的邮

Android实现定时任务的几种方式汇总(附源码)

《Android实现定时任务的几种方式汇总(附源码)》在Android应用中,定时任务(ScheduledTask)的需求几乎无处不在:从定时刷新数据、定时备份、定时推送通知,到夜间静默下载、循环执行... 目录一、项目介绍1. 背景与意义二、相关基础知识与系统约束三、方案一:Handler.postDel

Android使用ImageView.ScaleType实现图片的缩放与裁剪功能

《Android使用ImageView.ScaleType实现图片的缩放与裁剪功能》ImageView是最常用的控件之一,它用于展示各种类型的图片,为了能够根据需求调整图片的显示效果,Android提... 目录什么是 ImageView.ScaleType?FIT_XYFIT_STARTFIT_CENTE

Android实现在线预览office文档的示例详解

《Android实现在线预览office文档的示例详解》在移动端展示在线Office文档(如Word、Excel、PPT)是一项常见需求,这篇文章为大家重点介绍了两种方案的实现方法,希望对大家有一定的... 目录一、项目概述二、相关技术知识三、实现思路3.1 方案一:WebView + Office Onl

Android实现两台手机屏幕共享和远程控制功能

《Android实现两台手机屏幕共享和远程控制功能》在远程协助、在线教学、技术支持等多种场景下,实时获得另一部移动设备的屏幕画面,并对其进行操作,具有极高的应用价值,本项目旨在实现两台Android手... 目录一、项目概述二、相关知识2.1 MediaProjection API2.2 Socket 网络