如何使用WINSOCK命令处理消息,Api hook拦截修改socket数据包

 我来答
huanglenzhi
2016-01-19 · 知道合伙人数码行家
huanglenzhi
知道合伙人数码行家
采纳数:117538 获赞数:517181
长期从事计算机组装,维护,网络组建及管理。对计算机硬件、操作系统安装、典型网络设备具有详细认知。

向TA提问 私信TA
展开全部
  下面重点介绍创建挡截 WinSock 外挂程序的基本步骤:
   (1) 创建 DLL 项目,选择 Win32 Dynamic-Link Library ,再选择 An empty DLL project 。
   (2) 新建文件 wsock32.h ,按如下步骤输入代码:
   ① 加入相关变量声明:
    HMODULE hModule=NULL; // 模块句柄
    char buffer[1000]; // 缓冲区
    FARPROC proc; // 函数入口指针
   ② 定义指向原WinSock库中的所有函数地址的指针变量,因WinSock库共提供70多个函数,限于篇幅,在此就只选择几个常用的函数列出,有关这些库函数的说明可参考MSDN相关内容。
    // 定义指向原 WinSock 库函数地址的指针变量。
    SOCKET (__stdcall *socket1)(int ,int,int);// 创建 Sock 函数。
    int   (__stdcall *WSAStartup1)(WORD,LPWSADATA);// 初始化 WinSock 库函数。
    int   (__stdcall *WSACleanup1)();// 清除 WinSock 库函数。
    int (__stdcall *recv1)(SOCKET ,char FAR * ,int ,int );// 接收数据函数。
    int (__stdcall *send1)(SOCKET ,const char * ,int ,int);// 发送数据函数。
    int (__stdcall *connect1)(SOCKET,const struct sockaddr *,int);// 创建连接函数。
    int (__stdcall *bind1)(SOCKET ,const struct sockaddr *,int );// 绑定函数。
    ...... 其它函数地址指针的定义略。
   (3) 新建 wsock32.cpp 文件,按如下步骤输入代码:
   ① 加入相关头文件声明:
    #include <windows.h>
    #include <stdio.h>
    #include "wsock32.h"
   ② 添加DllMain函数,在此函数中首先需要加载原WinSock库,并获取此库中所有函数的地址。代码如下:
    BOOL WINAPI DllMain (HANDLE hInst,ULONG ul_reason_for_call,LPVOID lpReserved)
    {
     if(hModule==NULL){
      // 加载原 WinSock 库,原 WinSock 库已复制为 wsock32.001 。
    hModule=LoadLibrary("wsock32.001");
   }
     else return 1;
// 获取原 WinSock 库中的所有函数的地址并保存,下面仅列出部分代码。
if(hModule!=NULL){
      // 获取原 WinSock 库初始化函数的地址,并保存到 WSAStartup1 中。
proc=GetProcAddress(hModule,"WSAStartup");
    WSAStartup1=(int (_stdcall *)(WORD,LPWSADATA))proc;
      // 获取原 WinSock 库消除函数的地址,并保存到 WSACleanup1 中。
     proc=GetProcAddress(hModule i,"WSACleanup");
     WSACleanup1=(int (_stdcall *)())proc;
      // 获取原创建 Sock 函数的地址,并保存到 socket1 中。
     proc=GetProcAddress(hModule,"socket");
      socket1=(SOCKET (_stdcall *)(int ,int,int))proc;
      // 获取原创建连接函数的地址,并保存到 connect1 中。
      proc=GetProcAddress(hModule,"connect");
      connect1=(int (_stdcall *)(SOCKET ,const struct sockaddr *,int ))proc;
      // 获取原发送函数的地址,并保存到 send1 中。
      proc=GetProcAddress(hModule,"send");
      send1=(int (_stdcall *)(SOCKET ,const char * ,int ,int ))proc;
      // 获取原接收函数的地址,并保存到 recv1 中。
      proc=GetProcAddress(hModule,"recv");
      recv1=(int (_stdcall *)(SOCKET ,char FAR * ,int ,int ))proc;
      ...... 其它获取函数地址代码略。
    }
    else return 0;
    return 1;
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式