首页
社区
课程
招聘
[讨论]关于HOOK的一个问题,很严重!!
发表于: 2011-3-24 15:13 5586

[讨论]关于HOOK的一个问题,很严重!!

2011-3-24 15:13
5586
    这个是我写的一个简单的HOOK MessageBox的代码,思路是改变MessageBox的开头的几个字节写入我自己的函数地址,程序执行到MessageBox的时候转入我自己的函数中执行.

我自己的函数就是先把MessageBox还原,然后调用
MessageBoxA(hWnd,"你被Hook",lpCaption,uType);
显示消息.

代码很简单,但是出了点问题,请大家帮忙看看,我这里没给注入的代码,我是用工具注入到某个进程中的.程序我都注释了很多,力求大家很容易就看明白...

我想了很长时间也不知道错在哪里...麻烦大家帮忙解决一下

先谢谢了...

//这是一个名字为MyHook.dll 的DLL文件

#include "stdafx.h"
int MyMessageBox(  HWND hWnd,LPCTSTR lpText,    LPCTSTR lpCaption,   UINT uType     );
//=========================================
void Write_Process();//HOOK的主要函数
//=========================================
#pragma  data_seg ( ".Shared" )
char old[5] = {0};
char Jmp[5]  = {(char)0xE9};	//这里是放跳转的地方,我要把这个值写入MessageBox的入口点让它执行我的函数
DWORD offset = 0;   //存放偏移
DWORD g_Addr = 0;
#pragma  data_seg ()

//=========================================

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
					 )
{

	if( DLL_PROCESS_ATTACH == ul_reason_for_call )
    {
        Write_Process();
    }
   
    return TRUE;
}
//=========================================
//这是我写入MessageBox入口地址的函数,也就是HOOK的实现
void Write_Process()
{
	DWORD dwOldProtect,temp;
	HMODULE hmod = ::LoadLibrary("User32");
	DWORD Addr = (DWORD)::GetProcAddress(hmod,"MessageBoxA");
	g_Addr = Addr;   //把MessageBoxA的地址给全局的g_Addr
	::VirtualProtect((PVOID)Addr,5,PAGE_EXECUTE_READWRITE,&dwOldProtect);//
	if(!::ReadProcessMemory((void*)-1,(PVOID)Addr,old,5,NULL))
		MessageBox(NULL,"读取失败!","Warn!",MB_OK);

	offset = (DWORD)MyMessageBox - Addr-5;
	memcpy(Jmp + 1, &offset, 4);
	
	if(!::WriteProcessMemory((void*)-1,(PVOID)Addr,Jmp,5,NULL))
		MessageBox(NULL,"写入失败!","Warn!",MB_OK);
	::VirtualProtect((PVOID)g_Addr,5,dwOldProtect,&temp);//还原内存属性
	FreeLibrary(hmod);
}
//=========================================


//=========================================================
//这个是我的替换函数
//我的目的是让程序执行MessageBox的时候先到我函数中来,我改变MessageBox显示的内容,然后还原MessageBox,再调用MessageBox
int MyMessageBox(  HWND hWnd,LPCTSTR lpText,    LPCTSTR lpCaption,  UINT uType  )
{
	DWORD dwOldProtect,temp;
	::VirtualProtect((PVOID)g_Addr,5,PAGE_EXECUTE_READWRITE,&dwOldProtect);
	::WriteProcessMemory((void*)-1,(PVOID)g_Addr,old,5,NULL);
	::VirtualProtect((PVOID)g_Addr,5,dwOldProtect,&temp);
	//再次调用MessageBox
	return MessageBoxA(hWnd,"你被Hook了",lpCaption,uType);	
	
}

//=========================================================










[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 677
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
MyMessageBox要声明为WINAPI吧 默认是c调用方式 返回后栈出错了
2011-3-24 16:05
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
3
如果是调用某函数后出错,一般是调用约定不符,显性声明为_stdcall调用就行了~~
2011-3-24 16:25
0
雪    币: 69
活跃值: (157)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
4
那我试试看啊
2011-3-24 21:52
0
雪    币: 69
活跃值: (157)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
5
楼上的2位,非常感谢,这个困扰我好久,谢谢解答,果然是调用的问题,声明为 WINAPI 就可以了..谢谢
2011-3-25 08:43
0
雪    币: 88
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
学习了,学习了
2011-3-25 10:57
0
雪    币: 195
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
这hook岂不是用一次就没了。。。。
2011-3-25 13:47
0
雪    币: 69
活跃值: (157)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
8
我只是尝试了一下,因为当时没成功,所以我就改为一次了,现在好了
2011-3-25 17:00
0
游客
登录 | 注册 方可回帖
返回
//