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

2024-11-24 06:56:59
推荐回答(1个)
回答1:

面重点介绍创建挡截 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
    #include
    #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;
}