出于培训目的,我自己实现了 WINAPI 函数 GetModuleHandle
这里是:
PVOID SelfGetModuleHandle(PCWSTR name) {
PEB* pPeb = RtlGetCurrentPeb();//getting Process Environement Bloc
PPEB_LDR_DATA pLdr = pPeb->Ldr; //https://learn.microsoft.com/en-us/windows/win32/api/winternl/ns-winternl-peb
LIST_ENTRY Lentry = pLdr->InMemoryOrderModuleList;//https://learn.microsoft.com/en-us/windows/win32/api/winternl/ns-winternl-peb_ldr_data
LIST_ENTRY FirstLentry = Lentry;
do
{
LDR_DATA_TABLE_ENTRY LDataTableEntry = *(LDR_DATA_TABLE_ENTRY*)Lentry.Flink;
if (StrCmpW(LDataTableEntry.FullDllName.Buffer, name) == 0) {
printf("Base foud: %p\n", LDataTableEntry.DllBase);
return (LDataTableEntry.DllBase);
}
Lentry = *Lentry.Flink;
} while (memcmp(&Lentry, &FirstLentry, sizeof(LIST_ENTRY)));
return NULL;
}
我认为我的函数很酷并且可以正常工作,但是示例代码得到了 SIGSEV(段错误)
typedef
double
(__stdcall* POW)( //pow from NTDLL (offset 0x151498)
double a,
double b
);
int main(){
HMODULE dllBase = (HMODULE)SelfGetModuleHandle(L"ntdll.dll");//00000000001F8000 instead of 00007FFD36FD0000
POW pow = (POW)GetProcAddress(dllBase, "pow");
printf("%f", pow(2.0,3.0));
}
我正在搜索我做错了什么但找不到。
也许我没有为此获得正确的 dllbase,在错误的表中,或者 PVOID 需要更大的转换才能成为 HMODULE,但我不认为是这样。
谢谢。