反APIHOOK

外挂作坊系列教材-[第七章 中级进阶]04-反APIHOOK

第三节介绍了全局钩子+APIHOOK进行对其它进程的监控,凡事有了矛必然也会出现盾。在目前的游戏里,外挂与反外挂的技术斗争也越来越激烈,需要知已知彼才能百战百胜。

所以本节要介绍如何反APIHOOK的原理与实现。
自从劲舞团这个网络游戏更新为1.75版,使用了韩国安博士反外挂功能后,一时之间愁住了不少的外挂开发新手,之前大量的劲舞团按键精灵脚本也全都失去了作用。

其实劲舞团使用了驱动拦截进程的创建,为每个进程都加入一个DLL文件。这个DLL里会对当前进程中大量的关健API进行HOOK处理。一旦发现该进程调用的API有危害及劲舞团的进程时就会进行过滤处理。原理上与上节的全局钩子+APIHOOK实现的进程保护差不多。

也就是说劲舞团反外挂是通过APIHOOK实现过滤我们对一些特殊的关健API调用。
为了能实现反APIHOOK功能,我们有必要对APIHOOK这个实现原理有由了解

什么是APIHOOK?
通过某些手段能够控制住目标进程对某些API功能的调用,我们称为APIHOOK

APIHOOK有哪些方式?
常见的HOOK API调用的实现方式有两种。
一种是找到该API在内存的入口地址,修改其入口前八字节数据为了一汇编的 jmp xxxxxxxx 无条件跳转指令,使其调用该API时会跳到指定的另一处函数入口处,即与这个API有着相同的参数与返回值的回调处理程序

第二种是在进程的输入表(IAT表)找到保存在这里的要调用的那个API地址,修改这个地址,使程序在输入表里找该API地址时取的是我们修改后的回调程序入口地址。

上面的两种方式,其实第二种不必去考滤,因为程序要调用某个API可以不通过输入表。第一种修改入口前八字节才是最重要的,因为只要程序要调用这个API,必然得从它的入口地址进入。

下面我们的代码就是解决第一种的APIHOOK功能,让他不能监控到我们对API的调用
这里,我们使用第二节的 调用API.e 这个例子进行修改修改,使其有反APIHOOK的作用,通过修改后的程序,
[color=#ff0000]将能在劲舞团里取颜色[/color]
.版本 2
.程序集 窗口程序集1
.程序集变量 取设备句柄入口, 字节集
.程序集变量 取鼠标坐标入口, 字节集
.程序集变量 取坐标颜色入口, 字节集
.程序集变量 键盘动作入口, 字节集
.子程序 __启动窗口_创建完毕
模块注册 ()
读字节集内存 (0, 取函数入口 (取模块句柄 (“user32.dll”), “GetDC”), 取设备句柄入口, 8)
读字节集内存 (0, 取函数入口 (取模块句柄 (“user32.dll”), “GetCursorPos”), 取鼠标坐标入口, 8)
读字节集内存 (0, 取函数入口 (取模块句柄 (“gdi32.dll”), “GetPixel”), 取坐标颜色入口, 8)
读字节集内存 (0, 取函数入口 (取模块句柄 (“user32.dll”), “keybd_event”), 键盘动作入口, 8)
注册热键程序 (0, 36, &取色)
.子程序 取色
.局部变量 设备句柄, 整数型
.局部变量 坐标, 坐标
写字节集内存 (0, 取函数入口 (取模块句柄 (“user32.dll”), “GetDC”), 取设备句柄入口)
设备句柄 = 取设备句柄 (0)
写字节集内存 (0, 取函数入口 (取模块句柄 (“user32.dll”), “GetCursorPos”), 取鼠标坐标入口)
取鼠标坐标 (坐标)
写字节集内存 (0, 取函数入口 (取模块句柄 (“gdi32.dll”), “GetPixel”), 取坐标颜色入口)
标签1.背景颜色 = 取坐标颜色_ (设备句柄, 坐标.横, 坐标.纵)
释放设备 (0, 设备句柄)
.子程序 _按钮1_被单击
_启动窗口.位置 = 2    ' 把本程序窗口最小化
延时 (500)
.计次循环首 (20, )
      写字节集内存 (0, 取函数入口 (取模块句柄 (“user32.dll”), “keybd_event”), 键盘动作入口)
      键盘动作 (#A键, 0, 0, 0)
      键盘动作 (#A键, 0, 2, 1)
.计次循环尾 ()

看上面的对码,相对于第二节的代码里增加了一些读写内存,在进程创建时就先把一些关健的将要使用的API入口处八字节数据读出保存,然后在每次要调用这些API时,把这原保存的八字节数据都写回去。这样一来,游戏对我们的API入口处拦截就失败了。

但有一点需要注意的,我们的程序必需得在游戏之前运行才可以。如果游戏以我们之前已经运行了的话,就晚了,那时你保存下来的八字节数据早就被游戏动过手脚了的。而且,对于这种被修改过的数据你保存下来后,若该游戏结束运行了时,你还去恢复API入口并调用这些API的话,会出现非法操作的。

基于上面的原因,所以反APIHOOK一般只用于自已的EXE程序里,在钩子DLL中用到的机会不多。

由于反APIHOOK的实现需要精通于API的组合调用,所以新手在自已做这种功能时可能不太如意,达不到想要的效果。
外挂作坊1.8第三版模块内置了一些反APIHOOK机制。只要直接调用模块里的取坐标颜色等功能即可。
下版模块会把反APIHOOK分离出为,给用户进行可选择性使用
.版本 2
.程序集 窗口程序集1
.子程序 __启动窗口_创建完毕
模块注册 ()
注册热键程序 (0, 36, &取色)
.子程序 取色
标签1.背景颜色 = 取坐标颜色 ()
.子程序 _按钮1_被单击
_启动窗口.位置 = 2    ' 把本程序窗口最小化
延时 (500)
.计次循环首 (20, )
      键盘按下 (, #A键)
      键盘弹起 (, #A键)
.计次循环尾 ()
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值