c++字符串加密_使用frida破解Native层加密

所需设备和环境:

设备:获取root权限的安卓手机

抓包:fiddler + proxyDroid

反编译:jadx-gui,ida

前两天逛知乎,看到一个app,博主介绍了如何解决抓包问题,之后如何抓取数据就没有了,这里接着来看看如何破解这个app的加密参数,并请求拿到数据。这是原帖链接:https://zhuanlan.zhihu.com/p/46433599

抓包

先root手机,安装proxyDroid强制全局代理app,打开fiddler先来抓个包:

b3a65a8aa1c8c3038eddbbf175eabbef.png

成功抓到了列表详情页的数据,下拉刷新两次来看看请求参数有什么变化:

47baa7d865b0d1b67a658a416c3d6600.png

922f77ec49285e53c05e54594fdb791a.png

对比可得nonce和sign每次请求都在变,其他参数不是固定就是一些时间戳,所以我们只需破解这两个参数就可以拿到列表详情页的数据。

反编译

jadx中打开app,先来全局搜索nonce:

475169b6526a8cbe48282dd75ac54aaf.png

点进去第一个看看:

1d50380ff69e60cf139fd7cde9acee03.png

运气好像不错,这里定义了一个map,里面都是请求参数的生成方法,按住ctrl,鼠标点击这个a函数,看看nonce的具体内容:

8b090a59b11dc109d8ab28e594254a32.png

比较好容易理解,是从26个英文字母和10个阿拉伯数字中随机选择6个字符,然后拼接当前时间戳就形成了nonce参数,用python可以轻松实现,不过这里我们使用rpc主动调用来获取参数,以后如果遇到不理解的参数就可以直接主动调用:

b6f8bacd2c9f8e955f55f703696e461b.png

接下来看看sign,按住ctrl点击sign跳转到了如下页面:

13f92dc47e0037dce48b3d6777375ee8.png

Sign的加密方法写到了native层去了,那我们只好去分析这个名为tre的so文件了,解压目标apk获取到了如下图这些文件:

2ec4af23881f78516b79a422d208a42d.png

So文件就在这个lib文件夹里:

6a27b1eb8a206613d83809e692e988ef.png

ida中打开这个文件,切换到导出函数Export选项卡,先来直接搜索sign:

2484ab135979c42962bb5fb07013794b.png

直接搜索到了,双击第一个点进去看看详情,都是汇编语言,按F5可以把汇编代码转换为伪C代码,下拉分析一波,看到这里有一个sha1的加密算法,因为在fiddler中看到 sign加密后的内容是40位,而sha1加密后也是40位,因此猜测它就是目标函数,那么先来hook这个函数看看:

c743cf5a7f3a0be5a25b961f4cefcc41.png

1d3cc9edc1d9fee8e8c567fa38608373.png

这里0x18C6即为j_SHA1Input函数的地址,ida中使用tab键切换到汇编代码就可以获取到:

af5f92d7b00109490c7635822adc1ebb.png

加1是为何,只记得大学时候学过汇编语言讲到段地址,偏移地址,物理地址这些,猜测和这些知识有关,还需研究,这里先这样用,运行这个脚本看看打印输出:

83847eb414d75790494fa2703746850d.png

成功hook到了,但是这个结果是以”=”结尾的,应该是个base64,再来看看伪c代码:

107a93d8f3f5425f931da44ed51b1f12.png

这里果然有一个base64编码,继续来hook这个函数:

d75a4618da6554ebb1e18fb2b4113b3e.png

运行脚本,得到了结果:

a2a7b6504bf884a789c7439ca228de27.png

复制这个v10参数到sublime,使用正则表达式把”&”替换成换行符,来看看具体内容:

421448710a0b540ff0a000899ed80132.png

就是请求参数拼接了一个固定字符串,至此,逆向就全部完成了,总结一下,这个sign参数就是以上字符串先通过base64编码,然后sha1加密,使用python来改写。

请求

代码如下:

b026e14fcf4d3591287101f77237d1df.png

9c8bbf978e08070e025694c48517a488.png

运行一波,成功拿到数据:

0e8b5b90e74e57f2df2d8bf8ce09d697.png

总结

今天主要介绍了native层hook的方法,虽然 so文件中的伪c代码要有一定的基础才能看懂,但是先不要怕,分析的过程中可以先大胆假设,有frida非常强大的hook功能,就能一步步验证之前的假设。这两次都是静态分析方法,下次我们再来介绍一下动态调试的方法。

最后,以上内容仅供学习交流。

公众号终于获得了留言功能,评论区燥起来啊fa33ca9c796936dcc162468d4300905a.png

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Frida字符串转为JSON的过程可以使用以下代码进行操作: 在Frida中,可以使用JavaScript语言来进行字符串到JSON的转换。可以使用JSON.parse()函数将字符串解析为JSON对象。例如,可以使用以下代码将字符串转换为JSON对象: ```javascript var jsonString = '{"name": "John", "age": 30}'; var jsonObject = JSON.parse(jsonString); ``` 在这个例子中,我们将一个包含"name"和"age"字段的JSON字符串解析为一个JSON对象。 如果你需要将JSON对象转换回字符串,可以使用JSON.stringify()函数。例如,可以使用以下代码将JSON对象转换为字符串: ```javascript var jsonObject = { "name": "John", "age": 30 }; var jsonString = JSON.stringify(jsonObject); ``` 在这个例子中,我们将一个包含"name"和"age"字段的JSON对象转换为一个JSON字符串。 所以,在Frida中,要将字符串转换为JSON,可以使用JSON.parse()函数,而要将JSON转换为字符串,可以使用JSON.stringify()函数。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [NSDictionary转换成JSON字符串](https://blog.csdn.net/huangyong1314/article/details/50820040)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [将json字符串转化为hashmap的问题](https://blog.csdn.net/honeysx/article/details/113857904)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值