首页
论坛
课程
招聘
[原创]微信 PC端 数据库 自动解密
2021-7-22 15:43 8664

[原创]微信 PC端 数据库 自动解密

2021-7-22 15:43
8664

微信 PC端 数据库 自动解密

摘要

环境:

win10家庭中文版 10.0.19043 x64(本机)

微信 3.3.0.115

openssl-1.0.2r

PC密码为32字节。

手动流程参考看雪另一位dalao整理的文章,链接见最后的参考处。我主要是把整个过程实现了自动化,顺便复习了一下api hook。

手动流程

获取密码

打开微信(不点登录)。

打开Odb附加WeChat.exe。

查找->可执行模块->WeChatWin。

用插件找ASCII字符串(我打了中文搜索补丁,直接用中文搜索的搜索ASCII字符串)。

然后搜索字符串DBFactory::encryptDB,跳转到第一次出现该字符串的位置。这里旧版本可能是第二个字符串的位置。3.3版本我找到了两个,都跳转过去看看,其中一个push语句下面有一个TEST,另一个只有一个call就return了。要找的是有TEST那个。

该TEST语句就是比较密码的地方,双击设置断点。然后运行并登录。

停在断点时,选择edx在数据窗口中跟随。

然后把从edx开始的32字节的数据dump出来,该32字节的数据就是密码。

从源码安装openssl

需要用到openssl,据说sqlcipher用的是最低版本的openssl。这里使用1.0.2u。

首先安装perl。(http://www.activestate.com/activeperl/downloads/

然后运行 x86 Native Tools Command Prompt for VS 2019 这个shell。

激活perl环境

state activate
cd /d E:\openssl-1.0.2u\

编译

perl Configure VC-WIN64A no-asm -prefix=E:\Program_Files\openssl102u
ms\do_ms.bat
nmake -f ms\ntdll.mak

检查

nmake -f ms\ntdll.mak test

安装

nmake -f ms\ntdll.mak install

奇怪的是最后还是安装到了E:\usr\local\ssl\这个目录下

解密

这里分享vs2019解密的过程。

在项目的属性页 -> C/C++ -> 常规 -> 附加包含目录 中添加openssl的include目录。

在项目的属性页 -> 链接器 -> 常规 -> 附加库目录 中添加openssl的include目录。

在项目的属性页 -> 链接器 -> 输入 -> 附加依赖项 中添加libeay32.lib和ssleay32.lib。

然后编译运行看雪文章中的代码。(链接见参考)

然后把E:\usr\local\ssl\bin\中的两个dll复制exe的根目录,exe才能正常运行。

接着把exe和两个dll复制到微信缓存文件的目录/对应用户目录/Msg/里,微信缓存目录名为WeChat Files,可以在微信设置中查到。

复制过去后运行exe即可。

自动获取(代码修改api hook)

流程

代码参考附件。

总流程如下:

复制dll到wx根目录
打开微信
注入dll
微信登录
dll把密钥dump出来
复制聊天记录文件
解密

其中dll所做的是修改目标函数的起始字节为jmp,跳转到hook函数中,然后读取原函数的参数,把密钥写到文件里,再unhook并跳回原来的位置继续运行。

因为比较懒,自动化代码没有写卸载dll的东西。另外有时会出现dump出密码后,微信直接闪退的情况。

dll

通过注入dll实现修改代码的hook来dump出密钥。

通过GetModuleHandle获取WeChatWin.dll的基址,然后加上目标api的偏移得到api的地址。

hApi = GetModuleHandleW(L"WeChatWin") + apiOffset;
hook_by_5b_code(hApi, (PROC)HookFunc);

然后查看api的代码可以推算出密钥首地址为*(*(esp - 4 + 0x10)),减4是因为有个push ebp。然后剩下的照抄test edx, edx前的代码得到。

当然也可以直接在test edx, edx的地方跳转,这样直接读edx就行。

__declspec(naked) void HookFunc()
{
    {
        DWORD _esp = 0;

        __asm {
            mov _esp, esp;
            pusha;
        }

        DWORD addr = *(DWORD*)(*(DWORD*)(_esp + 0xc));
        HANDLE hFile = CreateFileW(L"./pw.bin", GENERIC_WRITE, 0, 0, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
        WriteFile(hFile, (LPCVOID)addr, 32, NULL, NULL);
        CloseHandle(hFile);
        unhook_by_5b_code(hApi);

        __asm {
            popa;
            mov ecx, 0x53677E70;
            jmp ecx;
        }
    }
}

食用指南

GetPwHookCodeDll.cpp是dll的代码。AllInOne.cpp是自动解密的代码。需要提供wx根目录位置和微信用户文件的位置。

wx用户文件的位置:在wx的缓存文件(该目录在wx设置中有)中,有一个叫wxid_xxxxxxx的文件夹,xxxxx是你的初始wx id,这个就是对应wx账户的本地文件。

假设wx根目录是D:\WeChat,用户目录是D:\WeChat Files\wxid_bravetroops 方法一:在自动程序根目录中打开shell,输入AllInOne.exe D:\WeChat D:\WeChat Files\wxid_bravetroops即可。 方法二:在程序根目录中有个aio_cf.txt,第一行输入wx根目录,第二行输入用户目录即可。

最后会在根目录生成一个dec_ChatMsg.db的文件,就是解密后的聊天记录。

参考

[原创]PC版微信数据库解密详细教程-软件逆向-看雪论坛-安全社区|安全招聘|bbs.pediy.com

window10 安装 OpenSSL_sun-CSDN博客



[注意] 欢迎加入看雪团队!base上海,招聘安全工程师、逆向工程师多个坑位等你投递!

最后于 2021-7-23 15:27 被wx_御史神风编辑 ,原因: 修改错误,更新附件
上传的附件:
收藏
点赞3
打赏
分享
最新回复 (9)
雪    币: 2039
活跃值: 活跃值 (1081)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
caolinkai 活跃值 2021-7-26 10:31
2
0
nice
雪    币: 226
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
grayxh 活跃值 2021-7-28 07:56
3
0

雪    币: 472
活跃值: 活跃值 (597)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
wx_御史神风 活跃值 2021-7-31 22:37
4
0
grayxh
这个问题似乎是由缺少pw.bin文件引起的,这个文件是注入的dll在微信根目录下创建的,然后二进制模式写入的32字节数据库密钥。你可以打开微信根目录看看是否有这个文件,如果有就是微信根目录路径填写错误,如果没有可能是注入的dll有问题。
雪    币: 226
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
grayxh 活跃值 2021-8-4 09:05
5
0
wx_御史神风 这个问题似乎是由缺少pw.bin文件引起的,这个文件是注入的dll在微信根目录下创建的,然后二进制模式写入的32字节数据库密钥。你可以打开微信根目录看看是否有这个文件,如果有就是微信根目录路径填写错误 ...
是的 微信根目录没有pw.bin这个文件
雪    币: 472
活跃值: 活跃值 (597)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
wx_御史神风 活跃值 2021-8-4 15:57
6
0
grayxh 是的 微信根目录没有pw.bin这个文件
有可能是dll没注入到,另外微信更新了wechatwin.dll,这种方法已经不行了
雪    币: 2147
活跃值: 活跃值 (590)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
大有可为 活跃值 2021-8-10 16:47
7
0
微信3.3.5.54  已经搜不到DBFactory::encryptDB了
雪    币: 12
活跃值: 活跃值 (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
mb_arvtfhrt 活跃值 2021-8-21 20:39
8
0
现在还有其它办法可以查吗?
雪    币: 12
活跃值: 活跃值 (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
mb_arvtfhrt 活跃值 2021-8-21 20:40
9
0
wx_御史神风 有可能是dll没注入到,另外微信更新了wechatwin.dll,这种方法已经不行了
楼主,现在还有其他办法可以查吗?
雪    币: 22
活跃值: 活跃值 (197)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lovehuai 活跃值 2021-8-30 11:01
10
0
其实吧根本不用Hook,也不用注入。
我最早时用的DLL劫持+Hook,后面被数字拦了之后就换了新的方法根本不需要dll
游客
登录 | 注册 方可回帖
返回