这个这段代码什么地方有问题? (拦截API的)

classfree 2005-03-29 09:42:33
目标进程执行这段代码后就会非法操作. 各位老大帮我看看什么地方出了问题:

#include <windows.h>
#include <stdio.h>
#include <stddef.h>
#include <WinInet.h>
#pragma comment(lib, "WinInet.lib")
#pragma comment(lib, "ImageHlp.lib")

typedef struct
{
FARPROC funcaddr;
BYTE olddata[5];
BYTE newdata[5];
}HOOKSTRUCT;

HMODULE hModule ;
HOOKSTRUCT InternetConnectA_API;
//拦截开关
void HookOnOff(HOOKSTRUCT *hookfunc, bool DOUNT)
{
HANDLE hProc;
DWORD dwIdOld = GetCurrentProcessId();
hProc = OpenProcess(PROCESS_ALL_ACCESS, 0, dwIdOld);
VirtualProtectEx(hProc, hookfunc->funcaddr, 5, PAGE_READWRITE, &dwIdOld);
if(DOUNT)
WriteProcessMemory(hProc, hookfunc->funcaddr, hookfunc->newdata, 5, 0)
else
WriteProcessMemory(hProc, hookfunc->funcaddr, hookfunc->olddata, 5, 0);
VirtualProtectEx(hProc, hookfunc->funcaddr, 5, dwIdOld, &dwIdOld);
}

//获取被拦截函数信息
BOOL hookapi(char *dllname, char *procname, DWORD myfuncaddr, HOOKSTRUCT *hookfunc)
{
hModule = LoadLibrary(dllname);
hookfunc->funcaddr = GetProcAddress(hModule, procname);
if(hookfunc->funcaddr == NULL)
return false;

memcpy(hookfunc->olddata, hookfunc->funcaddr, 6);
hookfunc->newdata[0] = 0xe9;
DWORD jmpaddr = myfuncaddr - (DWORD)hookfunc->funcaddr - 5;
memcpy(&hookfunc->newdata[1], &jmpaddr, 5);
return true;
}

//准备用于替换原始函数的函数
HINTERNET MyInternetConnectA(HINTERNET hInternet,
LPCSTR lpszServerName,
INTERNET_PORT nServerPort,
LPCSTR lpszUsername,
LPCSTR lpszPassword,
DWORD dwService,
DWORD dwFlags,
DWORD dwContext)
{
HINTERNET RetConn = NULL;
HookOnOff(&InternetConnectA_API, false);
char tmp[128];
sprintf(tmp, "%s:%d\r\n", lpszServerName, nServerPort);
LogFile(tmp, "InternteConnectA.txt");
RetConn = ::InternetConnectA(hInternet,
lpszServerName,
nServerPort,
lpszUsername,
lpszPassword,
dwService,
dwFlags,
dwContext);
HookOnOff(&InternetConnectA_API, true);
return(RetConn);
}

BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
if(hookapi("WININET.DLL",
"InternetConnectA",
(DWORDMyInternetConnectA,
&InternetConnectA_API))
{
HookOnOff(&InternetConnectA_API, true);
}
break;
}
}
...全文
107 点赞 收藏 10
写回复
10 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
classfree 2005-03-30
怎么没人看呢?
难道这个问题真的值得在这里问吗?
谁能帮我解答, 100分相送.绝不失言!
回复
classfree 2005-03-30
rabo(不哭死人) 老大,
能留下MAIL或者QQ吗?
我还有问题请教
回复
classfree 2005-03-30
memcpy(hookfunc->olddata, hookfunc->funcaddr, 5);
同样出问题.

我是直接用的远线程插入. 这个DLL只是运行在目标进程空间中的.
回复
classfree 2005-03-30
哦?
我看看~~~~~~~~
回复
rabo 2005-03-30
突然发现你的问题

memcpy(hookfunc->olddata, hookfunc->funcaddr, 6);

最后一个参数是6吗?你的定义BYTE olddata[5];

会溢出吧。。。
回复
rabo 2005-03-30
把调试信息打出来就知道哪儿出问题了。
一般你的问题可能是出在HookOnOff这个函数里面。
请确认hProc等值是否正确。
PS:有哪些变量是在两个空间都要用到的,就放在共享区里面。
回复
classfree 2005-03-30
rabo(不哭死人) 老大,又是你哟,
哪个变量应该放到共享内存区呢?
HMODULE hModule ;这个变量吗?
回复
classfree 2005-03-30
我是直接用的远线程,应该不会用到共享内存
回复
classfree 2005-03-30
不至于吧??
我以前都行的
回复
rabo 2005-03-30
有些变量是应该放在全局共享内存段里面。因为是两个不同的进程空间。
回复
相关推荐
发帖
进程/线程/DLL
创建于2007-09-28

1.5w+

社区成员

VC/MFC 进程/线程/DLL
申请成为版主
帖子事件
创建了帖子
2005-03-29 09:42
社区公告
暂无公告