首页
论坛
课程
招聘
[原创]分享一个超简单的PDB解析库EasyPdb
2022-7-23 20:15 3073

[原创]分享一个超简单的PDB解析库EasyPdb

2022-7-23 20:15
3073

github:
https://github.com/Kwansy98/EasyPdb

 

最近在写ARK工具,有使用未导出函数,访问某些内核结构的需求。github上有不少相关的库,如raw_pdb, pdbex等,但是里面很多功能我用不到,所以我自己封装了一个精简版的PDB解析库,可以很方便地下载PDB,获取全局变量和函数的RVA,以及获取结构体字段偏移。

 

图片描述

 

用法也是非常简单的,几个API看参数就能知道是干什么的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
int test2()
{
    EZPDB pdb = { 0 };
 
#ifndef _AMD64_
    PVOID OldValue = NULL;
    Wow64DisableWow64FsRedirection(&OldValue);
#endif
 
    // "http://msdl.blackint3.com:88/download/symbols/"
    DWORD dwError = EzInitPdb(&pdb, "C:\\Windows\\System32\\", "ntoskrnl.exe", TRUE, NULL, "D:\\symboldownload");
 
#ifndef _AMD64_
    Wow64RevertWow64FsRedirection(&OldValue);
#endif
 
    if (dwError != 0)
    {
        printf("init pdb error: %x\n", dwError);
        return dwError;
    }
 
    dwError = EzLoadPdb(&pdb);
    if (dwError != 0)
    {
        printf("load pdb error: %x\n", dwError);
        return dwError;
    }
    DWORD rva = 0;
    DWORD Offset = 0;
    if (EzGetRva(&pdb, "KeServiceDescriptorTable", &rva))
    {
        printf("KeServiceDescriptorTable: %x\n", rva);
    }
 
    if (EzGetRva(&pdb, "PspTerminateThreadByPointer", &rva))
    {
        printf("PspTerminateThreadByPointer: %x\n", rva);
    }
 
    if (EzGetOffset(&pdb, "_EPROCESS", L"ActiveProcessLinks", &Offset))
    {
        printf("_EPROCESS.ActiveProcessLinks: %x\n", Offset);
    }
    if (EzGetOffset(&pdb, "_ETHREAD", L"ThreadListEntry", &Offset))
    {
        printf("_ETHREAD.ThreadListEntry: %x\n", Offset);
    }
 
    EzPdbUnload(&pdb);
 
    return 0;
}

[2022冬季班]《安卓高级研修班(网课)》月薪两万班招生中~

收藏
点赞2
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回