x64加载内核符号解析地址

本文提供了一段简洁易懂的x64内核符号枚举代码,包括从设备驱动中获取符号路径、加载模块并进行符号枚举等关键步骤。适用于学习和实践内核开发及符号解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文:【推荐】分享一个x64内核符号枚举代码 50行 简洁易懂

作者:友情zyj

链接:http://bbs.pediy.com/showthread.php?t=204535


#include <Windows.h>
#include <stdio.h>
#include <string>
#include <psapi.h>

#include "dbghelp.h"
#pragma comment(lib,"dbghelp.lib")

BOOL CALLBACK EnumSymCallBack(PSYMBOL_INFO pSymInfo, ULONG SymbolSize, PVOID UserContext)
{
  if (strcmp((pSymInfo->Name), "PspCreateProcessNotifyRoutine") == 0 ||
    strcmp((pSymInfo->Name), "PspLoadImageNotifyRoutine")     == 0 ||
    strcmp((pSymInfo->Name), "PspCreateThreadNotifyRoutine")  == 0)
  {
      printf("%-30s :%p\n", pSymInfo->Name, pSymInfo->Address);
  }
  return TRUE;
}

int main()
{
  std::string strMod;
  PVOID dwBaseAddr = 0;
  PVOID pDrvAddr[128*8];
  DWORD dwcbNeeded = 0;
  if (EnumDeviceDrivers(pDrvAddr,sizeof(pDrvAddr),&dwcbNeeded))
  {
    for (unsigned int i=0 ; i<(dwcbNeeded/8) ; i++)
    {
      LPSTR chDrvName[MAX_PATH];
      GetDeviceDriverBaseNameA(pDrvAddr[i],(LPSTR)chDrvName,MAX_PATH);
      dwBaseAddr = pDrvAddr[i];
      strMod = std::string((char*)chDrvName);
      printf("%-20s 0x%p\n",strMod.c_str(),dwBaseAddr);
      break;
    }
  }
  SymSetOptions(SYMOPT_DEFERRED_LOADS);
  HANDLE hProcess = GetCurrentProcess();
  SymInitialize(hProcess, 0, FALSE);
  std::string strSymbolPath = "srv*C:\\Windows\\symbols*http://msdl.microsoft.com/download/symbols";
  std::string strSystemPath = "C:\\Windows\\System32\\" + strMod;
  SymSetSearchPath(hProcess, strSymbolPath.c_str());
  HANDLE hSystemFile = CreateFileA(strSystemPath.c_str(), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
    NULL, OPEN_EXISTING, 0, NULL);
  DWORD dwFileSize = GetFileSize(hSystemFile, NULL);
  DWORD64  dwBase = SymLoadModule64(hProcess, NULL, strSystemPath.c_str(), NULL, (DWORD64)dwBaseAddr, dwFileSize);
  printf("正在枚举符号...\n");
  SymEnumSymbols(hProcess, dwBase, 0, EnumSymCallBack, 0);
  printf("枚举符号结束...\n");
  SymUnloadModule64(hProcess, dwBase);
  SymCleanup(hProcess);
  system("pause");
  return 0;
}


看别人源码写的邋里邋遢,于是改了下,发上来看看大家能用不


工程要编译成x64位的。


还需要两个DLL  dbghelp.dll   symsrv.dll  和编译生成的EXE放在一起 (在windbg目录有这俩个DLL)


以下是测试结果...
ntoskrnl.exe         0xFFFFF8000400E000
正在枚举符号...
PspCreateProcessNotifyRoutine  :FFFFF80004234F80
PspLoadImageNotifyRoutine      :FFFFF80004234D00
PspCreateThreadNotifyRoutine   :FFFFF80004234D60
枚举符号结束...
请按任意键继续. . . 



一、软件说明: 1. x64dbg 是一款开源的、目前仍在积极开发中的 x32/x64 位动态调试器。其界面及操作方法与 OllyDbg 类似,和 OllyDbg 不同的是它可以对 64 位程序进行调试。此外,其开放式的设计给了此软件很强的生命力。通过爱好者们不断的修改和扩充,使其功能越来越强大。 2. 该调试器(目前)有三部分:DBG、GUI、Bridge。 DBG 是调试器的调试部分。它处理调试技术(使用 TitanEngine),并为 GUI 提供数据。 GUI 是调试器的图形部分。它建立在 Qt 上,并提供用户交互界面。 Bridge 是 DBG 和 GUI 部分的通信库(将来也许是在更多的部件之间)。Bridge 可用于在新建功能上工作,而无需更新代码的其他部分。 二、汉化修订说明: 1. 为帮助用户更好地了解 x64dbg 反汇编后的 CPU 汇编指令信息,本次特别对汇编指令的“助记符帮助”和“助记符摘要”进行了汉化。汇编指令的汉化参考了“清华大学出版社”出版的《汇编语言程序设计教程》(第4版) 中术语,因此可能与其他软件的汉化术语略有不同。 2. 对 Scylla 插件等进行了全面汉化。 3. 对 x64dbg 帮助文档的主要内容,按照最新版进行了修订、翻译。对界面字体以及布局重新进行了设置。并将默认调用在线帮助更改为调用本地帮助文件。 4. 对 x64dbg 官方中文版的汉化错误及不一致处进行了修订,并与帮助文档的关键词进行了统一。 5. 对中文版界面字体进行了重新设置,使其更为美观。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值