我破解了一个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应用程序以免费理发的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/335010

相关文章

Android中Dialog的使用详解

《Android中Dialog的使用详解》Dialog(对话框)是Android中常用的UI组件,用于临时显示重要信息或获取用户输入,本文给大家介绍Android中Dialog的使用,感兴趣的朋友一起... 目录android中Dialog的使用详解1. 基本Dialog类型1.1 AlertDialog(

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

Android自定义Scrollbar的两种实现方式

《Android自定义Scrollbar的两种实现方式》本文介绍两种实现自定义滚动条的方法,分别通过ItemDecoration方案和独立View方案实现滚动条定制化,文章通过代码示例讲解的非常详细,... 目录方案一:ItemDecoration实现(推荐用于RecyclerView)实现原理完整代码实现

Android App安装列表获取方法(实践方案)

《AndroidApp安装列表获取方法(实践方案)》文章介绍了Android11及以上版本获取应用列表的方案调整,包括权限配置、白名单配置和action配置三种方式,并提供了相应的Java和Kotl... 目录前言实现方案         方案概述一、 androidManifest 三种配置方式

电脑报错cxcore100.dll丢失怎么办? 多种免费修复缺失的cxcore100.dll文件的技巧

《电脑报错cxcore100.dll丢失怎么办?多种免费修复缺失的cxcore100.dll文件的技巧》你是否也遇到过“由于找不到cxcore100.dll,无法继续执行代码,重新安装程序可能会解... 当电脑报错“cxcore100.dll未找到”时,这通常意味着系统无法找到或加载这编程个必要的动态链接库

Android WebView无法加载H5页面的常见问题和解决方法

《AndroidWebView无法加载H5页面的常见问题和解决方法》AndroidWebView是一种视图组件,使得Android应用能够显示网页内容,它基于Chromium,具备现代浏览器的许多功... 目录1. WebView 简介2. 常见问题3. 网络权限设置4. 启用 JavaScript5. D

Android如何获取当前CPU频率和占用率

《Android如何获取当前CPU频率和占用率》最近在优化App的性能,需要获取当前CPU视频频率和占用率,所以本文小编就来和大家总结一下如何在Android中获取当前CPU频率和占用率吧... 最近在优化 App 的性能,需要获取当前 CPU视频频率和占用率,通过查询资料,大致思路如下:目前没有标准的

Android开发中gradle下载缓慢的问题级解决方法

《Android开发中gradle下载缓慢的问题级解决方法》本文介绍了解决Android开发中Gradle下载缓慢问题的几种方法,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、网络环境优化二、Gradle版本与配置优化三、其他优化措施针对android开发中Gradle下载缓慢的问

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

Android里面的Service种类以及启动方式

《Android里面的Service种类以及启动方式》Android中的Service分为前台服务和后台服务,前台服务需要亮身份牌并显示通知,后台服务则有启动方式选择,包括startService和b... 目录一句话总结:一、Service 的两种类型:1. 前台服务(必须亮身份牌)2. 后台服务(偷偷干