乐趣区

关于windows:笔记使用-PDB-符号文件导出-Windows-内核数据结构

Windows 提供的根底系统文件(从上到下为依赖关系)

  • msvcrt.dll ucrtbase.dll 提供根底 CRT(C 语言运行时)库,例如 fopen_sleep 等。前者 msvcrt 绑定 MSVC 版本号,不同的版本不齐全兼容(这也是装置很多软件时会让你装微软运行时的缘故),后者是微软新出的通用版本,所谓 Universal CRT
  • kernel32.dll kernelbase.dll 提供 Win32 兼容 API 函数,例如根本的 CreateFileW(留神 CreateFile 是宏而非函数)和 SleepEx 等,这些函数都是面向用户端的
  • ntdll.dll 提供用户端的 WinNT 内核函数入口,例如 NtCreateFileNtDelayExecution。这些以 Nt 打头的函数是用户端能接触到的 Windows 零碎最底层的函数。参数要求严苛(例如全副要求 wchar_t 编码,路径名要求奇葩的 NTFS 格局),实现都是些 syscall
  • ntoskrnl.exe WinNT 零碎内核镜像(NT Operating System KeRNeL)。这里寄存真正的内核代码,用户端接触不到,入口即为下面的 ntdll

维基百科:https://en.wikipedia.org/wiki…

微软公开的 Windows API 都是继承自 Windows 95 上古年代的 Win32 API,即 kernel* 提供的那些。MDSN 上有残缺的文档,Windows SDK 有残缺的头文件。微软(名义上)保障 API 和 ABI 的双兼容,这就是 WinXP 甚至某些 Win98 上运行的程序都能够间接在 Win11 上运行的起因。

然而 Windows NT 内核,WinNT API 才是精髓。比方 Win32 API 中 Sleep(0) 的非凡行为,在 WinNT API 中可是明确的辨别为 NtDelayExecutionNtYieldExecutionntdll 提供了大量贴近内核功能强大的函数,微软一不提供文档阐明和头文件定义,二不保障不同版本间 AxI 兼容(比方这次 IoRing ABI 不兼容,让我调试了良久),想用有时还得手动 LoadLibrary(当然绝大多数状况链接 ntdll.lib 就够了)

想用 WinNT API,首先要晓得 WinNT 提供了哪些函数能够用。这里最简略的方法,应用 PE Viewer(笔者这里应用 XPEViewer)关上 ntdll.dll,查看导出函数表

这些函数都是很标准的 Pascal 命名,看名字就能把用处猜个大略,而后在网上搜寻即可。如果往下翻一翻还能够看到 ntdll 还定义了很多 CRT 中的函数。

通过 PE Viewer 只能看到函数名,如果要调用须要他们的准确申明。一部分申明能够在 ntoskrnl.exe 的符号文件(PDB)中找到

PDB 是公开的,能够在微软的符号服务器下载。在 MSVC 中调试零碎 dll 时主动下载局部符号文件(kernel32.pdbntdll.pdb 等),但绝不可能下载到 ntoskrnl.pdb。这里能够用 PDBDownloader 手工下载。

下载之后的 pdb 文件能够应用 PDBRipper 读取

PDBRipper 当初有个 bug,不反对构造体中的匿名共用体。

也能够用 pdbex 间接导出头文件,而且没有匿名共用体的 bug

PDB 文件中能获取到绝大多数函数中用到的数据结构(构造体和共用体),依然没有准确的函数申明。函数申明能够在网上找到一部分,剩下的我也不晓得从哪搞 ;)

退出移动版