Hook Socket API 的问题,兄弟们多帮忙!

xpf_2000 2003-10-15 02:50:56
现在有一个例子,HOOK的是GetTime函数,我添加了一个wsock32.dll的send函数,却不行,提示是在wsock32.dll中没有找到导出的send函数。查找过程如下:

// Save information about this hooked function
m_pszCalleeModName = pszCalleeModName;
m_pszFuncName = pszFuncName;
m_pfnHook = pfnHook;
m_fExcludeAPIHookMod = fExcludeAPIHookMod;
m_pfnOrig = GetProcAddressRaw(
GetModuleHandleA(pszCalleeModName), m_pszFuncName);
if (m_pfnOrig==NULL)
{
WriteLog((char *)m_pszCalleeModName);
WriteLog("------");
WriteLog((char *)m_pszFuncName);
}

chASSERT(m_pfnOrig != NULL); // Function doesn't exist

if (m_pfnOrig > sm_pvMaxAppAddr) {
// The address is in a shared DLL; the address needs fixing up
PBYTE pb = (PBYTE) m_pfnOrig;
if (pb[0] == cPushOpCode) {
// Skip over the PUSH op code and grab the real address
PVOID pv = * (PVOID*) &pb[1];
m_pfnOrig = (PROC) pv;
}
}

// Hook this function in all currently loaded modules
ReplaceIATEntryInAllMods(m_pszCalleeModName, m_pfnOrig, m_pfnHook,
m_fExcludeAPIHookMod);


chASSERT(m_pfnOrig != NULL); // Function doesn't exist
这句到了wsock32.dll,send,就过不去,实在搞不懂,wsock32.dll怎么会没有导出send函数呢?
请高手帮忙!先谢了!
用到的函数:

FARPROC CAPIHook::GetProcAddressRaw(HMODULE hmod, PCSTR pszProcName) {

return(::GetProcAddress(hmod, pszProcName));
}

FARPROC WINAPI CAPIHook::GetProcAddress(HMODULE hmod, PCSTR pszProcName) {

// Get the true address of the function
FARPROC pfn = GetProcAddressRaw(hmod, pszProcName);

// Is it one of the functions that we want hooked?
CAPIHook* p = sm_pHead;
for (; (pfn != NULL) && (p != NULL); p = p->m_pNext) {

if (pfn == p->m_pfnOrig) {

// The address to return matches an address we want to hook
// Return the hook function address instead
pfn = p->m_pfnHook;
break;
}
}
return(pfn);
}
...全文
204 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
coolali 2003-10-31
  • 打赏
  • 举报
回复
我在程序中Hook了这个函数,不过还没有测试,呵呵希望好运降临!

在这里问个问题,希望楼主不要介意:
我想在驱动程序文件中作一些事情(通过DLL实现),但我尝试使用LoadLibrary结果不行,
不知哪位高手能够帮偶一下,谢啦!
xpf_2000 2003-10-29
  • 打赏
  • 举报
回复
参数h i n s t D l l是调用L o a d L i b r a r y ( E x )或G e t M o d u l e H a n d l e函数而返回的,它用于设定包含符
号的D L L的句柄。参数p s z S y m b o l N a m e可以采用两种形式。第一种形式是以0结尾的字符串的地址,它包含了你想要其地址的符号的名字:
参数p s z S y m b o l N a m e的第二种形式用于指明你想要其地址的符号的序号:
xpf_2000 2003-10-26
  • 打赏
  • 举报
回复
楼上的,能不能发给我?xpf@senre.net
to scatzr():
也不行,connect也试过了。
shaker 2003-10-21
  • 打赏
  • 举报
回复
我有一段代码~不知楼主要不~~

我的代码可以在98下运行,但是在2000/xp下就提示错误~不知道为什么!!!
scatzr 2003-10-21
  • 打赏
  • 举报
回复
呵呵,其他的函数比如closesocket行不行呢?
xpf_2000 2003-10-16
  • 打赏
  • 举报
回复
ws2_32.dll的也试过了,也提示同样的错误。看其他的文章,有这样做成功的,但是没有实际的例子。
NowCan 2003-10-16
  • 打赏
  • 举报
回复
wsock32.dll中额send好像是个函数转发器。
NowCan 2003-10-16
  • 打赏
  • 举报
回复
hook ws2_32.dll这个呢?
xpf_2000 2003-10-15
  • 打赏
  • 举报
回复
To FlyYang(++X++):
这段代码大概的意思是寻找wsock32.dll导出的函数中有没有send,如果有就用mysend函数的地址替换,并保存原来地址恢复用。但是执行到
chASSERT(m_pfnOrig != NULL); // Function doesn't exist
始终过不去,说明在wsock32.dll中的导出函数表里没有send,但肯定有send函数呀。
FlyYang 2003-10-15
  • 打赏
  • 举报
回复
wsock32.dll肯定会导出send
你的代码不很明白

---------
++C++
---------
xpf_2000 2003-10-15
  • 打赏
  • 举报
回复
多谢楼上的!
drip 2003-10-15
  • 打赏
  • 举报
回复
帮你UP

15,471

社区成员

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

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