百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

游戏外挂之进程钩子(游戏进程挂起)

cac55 2024-09-20 12:58 23 浏览 0 评论

游戏外挂,首先要做的就是将我们的代码放到游戏进程中去,以此来达到“不可告人的目的”。这里我就介绍一种比较常用的方法。就是进程钩子的方式将DLL放到游戏进程中去。其实这也是一些木马盗取账号和密码的方式。我们这里只是讲解通过一个进程钩子实现代码注入游戏进程。由第二节我们知道怎么去写一个C++MFC的DLL。这里我们首先新建一个DLL。首先和大家说下这里我会用到4个Window AP函数。

HWND FindWindow( LPCTSTR lpClassName, LPCTSTR lpWindowName ); 

这个API是找到一个给定类名或者窗口名称的窗口句柄。参数就不用介绍了,顾名思义,第一个参数就是窗口类名称,第二个参数就是窗口名称。我们在这里只是用第二个参数。第一个参数放NULL。窗口名称我们可以通过Spy++去获取这是VS的一个工具:

打开这个工具。

将那个圆拖到游戏标题栏后松开我们就可以看到这个游戏窗口的标题了。我们根据这个标题去找窗口句柄。

DWORD GetWindowThreadProcessId( HWND hWnd, LPDWORD lpdwProcessId );

这个API返回创建指定窗口的线程ID,MSDN上这样说的 “This function retrieves the identifier of the thread that created the specified window and, optionally, the identifier of the process that created the window”

参数hWnd是窗口句柄。就是FindWindow函数返回的值。lpdwProcessId是创建窗口的进程标志ID,它是一个输出参数,也就是一个指针。就和C#中的out参数差不多。这个参数可以放NULL,如果不是NULL,它会返回创建指定窗口的进程标志。

HHOOK SetWindowsHookEx( int idHook,HOOKPROC lpfn,HINSTANCE hMod, DWORD dwThreadId);

这个API就是设置钩子。第一个参数是钩子类型。钩子类型具体有哪些可以参照MSDN这里我们用到的是WH_KEYBOARD。第二个参数就是一个回调函数。回调函数的格式如下:

LRESULT CALLBACK KeyboardProc( int code,
 WPARAM wParam,
 LPARAM lParam
);

第三个参数就是DLL的模块句柄,我们可以通过API函数来获取

HMODULE GetModuleHandle( LPCTSTR lpModuleName);

这个时候大家就会疑惑了SetWindowsHookEx的第三个参数是HINSTANCE类型,但是GetModuleHandle返回的却是HMODULE,这个能对上吗?其实能对上。你可以看看定义它的头文件,我们能看到typedef HINSTANCE HMODULE 这样大家就很容易看出它们其实就是一个东西。这在Windows 核心编程中经常碰到这种情况。我们在写Windows游戏外挂的时候,最好要去研究下Windows 核心编程。推荐一本比较耐看的书《windows核心编程》,我的是最新版.这本书的作者绝对Windows系统有很高的研究。值得反复去看,去研究。不跑题了,继续……。GetModuleHandle的第一个参数就是要注入的DLL路径可以是相当也可以绝对,当然我推荐相对路径。SetWindowsHookEx的最后一个参数就是GetWindowThreadProcessId返回的值。通过这样的讲解大家应该了解了。

下面就是实实在在的编码。我们新建一个MFC DLL(我这个DLL的名称是GameHookDLL)。

///钩子回调函数
LRESULT CALLBACK KeyboardProc( int code, // hook code
 WPARAM wParam, // virtual-key code
 LPARAM lParam // keystroke-message information
 ){
 AFX_MANAGE_STATE(AfxGetStaticModuleState());
 if(wParam==VK_F1&&((lParam&(1<<31))==0)){
 AfxMessageBox(L"F1键在游戏窗口被按下了!");
 }
 return CallNextHookEx(0,code,wParam,lParam);
}
//(LPWSTR)"YB_OnlineClient"
void SetHook(LPWSTR prc_name){
 AFX_MANAGE_STATE(AfxGetStaticModuleState());
 HWND hd=FindWindow(NULL,prc_name);
 if(hd==NULL)
 {
 AfxMessageBox(L"请打开输入的程序进程");
 return;
 }
 DWORD dwid=GetWindowThreadProcessId(hd,NULL);
 //
 HINSTANCE hdll=::GetModuleHandleW(L"GameHookDLL.dll");
 
 SetWindowsHookEx(WH_KEYBOARD,&KeyboardProc,hdll,dwid);
}

这是我在DLL中添加的两个函数,上面是SetWindowsHookEx的回调处理函数。对了,这个回调函数一定别忘了最后一行

return CallNextHookEx(0,code,wParam,lParam);如果回调KeyboardProc 中的code值小于0它会跳过去然后call下一个消息MSDN中的原文是:If code is less than zero, the hook procedure must pass the message to the CallNextHookEx function without further processing and should return the value returned by CallNextHookEx。所以我建议还是自己研究MSDN,比较我个人能力有限,说不定理解的有误,当然在这里如果有什不正确或者理解有偏差的地方希望大家谅解。这里我们DLL只需要对外暴露第二个函数void SetHook(LPWSTR prc_name)。至于怎么暴露,自己去看第二节。

if(wParam==VK_F1&&((lParam&(1<<31))==0)){
 AfxMessageBox(L"F1键在游戏窗口被按下了!");
 }
wParam==VK_F1表示我们按下的F1键。(lParam&(1<<31))==0对lParam参数不熟悉的就不好理解了。lParam的第31位如果是0表示按下,如果是1表示按键弹起。我们这里是判断F1按键被按下。
如果没有(lParam&(1<<31))==0我们按下F1键将会弹出两次,一次是按下时弹出,一次是F1弹起式弹出。所以要保证lParam的第31位是0我们才弹出对话框。1<<31是10000000000000000000
0000000000后面有31个0而lParam的0~30位我们不确定但是我们&一下肯定都是0,然后第31位是0最后结果肯定是0这样就实现了判断。

MSDN中远英文是:

lParam[in] Specifies the repeat count, scan code, extended-key flag, context code, previous key-state flag, and transition-state flag. For more information about the lParam parameter, see Keystroke Message Flags. This parameter can be one or more of the following values.

0-15.Specifies the repeat count. The value is the number of times the keystroke is repeated as a result of the user's holding down the key.

16-23.Specifies the scan code. The value depends on the OEM.

24.Specifies whether the key is an extended key, such as a function key or a key on the numeric keypad. The value is 1 if the key is an extended key; otherwise, it is 0.

25-28.Reserved.

29.Specifies the context code. The value is 1 if the ALT key is down; otherwise, it is 0.

30.Specifies the previous key state. The value is 1 if the key is down before the message is sent; it is 0 if the key is up.

31.Specifies the transition state. The value is 0 if the key is being pressed and 1 if it is being released.

接下来我们去新建一个MFC exe程序。在这个程序中去调用这个void SetHook(LPWSTR prc_name)函数。把窗口名称作为参数传过去。这里我添加的是MFC 简单对话框。对话框的布局如图:

然后给文本框关联上CString类型的变量txt_prc_name。在按钮事件中添加注册钩子代码:

void CGameWGClientDlg::OnBnClickedOk()
{
 UpdateData(true);
 LPWSTR s1=(LPWSTR)(LPCTSTR)txt_prc_name;
 SetHook(s1);
 // TODO: 在此添加控件通知处理程序代码
 //CDialogEx::OnOK();
}

这些只需要你掌握一点MFC知识。LPWSTR s1=(LPWSTR)(LPCTSTR)txt_prc_name;这个经过两次装换,主要是CString类型没法直接装换成LPWSTR类型。所以就这样处理了。好代码搞定,来看效果:

在MFC客户程序中输入我们用Spy++找出的游戏窗口名称,然后点击确定这样钩子就被注册到了游戏进程中。这时候我们在登陆框中随便输入,直到我们输入F1弹出对话框。这样通过键盘钩子注入进程的原型就搞定了。这一节就到这里。

作者:egojit

原文:https://www.cnblogs.com/egojit/archive/2013/06/16/3138266.html

相关推荐

Mac电脑强制删除任何软件方法-含自启动应用

对于打工者来说,进入企业上班使用的电脑大概率是会被监控起来,比如各种流行的数据防泄漏DLP,奇安信天擎,甚至360安全卫士,这些安全软件你想卸载是非常困难的,甚至卸载后它自己又安装回来了,并且还在你不...

Linux基础知识 | 文件与目录大全讲解

1.linux文件权限与目录配置1.文件属性Linux一般将文件可存取的身份分为三个类别,分别是owner/group/others,且三种身份各read/write/execute等权限文...

文件保护不妥协:2025 年 10 款顶级加密工具推荐

数据安全无小事,2025年这10款加密工具凭借独特功能脱颖而出,从个人到企业场景全覆盖,第一款为Ping32,其余为国外英文软件。1.Ping32企业级加密核心工具,支持200+文件格...

省心省力 一个软件搞定系统维护_省心安装在哪里能找到

◆系统类似于我们居住的房间,需要经常打理才能保持清洁、高效。虽然它本身也自带一些清理和优化的工具,但借助于好用的第三方工具来执行这方面的任务,会更让人省心省力。下面笔者就为大家介绍一款集多项功能于一身...

JAVA程序员常用的几个工具类_java程序员一般用什么软件写程序

好的工具做起事来常常事半功倍,下面介绍几个开发中常用到的工具类,收藏一下,也许后面真的会用到。字符串处理:org.apache.commons.lang.StringUtilsisBlank(Char...

手工解决Windows10的若干难题_windows10系统卡顿怎么解决

【电脑报在线】很多朋友已经开始使用Win10,估计还只是测试版本的原因,使用过程中难免会出现一些问题,这里介绍解决一些解决难题的技巧。技巧1:让ProjectSpartan“重归正途”从10074...

System32文件夹千万不能删除,看完这篇你就知道为什么了

C:\Windows\System32目录是Windows操作系统的关键部分,重要的系统文件存储在该目录中。网上的一些恶作剧者可能会告诉你删除它,但你不应该尝试去操作,如果你尝试的话,我们会告诉你会发...

Windows.old 文件夹:系统备份的解析与安全删除指南

Windows.old是Windows系统升级(如Win10升Win11)或重装时,系统自动在C盘创建的备份文件夹,其核心作用是保留旧系统的文件、程序与配置,为“回退旧系统”提供保...

遇到疑难杂症?Windows 10回收站问题巧解决

回收站是Windows10的一个重要组件。然而,我们在使用过程中,可能会遇到一些问题。例如,不论回收站里有没有文件,都显示同一个图标,让人无法判别回收站的空和满的真实情况;没有了像Windows7...

卸载软件怎么彻底删掉?简单几个步骤彻底卸载,电脑小白看过来

日常工作学习生活中,我们需要在安装一些软件程序,但随着软件的更新迭代速度,很多时候我们需要重新下载安装新的程序,这时就需要将旧的一些软件程序进行卸载。但是卸载软件虽然很简单,但是很多小伙伴们表示卸载不...

用不上就删!如何完全卸载OneDrive?

作为Windows10自带的云盘,OneDrive为资料的自动备份和同步提供了方便。然而,从隐私或其他方面考虑,有些人不愿意使用OneDrive。但Windows10本身不提供直接卸载OneDri...

【Linux知识】Linux下快速删除大量文件/文件夹方法

在Linux下,如果需要快速删除大量文件或文件夹,可以使用如下方法:使用rm命令删除文件:可以使用rm命令删除文件,例如:rm-rf/path/to/directory/*这个命令会递...

清理系统不用第三方工具_清理系统垃圾用什么软件

清理优化系统一定要借助于优化工具吗?其实,手动优化系统也没有那么神秘,掌握了方法和技巧,系统清理也是一件简单和随心的事。一方面要为每一个可能产生累赘的文件找到清理的方法,另一方面要寻找能够提高工作效率...

系统小技巧:软件卸载不了?这里办法多

在正常情况下,我们都是通过软件程序组中的卸载图标,或利用控制面板中的“程序和功能”模块来卸载软件的。但有时,我们也会发现利用卸载图标无法卸载软件或者卸载图标干脆丢失找不到了,甚至控制面板中卸载软件的功...

麒麟系统无法删除文件夹_麒麟系统删除文件权限不够

删除文件夹方法例:sudorm-rf文件夹名称。删除文件方法例:sudorm-r文件名包括扩展名。如果没有权限,给文件夹加一下权限再删。加最高权限chmod775文件名加可执行权限...

取消回复欢迎 发表评论: