工具软件   办公软件   操作系统   网络安全   设计在线   程序开发   教程宝典   软件下载   软件论坛
您的位置:软件 > 开发者网络 > 技术跟踪 > 技术理论 > 正文
协议型网络游戏外挂制作之外挂窗口
[文章信息]
作者:zeze0556
时间:2004-10-26
出处:gameres
责任编辑:方舟
[文章导读]
上一次我们说了目标程序的启动,以及对目标程序的预处理。这一节中争取可以将外挂的窗口显出来
advertisement
热点推荐
· 禁止QQ登录的方法
· 给你的XML文件做个数字签名
· ImageReady制作“焰火”小动画
· Java加密和数字签名编程快速入门
· 在VB6中用命令行为模式控制GUI动作
[正文]

1 2  下一页

  上一次我们说了目标程序的启动,以及对目标程序的预处理。这一节中争取可以将外挂的窗口显出来,具体能不能说这么多,只能看着办了。

  因为我决定采用最俗的办法Hook来注入线程(有时候我都觉得自己是否有必要这么做,因为Debug的办法也不错),为了程序的更普遍性和更快的移植,以及简单一点,我决定还是采用Hook。这里提前说一下,如果不懂汇编和程序调试的话,最好先补一下课,这在以后要用的。

  我们先来编写Hook.dll部分,程序的启动部分暂时不用理会了(我以后就将那部分叫做wg.exe吧),昨天着急忘了说一声了,我让屏蔽的WriteProcessMemory中的数据地址是大话9.16更新之前的最后一个版本,在9.16更新之后的版本中需要先将程序脱壳,这部分我在以后会说的,所以让大家屏蔽掉那两个写内存的操作。
对于Hook.dll来说,我们准备使用F12键来激活外挂,在CB中编写dll非常简单,建立一个dll项目工程,然后就可以添加代码了。建立工程的时候一点记得选上使用C++,使用VCL,Multi Thread这几个选项,理由:

  1、使用C++是为了让我省点口水(我将APIHOOK封装到了一个类里面)。

  2、使用VCL是因为我太懒惰,不想编写界面代码。

  3、使用多线程是因为程序必须。

  由于外挂主窗体在dll中,因此生成的dll就会比一般的dll大。窗体其实可以放到任何地方的,只是放到dll中比较方便而以,而且在说的时候可以更好的分开。

  以下是Hook.cpp的代码:

//---------------------------------------------------------------------------
#include <vcl.h>
#include <windows.h>
#include "hookapi.h"
#include "hookform.h"
#pragma hdrstop

#pragma argsused
HHOOK g_hHook = NULL;//Hook的句柄
HINSTANCE DllHinst = NULL; //Dll的句柄
HWND gamehWnd; //游戏句柄
HANDLE hThread = NULL; //线程句柄
HWND wghandle = NULL; //外挂窗口句柄
HANDLE gamehandle; //游戏窗口句柄,忘了有没有用
HINSTANCE gameInstance; //游戏的,也不知道用了没用
DWORD ThreadID; //线程ID

LRESULT CALLBACK KeyBoardHook(int nCode, WPARAM wParam, LPARAM lParam);//键盘Hook
extern "C" __declspec(dllexport)bool EnableHook(DWORD dwThreadId);//启动Hook的函数
extern "C" __declspec(dllexport)bool DisableHook();//卸载Hook的函数,和上面的函数一样都是为了外部可以控制

DWORD WINAPI Thread1(PVOID param);//线程函数,在该函数中,将启动外挂窗口

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
 DllHinst = hinst;//载入Dll
 return 1;
}
extern "C" __declspec(dllexport)bool EnableHook(DWORD dwThreadId)
// 导出函数EnableHook()
{
 if (g_hHook == NULL)
 // 安装新钩子
 {
  g_hHook = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)KeyBoardHook, DllHinst,
dwThreadId);
  /*记得CreateProcess中的参数吗?我们传进的参数是目标程序的主线程ID,表示我们启动的是线程Hook,而不是全局Hook,这样不会对其他程序产生任何影响*/
 }
 if (g_hHook)
 {
  return true;
 }
 return false;
}
extern "C" __declspec(dllexport)bool DisableHook() // 导出函数DisableHook()
{
 /*卸载Hook,现在暂时先这样了,其实在真实的情况下如果要做的完美的话,需要做许多事情,如果直接关闭客户端的话,这样就足够了,这个函数其实并没有任何的用处,这里仅仅是为了说明外部可以主动控制外挂的启动和关闭而已*/
 if (g_hHook != NULL)
 {
  UnhookWindowsHookEx(g_hHook);
  g_hHook = NULL; // 卸掉新钩子
  return true;
 }
 return false;
}
LRESULT CALLBACK KeyBoardHook(int nCode, WPARAM wParam, LPARAM lParam)
{
 if (nCode >= 0)
 {
  if (wParam == 123)
   //123为F12的键码,可以查看MSDN或者Windows API参考方面的书找到,自己写个小程序测试也可以
  {
   if (hThread == NULL)
   //这里确保线程启动一次,而不是多次,每一次的启动都回引入一个外挂窗口
   {
    hThread = CreateThread(NULL, 0, Thread1, NULL, NULL, &ThreadID);
    //启动线程,该线程很快执行完毕
   }
  }
 }
 return (CallNextHookEx(g_hHook, nCode, wParam, lParam));//剩下的让目标程序去处理
}

  Dll中的函数是外挂程序的核心。在线程启动成功之后,就可以卸载Hook了,这里只是为了简便,所以将Hook仍然保留。


1 2  下一页

天极社区邀请您:写博客日记  上传相片   论坛聊天  订阅电子杂志  推荐网摘   免费图铃工具
笔名:   请您注意:

 遵守国家有关法律、法规,尊重网上道德,承担一切因您的行为而直接或间接引起的法律责任。

 天极网拥有管理笔名和留言的一切权利。
评论:
 
发表评论推荐给朋友我想参加相关培训打印我对此感兴趣订阅电子杂志
相关内容焦点新闻
  • 简述角色扮演游戏引擎的设计原理
  • 信息传输的安全需求与密码算法
  • 在内存中修改数据的网游外挂
  • 四种网络游戏外挂的设计方法
  • 网络游戏外挂核心封包揭密
  • 网络游戏外挂编写基础
  • 网络游戏通讯模型初探
  • 游戏外挂基本原理及实现
  • 民营家电商排队造手机 设备商全面杀入
  • 英特尔澄清杨旭任职传闻 官方没宣布此消息
  • 国资委河北密制联通拆分方案
  • 垃圾邮件害人害企害国 清除垃圾邮件不手软
  • 中兴携手阿尔卡特 全球逐鹿CDMA
  • 用友总裁王文京:誓将ERP变成“大众消费”
  • 香港消费者委员会:数码相机最贵未必最好
  • 外电称中兴正评估西门子手机业务 或能并购
  • Advertisement

    天极无线


    奇妙科幻|美好风光|清风车影|漫画卡通|星座生肖|明星写真|动物世界
    老鼠爱大米
    挥着翅膀的女孩
    女人味
    栀子花开
    白月光
    刚刚好
    江南
    快乐崇拜
    亲爱的你怎么不在我身边
    小薇
    2002年的第一场雪
    有多少爱可以重来
    我的地盘
    七里香
    情人
     
    老鼠爱大米 老板电话
    冲动的惩罚 七里香
    我不是黄蓉 女生撒娇
    盛夏的果实 坚持到底
    孤单北半球 眉飞色舞
    挪威的森林 可爱女人
    最浪漫的事 老板电话

    CSEEK搜索