逆向工程中型应用程序(并使其中的所有故事免费)

上周,我意识到距我在这里的最新帖子已经一年了。 我喜欢写故事,也喜欢阅读别人的故事,但前提是我认为这些故事足够有趣,老实说,这是一个很高的标准。 我最近一直在研究Android应用程序的逆向工程,因此我试图考虑一个可能涉及该领域的项目,同时对Medium的读者也很感兴趣。

反转Medium Android应用程序可能很酷,但是出于什么目的呢? 经过一番思考,我认为一个不错的目标可以是开发该应用程序的改进版本,以过滤掉需要会员资格的故事。

由于Medium向新访客免费提供了前三个故事,因此过滤需要会员资格的故事就像将它们免费发布一样容易,所以让我们在新应用中做到这一点:)

这是我们要做的:

  • 获取应用程序源代码。
  • 对其进行修改,以使Medium的后端API免费提供我们的故事。
  • 重新编译所有内容并安装被篡改的应用程序。

获取应用程序源代码

所有Android应用程序都是通过APK(Android PacKage)安装的。 Android操作系统正在使用此包文件格式分发和安装移动应用程序,并且它包含所有应用程序资源,资产,证书等,包括应用程序源代码-包含Dalvik字节码的Dex文件。 Dalvik字节码由Dalvik虚拟机执行, 它类似于Java虚拟机,但针对手机的硬件和需求进行了优化。 Dalvik虚拟机是负责在Android操作系统上执行程序的虚拟机,您可以将其视为针对手机环境进行了优化的出色而高效的主力。

我们可以轻松地从我们的APK中提取Dex文件(即使使用WinRAR,APK也是从ZIP扩展而来的打包文件格式),但是字节码指令不是人类可读的。 使用Smali / Baksmali(汇编器/反汇编器),我们可以将Dex文件转换为Smali文件,这些文件以类似于汇编的语法编写(仍然是低级的,但是可以确定)。

拥有Smali文件后,我们可以将它们转换回Java文件,但是仅能部分成功。 一些原因可能包括开发人员使用混淆器(这些工具会使逆向工程过程变得更加困难)。 尽管如此,我们仍将尝试分解我们可以做的事情,因为它确实简化了理解应用程序功能的过程。

ApktoolJadx是两个出色的工具,可以帮助我们完成上述任务。 Apktool生成Smali文件,而Jadx尝试为那些美味的Java文件付出更多努力。

(从左到右)Java,Smali和Dex,代表处理拍手请求的代码部分

免费发布所有故事

Medium向新访客免费授予三个故事,并使用存储在他们设备上的会话Cookie识别访客。 用新的会话cookie替换会话cookie意味着成为新的访问者,因为Medium的服务器可以看到它(您可以通过打开一个新的隐身窗口浏览Medium来对其进行测试)。

因此,如果所有获取故事的HTTP请求都将在没有会话cookie的情况下发送,则我们应始终获得新访问者的待遇,并成功接收每个故事。

在应用程序源代码中经过夜间游泳之后,我认为可以通过编辑OkHttp提供的默认cookie存储类来最轻松地完成上述操作。 OkHttp是用于Android和Java应用程序的HTTP库,而Medium Android应用程序是使用该库开发的。 从我的文档中可以看到,它是一个很酷的库,支持很多功能。 除其他外,它提供了一个名为JavaNetCookieJar的简洁类,在构造OkHttp客户端实例以使其持久存储Cookie时可以引用该类。 中号也在内部使用它。

用于获取故事的API调用采用/_/api/posts/{postId} ,我们不要为这些请求提供cookie。 下图显示了我们将对JavaNetCookieJar进行的修改。 您实际上可以在这里看到该类的原始实现。

^ https:\\ / \\ / api \\。medium \\。com \\ / __ \ / api \\ / posts \\ / [^ \\ /] + $是作为Java字符串转义的正则表达式,将网址与上面显示的获取故事的模式相匹配

编译修改后的应用

如前所述,我们无法完全获得Java应用程序源代码。 因此,为了能够重新编译我们的应用程序,我们需要在程序集级别进行所有更改(我们确实拥有该应用程序的完整程序集源代码)。

对程序集文件进行更改听起来很恶心,但实际上还不错。 特别是如果我们在谈论Java字节码汇编(Java虚拟机和Dalvik虚拟机都具有相对较高级别的指令集,这里不是LC-3或x86)。

这些是与我们要添加的先前Java语句相对应的Smali指令:

不必担心理解它们,但是,如果您对低级语言有一定的背景知识并试图理解这些说明,那么我应该告诉您,v2是Java源代码中名为“ url”的变量,而cond_4是使该函数返回Cookie的空列表的代码段。

将这些行添加到应用程序源之后,我们需要重新编译所有内容。 我们将再次使用Apktool,这次是根据给定的Smali文件来构建APK。 现在我们有了经过修改的APK,让我们快速对其进行真正的签名(每个Android应用程序都需要经过正常的签名过程),我们完成了!

奖励:添加新的设置选项

与我们已经做过的类似,我添加了一个新的设置选项来启用和禁用我们的更改。 只需添加一些条件语句,复制现有的设置代码,然后将其紧密地挂钩即可。 我们的新应用程序很棒,请在下面查看!

我最喜欢写的方式是专注于事物的高级方面,而不过多地解释技术性内容(例如我传入Apktool的参数)。 但是,如果您想学习这篇文章中介绍的实际技术技能,我会列出一些我最喜欢的资源:

引用反向工程Android应用

Smali寄存器说明

Smali类型,方法和字段说明

Dalvik操作码

我可能还应该提到,Medium应用程序相当容易反转,当开发人员实际上真的不希望您反转他们的应用程序时,事情变得更加复杂。 但是,这些技术困难通常伴随着奖励性的,未修补的错误,这些错误仅由于这些困难而隐藏。 移动应用程序中的错误在我的经验中很常见,在大公司的产品中也很常见(例如,我最近在Zynga受欢迎的游戏“ Draw Something”中发现了一个错误,该错误可以无限量提供游戏币。我被添加到他们的Whitehats页面中,用于那)。

希望您喜欢我们的小项目,我当然做到了:)

中请不要起诉ue
都是为了教育目的。

更新-故事的第二部分 在这里

From: https://hackernoon.com/dont-publish-yet-reverse-engineering-the-medium-app-and-making-all-stories-in-it-free-48c8f2695687

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值