登录  | 立即注册

游客您好!登录后享受更多精彩

查看: 130|回复: 0

使用符号获取结构体成员的偏移

[复制链接]

90

主题

9

回帖

407

积分

管理员

积分
407
发表于 2024-12-24 19:58:57 | 显示全部楼层 |阅读模式
由于WIN10更新太猛,直接把结构体成员偏移写死在代码里已经不可靠了,所以在可以联网的情况下,我建议使用符号获取结构体成员的偏移
编译以下代码后,需要在EXE文件的同目录下放置dbghelp.dll、symsrv.dll、symsrv.yes。如果不知道在哪里获得这些文件,可以先下载并运行一次WKE,然后把WKE输出的相关文件复制过来即可。
以下是完整可编译的C代码,演示了获取fltmgr!_FLT_FILTER结构体里Operations成员的偏移:
  1. #include <stdio.h>
  2. #include <Windows.h>
  3. #include <psapi.h>
  4. #include <Imagehlp.h>

  5. #pragma comment(lib, "PSAPI.lib")
  6. #pragma comment(lib, "DbgHelp.lib")
  7. #pragma comment(lib, "ImageHlp.lib")

  8. /*enum SymTagEnum
  9. {
  10.         SymTagNull,
  11.         SymTagExe,
  12.         SymTagCompiland,
  13.         SymTagCompilandDetails,
  14.         SymTagCompilandEnv,
  15.         SymTagFunction,
  16.         SymTagBlock,
  17.         SymTagData,
  18.         SymTagAnnotation,
  19.         SymTagLabel,
  20.         SymTagPublicSymbol,
  21.         SymTagUDT,
  22.         SymTagEnum,
  23.         SymTagFunctionType,
  24.         SymTagPointerType,
  25.         SymTagArrayType,
  26.         SymTagBaseType,
  27.         SymTagTypedef,
  28.         SymTagBaseClass,
  29.         SymTagFriend,
  30.         SymTagFunctionArgType,
  31.         SymTagFuncDebugStart,
  32.         SymTagFuncDebugEnd,
  33.         SymTagUsingNamespace,
  34.         SymTagVTableShape,
  35.         SymTagVTable,
  36.         SymTagCustom,
  37.         SymTagThunk,
  38.         SymTagCustomType,
  39.         SymTagManagedType,
  40.         SymTagDimension
  41. };*/

  42. typedef struct _SYMBOL_GET_STRUCT_OFFSET
  43. {
  44.         char StructureName[64];
  45.         WCHAR MemberName[30];
  46.         ULONG offset;
  47. }SYMBOL_GET_STRUCT_OFFSET, *PSYMBOL_GET_STRUCT_OFFSET;

  48. PVOID GetDriverBaseA(char *DriverName)
  49. {
  50.         DWORD cbNeed = 0,i = 0;
  51.         PVOID *ppDrvBas = NULL, RetVal = NULL;
  52.         if(EnumDeviceDrivers(NULL,0,&cbNeed))
  53.         {
  54.                 ppDrvBas = (PVOID*)malloc(cbNeed);
  55.                 if(ppDrvBas)
  56.                 {
  57.                         if(EnumDeviceDrivers(ppDrvBas,cbNeed,&cbNeed))
  58.                         {
  59.                                 for(i=0;i<cbNeed/sizeof(SIZE_T);i++)
  60.                                 {
  61.                                         char path[MAX_PATH]={0};
  62.                                         if(GetDeviceDriverBaseNameA(ppDrvBas[i],path,MAX_PATH))
  63.                                         {
  64.                                                 if(!stricmp(path,DriverName))
  65.                                                 {
  66.                                                         RetVal = ppDrvBas[i];
  67.                                                         break;
  68.                                                 }
  69.                                         }
  70.                                 }
  71.                         }
  72.                         free(ppDrvBas);
  73.                 }
  74.         }
  75.         return RetVal;
  76. }

  77. BOOLEAN CALLBACK EnumSymbolStructureRoutine(PSYMBOL_INFO psi, ULONG SymSize, PVOID Context)
  78. {
  79.         if(Context)
  80.         {
  81.                 PSYMBOL_GET_STRUCT_OFFSET pInfo = (PSYMBOL_GET_STRUCT_OFFSET)Context;
  82.                 if(!strcmp(psi->Name,(const char*)(pInfo->StructureName)))
  83.                 {
  84.                         DWORD i, dwChildrenCount = 0;
  85.                         if(SymGetTypeInfo(GetCurrentProcess(), psi->ModBase, psi->TypeIndex, TI_GET_CHILDRENCOUNT, &dwChildrenCount))
  86.                         {
  87.                                 TI_FINDCHILDREN_PARAMS *pChildren = (TI_FINDCHILDREN_PARAMS *)malloc(sizeof(TI_FINDCHILDREN_PARAMS) + sizeof(DWORD) * dwChildrenCount);
  88.                                 if(pChildren)
  89.                                 {
  90.                                     pChildren->Count = dwChildrenCount;
  91.                                     pChildren->Start = 0;
  92.                                         if(SymGetTypeInfo(GetCurrentProcess(), psi->ModBase, psi->TypeIndex, TI_FINDCHILDREN, pChildren))
  93.                                         {
  94.                                             if(psi->Tag==SymTagUDT)
  95.                                             {
  96.                                                         for(i = 0; i < dwChildrenCount; i++)
  97.                                                         {
  98.                                                                 WCHAR *pwszTypeName = NULL;
  99.                                                                 if(SymGetTypeInfo(GetCurrentProcess(), psi->ModBase, pChildren->ChildId[i], TI_GET_SYMNAME, &pwszTypeName))
  100.                                                                 {
  101.                                                                         if(!wcscmp(pwszTypeName, (const wchar_t*)(pInfo->MemberName)))
  102.                                                                         {
  103.                                                                                 DWORD dwMemberOffset;
  104.                                                                                 if(SymGetTypeInfo(GetCurrentProcess(), psi->ModBase, pChildren->ChildId[i], TI_GET_OFFSET, &dwMemberOffset))
  105.                                                                                 {
  106.                                                                                         pInfo->offset = dwMemberOffset;
  107.                                                                                 }
  108.                                                                         }
  109.                                                                         LocalFree(pwszTypeName);
  110.                                                                         if(pInfo->offset)
  111.                                                                         {
  112.                                                                                 break;
  113.                                                                         }
  114.                                                                 }
  115.                                                         }
  116.                                                 }
  117.                                         }
  118.                                         free(pChildren);
  119.                                         if(pInfo->offset)
  120.                                         {
  121.                                                 return FALSE;
  122.                                         }
  123.                                 }
  124.                         }
  125.                 }
  126.         }
  127.         return TRUE;
  128. }

  129. ULONG SymbolGetStructureOffset(PVOID DriverBase, PCHAR StructureName, PWCHAR MemberName)
  130. {
  131.         SYMBOL_GET_STRUCT_OFFSET info = {0};
  132.         strcpy(info.StructureName, StructureName);
  133.         wcscpy(info.MemberName, MemberName);
  134.         SymEnumTypes(GetCurrentProcess(),(ULONG64)DriverBase,(PSYM_ENUMERATESYMBOLS_CALLBACK)EnumSymbolStructureRoutine,&info);
  135.         return info.offset;
  136. }

  137. void main()
  138. {
  139.         if(SymInitialize(GetCurrentProcess(), "srv*c:\\symbols*http://msdl.microsoft.com/download/symbols", 0))
  140.         {
  141.                 PVOID fmbase = GetDriverBaseA("fltmgr.sys");printf("base: 0x%p\r\n",fmbase);
  142.                 if(fmbase)
  143.                 {
  144.                         DWORD64 base = SymLoadModule64(GetCurrentProcess(), 0, "c:\\windows\\system32\\drivers\\fltmgr.sys", 0, (DWORD64)fmbase, 0);
  145.                         if(base)
  146.                         {
  147.                                 ULONG offset = SymbolGetStructureOffset(fmbase,"_FLT_FILTER",L"Operations");
  148.                                 printf("_FLT_FILTER->Operations: 0x%x\r\n",offset);
  149.                         }
  150.                 }
  151.         }
  152.         SymCleanup(GetCurrentProcess());system("pause");
  153. }
复制代码






您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|断点社区 |网站地图

GMT+8, 2025-1-18 18:12 , Processed in 0.059756 second(s), 26 queries .

Powered by XiunoBBS

Copyright © 2001-2025, 断点社区.

快速回复 返回顶部 返回列表