电梯

开端

好吧,今天我们要实验的,是一款不知名的xxxx跑步APP,这款APP除了会记录你跑步的数据,还会通过当 日/周/月 的跑步距离生成一个排行榜,我们的目标就是尽可能的让跑步数据夸张(真实?),并突破人体极限,拿下冠军宝座。
真实教程:如何突破人类跑步速度的极限(误-LMLPHP
真实教程:如何突破人类跑步速度的极限(误-LMLPHP

困难度==0的方式

首先就是非常平庸的模拟器模拟。
我们大家都知道,AVD自带导入GPX文件功能,更加方便的模拟坐标。
(嗯?其实GPX文件就是个包含了坐标信息的XML文件而已)
真实教程:如何突破人类跑步速度的极限(误-LMLPHP

用户们的赤裸裸的歧视啊。

尝试抓包

那就改数据包试试吧,这里我用的fiddler。

可以确定的是,当点击开始跑步时先会通过/api/run/runPage接口通知服务器。在跑步过程中,软件并没有和服务器交互。
(其实和amap,也就是高德地图交互了,)
真实教程:如何突破人类跑步速度的极限(误-LMLPHP
只有在跑步结束后,软件会调用/api/run/saveRunv2接口,并发送如下的神秘数据包。
真实教程:如何突破人类跑步速度的极限(误-LMLPHP
嗯,瞧这个格式,说明。。。
说明这个开发者很喜欢百分号啊!()
咳咳,其实就是urlencode而已,可以看到解码之后data字段里面是个JSON。
真实教程:如何突破人类跑步速度的极限(误-LMLPHP
那我们伪造这个JSON就好啦,不过。
那个sign字段里的是什么?看起来很像校验值,是什么的校验值呢?
尝试对后面data字段内的JSON进行校验值计算,然而,结果完全不对。
好吧,看起来我们必须得拨开这个APP的外衣(误)稍稍看一下下这个校验过程了。

深入核心

直接从apk中提出来dex,然后使用dex2jar。
啊,看起来被加固了。
真实教程:如何突破人类跑步速度的极限(误-LMLPHP
不过没关系,我们有在运行时Hook的脱壳神器FDex2。
真实教程:如何突破人类跑步速度的极限(误-LMLPHP
嗯,看起来,大成功?
呃,一部分的函数/类/字段/包名都被混淆 成了a b c d。。。
真实教程:如何突破人类跑步速度的极限(误-LMLPHP
不过常量字符串没有被混淆,我们通过全局字符串查找我们需要的api接口(也就是"saveRunv2")很快就会发现发送我们需要数据包的代码就在这个SportActivity中。
真实教程:如何突破人类跑步速度的极限(误-LMLPHP
终于我们顺藤摸瓜找到了加密过程:md5(salt+data)
而salt作为字符串常量,虽然变量名被混淆,但却依然可以看出来:
真实教程:如何突破人类跑步速度的极限(误-LMLPHP
真实教程:如何突破人类跑步速度的极限(误-LMLPHP
函数a:
真实教程:如何突破人类跑步速度的极限(误-LMLPHP
emmm。。。无论你混淆成啥样这也很明显的是个MD5校验函数。。。。

扳手的制作过程

好了,接下来我们就可以写点代码重新制作数据包,利用fiddler拦截并替换即可。
GitHub链接,里面有你懂的

END

荣登冠军宝座。(没错第一就是我!)
然而,一想到自己实际上屁股就这么在椅子上坐了七天,泪水便不争气的流了下来。

10-07 18:57