一、目标

为了防止数据被截获,有些App把返回数据做了加密,比如下面这个:

某汽车资讯App 返回数据解密_android

content 部分就是密文。我们今天就来搞搞它。

二、步骤

jadx搜索 content"

返回值是个json,那么它一定要把密文解析出来再解密,所以我们先搜索 content",看看有没有什么收获:

某汽车资讯App 返回数据解密_android_02

不开心,结果有点多,这个不好办……

hooker

今天介绍一个大佬的新玩具

github.com/CreditTone/…

hooker 是一个基于frida实现的逆向工具包。为逆向开发人员提供统一化的脚本包管理方式、通杀脚本、自动化生成hook脚本、内存漫游探测activity和service和其他任意对象。

听起来很拉风的样子。

按照说明配置好

git clone https://github.com/CreditTone/hooker.git
cd hooker
pip install -r requirements.txt // 安装依赖

然后先把App启动起来,再运行 ./hooker

这时候会列出当前所有的进程名,如果没有列出来,那就可能是frida-server没有启动

输入 我们要分析的app包名 com.yxxxx.axxxxx,就会进入到交互式控制台,这里提供了几个有意思的功能,不过今天我们暂时用不到。

ex 退出交互式控制台。

hooker替我们生成了一些辅助脚本,我们进入 com.yxxxx.axxxxx 文件夹

fenfeiMac:com.yxxxx.axxxxx feifei$ ls
activity_events.js log
android_ui.js object_store.js
attach objection
click.js spawn
edit_text.js spider.py
hook_RN.js ssl_log.js
hooking text_view.js
just_trust_me.js url.js
keystore_dump.js xinit
kill xinitdeploy

这里我们用到的是 text_view.js 辅助命令。

为什么呢?

先看看作者的说明

跟踪TextView的setText和getText,获取TextView的真实Class。一般setText的堆栈信息会带出业务层的数据model处理逻辑,进而进一步分析到业务层数据bean封装类。

密文数据总归是要解密成明文显示出来的,我们在显示明文的时候打印出堆栈,不就可以分析它的解密过程了吗?

某汽车资讯App 返回数据解密_android_03

召唤Jadx

某汽车资讯App 返回数据解密_安全_04

逮住了,顾名思义,应该就是这个 EncryptUtils.O000000o

自动生成hook代码

这时候可以用上 hooker 另一个比较拉风的功能了,自动生成Hook js代码

先回到之前的那个交互式控制台。(怎么回去?退出当前命令,到上级目录 重新输入 ./hooker 命令呗)

fenfeiMac:com.yxxx.axxx fenfei$ cd ..
feifenMac:hooker fenfei$ ./hooker
PID Name Identifier
----- --------------------------------------- ------------------------------------------------
2505 ANT HAL Service com.dsi.ant.server
17295 Analytics com.miui.analytics
17166 Android Services Library android.ext.services
......

Enter the need to attach package.
: com.yxxx.axxx
It's com.yxxx.axxx that you have attached app.
--------------------------------------------------
Please enter e, s, j, c or ex command.
a: Discovering activities.
b: Discovering services.
c: Discovering object. eg:'c {objectId}'
d: Object2Explain. eg:'d {objectId}'
v: Discovering view. eg:'v {viewId}'
e: Determines whether a class exists. eg:'e android.app.Application'
s: Discovering classes by a class'regex. eg:'s com.tencent.mm.Message.*'
t: Discovering offspring classes by a class'name. eg:'t com.tencent.mm.BasicActivity'
j: Generating hooked js. eg:'j okhttp3.Request$Builder:build'
k: Generating hooked the string generation js with a keyword. eg:'k {YourKeyword}'
l: Generating hooked the param generation js with a param keyword. eg:'l {YourKeyword}'
m: Discovering so module.
: j com.bxxx.libcommon.tools.Encrypt -o com.bxxx.libcommon.tools.Encrypt.js
Hooking js code have generated. Path is com.yxxx.axxx/com.bxxx.libcommon.tools.Encrypt.js.

ok了,再进入 com.yxxxx.axxxxx 文件夹,跑一下这个js

fenfeiNewMac:hooker feifei$ cd com.yxxx.axxx
feifeiMac:com.yxxx.axxx fenifei$ ./hooking com.bxxx.libcommon.tools.Encrypt.js

结果出来了

某汽车资讯App 返回数据解密_数据_05

三、总结

大佬们造了很多有意思的轮子,善于使用这些轮子,往往可以事半功倍。 hooker 还有很多有意思的功能等待挖掘。

某汽车资讯App 返回数据解密_安全_06好男儿当有一份拉几把倒的情怀,把人生当做一次旅行好了,很多事情其实都无所谓的,看淡些 ——from 鲁迅 [社会社会]

TIP: 本文的目的只有一个就是学习更多的逆向技巧和思路,如果有人利用本文技术去进行非法商业获取利益带来的法律责任都是操作者自己承担,和本文以及作者没关系。

关注微信公众号: 奋飞安全,最新技术干货实时推送