阅读:754回复:0
请教一个 VC 内联汇编的问题
代码如下:
#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 的内存地址,请问如何办啊? |
|