当前位置:   article > 正文

通过符号文件获取函数地址_解析符号表获取函数地址

解析符号表获取函数地址
  1. //通过符号文件获取函数地址
  2. #include <windows.h>
  3. #include <stdio.h>
  4. #include <Dbghelp.h>
  5. #include <tchar.h>
  6. #include "ntdll.h"
  7. #pragma comment(lib,"dbghelp.lib")
  8. //注意:需要这两个文件
  9. //dbghelp.dll
  10. //symsrv.dll
  11. //获取函数地址PDB
  12. ULONG_PTR GetFunctionAddressPDB(HMODULE hMod, const WCHAR * szApiName)
  13. {
  14. //定义变量
  15. BYTE memory[0x2000] = {0};
  16. //参数效验
  17. if (hMod == NULL)return NULL;
  18. if (szApiName == NULL)return NULL;
  19. ZeroMemory(memory, sizeof(memory));
  20. SYMBOL_INFOW * syminfo = (SYMBOL_INFOW *)memory;
  21. syminfo->SizeOfStruct = sizeof(SYMBOL_INFOW);
  22. syminfo->MaxNameLen = MAX_SYM_NAME;
  23. syminfo->ModBase = (ULONG_PTR)hMod;
  24. if (!SymFromNameW(GetCurrentProcess(), szApiName, syminfo))
  25. {
  26. printf("SymFromName %ws returned error : %d\n", szApiName, GetLastError());
  27. return 0;
  28. }
  29. return (ULONG_PTR)syminfo->Address;
  30. }
  31. //符号获取函数地址
  32. PVOID SymGetProcAddress(LPCWSTR szDllName, LPCWSTR szApiName)
  33. {
  34. //变量定义
  35. TCHAR symbolPath[0x2000] = { 0 };
  36. TCHAR szPath[MAX_PATH] = { 0 };
  37. //参数效验
  38. if (szDllName == NULL)return NULL;
  39. if (szApiName == NULL)return NULL;
  40. GetModuleFileName(0, szPath, ARRAYSIZE(szPath));
  41. TCHAR * temp = _tcsrchr(szPath, TEXT('\\'));
  42. if (temp == NULL)return NULL;
  43. *temp = 0;
  44. _tcscat_s(symbolPath, TEXT("SRV*"));
  45. _tcscat_s(symbolPath, szPath);
  46. _tcscat_s(symbolPath, TEXT("*http://msdl.microsoft.com/download/symbols"));
  47. SymSetOptions(SYMOPT_UNDNAME | SYMOPT_DEFERRED_LOADS | SYMOPT_FAVOR_COMPRESSED);
  48. if (!SymInitializeW(GetCurrentProcess(), symbolPath, TRUE))
  49. {
  50. return NULL;
  51. }
  52. HMODULE hDll = GetModuleHandle(szDllName);
  53. PVOID lpRet = NULL;
  54. lpRet = (PVOID)GetFunctionAddressPDB(hDll, szApiName);
  55. SymCleanup(GetCurrentProcess());
  56. return lpRet;
  57. }
  58. int main(void)
  59. {
  60. PVOID lpFuntAddressRet = NULL;
  61. if (GetModuleHandle(TEXT("kernelbase.dll")))
  62. {
  63. //高版本系统
  64. lpFuntAddressRet = SymGetProcAddress(TEXT("ntdll.dll"), TEXT("ZwReadVirtualMemory"));
  65. //lpRet = SymGetProcAddress(TEXT("ntdll.dll"), TEXT("RtlDispatchAPC"));
  66. }
  67. else
  68. {
  69. lpFuntAddressRet = SymGetProcAddress(TEXT("kernel32.dll"), TEXT("ZwReadVirtualMemory"));
  70. //lpRet = SymGetProcAddress(TEXT("kernel32.dll"), TEXT("BaseDispatchAPC"));
  71. }
  72. printf("%p", lpFuntAddressRet);
  73. return 0;
  74. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/160502
推荐阅读
相关标签
  

闽ICP备14008679号