CN103513989B - 按键数据获取方法及装置 - Google Patents

按键数据获取方法及装置 Download PDF

Info

Publication number
CN103513989B
CN103513989B CN201310462441.9A CN201310462441A CN103513989B CN 103513989 B CN103513989 B CN 103513989B CN 201310462441 A CN201310462441 A CN 201310462441A CN 103513989 B CN103513989 B CN 103513989B
Authority
CN
China
Prior art keywords
function
state
address
directinput
target process
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN201310462441.9A
Other languages
English (en)
Other versions
CN103513989A (zh
Inventor
冯世杰
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Guangzhou Huaduo Network Technology Co Ltd
Original Assignee
Guangzhou Huaduo Network Technology Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Guangzhou Huaduo Network Technology Co Ltd filed Critical Guangzhou Huaduo Network Technology Co Ltd
Priority to CN201310462441.9A priority Critical patent/CN103513989B/zh
Publication of CN103513989A publication Critical patent/CN103513989A/zh
Application granted granted Critical
Publication of CN103513989B publication Critical patent/CN103513989B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Landscapes

  • Stored Programmes (AREA)

Abstract

本发明公开了一种按键数据获取方法及装置,属于计算机技术领域。所述方法包括:修改目标进程中与状态获取函数相关的代码;在目标进程调用状态获取函数时,利用自定义代码段执行状态获取函数中的真实函数体;在自定义代码段执行完状态获取函数中的真实函数体后,获取当前缓冲区中与指定硬件设备相关的按键数据。本发明通过修改目标程序中与状态获取函数相关的代码,当该目标程序调用该状态获取函数时,则利用自定义代码段调用真实的状态获取函数的真实函数体,在调用完成之后,获取当前缓冲区中的按键数据;解决了现有技术中无法准确地获取及模拟目标程序中按键数据的问题,达到了可以准确获取按键数据,并可以对按键数据进行模拟的效果。

Description

按键数据获取方法及装置
技术领域
本发明涉及计算机技术领域,特别涉及一种按键数据获取方法及装置。
背景技术
随着WINDOWS的游戏的飞速发展,DirectX编程得到了广泛普及和应用,目前大部分游戏使用DirectX编程中的DirectInput控制游戏的输入和输出。但一些游戏厂商出于游戏安全等方面的考虑,会让其它程序无法得到游戏中的按键数据(比如,键盘数据、手柄数据和/或鼠标数据),并且也无法接收外来程序发给他们的按键数据。但在实际应用中,很多时候需要分析用户的按键习惯或者代替用户在游戏时重复无意义的多次按键,此时需要获取用户在游戏时产生的按键数据,并对按键数据进行模拟。
现有技术中,存在一种获取并模拟目标程序中按键数据的方法,这里的目标程序可以为游戏或其他应用程序,该方法可以包括:通过系统提供的API(Application Programming Interface,应用程序编程接口)函数获取目标程序当前的按键数据,这些API函数可以包括用于获取键盘状态的函数GetKeyState、用于实时获取键盘状态的函数GetAsyncKeyState和用于录制键盘和鼠标动作的钩子函数SetWindowsHookEx WH_KEYBOARD、WH_MOUSE、WH_JOURNALRECORD;通过系统提供的API函数模拟目标程序的按键数据,这些API函数可以包括用于发送消息的函数SendMessage和PostMessage、用于获取击键事件的函数keybd_event和用于获取鼠标点击事件的函数mouse_event以及用于回放键盘和鼠标动作的钩子函数SetWindowsHookExWH_JOURNALPLAYBACK。
在实现本发明的过程中,发明人发现现有技术至少存在以下问题:由于用于获取目标程序当前的按键数据的API函数以及用于模拟按键数据的API函数均是系统提供的,所以开发目标程序的厂商很容易通过Hook(钩子)技术Hook到这些API函数,并可以对这些API进行特殊处理,以避免被这些API函数获取并模拟按键数据。这样,这些API则无法准确地获取到目标程序当前的按键数据,也无法对这些按键数据进行模拟。
发明内容
为了解决现有技术中目标程序可以对系统提供的用于获取并模拟目标程序中按键数据的API函数进行处理,从而使得这些API函数无法准确地获取到目标程序当前的按键数据,也无法对这些按键数据进行模拟的问题,本发明实施例提供了一种按键数据获取方法及装置。所述技术方案如下:
第一方面,提供了一种按键数据获取方法,所述方法,包括:
修改目标进程中与状态获取函数相关的代码,使得所述目标进程调用所述状态获取函数时跳转至注入在所述目标进程中的自定义代码段中,所述状态获取函数是用于获取指定硬件设备的状态的函数;
在所述目标进程调用所述状态获取函数时,利用所述自定义代码段执行所述状态获取函数中的真实函数体,所述真实函数体为在所述修改目标进程中与所述状态获取函数相关的代码前所述状态获取函数中具有的函数体;
在所述自定义代码段执行完所述状态获取函数中的所述真实函数体后,获取当前缓冲区中与所述指定硬件设备相关的按键数据,
其中,所述指定硬件设备为键盘、鼠标或手柄。
在第一方面的第一种可能的实施方式中,所述修改目标进程中与状态获取函数相关的代码,使得所述目标进程在调用所述状态获取函数时跳转至注入在所述目标进程中的自定义代码段中,包括:
利用所述自定义代码段中的状态获取函数的地址查找到位于所述目标进程中的用于获取指定硬件设备状态的状态获取函数的地址;
将查找到的所述状态获取函数的地址所指向的函数体中初始的代码修改为用于跳转至所述自定义代码段中的代码;
或者,
利用所述自定义代码段中的状态获取函数的地址查找到指向位于所述目标进程中的用于获取指定硬件设备状态的状态获取函数的地址的指针;
将指向所述目标进程中的所述状态获取函数的地址的指针定向至所述自定义代码段中。
结合第一方面或者第一方面的第一种可能的实施方式,在第二种可能的实施方式中,在所述修改目标进程中与状态获取函数相关的代码之前,还包括:
在自定义程序中创建DirectInput;
获取所述DirectInput中用于创建DirectInput设备对象的创建函数;
在所述自定义程序中根据所述DirectInput中的所述创建函数创建与指定硬件设备相关的DirectInput设备对象;
获取所述DirectInput设备对象中用于获取所述指定硬件设备状态的状态获取函数的地址;
将所述状态获取函数的地址添加到注入在目标进程中的自定义代码段中。
结合第一方面、第一方面的第一种可能的实施方式或者第一方面的第二种可能的实施方式,在第三种可能的实施方式中,在利用所述自定义代码段中的状态获取函数的地址查找到指向位于所述目标进程中的用于获取指定硬件设备状态的状态获取函数的地址的指针之前,还包括:
获取所述DirectInput设备对象中符合设定条件的中间函数的地址,所述符合设定条件的中间函数为所述DirectInput设备对象中不用的且地址与所述DirectInput设备对象中的所述状态获取函数的地址最接近的函数;
向所述自定义代码段中添加所述中间函数的地址,所述符合设定条件的中间函数为所述DirectInput设备对象中不用的且地址与所述DirectInput设备对象中的所述状态获取函数的地址最接近的函数;
将所述中间函数的地址所指向的函数体中的起始代码修改为用于跳转至所述自定义代码段中的代码;
所述将指向所述目标进程中的所述状态获取函数地址的指针定向至所述自定义代码段中,包括:
将指向所述目标进程中的所述状态获取函数地址的指针定向至所述自定义代码段中的所述中间函数的地址。
结合第一方面、第一方面的第一种可能的实施方式、第一方面的第二种可能的实施方式或者第一方面的第三种可能的实施方式,在第四种可能的实施方式中,在所述获取当前缓冲区中与所述指定硬件设备相关的按键数据之后,还包括:
更改所述当前缓冲区中与所述指定硬件设备相关的所述按键数据。
第二方面,提供了一种按键数据获取装置,其特征在于,所述装置,包括:
第一修改模块,用于修改目标进程中与状态获取函数相关的代码,使得所述目标进程调用所述状态获取函数时跳转至注入在所述目标进程中的自定义代码段中,所述状态获取函数是用于获取指定硬件设备的状态的函数;
执行模块,用于在所述目标进程调用所述状态获取函数时,利用所述自定义代码段执行所述状态获取函数中的真实函数体,所述真实函数体为在所述修改目标进程中与所述状态获取函数相关的代码前所述状态获取函数中具有的函数体;
按键数据获取模块,用于在所述自定义代码段执行完所述状态获取函数中的所述真实函数体后,获取当前缓冲区中与所述指定硬件设备相关的按键数据,
其中,所述指定硬件设备为键盘、鼠标或手柄。
在第二方面的第一种可能的实施方式中,所述第一修改模块,包括:
第一查找单元,用于利用所述自定义代码段中的状态获取函数的地址查找到位于所述目标进程中的用于获取指定硬件设备状态的状态获取函数的地址;
修改单元,用于将所述第一查找单元查找到的所述状态获取函数的地址所指向的函数体中初始的代码修改为用于跳转至所述自定义代码段中的代码;
或者,
第二查找单元,用于利用所述自定义代码段中的状态获取函数的地址查找到指向位于所述目标进程中的用于获取指定硬件设备状态的状态获取函数的地址的指针;
定向单元,用于将所述第二查找单元查找到的指向所述目标进程中的所述状态获取函数的地址的指针定向至所述自定义代码段中。
结合第二方面或者第二方面的第一种可能的实施方式,在第二种可能的实施方式中,所述装置,还包括:
创建模块,用于在自定义程序中创建DirectInput;
创建函数获取模块,用于获取所述DirectInput中用于创建DirectInput设备对象的创建函数;
设备对象创建模块,用于在所述自定义程序中根据所述创建函数获取模块获取到的所述DirectInput中的所述创建函数创建与指定硬件设备相关的DirectInput设备对象;
第一获取模块,用于获取所述设备对象创建模块创建的所述DirectInput设备对象中用于获取所述指定硬件设备状态的状态获取函数的地址;
第一添加模块,用于将所述第一获取模块获取到的所述状态获取函数的地址添加到注入在目标进程中的自定义代码段中。
结合第二方面、第二方面的第一种可能的实施方式或者第二方面的第二种可能的实施方式,在第三种可能的实施方式中,所述装置,还包括:
第二获取模块,用于获取所述DirectInput设备对象中符合设定条件的中间函数的地址,所述符合设定条件的中间函数为所述DirectInput设备对象中不用的且地址与所述DirectInput设备对象中的所述状态获取函数的地址最接近的函数;
第二添加模块,用于向所述自定义代码段中添加所述中间函数的地址,所述符合设定条件的中间函数为所述DirectInput设备对象中不用的且地址与所述DirectInput设备对象中的所述状态获取函数的地址最接近的函数;
第二修改模块,用于将所述中间函数的地址所指向的函数体中的起始代码修改为用于跳转至所述自定义代码段中的代码;
所述定向单元,用于:
将指向所述目标进程中的所述状态获取函数地址的指针定向至所述自定义代码段中的所述中间函数的地址。
结合第二方面、第二方面的第一种可能的实施方式、第二方面的第二种可能的实施方式或者第二方面的第三种可能的实施方式,在第四种可能的实施方式中,所述装置,还包括:
更改模块,用于更改所述当前缓冲区中与所述指定硬件设备相关的所述按键数据。
本发明实施例提供的技术方案带来的有益效果是:
通过修改目标程序中与状态获取函数相关的代码,以使得目标进程调用该状态获取函数时跳转至注入在该目标进程中的自定义代码段中,当该目标程序调用该状态获取函数时,则利用自定义代码段调用真实的状态获取函数,在调用完之后,获取当前缓冲区中与指定硬件设备相关的按键数据;解决了现有技术中目标程序可以对系统提供的用于获取并模拟目标程序中按键数据的API函数进行处理,从而使得这些API函数无法准确地获取到目标程序当前的按键数据,也无法对这些按键数据进行模拟的问题,由于根据上述要求修改了目标程序中与状态获取函数相关的代码,从而使得自定义代码段在目标程序调用该状态获取函数的时机调用真实的状态获取函数,以获取调用完之后当前缓冲区中的按键数据,达到了可以准确获取按键数据,并可以对按键数据进行模拟的效果。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明一个实施例中提供的按键数据获取方法的方法流程图;
图2是本发明另一个实施例中提供的按键数据获取方法的方法流程图;
图3是本发明再一个实施例中提供的按键数据获取方法的方法流程图;
图4是本发明一个实施例中提供的按键数据获取装置的结构示意图;
图5是本发明另一个实施例中提供的按键数据获取装置的结构示意图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式作进一步地详细描述。
为了便于描述,首先对本发明实施例所涉及的相关知识进行详细描述。
目前大多数游戏是使用DirectX编程来实现,而DirectX由很多API组成,这些API按照性质可以分为四个部分,分别为显示部分、声音部分、输入部分和网络部分。在实际应用中,很多时候需要分析用户的按键习惯或者代替用户在游戏时重复无意义的多次按键,此时则需要获取用户在游戏时产生的按键数据,并对按键数据进行模拟。而如果想要精确的获取到用户在游戏时产生的按键数据或对这些按键数据进行模块,需要通过DirectX编程中的输入部分DirectInput实现对用户在游戏时的按键数据的获取。
当然除了游戏外,还有一些应用程序也可能是通过DirectInput实现用户的输入和输出的,所以下文中所讲的“目标进程”一般可以为游戏或者部分应用程序中的进程。
为了获取到目标进程中的按键数据,自定义程序需要向该目标进程中注入一段自己定义的代码段(下文成为自定义代码段),该自定义代码段中可以编写需要的功能代码,比如该自定义代码段可以调用目标进程中的函数、修改目标进程中的代码、获取缓冲区中的内容等。
下面通过多个实施例对案件数据获取方法进行详细说明。
请参见图1所示,其示出了本发明一个实施例中提供的按键数据获取方法的方法流程图。该按键数据获取方法可以包括:
101,修改目标进程中与状态获取函数相关的代码,使得该目标进程调用该状态获取函数时跳转至注入在该目标进程中的自定义代码段中,该状态获取函数是用于获取指定硬件设备的状态的函数;
指定硬件设备可以为键盘、鼠标或手柄等,比如,游戏中需要用到键盘和鼠标,此时指定硬件设备可以为键盘或鼠标中的一种;再比如,游戏中需要用到手柄,此时指定硬件设备可以为手柄。
硬件设备的状态可以为对硬件设备的操作时产生的状态。比如,通过键盘输入字符时产生的状态、点击鼠标的左键或右键时产生的状态,或者移动手柄时产生的状态等。
通常在通过DirectX编程中的输入部分DirectInput实现游戏中的输入或输入时,用于获取指定硬件设备状态的状态获取函数可以为GetDeviceState函数。
目标进程为要监控的用户正在使用的游戏或者一些应用程序,本实施例就是用于获取该目标进程中产生的按键数据。
自定义代码段是自定义程序(用于获取该目标进程中按键数据的程序)注入在目标进程中的一段可以实现想要功能的代码段,用户可以在该自定义代码段中编写需要的代码。通常来讲,当自定义代码段被注入到目标进程中之后,该自定义代码段就相当于该目标进程中的一部分,但由于目标进程中之前并没有调用该自定义代码段的调用语句,因为目标进程在运行时,并不能自发的执行该自定义代码段。因此如果想要保证目标进程在运行时可以执行该自定义代码段中内容,需要修改目标进程中的代码以跳转到自定义代码段中。
通常,修改目标进程中与状态获取函数相关的代码以跳转至自定义代码段中的位置可以由编程人员根据需要设定。这是因为自定义代码段中可能会编写有各种功能的代码段,如果想要在目标程序调用该获取状态函数时,目标程序的执行点从该获取状态函数的起始代码跳转至自定义代码段之后,执行某一个指定代码段中的代码,此时,则可以将跳转的位置定位为该指定代码段的初始位置。
102,在目标进程调用状态获取函数时,利用自定义代码段执行该状态获取函数中的真实函数体,该真实函数体为在修改目标进程中与状态获取函数相关的代码前状态获取函数中具有的函数体;
由于已经修改了目标进程中与状态获取函数相关的代码,以使得在目标进程调用该状态获取函数时跳转至自定义代码段中,因此当目标进程调用该状态获取函数时,可以直接跳转至自定义代码段中,对应的,在跳转后,自定义代码段开始工作。
通常来讲,当真实的状态获取函数被执行时,可以将与指定硬件设备状态相关的按键数据添加至一个缓冲区中,而为了获取这个缓冲区中的按键数据,需要调用这个真实的状态获取函数。由于修改了目标进程中与状态获取函数相关的代码,因此目标进程不会再调用真实的状态获取函数,所以为了能够获取到按键数据,自定义代码段可以编写一段调用代码,该段调用代码可以在被跳转之后,调用真实的状态获取函数,当调用完成后,则可以获取到当前缓冲区中的按键数据。
由于在修改目标进程中与状态获取函数相关的代码时,状态获取函数中的函数体可能已经被修改过,因此自定义代码段需要调用真实的状态获取函数,也即需要调用状态获取函数中的真实函数体,该真实函数体即为真实的状态获取函数中原有的函数体。换句话说,自定义代码段调用的是未修改之前的该状态获取函数中具有的函数体。
举例来讲,当在修改目标进程中与状态获取函数相关的代码时,如果没有改动该状态获取函数中的函数体中的代码,则自定义代码段可以直接调用该状态获取函数中的函数体;如果状态获取函数中的函数体中的代码已经被改动了,此时,则需要回补被改动的代码,使回补后的代码与原有的函数体中的代码完全相同,然后自定义代码段可以调用该状态获取函数中回补后的函数体。
103,在自定义代码段执行完状态获取函数中的真实函数体后,获取当前缓冲区中与指定硬件设备相关的按键数据。
由于状态获取函数在被调用的过程中,可以将暂存的按键数据写入缓冲区中,因此在调用完该状态获取函数之后,就可以获取当前缓冲区中指定硬件设备相关的按键数据。
较优的,修改目标进程中与状态获取函数相关的代码,使得目标进程在调用该状态获取函数时跳转至注入在该目标进程中的自定义代码段中,包括:
利用自定义代码段中的状态获取函数的地址查找到位于目标进程中的用于获取指定硬件设备状态的状态获取函数的地址;
将查找到的状态获取函数的地址所指向的函数体中初始的代码修改为用于跳转至自定义代码段中的代码;
或者,
利用自定义代码段中的状态获取函数的地址查找到指向位于目标进程中的用于获取指定硬件设备状态的状态获取函数地址的指针;
将指向目标进程中的状态获取函数地址的指针定向至自定义代码段中。
较优的,在修改目标进程中与状态获取函数相关的代码之前,还包括:
在自定义程序中创建DirectInput;
获取DirectInput中用于创建DirectInput设备对象的创建函数;
在自定义程序中根据DirectInput中的创建函数创建与指定硬件设备相关的DirectInput设备对象;
获取DirectInput设备对象中用于获取指定硬件设备状态的状态获取函数的地址;
将状态获取函数的地址添加到注入在目标进程中的自定义代码段中。
较优的,在利用自定义代码段中的状态获取函数的地址查找到指向位于目标进程中的用于获取指定硬件设备状态的状态获取函数地址的指针之前,还包括:
向自定义代码段中添加符合设定条件的中间函数的地址,符合设定条件的中间函数为DirectInput设备对象中不用的且地址与DirectInput设备对象中的状态获取函数的地址最接近的函数;
将指向目标进程中的状态获取函数地址的指针定向至自定义代码段中,包括:
将指向目标进程中的状态获取函数地址的指针定向至自定义代码段中的中间函数的地址。
较优的,在获取当前缓冲区中与指定硬件设备相关的按键数据之后,还包括:
更改当前缓冲区中与指定硬件设备相关的所述按键数据。
综上所述,本发明实施例提供的按键数据获取方法,通过修改目标程序中与状态获取函数相关的代码,以使得目标进程调用该状态获取函数时跳转至注入在该目标进程中的自定义代码段中,当该目标程序调用该状态获取函数时,则利用自定义代码段调用真实的状态获取函数,在调用完之后,获取当前缓冲区中与指定硬件设备相关的按键数据;解决了现有技术中目标程序可以对系统提供的用于获取并模拟目标程序中按键数据的API函数进行处理,从而使得这些API函数无法准确地获取到目标程序当前的按键数据,也无法对这些按键数据进行模拟的问题,由于根据上述要求修改了目标程序中与状态获取函数相关的代码,从而使得自定义代码段在目标程序调用该状态获取函数的时机调用真实的状态获取函数,以获取调用完之后当前缓冲区中的按键数据,达到了可以准确获取按键数据并可以对按键数据进行模拟的效果。
在修改目标进程中与状态获取函数相关的代码时,可以有多种方法,比如可以直接修改该状态获取函数中代码,以保证在目标进程调用该状态获取函数时直接跳转至自定义代码段中。下面结合一个具体的实施例进行详细说明。请参见图2所示,其示出了本发明一个实施例中提供的按键数据获取方法的方法流程图。该按键数据获取方法可以包括:
201,在自定义程序中创建DirectInput;
通常,在创建的DirectInput中会包含有很多函数指针。
需要说明的是,由于在系统启动时,首先会加载相关的DLL(Dynamic LinkLibrary,动态链接库),同一个DLL的加载地址是相同的,所以仅需要在自定义程序的进程中Hook到用于获取指定硬件设备状态的状态获取函数的地址,就可以直接在目标进程中注入的自定义代码中使用该状态获取函数的地址,这样可以很大程度上减少代码的编写难度。步骤201至步骤204即为在自定义程序中获取该状态获取函数的地址的过程。
202,获取DirectInput中用于创建DirectInput设备对象的创建函数;
根据DirectInput中包含的部分函数指针可以获取用于创建DirectInput设备对象的创建函数。
203,在自定义程序中根据DirectInput中的创建函数创建与指定硬件设备相关的DirectInput设备对象;
这里,针对不同的硬件设备可以创建不同的DirectInput设备对象。
当创建的DirectInput设备对象与某一个硬件设备相关时,则通过下面各个步骤最终获取到的按键数据是与该硬件设备相关的按键数据。举例来讲,当创建的DirectInput设备对象与键盘相关时,通过下面各个步骤最终获取的按键数据是与键盘相关的按键数据;同理,当创建的DirectInput设备对象与鼠标相关时,通过下面各个步骤最终获取的按键数据是与鼠标相关的按键数据。
204,获取DirectInput设备对象中用于获取指定硬件设备状态的状态获取函数的地址;
通常在通过DirectX编程中的输入部分DirectInput实现游戏中的输入或输入时,用于获取指定硬件设备状态的状态获取函数可以为GetDeviceState函数,也即这个函数通常是设置在DirectInput设备对象中用于获取指定硬件设备状态的专用函数。
很显然,在实际应用中,只需要获取具有用于获取指定硬件设备状态功能的函数即可,并不局限于名称为GetDeviceState的函数。
205,将状态获取函数的地址添加到注入在目标进程中的自定义代码段中;
目标进程为要监控的用户正在使用的游戏或者一些应用程序,本实施例就是用于获取该目标进程中产生的按键数据。
自定义代码段是自定义程序(用于获取该目标进程中按键数据的程序)注入在目标进程中的一段可以实现想要功能的代码段,用户可以在该自定义代码段中编写需要的代码。通常来讲,当自定义代码段被注入到目标进程中之后,该自定义代码段就相当于该目标进程中的一部分,但由于目标进程中之前并没有调用该自定义代码段的调用语句,因为目标进程在运行时,并不能自发的执行该自定义代码段。因此如果想要保证目标进程在运行时可以执行该自定义代码段中内容,需要修改目标进程中的代码以跳转到自定义代码段中。
通常,修改目标进程中与状态获取函数相关的代码以跳转至自定义代码段中的位置可以又编程人员根据需要设定。这是因为自定义代码段中可能会编写有各种功能的代码段,如果想要在目标程序调用该获取状态函数时,跳转至自定义代码段之后,执行某一个指定代码段中的代码,此时,则可以将跳转的位置定位为该指定代码段的初始位置。
206,利用自定义代码段中的状态获取函数的地址查找到位于目标进程中的用于获取指定硬件设备状态的状态获取函数的地址;
由于DLL加载的同一个函数的地址是相同的,所以可以通过自定义程序获取到的状态获取函数的地址查找位于目标进程中的状态获取函数的地址,即查找到目标进程中地址与添加在自定义代码段中的状态获取函数的地址相同时,则获取目标进程中的这个地址,并可以确定为该地址即为目标进程中的状态获取函数的地址。
207,将查找到的状态获取函数的地址所指向的函数体中初始的代码修改为用于跳转至自定义代码段中的代码;
比如,可以将查找到的状态获取函数的函数体中的第一句代码修改为用于跳转至自定义代码段中的代码。
但在实际应用中,函数体中的第一句代码通常比较短,因此在修改时,第一句代码的字节可能不够用于编写跳转至自定义代码段中的代码,此时,可以使用状态获取函数的函数体中前若干句代码来用于编写跳转至自定义代码段中的代码。举例来讲,可以将该查找到状态获取函数的函数体中前3句用来编写跳转至自定义代码段中的代码。
这样,通过上述修改之后,当目标进程调用该状态获取函数的地址时,则可以直接根据修改后的代码跳转至注入在目标进程中的自定义代码段中。
需要说明的是,由于后续中自定义代码段在获取按键数据时,还需要调用该状态获取函数,而由于该状态获取函数的函数体中的初始的代码已经被修改为可以用于跳转至自定义代码段中的代码,这样就会进行循环,为了避免这种循环的发生,并能够保证自定义代码段可以获取到真实的状态获取函数,此时可以将被修改的前若干句代码保存,并在需要调用真实的状态获取函数的函数体时,将保存的这些若干句代码重新回补到函数体的对应位置。
208,在目标进程调用状态获取函数时,利用自定义代码段执行状态获取函数中的真实函数体,真实函数体为在修改目标进程中与状态获取函数相关的代码前状态获取函数中具有的函数体;
根据步骤207可知,当目标进程调用状态获取函数时,在执行该函数中的第一句代码时,就会直接跳转至自定义代码段中,此时自定义代码段开始工作,这样,自定义代码段可以获悉到目标进程调用状态获取函数的时刻。为了能够获取到按键数据,可以预先在自定义代码段中编写一段用于调用状态获取函数的调用代码,并使得该调用代码在自定义代码段开始工作后调用状态获取函数。由于在调用状态获取函数时,可以将暂存在某一缓存区中的按键数据放入至当前的缓冲区中,因此在调用完状态获取函数之后,可以获取到当前缓冲区中的按键数据。
需要说明的是,如果想要使得自定义代码段中的调用代码在目标检测调用状态获取函数时直接执行对状态获取函数的调用,此时可以在步骤207中,将查找到的状态获取函数的地址所指向的函数体中初始的代码修改为用于跳转至自定义代码段中调用代码的起始位置的代码。这样,当目标进程调用状态获取函数时,根据该函数的函数体中被修改的初始的代码直接跳转至自定义代码段中调用代码的起始位置,调用代码则可以直接调用状态获取函数中的真实函数体。
209,在自定义代码段执行完状态获取函数中的真实函数体后,获取当前缓冲区中与指定硬件设备相关的按键数据。
由于状态获取函数在被调用的过程中,可以将暂存的按键数据写入缓冲区中,因此在调用完该状态获取函数之后,就可以获取当前缓冲区中指定硬件设备相关的按键数据。
需要说明的是,在获取到按键数据之后,如果想要模拟按键的动作,此时则可以根据实际需要修改当前缓冲区中与指定硬件设备相关的按键数据。比如,在某一个游戏中,用户需要连续1000次挥动朴刀砍一个怪物,此时为了避免用户不断的点击与该动作对应的按键或者不断的挥动与该朴刀对应的手柄,可以根据上述步骤获取到用于表示用户初始输入的挥动朴刀砍怪物的动作的按键数据,然后直接修改缓冲区中按键数据,以用于模拟用户的挥动朴刀砍怪物的动作。
综上所述,本发明实施例提供的按键数据获取方法,通过修改目标程序中状态获取函数中的起始代码,以使得目标进程调用该修改过的状态获取函数时可以直接跳转至注入在该目标进程中的自定义代码段中,这样,当该目标程序调用该状态获取函数时,自定义代码段会工作,并可以调用真实的状态获取函数,在调用完之后,获取当前缓冲区中与指定硬件设备相关的按键数据;解决了现有技术中目标程序可以对系统提供的用于获取并模拟目标程序中按键数据的API函数进行处理,从而使得这些API函数无法准确地获取到目标程序当前的按键数据,也无法对这些按键数据进行模拟的问题,由于将目标程序中的状态获取函数的起始代码的跳转方向指向了自定义代码段,所以自定义代码段在目标程序调用该状态获取函数时可以直接工作,并可以调用真实的状态获取函数,最终在调用完之后获取并修改当前缓冲区中的按键数据,达到了可以准确获取按键数据并可以对按键数据进行模拟的效果。
在修改目标进程中与状态获取函数相关的代码时,还可以有其他的方法,比如可以直接修改目标进程中调用该状态获取函数的地址的指针的指向,以保证在目标进程调用该状态获取函数时直接根据该指针跳转至自定义代码段中。下面结合一个具体的实施例进行详细说明。请参见图3所示,其示出了本发明一个实施例中提供的按键数据获取方法的方法流程图。该按键数据获取方法可以包括:
301,在自定义程序中创建DirectInput;
通常,在创建的DirectInput中会包含有很多函数指针。
需要说明的是,由于在系统启动时,首先会加载相关的动态链接库DLL,同一个DLL的加载地址是相同的,所以仅需要在自定义程序的进程中Hook到用于获取指定硬件设备状态的状态获取函数的地址,就可以直接在目标进程中注入的自定义代码中使用该状态获取函数的地址,这样可以很大程度上减少代码的编写难度。步骤301至步骤304即为在自定义程序中获取该状态获取函数的地址的过程。
302,获取DirectInput中用于创建DirectInput设备对象的创建函数;
根据DirectInput中包含的部分函数指针可以获取用于创建DirectInput设备对象的创建函数。
303,在自定义程序中根据DirectInput中的创建函数创建与指定硬件设备相关的DirectInput设备对象;
这里,针对不同的硬件设备可以创建不同的DirectInput设备对象。
当创建的DirectInput设备对象与某一个硬件设备相关时,则通过下面各个步骤最终获取到得按键数据是与该硬件设备相关的按键数据。举例来讲,当创建的DirectInput设备对象与键盘相关时,通过下面各个步骤最终获取的按键数据是与键盘相关的按键数据;同理,当创建的DirectInput设备对象与鼠标相关时,通过下面各个步骤最终获取的按键数据是与鼠标相关的按键数据。
304,获取DirectInput设备对象中用于获取指定硬件设备状态的状态获取函数的地址;
通常在通过DirectX编程中的输入部分DirectInput实现游戏中的输入或输入时,用于获取指定硬件设备状态的状态获取函数可以为GetDeviceState函数,也即这个函数通常是设置在DirectInput设备对象中用于获取指定硬件设备状态的专用函数。
很显然,在实际应用中,只需要获取具有用于获取指定硬件设备状态功能的函数即可,并不局限于名称为GetDeviceState的函数。
305,将状态获取函数的地址添加到注入在目标进程中的自定义代码段中;
目标进程为要监控的用户正在使用的游戏或者一些应用程序,本实施例就是用于获取该目标进程中产生的按键数据。
自定义代码段是自定义程序(用于获取该目标进程中按键数据的程序)注入在目标进程中的一段可以实现想要功能的代码段,用户可以在该自定义代码段中编写需要的代码。通常来讲,当自定义代码段被注入到目标进程中之后,该自定义代码段就相当于该目标进程中的一部分,但由于目标进程中之前并没有调用该自定义代码段的调用语句,因为目标进程在运行时,并不能自发的执行该自定义代码段。因此如果想要保证目标进程在运行时可以执行该自定义代码段中内容,需要修改目标进程中的代码以跳转到自定义代码段中。
一般来讲,游戏在防止被监控时,通常只会检测常用的几个函数,所以使用不常用的函数通常不容易被游戏检测到;而且在利用不常用的函数的地址替换状态获取函数的地址时,如果不常用的函数的地址与该状态获取函数地址相差较大,游戏也容易检测到。为了避免游戏的该目标进程能够监控到自定义代码在目标进程中所做的事情,可以选用一个地址与状态获取函数地址相近的不常用的函数作为在目标进程调用状态获取函数时跳转的目的地址。
306,获取DirectInput设备对象中符合设定条件的中间函数的地址,该符合设定条件的中间函数为DirectInput设备对象中不用的且地址与DirectInput设备对象中的状态获取函数的地址最接近的函数;
在具体实现时,获取该中间函数的地址的过程可以包括:
第一,获取DirectInput设备对象中不用的且地址与状态获取函数的地址最近的函数;
比如,先获取DirectInput设备对象中不用的函数,然后获取这些函数的地址,再然后将这些地址分别与状态获取函数的地址进行比较,最后找到与该状态获取函数的地址最接近的地址,将该地址对应的函数即为所要找的函数。
第二,将该函数确定为中间函数。
利用不常用的函数作为在目标进程调用状态获取函数时跳转的目的地址时,游戏通常不会Hook这个函数,且由于这个函数的地址与状态获取函数的地址非常近,在将中间函数的地址作为跳转的目的地址时,游戏通常也不会Hook到异常。
307,向自定义代码段中添加该中间函数的地址;
308,将该中间函数的地址所指向的函数体中的起始代码修改为用于指向该自定义代码段中;
为了避免跳转至该中间函数的地址时,执行该中间函数中的函数体,此时需要将该中间函数的地址所指向的函数体中的起始代码修改为用于指向该自定义代码段中其他需要的位置。比如,可以将起始代码修改为指向该自定义代码段中用于调用状态获取函数的调用代码段的起始位置。
309,利用自定义代码段中的状态获取函数的地址查找到指向位于目标进程中的用于获取指定硬件设备状态的状态获取函数地址的指针;
在实际应用中,获取指向状态获取函数的地址的指针的方法是本领域普通技术人员都能够实现的,这里就不再详述。
310,将指向目标进程中的状态获取函数地址的指针定向至自定义代码段中的中间函数的地址;
当目标进程在利用指针调用该状态获取函数地址时,由于指向该状态获取函数地址的指针的指向发生了改变,因此直接开始执行指向的自定义代码段中中间函数的地址,又由于中间函数的地址的起始代码被修改为指向自定义代码段中的某一位置(即步骤308),因此对于目标进程来讲,并不知道没有调用到真实的状态获取函数。而且由于中间函数的地址与状态获取函数的地址非常接近,目标进程基本上检测不出在调用状态获取函数的地址时出现差错。
311,在目标进程调用状态获取函数时,利用自定义代码段执行状态获取函数中的真实函数体,真实函数体为在修改目标进程中与状态获取函数相关的代码前状态获取函数中具有的函数体;
由于将指向目标进程中的状态获取函数地址的指针定向至自定义代码段中的中间函数的地址,因此目标进程中状态获取函数的地址并没有发生改变。此时,自定义代码段在调用状态获取函数时就是调用的该状态获取函数中的真实函数体。
312,在自定义代码段执行完状态获取函数中的真实函数体后,获取当前缓冲区中与指定硬件设备相关的按键数据。
由于状态获取函数在被调用的过程中,可以将暂存的按键数据写入缓冲区中,因此在调用完该状态获取函数之后,就可以获取当前缓冲区中指定硬件设备相关的按键数据。
需要说明的是,在获取到按键数据之后,如果想要模拟按键的动作,此时则可以根据实际需要修改当前缓冲区中与指定硬件设备相关的按键数据。比如,在某一个游戏中,用户需要连续1000次挥动朴刀砍一个怪物,此时为了避免用户不断的点击与该动作对应的按键或者不断的挥动与该朴刀对应的手柄,此时可以根据上述步骤获取到用于表示用户初始输入的挥动朴刀砍怪物的动作的按键数据,然后直接修改缓冲区中按键数据,以用于模拟用户的挥动朴刀砍怪物的动作。
综上所述,本发明实施例提供的按键数据获取方法,修改目标程序中调用状态获取函数的地址的指针的指向,以使得目标进程调用该状态获取函数时跳转至注入在该目标进程中的自定义代码段中,当该目标程序调用该状态获取函数时,则直接进入自定义代码段,此时自定义代码段可以执行相关的操作,比如利用自定义代码段调用真实的状态获取函数,在调用完成之后,获取当前缓冲区中与指定硬件设备相关的按键数据;解决了现有技术中目标程序可以对系统提供的用于获取并模拟目标程序中按键数据的API函数进行处理,从而使得这些API函数无法准确地获取到目标程序当前的按键数据,也无法对这些按键数据进行模拟的问题,由于根据上述要求修改了指向目标程序中该状态获取函数的地址的指针指向,从而使得自定义代码段在目标程序调用该状态获取函数时自发执行,并可以调用真实的状态获取函数,最终可以获取调用完之后当前缓冲区中的按键数据,达到了可以准确获取按键数据并可以对按键数据进行模拟的效果。
请参见图4所示,其示出了本发明一个实施例中提供的按键数据获取装置的结构示意图。该按键数据获取装置可以包括但不限于:第一修改模块401、执行模块402和按键数据获取模块403。
第一修改模块401,可以用于修改目标进程中与状态获取函数相关的代码,使得所述状态获取函数在被所述目标进程调用时跳转至注入在所述目标进程中的自定义代码段中,所述状态获取函数是用于获取指定硬件设备状态的函数,所述指定硬件设备为键盘、鼠标或手柄;
执行模块402,可以用于在所述目标进程调用所述状态获取函数时,利用所述自定义代码段执行所述状态获取函数中的真实函数体,所述真实函数体为在修改与所述状态获取函数相关的代码前所述状态获取函数中具有的函数体;
按键数据获取模块403,可以用于在所述自定义代码段执行完所述状态获取函数中的所述真实函数体后,获取当前缓冲区中与所述指定硬件设备相关的按键数据。
综上所述,本发明实施例提供的按键数据获取装置,通过修改目标程序中与状态获取函数相关的代码,以使得目标进程调用该状态获取函数时跳转至注入在该目标进程中的自定义代码段中,当该目标程序调用该状态获取函数时,则利用自定义代码段调用真实的状态获取函数,在调用完之后,获取当前缓冲区中与指定硬件设备相关的按键数据;解决了现有技术中目标程序可以对系统提供的用于获取并模拟目标程序中按键数据的API函数进行处理,从而使得这些API函数无法准确地获取到目标程序当前的按键数据,也无法对这些按键数据进行模拟的问题,由于根据上述要求修改了目标程序中与状态获取函数相关的代码,从而使得自定义代码段在目标程序调用该状态获取函数的时机调用真实的状态获取函数,以获取调用完之后当前缓冲区中的按键数据,达到了可以准确获取按键数据,并可以对按键数据进行模拟的效果。
请参见图5所示,其示出了本发明一个实施例中提供的按键数据获取装置的结构示意图。该按键数据获取装置可以包括但不限于:第一修改模块501、执行模块502和按键数据获取模块503。
第一修改模块501,可以用于修改目标进程中与状态获取函数相关的代码,使得所述状态获取函数在被所述目标进程调用时跳转至注入在所述目标进程中的自定义代码段中,所述状态获取函数是用于获取指定硬件设备状态的函数,所述指定硬件设备为键盘、鼠标或手柄;
执行模块502,可以用于在所述目标进程调用所述状态获取函数时,利用所述自定义代码段执行所述状态获取函数中的真实函数体,所述真实函数体为在修改与所述状态获取函数相关的代码前所述状态获取函数中具有的函数体;
按键数据获取模块503,可以用于在所述自定义代码段执行完所述状态获取函数中的所述真实函数体后,获取当前缓冲区中与所述指定硬件设备相关的按键数据。
较优的,第一修改模块501还可以包括第一查找单元501a、修改单元501b、第二查找单元501c和定向单元501d。
第一查找单元501a,可以用于利用所述自定义代码段中的状态获取函数的地址查找到位于所述目标进程中的用于获取指定硬件设备状态的状态获取函数的地址;
修改单元501b,可以用于将所述第一查找单元501a查找到的所述状态获取函数的地址所指向的函数体中的第一句代码修改为用于跳转至所述自定义代码段中的代码;
或者,
第二查找单元501c,可以用于利用所述自定义代码段中的状态获取函数的地址查找到指向位于所述目标进程中的用于获取指定硬件设备状态的状态获取函数地址的指针;
定向单元501d,可以用于将所述第二查找单元501c查找到的指向所述目标进程中的所述状态获取函数地址的指针定向至所述自定义代码段中。
较优的,该按键数据获取装置还可以包括:创建模块504、创建函数获取模块505、设备对象创建模块506、第一获取模块507和第一添加模块508。
创建模块504,可以用于在自定义程序中创建DirectInput;
创建函数获取模块505,可以用于获取所述DirectInput中用于创建DirectInput设备对象的创建函数;
设备对象创建模块506,可以用于在所述自定义程序中根据所述创建函数获取模块505获取到的所述DirectInput中的所述创建函数创建与指定硬件设备相关的DirectInput设备对象;
第一获取模块507,可以用于获取所述设备对象创建模块506创建的所述DirectInput设备对象中用于获取所述指定硬件设备状态的状态获取函数的地址;
第一添加模块508,可以用于将所述第一获取模块507获取到的所述状态获取函数的地址添加到注入在目标进程中的自定义代码段中。
较优的,该按键数据获取装置还可以包括:第二获取模块509、第二添模块510和第二修改模块511。
第二获取模块509,可以用于获取所述DirectInput设备对象中符合设定条件的中间函数的地址,所述符合设定条件的中间函数为所述DirectInput设备对象中不用的且地址与所述DirectInput设备对象中的所述状态获取函数的地址最接近的函数;
第二添加模块510,可以用于向所述自定义代码段中添加符合设定条件的中间函数的地址,所述符合设定条件的中间函数为所述DirectInput设备对象中不用的且地址与所述DirectInput设备对象中的所述状态获取函数的地址最接近的函数;
第二修改模块511,可以用于将所述中间函数的地址所指向的函数体中的起始代码修改为用于跳转至所述自定义代码段中的代码;
所述定向单元501d,可以用于:
所述将指向所述目标进程中的所述状态获取函数地址的指针定向至所述自定义代码段中的所述中间函数的地址。
较优的,该按键数据获取装置还可以包括:更改模块512。
更改模块512,可以用于更改所述当前缓冲区中与所述指定硬件设备相关的所述按键数据。
综上所述,本发明实施例提供的按键数据获取装置,通过修改目标程序中状态获取函数中的起始代码,以使得目标进程调用该修改过的状态获取函数时可以直接跳转至注入在该目标进程中的自定义代码段中,这样,当该目标程序调用该状态获取函数时,自定义代码段会工作,并可以调用真实的状态获取函数,在调用完之后,获取当前缓冲区中与指定硬件设备相关的按键数据;解决了现有技术中目标程序可以对系统提供的用于获取并模拟目标程序中按键数据的API函数进行处理,从而使得这些API函数无法准确地获取到目标程序当前的按键数据,也无法对这些按键数据进行模拟的问题,由于将目标程序中的状态获取函数的起始代码的跳转方向指向了自定义代码段,所以自定义代码段在目标程序调用该状态获取函数时可以直接工作,并可以调用真实的状态获取函数,最终在调用完之后获取并修改当前缓冲区中的按键数据,达到了可以准确获取按键数据并可以对按键数据进行模拟的效果。
需要说明的是:上述实施例提供的按键数据获取装置在获取按键数据时,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将设备的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。另外,上述实施例提供的按键数据获取装置与按键数据获取方法实施例属于同一构思,其具体实现过程详见方法实施例,这里不再赘述。
上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

Claims (6)

1.一种按键数据获取方法,其特征在于,所述方法,包括:
获取DirectInput设备对象中符合设定条件的中间函数的地址,所述符合设定条件的中间函数为所述DirectInput设备对象中不用的且地址与所述DirectInput设备对象中的状态获取函数的地址最接近的函数;
向自定义代码段中添加所述中间函数的地址;
将所述中间函数的地址所指向的函数体中的起始代码修改为用于跳转至所述自定义代码段中的代码;
利用所述自定义代码段中的状态获取函数的地址查找到指向位于目标进程中的用于获取指定硬件设备状态的状态获取函数的地址的指针,所述状态获取函数是用于获取指定硬件设备的状态的函数;
将指向所述目标进程中的所述状态获取函数地址的指针定向至所述自定义代码段中的所述中间函数的地址;
在所述目标进程调用所述状态获取函数时,利用所述自定义代码段执行所述状态获取函数中的真实函数体,所述真实函数体为在修改目标进程中与所述状态获取函数相关的代码前所述状态获取函数中具有的函数体;
在所述自定义代码段执行完所述状态获取函数中的所述真实函数体后,获取当前缓冲区中与所述指定硬件设备相关的按键数据,
其中,所述指定硬件设备为键盘、鼠标或手柄。
2.根据权利要求1所述的方法,其特征在于,所述方法还包括:
在自定义程序中创建DirectInput;
获取所述DirectInput中用于创建DirectInput设备对象的创建函数;
在所述自定义程序中根据所述DirectInput中的所述创建函数创建与指定硬件设备相关的DirectInput设备对象;
获取所述DirectInput设备对象中用于获取所述指定硬件设备状态的状态获取函数的地址;
将所述状态获取函数的地址添加到注入在目标进程中的自定义代码段中。
3.根据权利要求1或2所述的方法,其特征在于,在所述获取当前缓冲区中与所述指定硬件设备相关的按键数据之后,还包括:
更改所述当前缓冲区中与所述指定硬件设备相关的所述按键数据。
4.一种按键数据获取装置,其特征在于,所述装置,包括:
第一修改模块,用于修改目标进程中与状态获取函数相关的代码,使得所述目标进程调用所述状态获取函数时跳转至注入在所述目标进程中的自定义代码段中,所述状态获取函数是用于获取指定硬件设备的状态的函数;
执行模块,用于在所述目标进程调用所述状态获取函数时,利用所述自定义代码段执行所述状态获取函数中的真实函数体,所述真实函数体为在所述修改目标进程中与所述状态获取函数相关的代码前所述状态获取函数中具有的函数体;
按键数据获取模块,用于在所述自定义代码段执行完所述状态获取函数中的所述真实函数体后,获取当前缓冲区中与所述指定硬件设备相关的按键数据,其中,所述指定硬件设备为键盘、鼠标或手柄;
所述第一修改模块,包括:
第二查找单元,用于利用所述自定义代码段中的状态获取函数的地址查找到指向位于所述目标进程中的用于获取指定硬件设备状态的状态获取函数的地址的指针;
定向单元,用于将所述第二查找单元查找到的指向所述目标进程中的所述状态获取函数的地址的指针定向至所述自定义代码段中;
所述装置,还包括:
第二获取模块,用于获取DirectInput设备对象中符合设定条件的中间函数的地址,所述符合设定条件的中间函数为所述DirectInput设备对象中不用的且地址与所述DirectInput设备对象中的所述状态获取函数的地址最接近的函数;
第二添加模块,用于向所述自定义代码段中添加所述中间函数的地址,所述符合设定条件的中间函数为所述DirectInput设备对象中不用的且地址与所述DirectInput设备对象中的所述状态获取函数的地址最接近的函数;
第二修改模块,用于将所述中间函数的地址所指向的函数体中的起始代码修改为用于跳转至所述自定义代码段中的代码;
所述定向单元,用于:
将指向所述目标进程中的所述状态获取函数地址的指针定向至所述自定义代码段中的所述中间函数的地址。
5.根据权利要求4所述的装置,其特征在于,所述装置,还包括:
创建模块,用于在自定义程序中创建DirectInput;
创建函数获取模块,用于获取所述DirectInput中用于创建DirectInput设备对象的创建函数;
设备对象创建模块,用于在所述自定义程序中根据所述创建函数获取模块获取到的所述DirectInput中的所述创建函数创建与指定硬件设备相关的DirectInput设备对象;
第一获取模块,用于获取所述设备对象创建模块创建的所述DirectInput设备对象中用于获取所述指定硬件设备状态的状态获取函数的地址;
第一添加模块,用于将所述第一获取模块获取到的所述状态获取函数的地址添加到注入在目标进程中的自定义代码段中。
6.根据权利要求4或5所述的装置,其特征在于,所述装置,还包括:
更改模块,用于更改所述当前缓冲区中与所述指定硬件设备相关的所述按键数据。
CN201310462441.9A 2013-09-30 2013-09-30 按键数据获取方法及装置 Active CN103513989B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201310462441.9A CN103513989B (zh) 2013-09-30 2013-09-30 按键数据获取方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201310462441.9A CN103513989B (zh) 2013-09-30 2013-09-30 按键数据获取方法及装置

Publications (2)

Publication Number Publication Date
CN103513989A CN103513989A (zh) 2014-01-15
CN103513989B true CN103513989B (zh) 2017-01-04

Family

ID=49896773

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201310462441.9A Active CN103513989B (zh) 2013-09-30 2013-09-30 按键数据获取方法及装置

Country Status (1)

Country Link
CN (1) CN103513989B (zh)

Families Citing this family (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN107301765B (zh) * 2016-04-15 2021-11-30 北京远度互联科技有限公司 遥控方法、装置及终端
CN110135892A (zh) * 2019-04-15 2019-08-16 深圳职业技术学院 Api的调用计费方法、装置、电子设备以及存储介质

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6973417B1 (en) * 1999-11-05 2005-12-06 Metrowerks Corporation Method and system for simulating execution of a target program in a simulated target system
CN103023872A (zh) * 2012-11-16 2013-04-03 杭州顺网科技股份有限公司 一种云游戏服务平台

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6973417B1 (en) * 1999-11-05 2005-12-06 Metrowerks Corporation Method and system for simulating execution of a target program in a simulated target system
CN103023872A (zh) * 2012-11-16 2013-04-03 杭州顺网科技股份有限公司 一种云游戏服务平台

Non-Patent Citations (3)

* Cited by examiner, † Cited by third party
Title
恶意代码行为动态分析技术研究与实现;张旻溟;《中国优秀硕士学位论文全文数据库》;20091115;第61-64页 *
探讨游戏外挂应用技术;周毅;《中文信息》;20031020;第55-64页 *
网络游戏外挂技术及检测;罗平等;《计算机工程与设计》;20070328;第1273-1276页 *

Also Published As

Publication number Publication date
CN103513989A (zh) 2014-01-15

Similar Documents

Publication Publication Date Title
CN108021363B (zh) 可视化游戏逻辑编辑方法及系统
CN106126215A (zh) 业务规则脚本生成方法及装置
CN108351792A (zh) 使用应用容器管理代码和依赖性数据的传递
CN103984626B (zh) 一种生成测试用例脚本的方法及装置
CN107430502A (zh) 由帮助信息动态推断用于软件应用的语音命令
CN105739983A (zh) 脚本程序编辑装置及其实现方法
CN107038044A (zh) 基于Unity3D的游戏资源离散加载方法及系统
JP2011192296A (ja) ヘルプユーティリティアプリケーションプログラム
CN107766252A (zh) 测试脚本自动化执行方法、装置、设备以及存储介质
CN109271223A (zh) 窗口切换方法、装置、终端及计算机可读存储介质
CN108549568A (zh) 应用入口处理方法、装置、存储介质及电子设备
CN110058850A (zh) 一种应用的开发方法、装置以及存储介质
US7600106B2 (en) System and method for enabling/disabling write-protection of a basic input output system
CN108170438A (zh) 一种应用程序自动安装方法、终端及计算机可读介质
CN103513989B (zh) 按键数据获取方法及装置
US9632699B2 (en) User-configurable calculator
US20130297368A1 (en) Updating customer relationship management systems through sales playbook activities
CN110090438A (zh) 游戏加载方法、装置、终端及计算机可读存储介质
US11392699B2 (en) Device, method, and system for synthesizing variants of semantically equivalent computer source code using computer source code components to protect against cyberattacks
CN108205458A (zh) 会话框实现方法、装置及可读存储介质
CN106066966B (zh) 冻结应用的显示方法、冻结应用的显示装置和终端
US8225328B2 (en) Access to a target object with desired functionality
CN117180750A (zh) 基于行为树的非用户角色控制方法、装置、设备及介质
JP2020195770A (ja) スポーツゲームのスキル継承を利用したゲーム方法およびシステム
CN109254820A (zh) 窗口关闭方法、装置、终端及计算机可读存储介质

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
CB02 Change of applicant information

Address after: 511446 Guangzhou City, Guangdong Province, Panyu District, South Village, Huambo Business District Wanda Plaza, block B1, floor 28

Applicant after: Guangzhou Huaduo Network Technology Co., Ltd.

Address before: 510655, Guangzhou, Whampoa Avenue, No. 2, creative industrial park, building 3-08,

Applicant before: Guangzhou Huaduo Network Technology Co., Ltd.

COR Change of bibliographic data
C14 Grant of patent or utility model
GR01 Patent grant