这里只帖上部分代码:
第一步:遍历所有模块: hSnapShot = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, 0 );
if( hSnapShot == INVALID_HANDLE_VALUE )
return FALSE; if( Module32First( hSnapShot, &me) )
{
do
{
SetHook_MethodOne(me.hModule);
}
while( Module32Next( hSnapShot, &me ) );
}第二步:替换API函数入口地址: PROC *ppfn = ( PROC * ) & (pitd2->u1.Function);
if( *ppfn == GetProcAddress( GetModuleHandle( "User32.dll" ), "MessageBoxW" ) )
{
DWORD dwOldAccess = 0, dwNewAccess = 0, dwWritted = 0;
VirtualProtect( &pitd2->u1.Function, sizeof(DWORD), PAGE_WRITECOPY, &dwOldAccess );
WriteProcessMemory( GetCurrentProcess(), &pitd2->u1.Function, &MessageBoxT,sizeof(PROC), &dwWritted );
VirtualProtect( &pitd2->u1.Function, sizeof(DWORD), dwOldAccess, &dwNewAccess );
}第三步:自己的MessageBoxint WINAPI MessageBoxT(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType)
{
TCHAR szCaption[255];
strcpy(szCaption,lpCaption);
strcat( szCaption, TEXT(" +弹出窗口被HOOK了!") );
typedef int (__stdcall * MESSAGEBOXW)(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType);
MESSAGEBOXW MessageBoxW = ( MESSAGEBOXW ) GetProcAddress( GetModuleHandle( "user32.dll" ), "MessageBoxW" );
return MessageBoxW( hWnd, lpText, szCaption, uType );
}这里先不纠结代码中个别名字之类错误的问题,我有一点不明白:在和二步中if( *ppfn == GetProcAddress( GetModuleHandle( "User32.dll" ), "MessageBoxW" ) )将函数地址替换了,在第三步的我自己的MessageBoxT中又MESSAGEBOXW MessageBoxW = ( MESSAGEBOXW ) GetProcAddress( GetModuleHandle( "user32.dll" ), "MessageBoxW" );
return MessageBoxW( hWnd, lpText, szCaption, uType );这不是又调用了在第二步中已经被修改过地址的MessageBoxW吗?这样就成了死循环了啊。
第一步:遍历所有模块: hSnapShot = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, 0 );
if( hSnapShot == INVALID_HANDLE_VALUE )
return FALSE; if( Module32First( hSnapShot, &me) )
{
do
{
SetHook_MethodOne(me.hModule);
}
while( Module32Next( hSnapShot, &me ) );
}第二步:替换API函数入口地址: PROC *ppfn = ( PROC * ) & (pitd2->u1.Function);
if( *ppfn == GetProcAddress( GetModuleHandle( "User32.dll" ), "MessageBoxW" ) )
{
DWORD dwOldAccess = 0, dwNewAccess = 0, dwWritted = 0;
VirtualProtect( &pitd2->u1.Function, sizeof(DWORD), PAGE_WRITECOPY, &dwOldAccess );
WriteProcessMemory( GetCurrentProcess(), &pitd2->u1.Function, &MessageBoxT,sizeof(PROC), &dwWritted );
VirtualProtect( &pitd2->u1.Function, sizeof(DWORD), dwOldAccess, &dwNewAccess );
}第三步:自己的MessageBoxint WINAPI MessageBoxT(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType)
{
TCHAR szCaption[255];
strcpy(szCaption,lpCaption);
strcat( szCaption, TEXT(" +弹出窗口被HOOK了!") );
typedef int (__stdcall * MESSAGEBOXW)(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType);
MESSAGEBOXW MessageBoxW = ( MESSAGEBOXW ) GetProcAddress( GetModuleHandle( "user32.dll" ), "MessageBoxW" );
return MessageBoxW( hWnd, lpText, szCaption, uType );
}这里先不纠结代码中个别名字之类错误的问题,我有一点不明白:在和二步中if( *ppfn == GetProcAddress( GetModuleHandle( "User32.dll" ), "MessageBoxW" ) )将函数地址替换了,在第三步的我自己的MessageBoxT中又MESSAGEBOXW MessageBoxW = ( MESSAGEBOXW ) GetProcAddress( GetModuleHandle( "user32.dll" ), "MessageBoxW" );
return MessageBoxW( hWnd, lpText, szCaption, uType );这不是又调用了在第二步中已经被修改过地址的MessageBoxW吗?这样就成了死循环了啊。
解决方案 »
- 和SO_BROADCAST选项有关
- VC6中如何将一个MFC的项目转换成lib项目?
- 唉,入门难,提高更难,本人寻求老师帮助.详情进入:)
- 调整cwnd创建的窗口大小时,它的子控件会闪烁是什么原因?
- 怎样获得当前分割窗口的大小
- 请问在同一个程序中,如何使用消息传递内容给别窗口啊?请多指教!
- 几点需求如下:(帮提供思路或者相关例子代码)谢谢!!!分不够另加
- 请教怎么用ADO的ConnectionPtr 和RecordsetPtr指针来访问存取XML文件?
- 挺着急的 初学vc能力有限 请教关于DIB位图的问题
- threadid与thread handle是同一个东西吧?
- 成功用VC6+MFC+OpenCV实现了迅雷7的界面特效——半透明缩放窗口
- vs2010编译器 MFC如何向资源添加图片啊?
如果是这样一回事,又有两个问题:
一:如果我要调用MessageBox,系统内部执行的是直接去“那个地方(统一的地址存放地)”去找地址,还是用GetProcAddress("user32.dll","MessageBox")来取得MessageBox的址,然后去该地址执行呢?
二:如果函数地址统一存放在某个地方的话,那么我的EXE里的函数有成千上万个了,系统把每个函数地址都存放在那个地方,那么这个地方得存多少啊。我感觉又有点不太合理。
如果是动态加载dll,重新分析的PE文件,读取的函数地址