还是一个关于API hook的问题(自己解决不了。。。。。。。。。。)

readnothing 2002-06-05 09:28:32
这个问题上次提过了,不过可能夹在帖子中间,大家没有注意。。。。。。。

我使用《Windows核心编程》上的方法进行API hook,结果像::MessageBox这种API函数可以hook到,但是像CWnd::MessageBox这样的函数就无法hook到,上次有位老大说,可能是CWnd::MessageBox的入口地址不同的缘故,我有两个问题要闻:
1、若是两者地址不同的话,那请问如何得到CWnd::MessageBox这类函数的入口地址?
2、我觉得CWnd::MessageBox最终还是调用::MessageBox的,那么我的hook应该起作用才对。我做的测试例子是对某个特定的线程进行API hook,难道是这样导致了失败?

麻烦各位老大帮我想想办法,谢谢了!
...全文
36 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
readnothing 2002-06-12
  • 打赏
  • 举报
回复
to verybigbug:
呵呵,就是因为没有看懂,才问的说。。。。。。。。。。。。。。
readnothing 2002-06-12
  • 打赏
  • 举报
回复
to dongfa:
谢谢,我研究一下
我也是认为MFC类的函数最终调用的是API函数,但是我hook成功::MessageBox却无法hook成功CWnd::MessageBox,上次有位大虾说是两者的入口地址不同,所以无法成功,但是我又不知如何获得。。。。。。。。
dongfa 2002-06-12
  • 打赏
  • 举报
回复
MFC 类的函数其实最终调用的也是API函数,你可以用Depends看一下。
readnothing 2002-06-12
  • 打赏
  • 举报
回复
呵呵,就是没有怎么看懂,才问的。。。。。。。。。。。。。。。。。。
dongfa 2002-06-12
  • 打赏
  • 举报
回复
我上段时间也研究了hook api,一种是IAT一种是jmp,但都有利弊,现在还在修改中...
下面是我的HOOK API sdk中的一段:

DF_HOOKAPI BOOL DF_EXP DF_HookAPI_JMP(DF_HOOKITEM *hookItem)
{
BOOL bRet = FALSE;
if(hookItem != NULL)
{
DF_AdjustToken(SE_DEBUG_NAME, TRUE);

hookItem->pAddr = ::GetProcAddress(::GetModuleHandle(hookItem->chModule),
hookItem->chFunc);

hookItem->pHookAddr = ::GetProcAddress(::GetModuleHandle(hookItem->chHookModule),
hookItem->chHookFunc);

if(hookItem->pAddr && hookItem->pHookAddr)
{
bRet = DF_ReadProcessMemory(hookItem->chCode,
JMPCODE_LEN, hookItem->pAddr);

int n = DF_MakeJMPCode(hookItem->pHookAddr, (LPBYTE)hookItem->chHookCode);
bRet = DF_WriteProcessMemory(hookItem->pAddr,
hookItem->chHookCode, n);
}
}

return bRet;
}

DF_HOOKAPI BOOL DF_EXP DF_WriteProcessMemory(LPVOID lpAddress, LPVOID lpData, int nSize)
{
if(!AfxIsValidAddress(lpData, nSize))
return FALSE;

BOOL bRet = FALSE;

DWORD dwOldProtect = 0;
DWORD dwOffset = 0;
DWORD dwWrite = 0;

MEMORY_BASIC_INFORMATION mbi;
memset(&mbi, 0, sizeof(MEMORY_BASIC_INFORMATION));

dwOffset = ::VirtualQuery(lpAddress, &mbi,
sizeof(MEMORY_BASIC_INFORMATION));
if(dwOffset != sizeof(MEMORY_BASIC_INFORMATION))
{
return FALSE;
}
bRet = ::VirtualProtect(lpAddress, nSize,
PAGE_EXECUTE_WRITECOPY, &dwOldProtect);
if(!bRet)
{
return FALSE ;
}
bRet = ::WriteProcessMemory(::GetCurrentProcess(), lpAddress,
lpData, nSize, &dwWrite);
if((!bRet) || (nSize != (int)dwWrite))
{
return FALSE;
}
bRet = VirtualProtect(lpAddress, nSize,
dwOldProtect, &dwOldProtect);

return bRet;
}

DF_HOOKAPI BOOL DF_EXP DF_ReadProcessMemory(LPVOID lpBuffer, int nSize, LPVOID lpAddress)
{
if(!AfxIsValidAddress(lpBuffer, nSize))
return FALSE;

BOOL bRet = FALSE;
DWORD dwOldProtect = 0;
DWORD dwOffset = 0;
DWORD dwRead = 0;

MEMORY_BASIC_INFORMATION mbi;
memset(&mbi, 0, sizeof(MEMORY_BASIC_INFORMATION));

dwOffset = ::VirtualQuery(lpAddress, &mbi,
sizeof(MEMORY_BASIC_INFORMATION));
if(dwOffset != sizeof(MEMORY_BASIC_INFORMATION))
{
return FALSE;
}
bRet = ::VirtualProtect(lpAddress, nSize,
PAGE_EXECUTE_READ, &dwOldProtect);
if(!bRet)
{
return FALSE ;
}
bRet = ::ReadProcessMemory(::GetCurrentProcess(), lpAddress,
lpBuffer, nSize, &dwRead);
if(!bRet)
{
return FALSE;
}
bRet = VirtualProtect(lpAddress, nSize,
dwOldProtect, &dwOldProtect);

return bRet;
}

verybigbug 2002-06-12
  • 打赏
  • 举报
回复
晕倒。你还没明白Hook Api的原理机制。先看看书吧。
readnothing 2002-06-12
  • 打赏
  • 举报
回复
to verybigbug:
我在程序中hook的是User32.dll中的MessageBoxA和 MessageBoxW,难道不行吗?

to dongfa:
大虾能不能给个用jmp的例子,不胜感激!(最好是对于这种MFC类的函数的,呵呵)

to Purpleendurer:
能不能再说得清楚一点,谢谢
紫郢剑侠 2002-06-12
  • 打赏
  • 举报
回复
要HOOK系统中所有的同类消息,似乎要将HOOK定义在DLL中,即全局HOOK.
dongfa 2002-06-12
  • 打赏
  • 举报
回复
这种最好是用Jmp语句。用IAT会很麻烦.
verybigbug 2002-06-12
  • 打赏
  • 举报
回复
一样的啦。你HookApi的时候只是Hook了0x00400000的Exe,没有Hook Mfc42.dll的地址,你只要Hook你程序中所有的DLL就可以了。但是通过GetProcAddress调用的就必须特别处理。还有,LoadLibrary的调用都要注意。

我觉得Hook Api没什么用处。
readnothing 2002-06-12
  • 打赏
  • 举报
回复
可是在MFC42.dll中,MessageBox的 形式是怎么样的呢?
我用Depends看了一下,MFC42.dll中的MessageBox函数是依赖于User32.dll的 ,是不是形式上有所不同了?应该如何hook?

麻烦大家赐教!
readnothing 2002-06-12
  • 打赏
  • 举报
回复
thx,I will try it
readnothing 2002-06-12
  • 打赏
  • 举报
回复
thx,I will try it
verybigbug 2002-06-06
  • 打赏
  • 举报
回复
用IAT的话很麻烦的。你的Hook Api可能只Hook了Exe 模块没有Hook 其它的
DLL 模块。

比如:a.exe中调用MessageBox和CWnd::MessageBox。在a.exe的IAT中有MessageBox的地址,而Cwnd::MessageBox的地址在MFC42.dll中。

你Hook的仅仅是IAT而不是在MessageBox函数的入口点。。。。
readnothing 2002-06-05
  • 打赏
  • 举报
回复
up
readnothing 2002-06-05
  • 打赏
  • 举报
回复
大家关注一下呀

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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