急,在线等待!

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 的内存地址,请问如何办啊?
...全文
150 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
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 的问题。

15,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧