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

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

cac55 2024-09-20 12:58 25 浏览 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右键菜单如何设置?_mac 右键菜单

Mac的用户都知道,Mac和Windows很大的区别在于,Windows可以使用鼠标右键完成的很多快捷操作,例如右键剪切、右键新建文件、右键快速访问等等。在工作学习中,这种快捷操作会大大提高我们的工作...

Office局部加密隐藏信息_office隐藏修改痕迹

除了日常使用的图片、音视频文件外,我们还常常和别人共享使用一些Word或Excel办公文件。而这些文件中的部分内容,也许是我们不希望别人看到的。这时,就需要对Word文档或Excel表格中的部分数据实...

不常见但100%好用的电脑快捷键_最全的电脑快捷键

办公人士或者经常使用电脑的人已经熟悉了常见的Ctrl+C/V等快捷键,想要更高效、专业的操作技巧来提升工作效率。接下来,同创双子双子IT运维工程师帮忙整理了一些不太常见但非常有用的快捷键。比如Alt+...

U盘文件被隐藏怎么恢复 U盘文件恢复隐藏的方法

U盘文件被隐藏怎么恢复?U盘文件被隐藏其实这是中了一种U盘病毒,它会恶意的将U盘中的文件夹隐藏起来,采用常规的方法,都无法打开查看。这种U盘病毒会把文件夹的属性给篡改掉,文件设置被改成只读、隐藏,在文...

win7查看隐藏的文件怎么操作 win7如何打开隐藏文件

win7查看隐藏的文件怎么操作?在使用电脑时,有一些用户会将文件设置为隐藏属性,以保护隐私。此外,还有一些系统文件默认处于隐藏状态。那么,如何操作才能打开这些隐藏文件呢?小编今天在这就为大家分享一下w...

系统小技巧:八个实用设置 藏于桌面右键

我们除了在桌面上执行鼠标单、双击操作外,常常也会用右键菜单命令查看文件或显示属性等。其实,除此之外,桌面里还隐藏着不少可被我们利用的实用右键操作项目。下面的这些Windows10桌面右键操作技巧,不...

移动硬盘中的隐藏文件如何恢复显示?可尝试这些方法

在使用移动硬盘的过程中,有时我们可能会遇到一些文件突然变得不可见或“隐藏”的情况。这种情况可能是由于多种原因造成的,如文件系统错误、病毒感染或误操作等。面对隐藏的文件,许多用户可能会感到困惑和不知所措...

Win11怎么查看隐藏文件和文件夹?_如何查看windows隐藏文件夹

一般来说系统会对比较重要的文件和文件夹添加隐藏属性,很多朋友可能找半天都找不到,那么怎么找出这些隐藏文件和文件夹呢,今天系统之家小编来教大家Win11显示隐藏文件的设置方法,操作步骤其实挺简单的,希望...

隐藏电脑文件(夹)竟如此简单!再也不怕被偷窥了

导读:谁的电脑硬盘中还不存有一些珍藏多年的学习资料,可为了保护它们各位学习爱好者也真的是煞费苦心,不管是层层文件夹“套娃”隐藏也好,修改文件名甚至修改后缀名也好,效果都是非常差的,本期文章小君就聊一聊...

怎么打开隐藏文件夹?_文件夹怎么弄

有时在电脑上,我们会发现之前的文件或者文件夹不见了,很多人会觉得会不会是误删了文件之类的。其实还有一种可能,就是你的文件或者文件夹被隐藏起来了。怎么打开隐藏文件夹?一、文件或者文件夹被隐藏的原因隐藏是...

移动硬盘上的隐藏文件怎么能找出来

移动硬盘作为一种小巧而便携式的硬盘存储器,具备容量大、兼容性好、即插即用等优势,被广泛应用于办公和家庭生活中,那么在使用移动硬盘过程中,你是否遇到了文件被隐藏的问题呢?本文将介绍恢复移动硬盘隐藏文件的...

系统小技巧:“发送到”菜单问题巧解决

此前,我们已经通过本刊的一些文章熟悉了通过手动或软件的方法定制“发送到”菜单的基本方法。在使用“发送到”菜单的过程中,还可能会遇到一些问题。例如:“发送到”菜单越用越长,能不能在不编辑删减的情况下,调...

WIN 10系统介绍(21) 重要文件的隐藏 私密文件的保护 显示隐藏文件

大家好,今天介绍电脑中重要文件和文件夹的隐藏以及显示。在每个人使用的电脑中,都有一些个人的私密的资料,比如一些账目,或者个人的照片,信件,技术文档,视频等等的一些资料。我们可能不希望所有登录的用户,都...

状态栏在哪?手机+电脑+软件里的它 一篇讲清位置和功能

状态栏就是设备或软件里显示状态信息的区域,能让你快速知道时间、电量等情况。下面告诉你不同设备和软件里状态栏在哪儿、有啥用。手机上的状态栏位置:屏幕最顶端的窄条,不管用什么APP,基本都在这儿。显示...

excel隐藏的部分内容如何显示出来?3个方法帮助你!

excel隐藏的部分如何显示出来?你是否曾经在Excel中遇到过某些单元格被隐藏,或者某些数据在编辑时突然消失,让你感到困惑和无助?不要担心,今天我将向你揭示如何解决这些问题,让你轻松显示隐藏的部分。...

取消回复欢迎 发表评论: