随着软件产业的发展, 在Windows平台上, 为了防止软件被逆向, 破解, 出现了很多保护软件的手段, 其中一种就是反调试, 在反调试领域, 最强的莫过于在网络游戏方面.在网络游戏反调试上, 总是有一拨孜孜不倦的人, 不断的突破游戏公司的封锁, 而游戏公司又不断的改进反调试的方法.
有没有一种一劳永逸的方法呢? 这时候VT技术进入了我的视野.

这些反调试系统大致功能都是让OllyDbg不能调试, Cheat Engine( CE ) 不能查看搜索被保护程序的内存. 让人们无法逆向它们.
对抗从来都没有停止过. 每当这些反调试公司研究出新的反调试手段的时候, 又不断的有人对它进行破解, 绕过. 过去的手段是每当出现一种新的保护的时候, 就要重复性的再破解一次. 而且每种游戏保护采用的手段虽然大致相同, 但是还是略有区别.
这种状态一直持续到滴水公司出的DTDebug. 当时它们的调试器推出以后, 号称可以无视任何反调试. 根据我个人使用情况来看, 对于市面上常见的游戏保护是有效果的. 当然是2年前了. 最近据说一直没有更新. 被人提串了..
从DTDebug上面,  Virtualization Technolegy(VT)技术进入我们的视野. 经过一段时间的研究, 我准备写点VT的东西出来, 最开始我写了一个基于VT技术的单机内核调试器, 算是对VT技术的演练. 后面我想, 为什么不写一个有实际应用的调试插件呢?
写这个插件需要时间, 感谢cncert的王明华处长和李佳处长给的机会. 给我空间发挥. 于是我准备写一个Ollydbg的插件, 套上VT技术. 经过几个月码代码. 终于写的差不多了. 对于cncert来说. 写这个插件是一种研究性的目的. 而我也放弃了将这个插件商业化的想法. 所以项目搁浅.
这里再重点说说cncert http://www.cert.org.cn/ 一直非常关注最前沿的安全技术, 为我们国家的安全事业做出了不可磨灭的贡献. 同时cncert刚成立的前沿网络安全技术实验室也是牛人的摇篮.
摆了一段时间以后, 有几个朋友想找个要源码过去观摩下,看到看雪论坛也放出来VT技术的项目, 这个提醒了我, 在我征得cncert的同意下. 我想还是把他开源吧, 还算能够给大家做点贡献. 烂在硬盘里面总归不是上策. 我把这个插件的名字叫Ddvp. Ddvp是敌敌畏的缩写, 显示这个插件调试Bug确实很厉害.
技术细节
项目总共分成3部分. 分别是Ollydbg的插件部分. 调试函数调用界面. 和内核调试框架.
2.1 OllyDbg插件部分:
这部分的代码主要是显示一个开启VT调试框,用于开启和关闭调试框架..目前开多个调试器也是支持的.也就是说可以运行多份调试器.
在选择开启调试引擎以后, 程序会枚举符号. 这个要看你网络的情况了. 如果中间一直处于枚举符号状态, 请检查网络. 并在任务管理器中停止程序, 重新开启.
2.1 调试函数调用界面:
调试调用界面我写成的是一个DLL.DbgObj.dll 模拟了Windows和调试相关的大部分函数. 这些函数会以自己的方式进内核. 当时整这个DLL的时候, 我想到有一天可能在其他的地方使用, 比如Cheat Engine(CE)上面, 所以设计的还是比较满意的, 如果CE需要使用反调试框架, 那么只要勾住CE调用的函数使用我们DbgObj.dll中的函数就可以了. 细节请查看源码.
2.3 内核调试框架.
这是整个项目的重点, 里面的内容也可以分成几部分. 重写Windows调试框架. 重载内核. VT技术. 我分别说下这几部分.
在重写Windows调试框架部分. 我没有用系统原来的DbugPort. 另外自己维护了一份调试器与被调试进程的结构. 在采集调试消息的时候, 都是走我们的例程.. 和Windows的DebugPort类似, 下面这个是我写的调试框架的DebugPort.

typedef struct tagDbgItem
{
LIST_ENTRY  ListEntry;
PEPROCESS   Debugger;
ULONG_PTR   DebuggerCr3;
PEPROCESS   Debugged;
ULONG_PTR  DebuggedCr3;
ULONG       Active;
ULONG    RefCount;
ULONG    ProcessFlags;
NTSTATUS    Status;
BYTE    Buffer[64];
DEBUG_OBJECT DebugObject;
DEBUGGED_THREAD DebuggedThread;
} DBG_ITEM, *PDBG_ITEM;

细节方面, 请查看源码.
重载内核部分, 分成几步
查找系统内核模块. 不是ntkrnlpa.exe就是ntoskrnl.exe, 其中之一
映射内核文件
重定位模块
修复输入表, ( ntos 的输入表有3个DLL依赖项. 需要修复)
修改新的内核SSDT表
删除我们新的镜像PE头
VT 技术方面, 因为VT技术比较新, 如果你对VT技术还不甚明白, 请先查看intel 文档. 中文不大好可以配合newbluepill那本书看, VT技术方面, 我使用它的下面几个特性.
重定向中断. 对于1号中断, 属于硬件中断, 我会在windows中搜索0×20一下的中断号给1号中断使用. 对于3号中断属于软中断, 随便在IDT中搜索一个空的就OK了.
MSR寄存器保护, 我在插件开启的时候会将MSR_IA32_SYSENTER_EIP 0×176 换掉, 换成我们实现的KiFastCallEntry. 在这里判断是否是我们需要出来的SSDT调用, 根据不同的SSDT调用我们转到不同的内核模块中. (我们重定位的模块, 或者是系统本身的模块)
VT技术还有很多特性, 比如CR寄存器访问, DR寄存器访问. 本来都想用上, 但是发现, 不行. 因为在CR寄存器访问, 和DR寄存器访问的时候, 我没有办法确定线程的运行上下文在那个进程, 线程环境中.. 所以针对Cr3的保护, 和DRx寄存器保护没有做.
另外还有一个比较遗憾的地方是, 本来我决定要给整一个无限断点的. 后面因为项目搁置没有弄. 绝对不是不会整. 另外一个是想写一个类似NewBluePill的内存隐藏. 如果给台硬件调试器, 可以试试.
后记
如果你也想拿源码改改自己用, 那么你还需要再了解点东西, 首先代码大部分是在windbg+vmware双机调试下写出来的. 关于VT部分的代码是在bochs里面写出来的. Bochs很好很强大, 如果有时间真的应该把bochs的源码下载过来看看. 我在写VT的时候, 有些技术细节不懂的时候, 我就看看bochs的实现. 看看鞋子, 脚就懂了!
不过说到bochs的时候, 不得不说他这个东西非常的慢, 你需要一台非常好的电脑. 我的I7电脑运行起来依然慢的让我伤心.. 当然如果你有钱搞硬件调试器, 我就没话说了.
用bochs调试的时候在配置文件中加入这么一句 magic_break: enabled=1 那么遇到xchg bx, bx.. Bochs就会停下来, 类似windbg的. Int 3中断. 加入这么一句的时候, 在进入windows系统的时候, 好像windows的代码会不停的阻断在这个xchg bx, bx上面, 恶心至极. 在我恶心的受不了的时候. 我做出了改变. 改动了bochs的源码, 整个世界, 一瞬间清静了..下面这个帖子有告诉你bochs怎么开启VT. 怎么改变xchg bx, bx.

用bochs安装系统也是一个折磨人的工作, 当然你不需要做了. 如果你需要windows xp sp3的系统, 或者win 7 的系统可以联系我给你传. 链接我就不放了. 免得你告我盗版..
另外一方面, 目前NP, HS的反调试除了对系统的一些检测以外, 还提取了OllyDbg的特征码. 我就好人做到底,送佛送到西. 下面的下载链接里面已经有一个完整可以运行的OllyDbg. 可以调试HS. 已经修改过特征码了. 我用的是网上的OllyDbg加强版改的. 版权该谁还是谁的.

代码编译
编译代码请先设置$(WINDDK)环境变量设置成你自己安装的DDK目录. 因为要编译驱动. 运行代码请在Intel 的Cpu上. AMD的虚拟化没写. 倒…并且BIOS开启了VT技术.
Windows xp sp3系统, 最好原版安装的. 不要使用什么ghost的系统, 以免出现神奇的错误.

插件运行
目前程序可以稳定的调试TP, HS的游戏, TP我测试的是dnf. HS测试的是冒险岛. StrongOD我已经设置好了. 不要随便去改动, 除非你自己知道在做什么..
另外请先开启调试器, 再开启游戏调试. 注意了. HS如果不先开启调试器, 并开启引擎. 那么是调试不了的..
需要自己支持其他的插件的话, 将插件的输入表修改成DdvpOD.EXE就可以了. 原本是OllyDbg.exe..
DdvpOD插件可以按Atl+Q呼出来, 或者自己在插件菜单开启, 首次运行的时候有可能需要枚举符号, 需要一点时间, 具体看你网络了. 目前只支持原版xp sp3系统, 其他的没有测试过.. 使用Intel的Cpu. AMD还不支持..
1. 首先你应该开启DebugView. 程序处于调试版本状态. 开启DebugView会有助于确定程序崩溃的地方.
2. 点击DdvpOD.exe开启程序. Ddvp已经以插件的形式提供给OD使用. 同时OD的特征码也被我修改过. 放心使用.
3. Alt+Q呼出插件(或者在插件菜单开启). 点击开启调试引擎. 开启调试引擎的时候, 容易出错, 请确定你是用的是windows xp sp3系统  intel的cpu. 同时你的cpu支持VT技术, BIOS里面也已经开启.
4. 确认你的电脑处于联网状态, 首次运行需要联网枚举符号. 所以首次运行请联网..
程序组成结构:
原本OllyDbg.exe的东西, 我就不多说了. Ddvp在OD的目录下添加的文件作用我说一说..

1.DbgObj.dll
这是基于VT技术的调试框架的R3函数实现,基本上都是模拟Windows的函数调用. 比如CreateProcess. DebugActiveProcess
2.DbgSys.sys
DbgObj.dll启动以后会释放一个驱动文件在OD的主目录下面. 是负责调试框架的R0层..
3.[Plugin]Dichlorvos.dll
这是开放给OD使用的插件, 符合OD插件编写规范. 这个插件主要的功能是现实开启调试框架界面, Hook OD的调试有关函数  Hook以后走DbgObj.dll这边.
另外我修改了OD使用的DbgHelp.dll, OD自带的版本太旧了. 还有为了支持符号枚举, 添加了3个文件pingme.txt, symsrv.dll, symsrv.yes.这几个文件都是和符号枚举有关的.
attachment.jpg
attachment.jpg


您需要登录后才可以回帖 登录 | 获取账号

Archiver|Rerede.com     

GMT+8, 2017-10-23 12:21

Powered by R-Team X2

© 2011-2012 Rerede.com.

回顶部