急,在线等待!
代码如下:
#pragma check_stack(off)
#pragma pack(push, 8)
typedef struct {
DWORD dwProcessId;
PBYTE pfnHookFunc;
} INJLIBINFO, *PINJLIBINFO;
__declspec(naked) DWORD WINAPI CallDefault()
{
// __asm push ebp
// __asm mov ebp, CallDefault
// __asm add ebp, 70
// __asm mov eax, [ebp + INJLIBINFO.dwProcessId]
// __asm pop ebp
// __asm ret
}
static void AfterCallDefault(void) {}
#pragma pack(pop)
#pragma check_stack
//=======================================================================================
void Test()
{
INJLIBINFO InjLibInfo = {0};
InjLibInfo.dwProcessId = 19800611;
// 计算出 InjLibInfo 结构的大小
const int cbInfoSize = sizeof(InjLibInfo);
// 计算 CallDefault() 函数所占用的字节数
const int cbCodeSize = ((LPBYTE)AfterCallDefault - (LPBYTE)CallDefault);
// 计算出所需要的内存大小
const DWORD cbMemSize = cbCodeSize + cbInfoSize + 3;
// 分配共享内存
HANDLE hMapping = CreateFileMapping((HANDLE)0xFFFFFFFF, NULL,
PAGE_READWRITE, 0, cbMemSize, NULL);
// 映射共享内存
PBYTE pbCodeRemote = (PBYTE)MapViewOfFile(hMapping, FILE_MAP_WRITE,
0, 0, 0);
TRACE1("Address Of CallDefault: 0x%08X", pbCodeRemote);
// 将 CallDefault 放入共享内存中
memcpy(pbCodeRemote, (LPVOID)CallDefault, cbCodeSize);
// 将 INJLIBINFO 结构放入共享内存中
memcpy(pbCodeRemote + ((cbCodeSize + 4) & ~3), &InjLibInfo, cbInfoSize);
// 调试
DWORD d = ((DWORD(WINAPI*)(void))pbCodeRemote)();
TCHAR szTEMP[256];
wsprintf(szTEMP, "CallDefault Return: %d\n", d);
MessageBox(NULL, szTEMP, "TestFM", MB_ICONINFORMATION);
// 释放共享内存
UnmapViewOfFile(pbCodeRemote);
CloseHandle(hMapping);
return 0;
}
我想在 CallDefault 中得到 InjLibInfo 的内存地址,请问如何办啊?