急,在线等待!

needways 2004-12-14 10:00:51
代码如下:

#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 的内存地址,请问如何办啊?
...全文
96 点赞 收藏 12
写回复
12 条回复
needways 2004年12月16日
先结贴。不行再问。
回复 点赞
roger_ding 2004年12月16日
把INJLIBINFO拷到函数尾部,函数内处理如下

__declspec(naked) DWORD WINAPI CallDefault()
{
...
_asm
{
// get data point
lea eax, function_end
lea ebx, get_cur_eip1
sub eax, ebx
call get_cur_eip1
get_cur_eip1:
pop edx
add edx, eax // edx: data point

function_end:
}
}
回复 点赞
needways 2004年12月16日
谢谢,我先试试。
回复 点赞
needways 2004年12月15日
用 naked ,编译器不会为它添加标准程序入口和退出代码的。关键是不能为 CallDefault 添加参数,我想直接根据 CallDefault 的地址计算出 InjLibInfo 的地址,不知道可不可行?
回复 点赞
roger_ding 2004年12月15日
简单啊,给CallDefault加个参数不就可以了
__declspec(naked) DWORD WINAPI CallDefault(PINJLIBINFO pInfo)
{
pInfo...
...
}


DWORD d = ((DWORD(WINAPI*)(void))pbCodeRemote)(&InjLibInfo);

不过你这种hook方法可行吗?VC生成的函数会有附加代码
回复 点赞
roger_ding 2004年12月15日
这样好了,既然CallDefault()函数完全由你自己写,把不常用的寄存器放参数好了,例如edx

。。。
_asm lea edx,InjLibInfo
DWORD d = ((DWORD(WINAPI*)(void))pbCodeRemote)();

__declspec(naked) DWORD WINAPI CallDefault(PINJLIBINFO pInfo)
{
_asm mov ***, edx
...
}

回复 点赞
liuzq_78 2004年12月15日
gz
回复 点赞
老夏Max 2004年12月15日
学习!
回复 点赞
aoosang 2004年12月15日
up
回复 点赞
needways 2004年12月15日
急啊,没有办法可以解决吗?
回复 点赞
needways 2004年12月15日
急啊,没有办法可以解决吗?
回复 点赞
needways 2004年12月15日
可是 "DWORD d = ((DWORD(WINAPI*)(void))pbCodeRemote)();" 不是我调用的,是系统自动调用的。我想通过这个办法来解决 Win9x 下 HOOK API 时共享 DLL 的问题。
回复 点赞
发动态
发帖子
进程/线程/DLL
创建于2007-09-28

6376

社区成员

4.9w+

社区内容

VC/MFC 进程/线程/DLL
社区公告
暂无公告