| HMODULE hModule=NULL; //模块句柄 char buffer[1000]; //缓冲区 FARPROC proc; //函数入口指针 |
| //定义指向原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 );//绑定函数。 ......其它函数地址指针的定义略。 |
| #include <windows.h> #include <stdio.h> #include "wsock32.h" |
| 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; } |
| //库输出函数定义。 //WinSock初始化函数。 int PASCAL FAR WSAStartup(WORD wVersionRequired, LPWSADATA lpWSAData) { //调用原WinSock库初始化函数 return WSAStartup1(wVersionRequired,lpWSAData); } //WinSock结束清除函数。 int PASCAL FAR WSACleanup(void) { return WSACleanup1(); //调用原WinSock库结束清除函数。 } //创建Socket函数。 SOCKET PASCAL FAR socket (int af, int type, int protocol) { //调用原WinSock库创建Socket函数。 return socket1(af,type,protocol); } //发送数据包函数 int PASCAL FAR send(SOCKET s,const char * buf,int len,int flags) { //在此可以对发送的缓冲buf的内容进行修改,以实现欺骗服务器。 外挂代码...... //调用原WinSock库发送数据包函数。 return send1(s,buf,len,flags); } //接收数据包函数。 int PASCAL FAR recv(SOCKET s, char FAR * buf, int len, int flags) { //在此可以挡截到服务器端发送到客户端的数据包,先将其保存到buffer中。 strcpy(buffer,buf); //对buffer数据包数据进行分析后,对其按照玩家的指令进行相关修改。 外挂代码...... //最后调用原WinSock中的接收数据包函数。 return recv1(s, buffer, len, flags); } .......其它函数定义代码略。 |
| LIBRARY "wsock32" EXPORTS WSAStartup @1 WSACleanup @2 recv @3 send @4 socket @5 bind @6 closesocket @7 connect @8 |