我破解了一个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实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

免费也能高质量!2024年免费录屏软件深度对比评测

我公司因为客户覆盖面广的原因经常会开远程会议,有时候说的内容比较广需要引用多份的数据,我记录起来有一定难度,所以一般都用录屏工具来记录会议内容。这次我们来一起探索有什么免费录屏工具可以提高我们的工作效率吧。 1.福晰录屏大师 链接直达:https://www.foxitsoftware.cn/REC/  录屏软件录屏功能就是本职,这款录屏工具在录屏模式上提供了多种选项,可以选择屏幕录制、窗口

Android 10.0 mtk平板camera2横屏预览旋转90度横屏拍照图片旋转90度功能实现

1.前言 在10.0的系统rom定制化开发中,在进行一些平板等默认横屏的设备开发的过程中,需要在进入camera2的 时候,默认预览图像也是需要横屏显示的,在上一篇已经实现了横屏预览功能,然后发现横屏预览后,拍照保存的图片 依然是竖屏的,所以说同样需要将图片也保存为横屏图标了,所以就需要看下mtk的camera2的相关横屏保存图片功能, 如何实现实现横屏保存图片功能 如图所示: 2.mtk

android应用中res目录说明

Android应用的res目录是一个特殊的项目,该项目里存放了Android应用所用的全部资源,包括图片、字符串、颜色、尺寸、样式等,类似于web开发中的public目录,js、css、image、style。。。。 Android按照约定,将不同的资源放在不同的文件夹中,这样可以方便的让AAPT(即Android Asset Packaging Tool , 在SDK的build-tools目

Android fill_parent、match_parent、wrap_content三者的作用及区别

这三个属性都是用来适应视图的水平或者垂直大小,以视图的内容或尺寸为基础的布局,比精确的指定视图的范围更加方便。 1、fill_parent 设置一个视图的布局为fill_parent将强制性的使视图扩展至它父元素的大小 2、match_parent 和fill_parent一样,从字面上的意思match_parent更贴切一些,于是从2.2开始,两个属性都可以使用,但2.3版本以后的建议使

HomeBank:开源免费的个人财务管理软件

在个人财务管理领域,找到一个既免费又开源的解决方案并非易事。HomeBank 正是这样一个项目,它不仅提供了强大的功能,还拥有一个活跃的社区,不断推动其发展和完善。 开源免费:HomeBank 是一个完全开源的项目,用户可以自由地使用、修改和分发。用户友好的界面:提供直观的图形用户界面,使得非技术用户也能轻松上手。数据导入支持:支持从 Quicken、Microsoft Money