{
char* pFunName = (char*)(lpdwFunName[dwLoop] + (DWORD)hModuleBase);
if (pFunName[0] == 'G' &&
pFunName[1] == 'e' &&
pFunName[2] == 't' &&
pFunName[3] == 'P' &&
pFunName[4] == 'r' &&
pFunName[5] == 'o' &&
pFunName[6] == 'c' &&
pFunName[7] == 'A' &&
pFunName[8] == 'd' &&
pFunName[9] == 'd' &&
pFunName[10] == 'r' &&
pFunName[11] == 'e' &&
pFunName[12] == 's' &&
pFunName[13] == 's')
{
pRet = (FARPROC)(lpdwFunAddr[lpword[dwLoop]] + (DWORD)hModuleBase);
break;
}
}
return pRet;
}
// ----------------------------------------------
// 64位取函数地址
// ----------------------------------------------
/*
FARPROC getProcAddress(HMODULE hModuleBase)
{
PIMAGE_DOS_HEADER lpDosHeader = (PIMAGE_DOS_HEADER)hModuleBase;
PIMAGE_NT_HEADERS64 lpNtHeader = (PIMAGE_NT_HEADERS64)((ULONG64)hModuleBase + lpDosHeader->e_lfanew);
if (!lpNtHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size)
{
return NULL;
}
if (!lpNtHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress)
{
return NULL;
}
PIMAGE_EXPORT_DIRECTORY lpExports = (PIMAGE_EXPORT_DIRECTORY)((ULONG64)hModuleBase + (ULONG64)lpNtHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);
PDWORD lpdwFunName = (PDWORD)((ULONG64)hModuleBase + (ULONG64)lpExports->AddressOfNames);
PWORD lpword = (PWORD)((ULONG64)hModuleBase + (ULONG64)lpExports->AddressOfNameOrdinals);
PDWORD lpdwFunAddr = (PDWORD)((ULONG64)hModuleBase + (ULONG64)lpExports->AddressOfFunctions);
DWORD dwLoop = 0;
FARPROC pRet = NULL;
for (; dwLoop <= lpExports->NumberOfNames - 1; dwLoop++)
{
char* pFunName = (char*)(lpdwFunName[dwLoop] + (ULONG64)hModuleBase);
if (pFunName[0] == 'G' &&
pFunName[1] == 'e' &&
pFunName[2] == 't' &&
pFunName[3] == 'P' &&
pFunName[4] == 'r' &&
pFunName[5] == 'o' &&
pFunName[6] == 'c' &&
pFunName[7] == 'A' &&
pFunName[8] == 'd' &&
pFunName[9] == 'd' &&
pFunName[10] == 'r' &&
pFunName[11] == 'e' &&
pFunName[12] == 's' &&
pFunName[13] == 's')
{
pRet = (FARPROC)(lpdwFunAddr[lpword[dwLoop]] + (ULONG64)hModuleBase);
break;
}
}
return pRet;
}
*/
接着我们需要编写主代码逻辑,主代码逻辑中使用GetProcAddress
和LoadLibraryW
来加载user32.dll
并调用其中的MessageBoxW
函数弹出一个消息框的示例。
下面是代码的详细实现流程:
- 1.定义函数指针类型FN_GetProcAddress,用于存储GetProcAddress函数的地址,该函数用于在加载的DLL中查找导出函数的地址。
- 2.通过getProcAddress函数获取kernel32.dll中的GetProcAddress函数地址,并将其转换为FN_GetProcAddress类型的函数指针fn_GetProcAddress。
- 3.定义函数指针类型FN_LoadLibraryW,用于存储LoadLibraryW函数的地址,该函数用于加载指定的DLL文件。
- 4.定义名为xyLoadLibraryW的字符数组,存储字符串"LoadLibraryW"。
- 5.使用fn_GetProcAddress函数指针获取kernel32.dll中的LoadLibraryW函数的地址,并将其转换为FN_LoadLibraryW类型的函数指针fn_LoadLibraryW。
- 6.定义函数指针类型FN_MessageBoxW,用于存储MessageBoxW函数的地址,该函数用于弹出消息框。
- 7.定义名为xy_MessageBoxW的字符数组,存储字符串"MessageBoxW"。
- 8.定义名为xy_user32的字符数组,存储字符串"user32.dll"。
- 9.使用fn_LoadLibraryW函数指针加载user32.dll,并使用fn_GetProcAddress函数指针获取其中的MessageBoxW函数地址,并将其转换为FN_MessageBoxW类型的函数指针fn_MessageBoxW。
- 10.定义名为MsgBox和Title的wchar_t数组,用于存储消息框的文本内容和标题。
- 11.使用fn_Me