目 录
1绪论 ................................................ 2
1.1研究背景 ................................................................................................................................ 2
1.2本文的主要研究内容 ............................................................................................................. 3
2 Windows系统基础 ................................... 4
2.1 OD插件知识 ....................................................................................................................... 4
2.1.1 OD插件简介 .............................................................................................................. 4 2.1.2 如何编写OD插件 ..................................................................................................... 5 2.2 Windows系统理论知识 .................................................................................................. 5
2.2.1 Windows进程虚拟地址空间 .................................................................................... 5 2.2.2 Windows系统调用 ................................................................................................ 6 2.2.3 Windows 句柄理解 ............................................................................................... 7 2.2.4 Windows 切换进程空间 ....................................................................................... 8 2.3 Windows调试系统原理 .................................................................................................. 8
2.3.1 Windows调试系统用户模块 ................................................................................ 8 2.3.2 Windows调试系统内核模块 ................................................................................ 9
3系统需求分析 ........................................ 9
3.1 存在的主要问题............................................................................................................... 9 3.2解决方案 ............................................................................................................................. 10 3.3系统需求分析....................................................................................................................... 10 3.4系统流程图 .......................................................................................................................... 12
4系统概要设计 ....................................... 13
4.1 4.2
应用程序模块................................................................................................................. 13 内核驱动模块................................................................................................................. 14
5系统详细设计 ....................................... 15
5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8
HOOK ntdll.dll的KiFastSystemCall()函数 .................................................................. 15 实现HOOK的HxKiFastSystemCall(),改变系统调用的流程 .................................. 16 解析微软提供的PDB文件得到未导出的内核函数地址 ........................................... 18 向Windows系统内核中加入我们自己的系统服务表 ................................................ 24 实现我们自己的系统调用函数 ..................................................................................... 27 移除EPROCESS->DebugPort端口 .............................................................................. 31 HOOK Windows 内核下会发送调试事件的内核函数 ............................................ 32 HOOK Windows内核异常处理函数 ............................................................................ 35
系统开发小结 ........................................ 36 参考文献 ............................................ 36
致 谢 ............................... 错误!未定义书签。
基于OD插件的内核调试器的设计与实现
摘 要:随着计算机互联网技术的飞速发展,网络游戏得到了很好的发展,它的保护也
是日趋完善,几种常见的保护有nProtect GameGuard(NP), hackshield(HS),让OllyDbg调试器(OD)不能调试,Cheat Engine(CE)不能搜索游戏内存,让人们没法开始逆向它们,本文即在这种背景下为了满足人们的工作需求而设计的。系统以VC 6.0 应用程序编译器和WIN DDK 3790.1830 驱动编译器作为开发工具,以OD调试器提供的静态库,Window Research Kernel(WRK)的源码为基础,HOOK OD进程空间ntdll.dll动态库的KiFastSystemCall()函数,通过我们自己在Windows内核下加的系统服务表,使其当OD调试器调用我们感兴趣的系统调用时,跳到我们自己的系统调用,这样使其成功调用,突破游戏的一般保护,本文以C语言为编程语言,本系统是一个具有实际应用意义的典型系统。
关键词:OD插件;NP;HS;游戏保护;
OD plug-in based on the kernel debugger Design and
Implementation
Abstract: With the rapid development of Internet technology, computer, online games have been well developed, and its protection is also maturing, several common protect nProtect GameGuard (NP), hackshield (HS), let OllyDbg debugger (OD) can not debugging, Cheat Engine (CE) can not search for games of memory, so that people can not start reverse them, this is in this context in order to meet the needs of people work designed. Application system to VC 6.0 compiler and WIN DDK 3790.1830 drive the compiler as a development tool to OD debugger provides static libraries, Window Research Kernel (WRK) source-based, HOOK OD process space of KiFastSystemCall dynamic library ntdll.dll () function, through our own in the Windows kernel plus the system service table, so that the debugger is called when the OD system call when we are interested, skip to our own system calls, so call it success, breaking the game in general protection of this paper, C language programming language, the system is a typical system, the practical application of significance.
1
Key words: OD Plugins;NP;HS;Game Protect
1绪论 1.1研究背景
进入二十一世纪以来,随着社会的不断进步和互联网产业技术的飞速发展,网络游戏得到了空前的流行,研究它的人也越来越大众化。
因此,因为种种原因,一些游戏和商业程序就会防止OD调试器和CE数据搜索器搜索游戏的数据防止逆向工作人员逆向这们,一些防调试方法如下: 1, 比如检测系统当前系统运行的进程看有没有Od和Ce,查找窗口看有没有它们,还有就是搜索Od和Ce的特征码看有没有它们,有就退出。 2, 调用IsDebugPresent()函数,检测这个游戏进程是不是被调试。
3, Hook DbgUiRemoteBreakIn()函数防止运行int 3断点中止游戏的程序运行,这样能防止OD调试器附加游戏进程。
4, 游戏故意产生异常,然后自己去处理它,如果有调试的话,异常一般会先给调试器,由调试器处理了,所以游戏就不会进入它自己的异常处理,这样它就检测出了调试器。
5, 还有就是nProtect GameGuard(NP), hackshield(HS),PerfectProtect.sys等等的保护,一般它们都是差不多的,比如系统服务表(SSDT表)HOOK,内核下Inline HOOK,一般HOOK NtOpenProcess()防止打开游戏进程得到句柄,HOOK NtReadVirtualMemory(),NtWriteVirtualMemory()防止读写游戏进程空间的内存,还有就是HOOK NtDebugActiveProcess(),NtCreateDebugObject(),NtWaitForDebugEvent()等等一系列与调试有关的系统调用防止调试游戏,还有就是HOOK 每个CPU的中断描述符表(IDT)表中的INT 1和INT 3断点,防止对游戏进程下断产生单步调试事件和异常调试事件,还有一种就是内核下建立一个内核线程一直对游戏的进程控制块(EPROCESS)结构体的(调试端口)DebugPort一直清0,防止游戏被Od调试收到调试信息。
综上所述,第5种保护方法一般是现在最流行的保护,有很多的人们在研究它们的保护,他们一般采用的方法是跳过这些函数的调用,比如对于SSDT HOOK,它们可以在KiFastCallEntry()函数里进行处理,对于Inline HOOK,我们可以先HOOK SSDT进入我们自己的系统调用,然后才调用真正的函数,对于调试端口
2
DebugPort清0的检测我们可以把Windows内一切操作EPROCESS.DebugPort端口的内核函数,改变这些偏移,使其操作EPROCESS结构中的其它没有多大用的结构成员,比如EPROCESS.time。
这种方法针对一般的保护有效,但是对于特定的保护,我们可以特别的处理,比如Tessafe.sys你可以把自己加入白名单等等处理方法,还有对于HS我们可以调用一个14号功能函数通知HS保护驱动退出等等许多的方法。
1.2本文的主要研究内容
基于OD插件的内核调试器系统主要是在OD调试器的基础上编写OD插件,HOOK OD进程空间的ntdll.dll动态库的KiFastSystemCall()函数,改变OD进程调用一些关键系统函数的调用流程,使其进入我们自己在内核中的实现的系统调用,这样能够绕过一般的保护驱动的钩子。本系统是主要分为四个主要的功能来实现:
1, 编写OD应用程序插件,利用OD调试器提供给我们的OLLYDBG.LIB静态库和Plugin.h头文件来编写OD插件,在OD调试器上加个菜单选项用于控制OD调试器是不是启动我们的这种程序机制。比如当我们点BeginHook菜单时,我们的程序就开始工作,HOOK ntdll.dll动态库的KiFastSystemCall()函数,Windows提供给程序员的一般的API,比如Kernel32.dll里的打开进程OpenProcess(),读进程内存ReadVirtualmemory(),写进程内存WriteVirtualMemory()等等API函数,最终的系统调用都会调用这个函数,这时eax是系统调用ID,堆栈里有调用这个系统调用时的各个参数,这样,我们可以改变这些系统调用ID,使其调用我们自己在Windows系统内核添加的系统调用。当我们点CancelHook时,我们的程序就停止工作。
2, 由于我们内核驱动要调用的很多内核函数是ntkrnelpa.exe内核文件未导出的,所以我们要自己获取内核函数在当前系统的地址,很多同学采用的是暴力搜索内存然后匹配方法处理的,这种方法效率欠缺,并且由于好多硬编码,移值性很差。我是这么做的,在内核驱动下,把这些未导出的函数申明为函数变量指针,然后用户层程序(OD插件)调用DeviceIoControlFile()函数和驱动通信取得这些未导出的函数的名字,然后我们自己解析微软提供给我们的符号文件(PDB文件),得到这个版本系统的未导出的函数在这个系统版本的内核加载地址。然后再次调用DeviceIoControlFile()函数传给内核驱动。
3,把微软提供的Windows Reasarch Kernel(WRK)里的dbgk目录下的dbgkobj.c,dbgkport.c,dbgkproc.c,dbgkp.h文件移值到我们的内核驱动工程里来,这几个.c文件是Windows系统调试系统机制的实现,只要我们集成进我们的
3
驱动里来了,以后游戏保护对这些调试机制的一切HOOK与检测,我们可以不用去管它了,相当于OD插件它们用的是我们自己集成的调试系统机制。还有内核线程对EPROCESS结构体的DebugPort清0,我们也可以跳过它。还有就是增加游戏常HOOK的几个关键函数,比如NtOpenProcess(),NtReadVirtualMemory(),NtWriteVirtualMemory()等等,我们自己在Windows内核中实现它,下次OD调试器调用这些函数对游戏进程操作时,都会进入我们自己的这些系统调用,到时想实现什么功能就实现什么功能。
4, Windows系统内核下有两种系统服务表KeServiceDescriptorTable和KeServiceDescriptorTableShadow,对于图形界面(GUI)线程,它引用的是KeServiceDescriptorTableShadow这个系统服务表,非GUI线程引用的是KeServiceDescriptorTable系统服务表。对于微软提供的大多数API,内核下都有专门对应的系统调用,比如当我们调用OpenProcess() API函数时,最终会调用系统调用NtOpenProcess()。每一个系统调用ID,在Windows内核下都会对应一个系统调用函数,比如NtOpenProcess的系统调用ID,在Windows Xp 3的系统下ID为122。Windows Xp3 系统大概提供了283个系统调用。因此我们自己可以在这两种系统服务表的后面加上我们自己的系统调用函数,对应相应的系统调用ID,这样当OD调试器调用我们感兴趣的系统调用时,我们可以改变系统调用ID,这样就可以进入我们自己实现的系统调用函数。
2 Windows系统基础
2.1 OD插件知识
2.1.1 OD插件简介
OllyDbg 简称(OD) 是一款优秀的用户态调试工具。它不仅拥有强大的反汇编能力和动态分析力,还具有良好的扩展结构,允许用户自行开发插件完成特定的工作。OD插件也可以有自己的窗口逻辑和功能函数。事实上,我们可以将它看成这样一个Windows 程序,它拥有自己的消息循环和窗口过程,但它的启动是由OllyDbg 发起的,具体功能的实现也通过调用OllyDbg 提供的函数来实现的。它的启动过程如下:
在OllyDbg 的启动过程中,有一步是检查插件路径下是否存在DLL 文件。如果存在,逐一进行如下扫描:
1, 加载该DLL 文件,找到其入口点。
2, 通过回调函数,获取插件名称、版本等信息。
3, 通过回调函数,对插件进行初始化,包括申请资源、恢复全局参数等。
4