瞎猫碰到死耗子,安卓nt_qq数据库密钥算法

news/2024/11/17 5:24:50/文章来源:https://www.cnblogs.com/WXjzc/p/18351364

这个我实际上弄了很久了,一开始更新的时候,发现数据库操作都是在so里,那时候是在libkernel.so里直接hook sqlcipher的密钥函数拿到的密钥,32位字符串,很容易让人联想到md5,但是没有找到在哪里计算的

最近又想着做一下,这时打开数据库的so就变了,这是easyFridasofileopen插件hook出来的结果,目前使用的是libbasic_share.so这个so

不过这个so在apk包里面并没有,应该是运行的时候释放出来的

在应用目录里是可以拿到的

结果这个so的导出表里有md5相关的函数,而以前的libkernel并没有,感谢qq!!!!!!!!!!!!!

而且很多以前没有函数名的函数,这次也能看到函数名了,就比如密钥初始化函数

hook一下拿到密钥(直接attach,然后在登录、查看个人信息等时机可以hook到)

setImmediate(function () {Java.perform(function () {function buf2str(buffer) {let result = '';const byteArray = new Uint8Array(buffer);for (let i = 0; i < byteArray.length; i++) {result += String.fromCharCode(byteArray[i]);}return result;}var baseAddr = Module.findBaseAddress('libbasic_share.so');console.log(`baseAddr:${ baseAddr }`);var keyFuncAddr = baseAddr.add(5083692);//nt_sqlite3_key_v2的地址Interceptor.attach(keyFuncAddr, {onEnter: function (args) {var nk = args[3].toInt32();var pk = args[2].readByteArray(nk);console.log('pKey--------->' + buf2str(pk));},onLeave: function (retval) {}});});
});

拿到的这个key,非常符合md5的结果,前面又有md5导出函数,干脆就看一下?

先hook了MD5DigestToBase16,可以看到aa030bae477df5ced6093d4702523a3ad28951ee5178259c2916f46f37a14c30,前者与数据库路径有关,后者就是数据库密钥

setImmediate(function () {function readStdString(str) {const isTiny = (str.readU8() & 1) === 0;// 检查是否为小字符串if (isTiny) {return str.add(1).readUtf8String();	// 读取小字符串}return str.add(2 * Process.pointerSize).readPointer().readUtf8String();	// 读取大字符串}Java.perform(function () {Interceptor.attach(Module.findExportByName('libbasic_share.so', '_ZN4xpng17MD5DigestToBase16ERKNS_9MD5DigestE'), {onEnter: function (args) {},onLeave: function (retval) {console.log('md5 ret----------->' + readStdString(retval));}});});
});

然后再看一下update函数的参数,能够看到到底是计算了哪些,能看到密钥对应的参数是c8d05c49e391e2e1d0bda579cc5250085sWvEGXu,恰好是上一条u_bv0QrXXA4YqAB3PaYr3PpQ的md5结果,而前面路径中的值则和这个结果也有关联,是md5(md5(u_bv0QrXXA4YqAB3PaYr3PpQ)+'nt_kernel'),从而得到aa030bae477df5ced6093d4702523a3a,那么密钥参数c8d05c49e391e2e1d0bda579cc5250085sWvEGXu的后面几个字符串是哪来的?

setImmediate(function () {Java.perform(function () {Interceptor.attach(Module.findExportByName("libbasic_share.so",'_ZN4xpng9MD5UpdateEPA88_cPKhm'), {onEnter: function (args) {console.log('update data ------->', args[1].readUtf8String(args[2].toInt32()));},onLeave: function (retval) {}});});
})

居然都是在数据库里?

原来是在文件头写好的

那么密钥的算法就是md5(md5(u_bv0QrXXA4YqAB3PaYr3PpQ)+数据库文件头中的随机字符串),就是0x12080x1a07之间的字符串

那么现在u_bv0QrXXA4YqAB3PaYr3PpQ这一串又是什么呢?其实这个就是QQ的uid,之前分析手机大师日志的时候,恰好看到了,从mmkv(读取这玩意儿还不是个容易事儿,得通过腾讯开源的mmkv/Python去编译。。索性搓了一个解析工具,省的换机器要重新编译)中读取用户的uid,实际上是通过QQ号(uin)去获取的

因此最终,数据库路径中的哈希=`md5(md5(uid)+nt_kernel),密钥=md5(md5(uid)+文件头字符串)`

而要打开数据库的话,需要先把数据库的前1024字节删掉,然后进行解密,解密参数中,hmac算法应该是文件头中的sha1,kdf_iter是4000,其他都是sqlcipher4的配置

打开数据库后40800字段是聊天记录,内容是protobuf编码,45101是聊天内容

ForensicsTool集成了ntqq数据库解密

mmkvReader会同步上传至GitHub

想上传到之前刷到过的一个github,hook密钥就是从那学的,结果发现人家已经把算法搞出来了。。差距啊

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/780436.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[米联客-安路飞龙DR1-FPSOC] UDP通信篇连载-06 UDP层程序设计

软件版本:Anlogic -TD5.9.1-DR1_ES1.1 操作系统:WIN10 64bit 硬件平台:适用安路(Anlogic)FPGA 实验平台:米联客-MLK-L1-CZ06-DR1M90G开发板 板卡获取平台:https://milianke.tmall.com/ 登录"米联客"FPGA社区 http://www.uisrc.com 视频课程、答疑解惑! 3.5 UDP…

[米联客-安路飞龙DR1-FPSOC] UDP通信篇连载-02 MAC层程序设计

软件版本:Anlogic -TD5.9.1-DR1_ES1.1 操作系统:WIN10 64bit 硬件平台:适用安路(Anlogic)FPGA 实验平台:米联客-MLK-L1-CZ06-DR1M90G开发板 板卡获取平台:https://milianke.tmall.com/ 登录"米联客"FPGA社区 http://www.uisrc.com 视频课程、答疑解惑! 3 程序设…

[米联客-安路飞龙DR1-FPSOC] UDP通信篇连载-03 IP_ARP层程序设计

软件版本:Anlogic -TD5.9.1-DR1_ES1.1 操作系统:WIN10 64bit 硬件平台:适用安路(Anlogic)FPGA 实验平台:米联客-MLK-L1-CZ06-DR1M90G开发板 板卡获取平台:https://milianke.tmall.com/ 登录"米联客"FPGA社区 http://www.uisrc.com 视频课程、答疑解惑! 3.2 IP_…

二叉树的非递归后序遍历如何实现?

背景 面试时考了这道题,之前一直都会递归遍历,非递归遍历倒是从来没有实际理解过它的具体过程,包括使用什么数据结构,具体的过程是怎样的?满脑子都是二叉树的层序遍历, 但是这里后序遍历和层序遍历还不太一样。 在仔细梳理并讲出自己的思路的时候,还是觉得并非易事。那就…

[米联客-安路飞龙DR1-FPSOC] UDP通信篇连载-01 以太网协议介绍

软件版本:Anlogic -TD5.9.1-DR1_ES1.1 操作系统:WIN10 64bit 硬件平台:适用安路(Anlogic)FPGA 实验平台:米联客-MLK-L1-CZ06-DR1M90G开发板 板卡获取平台:https://milianke.tmall.com/ 登录"米联客"FPGA社区 http://www.uisrc.com 视频课程、答疑解惑! ​1 概述…

manim边学边做--点

几何图形是manim中最重要的一类模块,manim内置了丰富的各类几何图形,本篇从最简单的点开始,逐个介绍manim中的几何模块。 manim中点相关的模块主要有3个:Dot:通用的点 LabeledDot:在点的中间可以加一些说明文字 AnnotationDot:使用在注释场景中的点Dot系列在manim各个模…

给定一个10GB大小的文件,存储的都是数字,如何对文件中的数字进行排序,并输出新文件?限制内存只有1GB

背景 这是一道面试题,可考察的点也不少。总结几个关键词去解决这个问题,1,文件拆分;2、排序算法;3、缓冲buffer性能优化。 啊,乍一看,这绝对不是一个初级程序员能够答出来,且能答得很好的问题,这个题目可以考察到我们的算法能力,性能优化经验。可万万不能马虎对待!开…

从「数据资产入表」到「数据资产运营管理」,成功的关键在于找到合适的数资服务提供商

璞华科技在数据服务领域深耕细作,不断突破创新,近来荣膺多项重要认证与荣誉。 璞华易表数据资产运营管理平台正式获得国家计算机软件著作登记证书。这一殊荣不仅是对璞华科技研发团队技术实力的肯定,更是对璞华易表产品原创性和创新性的高度认可。它标志着璞华易表在软件开发…

基于米尔芯驰MY-YD9360商显板的神经网络推理库测试

本篇测评由优秀测评者“短笛君”提供。 本文将介绍基于米尔电子MYD-YD9360商显板(米尔基于芯驰D9360国产开发板)的TinyMaxi轻量级的神经网络推理库方案测试。 算力测试 TinyMaix 是面向单片机的超轻量级的神经网络推理库,即 TinyML 推理库,可以让你在任意单片机上运行轻量级…

Qwen2-Math 开源 AI 模型发布;阿里云推出首个域名 AI 大模型应用丨 RTE 开发者日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文章 」、「有看点的 会议 」,但内…

ssh连接失败,排错经验

一、场景描述 ssh连接服务器,发现连接失败,但是对应服务器的ip能够ping通。 场景:[root@yl-web ~]# ssh root@10.1.101.35 ssh_exchange_identification: read: Connection reset by peer [root@yl-web ~]# ping 10.1.101.35 PING 10.1.101.35 (10.1.101.35) 56(84) bytes o…

面向忙碌的-Java-开发者的-Python-教程-全-

面向忙碌的 Java 开发者的 Python 教程(全)原文:Python for the Busy Java Developer 协议:CC BY-NC-SA 4.0一、语言 让我们从了解 Python 与 Java 的不同之处开始我们的 Python 之旅。在下一章深入研究 Python 的语法之前,我将帮助你设置 Python。 Python 是什么? Pytho…