班门弄斧一次VC++.NET 2008写的HOOK RECV代码

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

学习资料:

 

班门弄斧一次VC++.NET 2008写的HOOK RECV代码

 

确实是班门弄斧,因为我是学VB的,虽然VB6和.NET都算入门吧,可真正拿VC++写程序还是第一次。学B/C/D的就莫看了。

由于是用上两篇写的远线程调用,所以很多参数等等都是传入的,而不是直接获取的。

 

下面就一个用VB的人能理解为目标做简单说明和注释:

1、VC里面声明变量和VB不一样:类型在前,名称在后,例如:

BYTE B ;

等同于:

dim B as byte

VC用分号来识别行结束,而VB用回车;VB用圆括号表示数组,VC用方括号……不多说了,我也不是很清楚,总之习惯就好

2、VC里面的函数、变量等等区分大小写,VB不区分,这个一定要注意!

3、类型转换:VB有显式或隐式的,而VC必须用显式的——即时内存里面存的就是那个东东你也不能直接拿来用,够严格,不过指针够灵活也够太灵活……转换时使用的方法就是在圆括号里面写入你要的类型,后面跟着你的参数就可以。例如:

(DWORD)LEN;就是把LEN转换成DWORD类型,据我理解要么是UINTEGER,要么是INTEGER,可能不同API要求不同,我一直都是按INTEGER处理的,也就是说,前面那句相当于CTYPE(LEN,INTEGER)了。

4、&将会吧后面的变量变为指针,*将会把指针变成相应的数据……说的不确切,应该是转换吧

5、其他看看就知道了,VC用API、常数等根本不声明……而是导入.H文件吧(头文件,而且里面可以用宏来改变API书写的名称,就像VB声明API时那个别名吧),反正这个工程里没用到。

 

以上言论如有误导,请尽快指出………………以免造孽更深…………谢谢………………

 

 

//自定义APIHOOK结构

typedef struct

{

   FARPROC funcaddr;  //RECV函数所在地址

 BYTE   olddata[8];      //RECV函数开头的8个字节原始数据

 BYTE   newdata[8];    //我们要写入的数据,汇编代码在下面,利用了EAX存储要跳转的地址,并且FF E0这个操作是绝对地址的

}HOOKSTRUCT;

//0-4 : move eax 0x00000000 //绝对地址,避免了一个换算,其实这个换算也简单,ADDRESS-MFUNADDRESS-5即是

//5-7 : jmp eax

HWND _fHandle ;  //接收消息窗口句柄

DWORD _dwIdNew ;  //PID

HANDLE hProc;  //进程内核句柄,就是OPENPROCESS打开PID得到的那个东东——读写内存用到

////////////////////////////////////////

DWORD _ws2_RecvIndex = 1 ;  //ws2_32.dll RECVHOOK标志,实际和HOOK没关系,但是当你HOOK的函数多起来,你得区分是哪个函数发来的消息啊!

HOOKSTRUCT _ws2_RecvHook; //ws2_32.dll HOOK结构

////////////////////////////////////////

//这下面的这些家伙,就是一个定义,和下面写的函数实体一样声明即可,VB里不用这么干编译器也能识别都有哪些函数,可VC不成

int WINAPI m_ws2_recv(SOCKET s, char FAR*buf, int len, int flags);

void SendMsg(char *buf,DWORD len,DWORDIndex);

void HookOnOne(HOOKSTRUCT *hookfunc);

void HookOffOne(HOOKSTRUCT *hookfunc);

bool HOOKAPI(DWORD Address,HOOKSTRUCT*hookfunc,DWORD mFncAddress);

//下面传入了一些参数:被注入进程PID,要接收返回信息窗口的句柄

extern "C" _declspec(dllexport)void __stdcall Init(DWORD PID ,HWND FormHandle)

{

 AFX_MANAGE_STATE(AfxGetStaticModuleState());   //这个……VC里叫宏吧,哎……说来话长,这句去掉也无所谓的

 _dwIdNew = PID ;            //备份PID,其实后面代码没用到,主要是为了识别注入了多个程序的话,是哪个程序发回来的信息呢

 _fHandle = FormHandle ;  //接收消息的窗口句柄,SendMsg函数用到

 hProc = OpenProcess(PROCESS_ALL_ACCESS, 0,_dwIdNew);   //打开进程,进一步操作他

}

//下面这个用来:记录被HOOK函数前8字节原始数据、构建新的8字节代码、将新代码替换RECV函数原来代码的

//说明全部都是以RECV函数为例,其实这个函数是一个通用函数

bool HOOKAPI(DWORD Address,HOOKSTRUCT*hookfunc,DWORD mFncAddress)

{

 hookfunc->funcaddr = (FARPROC)Address;  //这个地方用了一个转换,把传入值转换成何结构当中声明的一样

   memcpy(hookfunc->olddata, hookfunc->funcaddr, 8); //记录RECV函数前8字节原始数据

 //下面开始构建汇编代码{0xB8,0x00, 0x00, 0x00, 0x00, 0xFF, 0xE0, 0x00 }

 hookfunc->newdata[0]=0xB8;   //MOVE EAX (EAX后面的数就是下面4字节了)

 hookfunc->newdata[1]=0x00;

 hookfunc->newdata[2]=0x00;

 hookfunc->newdata[3]=0x00;

 hookfunc->newdata[4]=0x00; //到这里是 MOVE EAX00000000 ,这里的地址,将会在下面被替换(注意是绝对地址)

 hookfunc->newdata[5]=0xFF;

 hookfunc->newdata[6]=0xE0;//到这里是 JMP EAX

 hookfunc->newdata[7]=0xCC;//填充一个INT3 ,其实NOP(&h90)啥的也行,换句话说这个不改、不理他都可以,不过翻看帖子时看到一些人说CPU识别错代码,谁知道真假,还是放个显眼的比较保险……

 memcpy(&hookfunc->newdata[1],&mFncAddress, 4);  //这里替换了上面提到的00000000 为我们用来代替RECV的函数的地址

 HookOnOne(hookfunc);  //将RECV函数前8字节替换为我们构建的代码——开始HOOK RECV

 returntrue;

}

 

 

////////////////////////////////////////////////////////////////////////////////////

//recv,这个函数将实现RECV函数的替换:只需执行一次即可

////////////////////////////////////////////////////////////////////////////////////

extern "C" _declspec(dllexport)bool __stdcall Hook_ws2_Recv(DWORD RecvAddress)

{

 AFX_MANAGE_STATE(AfxGetStaticModuleState());

 HOOKAPI(RecvAddress,&_ws2_RecvHook,(DWORD)m_ws2_recv);//这里,(DWORD)m_ws2_recv的返回值就是m_ws2_recv函数的地址!你看人家VC多方便……

   return true;

}

//显然了,这个事解除RECV HOOK的

extern "C" _declspec(dllexport)bool __stdcall UnHook_ws2_Recv()

{

 AFX_MANAGE_STATE(AfxGetStaticModuleState());

 HookOffOne(&_ws2_RecvHook);

   return true;

}

//---------------------------------------------------------------------------

//这个函数,就是我们用来替换RECV函数的家伙了,必须让这个家伙和RECV函数声明相同,这么相同呢,很简单,VC++.NET也有类似VB的代码提示(虽然少点),找一个适当的地方打上recv(小写)然后打圆括号……看到了?

int WINAPI m_ws2_recv(SOCKET s, char FAR*buf, int len, int flags)

{

   int nReturn = 0;  //这个家伙记录了RECV的返回值,-1为错误,我们不处理,0为断开,其他嘛,就是实际从SOCKET缓冲区复制了多少字节到RECV缓冲区。简单的说,-1,0都不处理,其他值就是我们要从BUF里面读多少字节了!

 HookOffOne(&_ws2_RecvHook); //先关闭HOOK,因为已经进入我们的函数了

   nReturn = recv(s, buf, len, flags); //先运行原来的RECV,否则我们不能得到或不能得到全部被复制的内容

 HookOnOne(&_ws2_RecvHook); //继续HOOK

 //sndmsg((DWORD)len,(DWORD)nReturn);

 if (nReturn == SOCKET_ERROR )

 return -1 ;

 

 SendMsg(buf ,nReturn,_ws2_RecvIndex); //发送BUF里面NRETURN个字节到接收窗体

 

   return(nReturn);

}

/////////////////////////////////////////////////////////////////////////////

//WSARECV

 

/////////////////////////////////////////////////////////////////////////////////

//将原来的函数内容写回——关闭HOOK

void HookOffOne(HOOKSTRUCT *hookfunc)

{

 WriteProcessMemory(hProc,hookfunc->funcaddr, hookfunc->olddata, 8, 0);

}

//---------------------------------------------------------------------------

//将我们构建的代码写入——打开HOOK

void HookOnOne(HOOKSTRUCT *hookfunc)

{

 WriteProcessMemory(hProc,hookfunc->funcaddr, hookfunc->newdata, 8, 0);

}

//发送WM_COPYDATA消息到指定窗口

void SendMsg(char *buf,DWORD len,DWORDIndex)

{

         COPYDATASTRUCT cds;  

         cds.dwData = 0;//sizeof(COPYDATASTRUCT);    //有的说这个参数影响发送,还没用到,本来是存PID的,个人觉得应该不会影响

         cds.cbData = len;    //LPDATA里面的字节数

         cds.lpData = buf;   //实际数据

         SendMessage(_fHandle,WM_COPYDATA,(WPARAM)Index,(LPARAM)&cds);  //发到INIT里面指定的那个窗口

}

【自定义抓包发包工具(中)——挂钩六大通信函数】send,sendto,wsasend,recvrecvfrom,wsarecv函数挂钩,hook实战 在上篇内容中【自定义抓包发包工具(上)】我们提到了Windows通信底层实现和编带窗口的动态库,然后将动态库注入并显示了窗口。本期是自定义抓包、发包工具的第二部分。本部分内容是对Windows常用的六大通信函数进行挂钩,并将发送和接受的数据包打印输出出来。主要工作有Detour Hook框架的使用【DetourHook框架】,六大通信函数源地址获取【源函数地址获取】和对应代理函数的实现。并通过带窗口的动态库注入控制捕获数据。 阅读详情

相关推荐

利用hook截获进程的API调用

截获API是个很有用的东西,比如你想分析一下别人的程序是怎样工作的。这里我介绍一下一种我自己试验通过的方法。首先,我们必须设法把自己的代码放到目标程序的进程空间里去。Windows Hook可以帮我们实现这一点。SetWindowsHookEx的声明如下:HHOOK SetWindowsHookEx(  int idHook,        // hook type  HOOKPROC lpfn,

Redspider的专栏 2810

HookRecv 拦截输出

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

菜鸟学习HOOK

前言 自己从高中那时对黑客比较感兴趣,那时候去过很多论坛学所谓的“黑客技术”。同时也经常在一些QQ群,论坛里混,但见效甚微。 因为我很喜欢玩游戏,上大学后,同学们都发疯似的玩一款游戏—三国杀,现在玩的人已经很少了,被某公司抄袭后垄断了。由于当时学业繁重,然后自己又爱面子,所以在想如何学业不落下的同时游戏等级也能比别人高,上网找到了一款三国杀的刷分软件。兴高采烈得打开准备刷分,用了一天之后就不能

Beautiful Attack and Defence 1208

协程知识点总结

以客户端与服务器连接时为例

weixin_53492721的博客 594

HOOK API 函数跳转详解

什么是HOOK API:       Windows下暴露的对开发人员的接口叫做应用程序编程接口,就是我们常说的API。我们在应用层应用程序软件的时候都是通过调用各种API来实现的。有些时候,我们需要监控其他程序调用的API,也就是,当其他应用程序调用我们感兴趣的API的时候,我们在他调用前有一个机会做自己的处理,这就是HOOK API的涵义。  思路:       我们知道Wi

3735

C/C++构建强免杀C2远控:对抗沙箱、反调试与动态加密通信实战

在网络安全领域,恶意软件检测与免杀技术是攻防对抗的核心。静态特征码查杀、动态行为监控(如EDR和沙箱分析)以及网络流量检测构成了现代终端安全防护的多层体系。为了规避这些检测,远控木马需要从代码层、行为层和通信层实施综合对抗。其中,环境感知技术用于识别沙箱与虚拟机,通过检测硬件配置、用户交互等特征实现行为隐匿;反调试与反分析技术则利用时间戳检测、异常处理等手段增加逆向工程难度。这些技术的工程价值在于延长攻击载荷的生存周期,提升隐蔽性。在红队评估与渗透测试中,具备强免杀能力的C2远控成为突破防御的关键。本文聚焦

weixin_34151004的博客 379

hook WSARecv要注意的问题

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

冷风 7071

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

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

weixin_30662849的博客 340

详谈HOOK API的技术

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

skyremember的专栏 784

hook socket send recv代码(zz)

(zzfrom)http://hack.gameres.com/showthread.asp?threadid=3379 hook socket send recv代码(1) 最后更新:2005.07.17 本程序演示如何拦截一个程序对send、recv函数的调用, 并把send、recv函数的参数用 WM_COPYDATA 消息发送 到监视程序中。 附带演示如何拦截Di...

weixin_34210740的博客 685

Send函数和Recv函数解析

1. send函数 int send( SOCKET s, const char FAR *buf, int len, int flags );   不论是客户端还是服务器端应用程序都用send函数来向TCP连接的另一端发送数据。 客户端程序一般用send函数向服务器发送请求,而服务器则通常用send函数来向客户程序发送应答。 该函数的: 第一个参数指定发送端套接字描述符; 第二个参数

xtmb2364434724的博客 488

封包协议,加密解密,线程发包,recv,明文收包(转载)

2.掉线立刻下线, 比如以前的老游戏,电脑蓝屏关机了,由于没有自然下线, 心跳也特别少,人物可能还在上面很长一段时间,这是不安全的,比如传奇2。通过三个函数的特征码到对应模块中进行搜索,这里注意的是这个重新实现的发包函数,可能在原来的模块中ws2_32,也可能在游戏自己的某个模块中。B:... A:在吗?もしもし、韓さんです。功能函数1---》功能函数2---》组包过程---》明文封包---》加密---》发包函数。功能函数1---》功能函数2---》组包---》明文封包---》封包到某一个地址中。

Fiverya的博客 2220

DLL劫持三:inline hook JMP实例 (UDP recvfrom)

核心代码从网上找的,但原始函数调用一直有问,经过分析 整理并测试成功。   DWORD OldProtect2; byte pData[10]; //保留原始函数的调用 FARPROC FunAddr; //生成新的函数调用 typedef int ( WINAPI RecvFromFN)( SOCKET s, char *buf, int len, int flags, sock

qffhq 点积 1696
上一篇: win7生成生成Detours.lib以及简单使用实例
下一篇: 利用detours开发包截获星空极速账号和密码
zbc_vc
博客等级 码龄14年 5粉丝 4原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值