查看文章 |
自己写的一个GetProcAddress【转载】
2009-03-04 01:51
DWORD GetFunctionAddress( HMODULE phModule,char* pProcName ) { if (!phModule) return 0; PIMAGE_DOS_HEADER pimDH = (PIMAGE_DOS_HEADER)phModule; PIMAGE_NT_HEADERS pimNH = (PIMAGE_NT_HEADERS)((char*)phModule+pimDH->e_lfanew); PIMAGE_EXPORT_DIRECTORY pimED = (PIMAGE_EXPORT_DIRECTORY)((DWORD)phModule+pimNH->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress); DWORD pExportSize = pimNH->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size; DWORD pResult = 0;![]() if ((DWORD)pProcName < 0x10000) { if ((DWORD)pProcName >= pimED->NumberOfFunctions+pimED->Base || (DWORD)pProcName < pimED->Base) return 0; pResult = (DWORD)phModule+((DWORD*)((DWORD)phModule+pimED->AddressOfFunctions))[(DWORD)pProcName-pimED->Base]; }else { DWORD* pAddressOfNames = (DWORD*)((DWORD)phModule+pimED->AddressOfNames); for (int i=0;i<pimED->NumberOfNames;i++) { char* pExportName = (char*)(pAddressOfNames[i]+(DWORD)phModule); if (strcmp(pProcName,pExportName) == 0) { WORD* pAddressOfNameOrdinals = (WORD*)((DWORD)phModule+pimED->AddressOfNameOrdinals); pResult = (DWORD)phModule+((DWORD*)((DWORD)phModule+pimED->AddressOfFunctions))[pAddressOfNameOrdinals[i]]; break; } } } if (pResult != 0 && pResult >= (DWORD)pimED && pResult < (DWORD)pimED+pExportSize) { char* pDirectStr = (char*)pResult; bool pstrok = false; while (*pDirectStr) { if (*pDirectStr == '.') { pstrok = true; break; } pDirectStr++; } if (!pstrok) return 0; char pdllname[MAX_PATH]; int pnamelen = pDirectStr-(char*)pResult; if (pnamelen <= 0) return 0; memcpy(pdllname,(char*)pResult,pnamelen); pdllname[pnamelen] = 0; HMODULE phexmodule = GetModuleHandle(pdllname); pResult = GetFunctionAddress(phexmodule,pDirectStr+1); }![]() return pResult; } |
最近读者:




}
}