Giter Site home page Giter Site logo

0xlane / wechat-dump-rs Goto Github PK

View Code? Open in Web Editor NEW
339.0 4.0 49.0 3.25 MB

该工具用于导出正在运行中的微信进程的 key 并自动解密所有微信数据库文件以及导出 key 后数据库文件离线解密。

Rust 100.00%
pentesting pentesting-tools red-team-tools redteam rust wechat windows

wechat-dump-rs's Introduction

wechat-dump-rs

该工具用于导出正在运行中的微信进程的 key 并自动解密所有微信数据库文件以及导出 key 后数据库文件离线解密。

可能存在封号风险,后果自负!!!

工具用法

wechat-dump-rs (1.0.3) - REinject
A wechat db dump tool
Options:
  -p, --pid <PID>        pid of wechat
  -k, --key <KEY>        key for offline decryption of db file
  -f, --file <PATH>      special a db file path
  -d, --data-dir <PATH>  special wechat data dir path (pid is required)
  -o, --output <PATH>    decrypted database output path
  -h, --help             Print help

如果不带任何参数,程序只输出所有微信进程的 key、微信号、登录设备、数据目录、版本等信息:

=======================================
ProcessId: 12768
WechatVersion: 3.9.7.25
AccountName: nihao123
PhoneType: iphone
DataDir: C:\Users\test\Documents\WeChat Files\wxid_uy9q2sudtiqv22
key: b16aa99b8e8323f6bb0ebf2ef83ff88f2e47d86d913345933a7168d55aa7e362
=======================================

使用参数 -a 可以直接导出所有数据库文件。

原理

一般情况下,key 要在运行的微信进程内存中拿到,内存偏移在每个版本都不一样,大部分工具是对每个版本维护一套偏移,但是当出现新版本的时候都要重新找偏移,方法见后面有简单记录。

其实,除了这个方法外,还有一个更通用的方法就是内存暴力搜索找到能用于解密的密钥位置,当然如果对进程全部内存扫一遍肯定不行,所以项目里用下面这种方式缩小密钥内存范围加快扫描速度:

  1. 微信登录设备类型基本只有 iphone、android,在内存中先搜到设备类型所在内存,key 就在它的前面,向前搜就行
  2. key 的内存地址和登录设备类型据我观察是 16 字节对齐的,所以每次向前 16 字节

还有其它一些小细节,直接看一下代码吧。

已测试版本列表

其它未测试版本不代表不能用,这个列表只是我本地有过的环境。

  • 3.9.6.33
  • 3.9.7.25
  • 3.9.7.29
  • 3.9.8.9
  • 3.9.8.15
  • 3.9.10.19

如何手动寻找偏移

注意:我找的偏移不是其他人找的直接的内存偏移,而是微信的一个数据结构相对偏移,这个有什么用呢,我刚开始打算通过 yara 扫 WeChatWin.dll 二进制文件确定一个相对偏移,然后根据内存中找到的设备类型地址就能直接推算出其它数据的内存地址,通不通用的关键就在于 yara 了,我没写出通用的,所以才改成了上面的思路。

使用 CheatEngine 在内存中搜索找到 key 或微信号的内存地址,必须是在 WeChatWin.dll 内存范围内,然后使用 x64dbg 动态调试,在 key 地址下硬件内存访问断点,之后登录微信后可中断到一个地方,然后一直向上回溯可以找到偏移。

以微信号为例,在 CE 中搜索,我这里使用第二个地址,因为它和 key 的位置比较近:

1.png 2.png

在 x64dbg 中跳过去

3.png

加个硬件访问断点

4.png

然后会自动断下或者需要重启后重新登录断下,r12 寄存器当前地址就是微信号所在地址:

5.png

在这个指令这里右键复制文件偏移,在 ida 中打开 wechatwin.dll 跳转过去:

6.png

之后,到 ida 可以很明显看到 r12 的地址来自于 sub_1808D2FA0:

7.png

sub_1808D2FA0 的最后可以拿到一个地址 183B28120

8.png

183B28120 + 720 - 180000000 = 3B28840

9.png

在 x64dbg 中就可以根据这个文件偏移明确找到微信号的位置,和最初 CE 里搜到的地址一致:

10.png

通过同样的方式,分别找到 nickname、phone、key 的相对偏移。

nickename:183B28120 + 1E8 - 180000000 = 3B28308

11.png

wechat-dump-rs's People

Contributors

0xlane avatar howardlau1999 avatar mas0nshi avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

wechat-dump-rs's Issues

提取的密钥可以解密前几年保存的聊天记录吗?

手机丢了,电脑上只有在19年登录过,我用您的工具提取的key,去解密电脑上19年的聊天记录时,提示

decryption in progress, please wait...
thread 'main' panicked at src\main.rs:610:77:
called Result::unwrap() on an Err value: Hash verification failed
note: run with RUST_BACKTRACE=1 environment variable to display a backtrace

是不是微信中间换过密钥的生成方式?还是因为我中间改过id,造成了密钥变化?

程序找不到用户名

系统: win11
微信版本: 3.9.7.29

可以找得到登陆方式 iphone,但是在找用户名的过程中出问题了。

[src\main.rs:234] format!("{:#02x}", & phone_type_string_addr) = "0x7ffbc187c1b0"

image

我看了一下 iphone 这个串的内存地址是正确的。

报错

确认包含Misc.db文件,并且存在多个Misc.db(qq也存在Misc.db文件)
报错:
┌──(Tom💀TEST)-[/Downloads] 0ms ✓
└─# .\wechat-dump-rs.exe
[+] wechat version is 3.9.7.29
thread 'main' panicked at 'called Result::unwrap() on an Err value: Utf8Error { valid_up_to: 27, error_len: Some(1) }', src\procmem\mod.rs:44:96
note: run with RUST_BACKTRACE=1 environment variable to display a backtrace
NativeCommandExitException: Program "wechat-dump-rs.exe" ended with non-zero exit code: 101.
┌──(Tom💀TEST)-[
/Downloads] 356ms ⨯
└─# .\wechat-dump-rs.exe -a
[+] wechat version is 3.9.7.29
thread 'main' panicked at 'called Result::unwrap() on an Err value: Utf8Error { valid_up_to: 27, error_len: Some(1) }', src\procmem\mod.rs:44:96
note: run with RUST_BACKTRACE=1 environment variable to display a backtrace
NativeCommandExitException: Program "wechat-dump-rs.exe" ended with non-zero exit code: 101.
┌──(Tom💀TEST)-[~/Downloads] 63ms ⨯
└─# .\wechat-dump-rs.exe -p 14644
[+] wechat version is 3.9.7.29
thread 'main' panicked at 'called Result::unwrap() on an Err value: Utf8Error { valid_up_to: 27, error_len: Some(1) }', src\procmem\mod.rs:44:96
note: run with RUST_BACKTRACE=1 environment variable to display a backtrace
NativeCommandExitException: Program "wechat-dump-rs.exe" ended with non-zero exit code: 101.

微信 3.9.7.29版本提示not found key

d:\tmp1>wechat-dump-rs.exe
[+] wechat version is 3.9.7.29
[+] login phone type is android
[+] wechat data dir is C:\Users\deans\Documents\WeChat Files\sunxxx
[+] account name is sunxxx
thread 'main' panicked at src\main.rs:352:9:
not found key
stack backtrace:
0: 0x7ff741a5a5a3 -
1: 0x7ff7419db97b -
2: 0x7ff741a4e021 -
3: 0x7ff741a5caf4 -
4: 0x7ff741a5c7a3 -
5: 0x7ff741a5cfd0 -
6: 0x7ff741a5cc53 -
7: 0x7ff741a5cbd9 -
8: 0x7ff741a5cbc4 -
9: 0x7ff741aa0365 -
10: 0x7ff741978020 -
11: 0x7ff7419814fb -
12: 0x7ff741972411 -
13: 0x7ff741982f25 -
14: 0x7ff741a9f11c -
15: 0x7fffb50f7344 - BaseThreadInitThunk
16: 0x7fffb54026b1 - RtlUserThreadStart

执行出错

C:\secure\wechat-dump-rs-main>wechat-dump-rs.exe
thread 'main' panicked at 'called Result::unwrap() on an Err value: FromUtf8Error { bytes: [211, 239, 200, 184, 46, 101, 120, 101], error: Utf8Error { valid_up_to: 0, error_len: Some(1) } }', C:\Users\thin0.cargo\registry\src\index.crates.io-6f17d22bba15001f\tasklist-0.2.12\src\lib.rs:217:54
note: run with RUST_BACKTRACE=1 environment variable to display a backtrace

file is not exsit

我修改过我的微信路径,目前为G:\WeChat Files
执行wechat-dump-rs.exe报错:G:\WeChat Files\wxid_4bwa1yvxxxxx\Msg\ChatRoomUser.db G:\WeChat Files\wxid_4bwa1yvxxxxx\Msg\Misc.db is not exsit: Error { kind: InvalidInput, message: "strings passed to WinAPI cannot contain NULs" },我确保文件是存在的,我不清楚为什么会报这样的错误
微信版本:3.9.10.27
Release:V1.0.6

yara 匹配 Data Dir 错误

部分微信(比如说我)数据库目录不为 wxid_* 可能是 C:\Users\test\Documents\WeChat Files\abc02030405

简单了解了下,个人用户存在两种情况

  • 申请账号时使用的微信号(早期注册,长度及命名规则为 [0-9a-zA-Z-_]{6,20}
  • wxid_[0-9a-zA-Z]{14} (过去某个版本起,为系统自动生成)

rule GetDataDir
{
strings:
$a = /[a-zA-Z]:\\Users\\.{0,50}\\Documents\\WeChat Files\\wxid_[0-9a-zA-Z]{14}/
condition:
$a
}

导出缺少表 ContactLabel

微信版本 3.9.10.19
dump出来的数据库缺少表 ContactLabel
中间切换过微信,不知道是不是跟切换授权微信有关系。
另外一种情况,是不是没有缓存到 标签数据,本地就不会有表 ContactLabel

未知错误note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

微信文件路径设置在D盘的英文路径下:D:\Program Files\Tencent\WeChat Files\WeChat Files\wxid_b5efm05dybi121

thread 'main' panicked at C:\Users\runneradmin\.cargo\registry\src\index.crates.io-6f17d22bba15001f\tasklist-0.2.13\src\lib.rs:217:54:
called `Result::unwrap()` on an `Err` value: FromUtf8Error { bytes: [77, 101, 115, 115, 97, 103, 101, 84, 111, 111, 108, 115, 32, 213, 253, 202, 189, 176, 230, 32, 50, 46, 55, 46, 101, 120, 101], error: Utf8Error { valid_up_to: 13, error_len: Some(1) } }
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

database disk image is malformed

可以正常打开但是,有的数据页会受损

(base) PS C:\my_program\Asahngdan\WeChatMsg> sqlite3 "C:\my_program\Asahngdan\WeChatMsg\app\DataBase\wechat_14756\MediaMSG0.db" "PRAGMA integrity_check;"
*** in database main ***
Page 6564: btreeInitPage() returns error code 11
Page 6560 is never used
Page 6561 is never used
Page 6562 is never used
Page 6563 is never used
Error: stepping, database disk image is malformed (11)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.