dnf毛毛原理及使用

 将ActiveKey项目中的ActiveKey.h头dnf毛毛文件加入到Simulate项目中,并在
Stdafx.h中加入#include
ActiveKey.h。

  (6).在按钮单击事件函数输入如下dnf毛毛代码:

   void CSimulateDlg::OnButton1()
   {
// TODO: Add your control notification handler code here
if( !bSetup )
{
m_hook.Start();//激活dnf毛毛
}
else
{
m_hook.Stop();//撤消全局钩子。
}
bSetup = !bSetup;

   }

  (7).编译项目,并运行程序,单击按钮激活外挂。

  (8).启动画笔程序,选择文本工具并将笔的颜色设置为红色,将鼠标放在任意位置
后,按F10键,画笔程序自动移

动鼠标并写下一个红色的大写R。图一展示了按F10键前的画笔程序的状态,图二展示了
按F10键后的画笔程序的状态。


图一:按F10前状态(001.jpg)


图二:按F10后状态(002.jpg)


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

  ③ 定义库输出函数,在此可以对我们感兴趣的函数中添加外挂控制代码,在所有
的输出函数的最后一步都调用原

WinSock库的同名函数。部分输出函数定义代码如下:

//库输出函数定义。
//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);
     }
    .......其它函数定义代码略。

  (4)、新建wsock32.def配置文件,在其中加入所有库输出函数的声明,部分声明代
码如下:

   LIBRARY "wsock32"
   EXPORTS
    WSAStartup @1
   WSACleanup @2
    recv @3
    send @4
    socket @5
   bind @6
   closesocket @7
   connect @8

   ......其它输出函数声明代码略。

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值