欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

实现函数GetModuleHandle()

实现函数GetModuleHandle()

// 实现GetModuleHandle()函数
// DLL名称对应的地址
// 返回模块的地址
HMODULE SelfGetModuleHandle(LPCSTR lpszDllName)
{
  PPEB pPEB = NULL;
  __asm { 
    mov eax, fs:[30h]; // fs:[30h]指向PEB
    mov pPEB, eax;
  }
  if (pPEB == NULL) return NULL;
  PPEB_LDR_DATA pLdr = pPEB->LoaderData;
  PLIST_ENTRY pFlink = (PLIST_ENTRY)(pLdr->InLoadOrderModuleList.Flink);
  PLIST_ENTRY pBlink = (PLIST_ENTRY)(pLdr->InLoadOrderModuleList.Blink);
  if(NULL == lpszDllName)
  {
    PLDR_DATA_TABLE_ENTRY pModuleTab = (PLDR_DATA_TABLE_ENTRY)pFlink; 
    return (HMODULE)pModuleTab->DllBase;
  }
  WCHAR lpwszName[MAX_PATH] = {0};
  int nLen = strlen(lpszDllName) + 1; 
  int nwLen = MultiByteToWideChar(CP_ACP, 0, lpszDllName, nLen, NULL, 0);
    MultiByteToWideChar(CP_ACP, 0, lpszDllName, nLen, lpwszName, nwLen); 
  
  for (PLIST_ENTRY pLink = pFlink; pLink!=pBlink; pLink=pLink->Flink)
  {
    PLDR_DATA_TABLE_ENTRY pModuleTab = (PLDR_DATA_TABLE_ENTRY)pLink;
    
    // 不区分大小写比较
    if (_wcsicmp(pModuleTab->BaseDllName.Buffer, lpwszName) == 0) 
      return (HMODULE)pModuleTab->DllBase; 
  }
  return NULL;
}

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功