关于HOOK WINAPI函数

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

有时候要研究游戏封包或者需要对其进行修改,则最好的方法是HOOK他的网络API函数,如用于发送封包的send函数和

</pre>用于接受的recv,WSARecv函数等等。<p></p><p></p><p>将HOOK代码写到DLL中,然后通过修改游戏运行程序的输入表去加载这个dll从而达到劫持API的作用!</p><p>修改PE文件的输入表方法:最简单的就是试用PE工具LordPE了,打开程序,选择目录,点击输入表,然后右键增加输入表,输入DLL名称跟导入函数,保存即可</p><p></p><p>HOOK API原理</p><p>首先找到API的地址,然后将其前8个字节保存起来用于以后的恢复此API函数功能,修改前8个字节跳转到我们自己的处理函数上,</p><p>在自己的处理函数上对其进行修改,然后恢复前8个字节,调用API来完成API功能,最后将前8个字节又修改成跳转到自己处理函数的代码,以便下次的hook</p><p></p><p></p><p>代码如下:</p><p></p><pre name="code" class="cpp">#include <Windows.h>
#include <winsock2.h>

#pragma   comment(lib,  "ws2_32.lib")

typedef int (WINAPI *PFnSEND)(SOCKET s,const char FAR* buf,int len,int flags);

//B8 00 00 00 00 即mov eax, 0
//FF 0E 即jmp eax
BYTE btNewBytes[8] = {0x0B8,0x0,0x0,0x00,0x0,0x0FF,0x0E0,0};
BYTE btOldBytes[8];
DWORD pSend,dwSize;

//函数声明
//自己写的函数 __stdcall这个细节要注意
void SetHook();
void UnHook();
int __stdcall MySend(SOCKET s,const char FAR* buf,int len,int flags);


BOOL WINAPI DllMain(HANDLE hinstDLL, DWORD dwReason, LPVOID lpvReserved)
{
	switch (dwReason)
	{
	case DLL_PROCESS_ATTACH:
		SetHook();
		break;
	case DLL_PROCESS_DETACH:
		UnHook();
		break;
	}
	return true;
}

//自己的处理函数,可以自行添加处理代码,如修改封包,保存封包,添加封包等等
int __stdcall MySend(SOCKET s,const char FAR* buf,int len,int flags)
{
	int iResult = 0;
	WriteProcessMemory(INVALID_HANDLE_VALUE,(void*)pSend,(void*)btOldBytes,8,&dwSize);		
	iResult = ((PFnSEND)pSend)(s,buf,len,flags);
	WriteProcessMemory(INVALID_HANDLE_VALUE,(void*)pSend,(void*)btNewBytes,8,&dwSize);
	return iResult;	
}

//第一次的hook
void SetHook()
{
	pSend = (DWORD)GetProcAddress(GetModuleHandle("ws2_32.dll"),"send");
	if(VirtualProtect((LPVOID)pSend,8,PAGE_EXECUTE_READWRITE,&dwFlag))
	{
		ReadProcessMemory(INVALID_HANDLE_VALUE,(void*)pSend,(void*)btOldBytes,8,&dwSize);
		*(DWORD*)(btNewBytes+1) = (DWORD)MySend;
		WriteProcessMemory(INVALID_HANDLE_VALUE,(void*)pSend,(void*)btNewBytes,8,&dwSize);		
		VirtualProtect((LPVOID)pSend,8,dwFlag,&dwFlag);
	}	

}

//还原
void UnHook()
{
	WriteProcessMemory(INVALID_HANDLE_VALUE,(void*)pSend,(void*)btOldBytes,8,&dwSize);
}

同时应编写dll有输出表

工程项目中添加*.def文件

输入

LIBRARY
EXPORTS
SetHook

增加SetHook函数作为dll的输出函数。

C/C++ WinApiHook注意调用方式!!! 前言 在前段时间使用易语言hook的方式,实现了《11月的阿卡迪亚》的部分汉化,当时只是抱着试一试的心态,不过既然成功了,就当然想要深入的理解和研究。 最近又发现了个有趣的エロ游戏,于是乎我又打算尝试汉化,不过机会渺茫,没有搞懂资源结构,但是修改程序使其支持中文显示,应该还是可以的。 然后在尝试Hook某些API的时候,程序崩溃了,研究了整整一天才发现原因,So,写篇文章记录下来。 ... 阅读详情

相关推荐

Hook自定义MessageBox

// HookMsgBox.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "windows.h" #include #include using namespace std; // MessageBoxW函数原型 // int WINAPI MessageBoxW(__in_opt HWND hWnd,__in_opt LPCWS

1145

HookRecv 拦截输出

hookrecv拦截输出封包信息 不错的东西

Visual Studio 2008 C++实现进程隐藏技术

Windows API(应用程序编程接口)是一系列用于与Windows操作系统交互的函数。它包括用于进程管理、内存管理、文件系统访问等多个方面的函数。在进程隐藏中,主要关注的API涉及进程枚举、进程信息检索、进程控制等。这些API可以大致分为两类:一类用于枚举系统中的进程,如和;另一类用于获取和修改进程信息,如和。

weixin_31163455的博客 1098

hook send recv wsasend wsarecv 封包工具源码

hook send recv wsasend wsarecv 封包工具源码 本工具支持命令行操作,采用远程线程注入目标进程,注入后hook发包函数,实现封包拦截。 主程序为MFC编写 动态链接库VC WIN32项目

hook WSARecv要注意的问题

如果直接在hook函数中直接调用原始地址的话完全没有问题:int WSAAPI hooked_WSARecv_ws232(SOCKET s,LPWSABUF lpBuffers,DWORD dwBufferCount,LPDWORD lpNumberOfBytesRecvd,LPDWORD lpFlags,LPWSAOVERLAPPED lpOverlapped,LPWSAOVERLAPPED_

冷风 7072

详谈HOOK API的技术

 详谈HOOK API的技术        上一帖     下一帖    查看完整版本页: [1] 麦克风http://www.51cto.com2006-4-6 03:05详谈HOOK API的技术HOOKAPI是一个永恒的话题,如果没有HOOK,许多技术将很难实现,也许根本不能实现。这里所说的API,是广义上的API,它包括DOS下的中断,WINDOWS里的AP

skyremember的专栏 785

基于VC++开发InlineHook网络数据发送接收函数

大家都懂,很多时候开发项目需要修改网络数据,代码如下,请柬代码分析#include "stdafx.h" #include <stdio.h> #include <Windows.h> #include <Winsock2.h> #ifdef _MANAGED #pragma managed(push, off)...

weixin_30662849的博客 340

WinAPI【钩子相关函数HOOK例解

WinAPI: SetWindowsHookEx - 设置钩子 提示: 如果要设置系统级钩子, 钩子函数必须在 DLL 中.SetWindowsHookEx( idHook: Integer; {钩子类型} lpfn: TFNHookProc; {函数指针} hmod: HINST; {包含钩子函数的模块(EXE、DLL)句柄; 一般是 HInst

immcss的专栏 1502

Win2K下的Api函数的拦截

  Api拦截并不是一个新的技术,很多商业软件都采用这种技术。对windows的Api函数的拦截,不外乎两种方法,第一种是Mr. Jeffrey Richter 的修改exe文件的模块输入节,种方法,很安全,但很复杂,而且有些exe文件,没有Dll的输入符号的列表,有可能出现拦截不到的情况。第二种方法就是常用的JMP XXX的方法,虽然很古老,却很简单实用。  本文一介绍第二种方法在Win2k下的

914

hook监视窗口

<br />DLL文件<br />/*****************hook.cpp***************/<br /> <br /><br />#include <windows.h><br />#include <stdio.h><br /> <br />#pragma data_seg ("hook")<br />HINSTANCE g_hModule=NULL;<br />HHOOK hook=NULL;<br />#pragma data_seg() <br />#pragma comm

wf_wf_wf_1985的专栏 823

vc hook send烦请转delphi

在DELPHI中如实HOOK send,我看不懂C代码,请哪位高手指点只要写出DELPHI中实现hook send就行了(包括可以修改HOOK到的封包,发送自己的封包)模拟WSockExpert,使用APIHOOK 不知道大家用过WSockExpert没有, 它可以用来截获指定进程网络数据的传输.前面我还以为它是通过实时远程注入DLL来更改IAT. 不过后来发现在程序一运行时,它就已经将DLL插入

web518的专栏 1万+

DLL中封装的VCL窗体Tab键响应的问题

DLL中的子窗体不会响应Tab按键的,这个时候就需要手动去指定Tab键的操作,但是前提是主窗体要向这个窗体发送一个消息,一个Tab键按下的消息。基本顺序是这样的: 1. 主窗体用Hook技术捕获Tab按键并向活动子窗体发送一个Tab键按下的消息 2. 子窗体手动定义一个Tab键被按下的处理(需要用到FormKeyDown事件)。 3. 移动到下一个焦点的WinAPI函数:Perform(W...

爱.NET 131

STATUS_STACK_BUFFER_OVERRUN encountered

hook_api("user32.dll", "ToUnicode", MyToUnicode, SysToUnicode); int MyToUnicode( UINT wVirtKey, UINT wScanCode, const BYTE* lpKeyState, LPWSTR pwszBuff, int cchBuff, UINT wFlags ) { int r = SysToU...

ruoge2007的专栏 3687

Windows API Hook实战:用Detours库拦截MessageBoxW的5个常见坑点

本文深入探讨了使用微软Detours库Hook Windows API MessageBoxW时的5个常见问题及解决方案,包括事务管理、线程安全、函数指针还原、调用约定陷阱和DLL注入场景。通过实战代码示例和详细排查表,帮助开发者避免常见错误,提升Hook技术的稳定性和可靠性。

mango的博客 649

64位hook自定义函数

/注意:上面代码为了方便展示其中原理,使用了破坏寄存器的方法,实际工作中请使用标准的e9或ff25来实现.// 注意:更多功能请使用DetourHook,minhook。// 对原跳转地址进行恢复,或者对原跳转地址进行从新偏移计算。//为x64下创建一个在2GB范围内的上下标地址。// 公式:原地址 + 偏移地址 + 5。

2301_80744428的博客 425

拦截键盘输入

这是使用Keyboard Hook 的范例,它的解释请查VB5 Call WinAPI技巧或Hook的简介以下在.BasOption ExplicitDeclare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVa

mlm的专栏 911
上一篇: metin C++加解密算法
下一篇: 老张喝茶 教你同步异步 阻塞与非阻塞
Debugyt
博客等级 码龄18年 7粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值