chenwhenlong
驱动牛犊
驱动牛犊
  • 注册日期2002-07-23
  • 最后登录2005-08-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:754回复:0

请教一个 VC 内联汇编的问题

楼主#
更多 发布于:2004-12-15 16:28
代码如下:

#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 的内存地址,请问如何办啊?
游客

返回顶部