HOOK GetProcAddress的问题

j8daxue 2010-07-01 11:29:38
JR书上的挂接APIwin2000下的例子拿到WIN7上直接运行不了,只好重新敲一遍。结合网上资料http://www.docin.com/p-47913253.html
只不过发现每次钩子都会导致其他进程挂,比如桌面,QQ2010,WerFault等.后来发现似乎是GetProcAddress的问题。不过LoadLibrary只是用来解决延迟加载DLL的问题,于是遍历每个每个CAPIHOOK元素,如果原函数为空,即在构造函数里GetProcAddress没有得到的话,这里会重新挂接。代码:

void CApiHook::FixupNewlyLoadedModule(PCSTR pszModPath, HMODULE hmod, DWORD dwFlags)
{
if ((hmod != NULL) &&
(hmod != ModuleFromAddress(FixupNewlyLoadedModule)) &&
((dwFlags & LOAD_LIBRARY_AS_DATAFILE) == 0) &&
((dwFlags & LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE) == 0) &&
((dwFlags & LOAD_LIBRARY_AS_IMAGE_RESOURCE) == 0)
)
{
for (CApiHook* p = sm_pHead; p != NULL; p = p->m_pNext)
{
// 如果某个对象的原函数地址为NULL,可能是延迟加载等原因导致原来DLL不在内存中而引起的
// 因此在这里根据模块名获得函数现在的地址
if (p->m_pfnOrig == NULL)
{
// OutputDebugStringW(L"p->m_pfnOrig == NULL : m_pszCalleeModName,pszModPath\n");
OutputDebugStringA(p->m_pszCalleeModName);
OutputDebugStringA(pszModPath);
if (lstrcmpiA(p->m_pszCalleeModName, pszModPath) == 0)
{
p->m_hMod = hmod;
p->m_pfnOrig = p->GetProcAddressRaw(hmod, p->m_pszFuncName);
}
}
if (p->m_pfnOrig != NULL)
{
ReplaceIATEntryInAllMods(p->m_pszCalleeModName, p->m_pfnOrig, p->m_pfnHook);
}
}
}
}

而GetProcAdderss_Hook也只是遍历元素,如果需要被挂接函数地址和当前要加载函数地址一样的话,则返回已经被挂接的函数

FARPROC WINAPI CApiHook::GetProcAddress_Hook(HMODULE hmod, PCSTR pszProcName)
{ OutputDebugStringA("GetProcAddress_Hook : ");
OutputDebugStringA(pszProcName ? pszProcName : "error pszProcName");
OutputDebugStringA("\n");
FARPROC pfn = GetProcAddressRaw(hmod, pszProcName);
return pfn;
CApiHook * p = sm_pHead;
for (; (pfn != NULL) && (p != NULL); p = p->m_pNext)
{
if (pfn == p->m_pfnOrig)
{
pfn = p->m_pfnHook;
break;
}
}
return pfn;
}

事实上,不挂接这个函数一切运行就OK了。。。
不知道有没有人对这个有分析过?
...全文
627 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
Georgexmu 2010-10-13
  • 打赏
  • 举报
回复
我最近也遇到这个问题了,用jr <windows 核心编程5>中的CApihook加 win7 sdk,在vs2005中编译出来的程序,怎么都无法挂接成功,请问哪位有适合于 xp 到win7系统兼容的 api 挂接方案,不甚感激。
捕鲸叉 2010-07-18
  • 打赏
  • 举报
回复
如果有耐心的话,建议用windbg跟踪一下GetProAddress这个函数。也许高版本的该函数里面的东西变了。
wwstudio_cn 2010-07-06
  • 打赏
  • 举报
回复
大侠们也帮我看看这个问题吧:谢谢了!
http://topic.csdn.net/u/20100705/21/380dc3a2-026a-483a-8ed2-57097f3607ae.html?seed=730326605&r=66743739#r_66743739

利用全局钩子将含有HOOK API的DLL注入,但不知为什么只能HOOK住安装HOOK进程的API,其它进程都HOOK不到,不知道是为什么,求解
zwfgdlc 2010-07-02
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 j8daxue 的回复:]
引用 13 楼 zwfgdlc 的回复:
既然你已经HOOK了GetProcAddress()函数,
那你想调用原始函数时应该先把导入表的函数地址替换成原始的API地址吧。
不然的话又跳到你的代理函数里去了。

这个构造函数里就会首先调用原始的GetProcAddress_Raw来取得原始地址,由于本模块没被HOOK,所以这里得到的地址是正常的
[/Quote]
嗯,搞错,当成inline了。
还是发全代码吧。
sunlin7 2010-07-02
  • 打赏
  • 举报
回复
programing windows via C++这一版本是专门为vista写的,里面的例子在vista上运行正常,那么在win7下面也应该正常。

楼主的核心编程for win2k版本没有试过。
j8daxue 2010-07-02
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 zwfgdlc 的回复:]
既然你已经HOOK了GetProcAddress()函数,
那你想调用原始函数时应该先把导入表的函数地址替换成原始的API地址吧。
不然的话又跳到你的代理函数里去了。
[/Quote]
这个构造函数里就会首先调用原始的GetProcAddress_Raw来取得原始地址,由于本模块没被HOOK,所以这里得到的地址是正常的
j8daxue 2010-07-01
  • 打赏
  • 举报
回复
JR的核心编程大部分人都看过吧?难道没遇到这个问题?
zwfgdlc 2010-07-01
  • 打赏
  • 举报
回复
既然你已经HOOK了GetProcAddress()函数,
那你想调用原始函数时应该先把导入表的函数地址替换成原始的API地址吧。
不然的话又跳到你的代理函数里去了。
j8daxue 2010-07-01
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 tr0j4n 的回复:]
我没看过核心编程,所以对你代码里用的那些函数并不了解。

以下是我的建议:
1、注意检查下你的GetProcAddress,是不是形成了递归。
2、你的Hook函数中不是有OutputDebugStringA,用DebugView查看下关键的输出。
[/Quote]
1.从代码上看是没有,排除当前自身模块,不挂接自己。
attach to process调试过,没看出猫腻。
谢谢,只好先看看detours库怎么做了
MoXiaoRab 2010-07-01
  • 打赏
  • 举报
回复
我没看过核心编程,所以对你代码里用的那些函数并不了解。

以下是我的建议:
1、注意检查下你的GetProcAddress,是不是形成了递归。
2、你的Hook函数中不是有OutputDebugStringA,用DebugView查看下关键的输出。
opq211211 2010-07-01
  • 打赏
  • 举报
回复
不解……

学习!~
雪影 2010-07-01
  • 打赏
  • 举报
回复
帮顶~~
j8daxue 2010-07-01
  • 打赏
  • 举报
回复
help
j8daxue 2010-07-01
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zwfgdlc 的回复:]
你试下这样,暂时不用DLL,把代码写在自己的EXE里,然后逐步调试看下哪个函数执行失败了。
[/Quote]
失败没有,都HOOK到了,只是hook后出现的问题
zwfgdlc 2010-07-01
  • 打赏
  • 举报
回复
你试下这样,暂时不用DLL,把代码写在自己的EXE里,然后逐步调试看下哪个函数执行失败了。
magic7004 2010-07-01
  • 打赏
  • 举报
回复
ps:winxp貌似一切正常啊
magic7004 2010-07-01
  • 打赏
  • 举报
回复
jr的书看过,win7没玩过
j8daxue 2010-07-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 tr0j4n 的回复:]
注入钩?全局钩?
[/Quote]
全局钩,采用mfc模式dll。自己的一个程序加载这个dll
MoXiaoRab 2010-07-01
  • 打赏
  • 举报
回复
注入钩?全局钩?

15,473

社区成员

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

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