趁着圣诞又歇了几天,没博,倒是主动被动的看了不少片子。我发现我的观影口味挺杂,什么都看,还什么都能看的津津有味。这些片中,有肥皂剧型的“Ally McBeal”(甜心俏佳人),柯恩兄弟的黑帮型的"Miller's Crossing",闷骚型的“Country Life”,一直想看的“北京乐与路”,还有成龙大叔的“神话”。
前几天有博友留言希望我多谈点儿d2hackit,那我就随便说说。
D2中的外挂,比较有代表性的大致可以分为三类:以maphack为代表的辅助型,以帮助玩家更有效的玩游戏为目的;以D2JSP为代表的BOT型,用于在无人值守的状态下自动进行游戏;还有一类就是以d2hackit为代表的全能型,bot、pickit、dupe、pk hack、packet sniffer、trade hack、drop hack什么都能做,D2中dupe泛滥有一部分原因要归功于它,比较有代表性的基于d2hackit的插件外挂有09时期的pickit、PindleBot,和1.10时期的zPickit。
从结果上看,d2hackit无疑是成功的,然而从软件设计角度看,它当初的部分设计目标并没有达到。d2hackit的设计意图,是要实现一个外挂的开发平台,其他开发者只需用这个平台提供的基础设施,不必具备逆向工程,甚至汇编语言的能力就能够做出外挂。按照d2hackit原作者thohell的设想,d2hackit甚至不必局限于D2,而是一个通用的外挂开发平台,可以用于其他游戏。
降低外挂开发的难度这一点d2hackit是做到了,d2hackit插件泛滥就说明了它的成功。通用平台这一目标它显然没有达到,别说用于其它游戏,在09补丁上能用的插件,在1.10上都用不了,必须重新编译甚至修改源代码。
d2hackit的基本工作原理,跟我以前写的一篇 介绍外挂工作原理的文章里说的大致相同:d2hackit的加载、卸载,地址(旁路点、游戏内部函数和全局变量)的定位,以及旁路点被触发时的处理等几部份。不同的是d2hackit做为一个外挂平台,还需要加载它的插件,并在适当时刻(收、发数据包,进入、退出游戏等)通知插件。下面逐一分析。
1,d2hackit的加载和卸载。 d2hackit在本质上就是一个windows的DLL,因此任何能在游戏进程加载、卸载DLL的方法都适用于d2hackit。d2hackit 自带的loader用的是远程DLL注入的方法,另外d2hackit本身也可以做为d2loader的插件在游戏程序运行时自动加载。
2,地址的定位。d2hackit对地址的定位是比较有特色的,它除了支持基址+偏移量的通常做法,还支持指纹式的内存数据匹配搜索,也就是说它可以通过搜索特定模式的字节序列来定位内存地址。这样设计的意图是在游戏补丁升级时只需更新指纹数据就可以让d2hackit工作于新版本补丁(当然大家都知道这个目标没有达到)。指纹模式在配置文件中指定(d2hackit.ini),格式如下:
上面这行指定了接收数据包的旁路点地址的匹配模式:在d2client.dll中搜索8B5C2410xxxxxxxxxxxx8D145B8B0495特征数据,每xx匹配任意1字节数据。7为patch长度,13为距离匹配地址的偏移。
3,旁路点的事件处理。以接收游戏数据包的处理为例。在安装了GamePacketReceivedIntercept旁路点以后,每当收到游戏内数据包时,d2hackit的相应旁路点处理例程就会先获取控制权。为了不破坏原先的寄存器内容,旁路点处理例程必须先保存必要的寄存器然后再做真正的处理。因此处理例程分为两部分,用汇编写的GamePacketReceivedInterceptSTUB函数和C函数GamePacketReceivedIntercept。
前几天有博友留言希望我多谈点儿d2hackit,那我就随便说说。
D2中的外挂,比较有代表性的大致可以分为三类:以maphack为代表的辅助型,以帮助玩家更有效的玩游戏为目的;以D2JSP为代表的BOT型,用于在无人值守的状态下自动进行游戏;还有一类就是以d2hackit为代表的全能型,bot、pickit、dupe、pk hack、packet sniffer、trade hack、drop hack什么都能做,D2中dupe泛滥有一部分原因要归功于它,比较有代表性的基于d2hackit的插件外挂有09时期的pickit、PindleBot,和1.10时期的zPickit。
从结果上看,d2hackit无疑是成功的,然而从软件设计角度看,它当初的部分设计目标并没有达到。d2hackit的设计意图,是要实现一个外挂的开发平台,其他开发者只需用这个平台提供的基础设施,不必具备逆向工程,甚至汇编语言的能力就能够做出外挂。按照d2hackit原作者thohell的设想,d2hackit甚至不必局限于D2,而是一个通用的外挂开发平台,可以用于其他游戏。
降低外挂开发的难度这一点d2hackit是做到了,d2hackit插件泛滥就说明了它的成功。通用平台这一目标它显然没有达到,别说用于其它游戏,在09补丁上能用的插件,在1.10上都用不了,必须重新编译甚至修改源代码。
d2hackit的基本工作原理,跟我以前写的一篇 介绍外挂工作原理的文章里说的大致相同:d2hackit的加载、卸载,地址(旁路点、游戏内部函数和全局变量)的定位,以及旁路点被触发时的处理等几部份。不同的是d2hackit做为一个外挂平台,还需要加载它的插件,并在适当时刻(收、发数据包,进入、退出游戏等)通知插件。下面逐一分析。
1,d2hackit的加载和卸载。 d2hackit在本质上就是一个windows的DLL,因此任何能在游戏进程加载、卸载DLL的方法都适用于d2hackit。d2hackit 自带的loader用的是远程DLL注入的方法,另外d2hackit本身也可以做为d2loader的插件在游戏程序运行时自动加载。
2,地址的定位。d2hackit对地址的定位是比较有特色的,它除了支持基址+偏移量的通常做法,还支持指纹式的内存数据匹配搜索,也就是说它可以通过搜索特定模式的字节序列来定位内存地址。这样设计的意图是在游戏补丁升级时只需更新指纹数据就可以让d2hackit工作于新版本补丁(当然大家都知道这个目标没有达到)。指纹模式在配置文件中指定(d2hackit.ini),格式如下:
;
Name
=
Module
,
patchsize
,
offset
,
fingerprint
GamePacketReceivedIntercept = D2Client . dll , 7 , 13 , 8B5C2410xxxxxxxxxxxx8D145B8B0495
GamePacketReceivedIntercept = D2Client . dll , 7 , 13 , 8B5C2410xxxxxxxxxxxx8D145B8B0495
3,旁路点的事件处理。以接收游戏数据包的处理为例。在安装了GamePacketReceivedIntercept旁路点以后,每当收到游戏内数据包时,d2hackit的相应旁路点处理例程就会先获取控制权。为了不破坏原先的寄存器内容,旁路点处理例程必须先保存必要的寄存器然后再做真正的处理。因此处理例程分为两部分,用汇编写的GamePacketReceivedInterceptSTUB函数和C函数GamePacketReceivedIntercept。
DWORD __fastcall GamePacketReceivedIntercept(BYTE
*
aPacket, DWORD aLength)
{
// Pass packet to all clients who wants to snoop
LinkedItem * li = ClientModules.GetFirstItem();
while (li)
{
PCIS pCIS = ClientModules.GetCIS(li);
if (pCIS && pCIS -> OnGamePacketBeforeReceived)
{
aLength = pCIS -> OnGamePacketBeforeReceived(aPacket, aLength);
if ( ! aLength) break ;
}
li
{
// Pass packet to all clients who wants to snoop
LinkedItem * li = ClientModules.GetFirstItem();
while (li)
{
PCIS pCIS = ClientModules.GetCIS(li);
if (pCIS && pCIS -> OnGamePacketBeforeReceived)
{
aLength = pCIS -> OnGamePacketBeforeReceived(aPacket, aLength);
if ( ! aLength) break ;
}
li