git链接:
详细的使用方法请见git仓库中的README文件,下面进行简要介绍。
query-pdb是一个用于在服务端解析PDB文件的工具,客户端只需要向服务端发送要查询程序文件的版本信息和所需的全局变量、函数名称、结构体属性名,即可得到对应的偏移量。
简介
PDB文件是Windows平台上的调试符号文件,其中记录着可执行文件的调试符号信息,包括全局变量、函数、结构体(联合体)、枚举等信息。微软为Windows平台上的一些可执行程序提供了PDB文件,例如ntdll.dll,ntoskrnl.exe和win32k.sys等。
一些系统级的安全软件需要定位操作系统内核中未公开的全局变量、函数名称、结构体属性偏移,这些偏移量可能随着系统的版本变化而变化,因此这些软件需要根据当前操作系统的版本决定其使用的偏移量。
目前主要有以下几种方案:
- 在内核中通过特征码定位到关键代码片段,再通过反汇编引擎解析。
- 针对不同版本号记录对应的偏移量。
- 在客户端下载PDB文件,本地解析。
第一种方案由于不同版本系统的特征码可能会有所变化,因此较难做到全系统适配。第二种方案同样需要在前期进行大量工作。第三种方案需要下载PDB文件(通常大于10M),有较大的网络流量开销。
上面的方法看起来都不够优雅,因此我编写了这个PDB在线解析工具。
服务端
服务端使用C++进行开发,不依赖于微软的DIA SDK,因此具有跨平台的特性,可以部署在Windows、Linux服务器上。
客户端
客户端同样使用C++进行开发,包含用户态和内核态的两个demo,也就是说,你可以在应用层发送请求,然后再将偏移量传输给内核驱动,这也是比较标准的做法。除此之外,你还可以在内核态直接向服务器发送请求获得偏移量。
使用方式简介
客户端发送如下请求:
1
2
3
4
5
6
7
8
9
10
|
{
"name"
:
"ntkrnlmp.pdb"
,
"guid"
:
"8F0F3D677778391600F4EB2301FFC7A5"
,
"age"
:
1
,
"query"
: [
"KdpStub"
,
"MmAccessFault"
,
"xxxxxx"
]
}
|
服务端响应如下:
1
2
3
4
5
|
{
"KdpStub"
:
3773768
,
"MmAccessFault"
:
2454256
,
"xxxxxx"
:
-
1
}
|
运行演示
服务端日志
1
2
3
4
5
6
7
|
[
2023
-
02
-
20
20
:
19
:
14.638
] [info] create downloader, path: save, server: https:
/
/
msdl.microsoft.com
/
download
/
symbols
/
[
2023
-
02
-
20
20
:
19
:
46.007
] [info] symbol request: {
"age"
:
1
,
"guid"
:
"152D2E35E673E842C282B1EDB82FD060"
,
"name"
:"ntkrnlmp.pdb
","
query
":["
KdpStub"]}
[
2023
-
02
-
20
20
:
19
:
46.009
] [info] lookup pdb, path: ntkrnlmp.pdb
/
152D2E35E673E842C282B1EDB82FD0601
/
ntkrnlmp.pdb
[
2023
-
02
-
20
20
:
19
:
46.010
] [info] pdb already exists, path: ntkrnlmp.pdb
/
152D2E35E673E842C282B1EDB82FD0601
/
ntkrnlmp.pdb
[
2023
-
02
-
20
20
:
19
:
48.638
] [info] symbol request: {
"age"
:
1
,
"guid"
:
"152D2E35E673E842C282B1EDB82FD060"
,
"name"
:"ntkrnlmp.pdb
","
query
":["
KdpStub
","
MmAccessFault"]}
|
应用程序
驱动
更多【query-pdb: PDB文件在线解析服务】相关视频教程:www.yxfzedu.com