基于VT技术的OllyDbg插件Ddvp

随着软件产业的发展, 在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中搜索0x20一下的中断号给1号中断使用. 对于3号中断属于软中断, 随便在IDT中搜索一个空的就OK了.

MSR寄存器保护, 我在插件开启的时候会将MSR_IA32_SYSENTER_EIP 0x176 换掉, 换成我们实现的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.

http://www.joenchen.com/archives/801

用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的目录下添加的文件作用我说一说..

Ddvp_0.72_bin.part1.rar.
Ddvp_0.72_bin.part2.rar.
Ddvp_0.72_Src.rar.
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.这几个文件都是和符号枚举有关的.
点击图片以查看大图</p><br /><br /><br /><br /><br /><br /><br /><br />
<p>图片名称:	未命名.jpg<br /><br /><br /><br /><br /><br /><br /><br /><br />
查看次数:	8<br /><br /><br /><br /><br /><br /><br /><br /><br />
文件大小:	162.6 KB<br /><br /><br /><br /><br /><br /><br /><br /><br />
文件 ID :	81715点击图片以查看大图</p><br /><br /><br /><br /><br /><br /><br /><br />
<p>图片名称:	未命名2.jpg<br /><br /><br /><br /><br /><br /><br /><br /><br />
查看次数:	24<br /><br /><br /><br /><br /><br /><br /><br /><br />
文件大小:	158.6 KB<br /><br /><br /><br /><br /><br /><br /><br /><br />
文件 ID :	81716

另外, 求包养, 求笼罩.求抱大腿.  QQ:51753931.

网友评论:

  1. lion 说:

    开引擎,开游戏,直接重启
    游戏是完美的 “圣王”
    请告诉我,是ddvp特征码给检测到了,还是别的原因,谢谢

  2. Joen 说:

    完美的PP. 需要另外做点工作.. 开源Ddvp是给大家学习的机会, 并不是让大家成为伸手党…

  3. rulary 说:

    精彩!目前 还没有时间研究,除了VT 我更看重 博主重写Windows调试框架 和 重载内核的方法;
    不知道对这方面的资料 博主有什么好的推荐没有?

  4. rulary 说:

    当然 博主本身提供的代码已经是非常棒的资料了,Thks for share!

  5. xiaocai 说:

    重载内核已经看懂了, 但是完美的pp检测还是过不去, 这个不知道怎么调试. 想要学习这个, 楼主能推荐点材料学习下么. 非常感谢

  6. duo 说:

    博主你好,我在『首次运行需要联网枚举符号』这个地方卡住了,我试了好几次,
    一直都在『Symbols Download』,有办法可以直接放出枚举符号档案,
    这样就不用联网操作了,谢谢。

  7. xiaocai 说:

    能开启调试 但是提示 bios vt未设置 有什么影响?

  8. ctccode 说:

    求大大写个支持AMD CPU的

  9. 杨开银 说:

    vt…..欣赏,但技术不才,没能力改进源码

    我用滴水vt调试
    http://www.anedata.com 不会卡死,其余od都卡死setevent,
    试试楼主vt插件也是卡死在下载符号

    另外,非常需要楼主一片人肉新建vs工程手解themida cisc vm…..

  10. 杨开银 说:

    刚刚试了 打开 http://www.anedata.com

    每次都蓝屏,试了3次,3次蓝屏。。。

    因为不用滴水那个6056 替换system32目录下的文件,我的笔记本上老是无法开启插件vt,于是我是在替换文件下开启的vt

    领导有时间看看吗?为什么蓝屏,我对驱动一窍不通额

  11. gy 说:

    代码可以编译通过,但是驱动运行到SetCr4( GetCr4() | X86_CR4_VMXE );时崩溃了:
    *** Fatal System Error: 0x0000007f
    (0x0000000D,0x00000000,0x00000000,0x00000000)

    Break instruction exception – code 80000003 (first chance)

    A fatal system error has occurred.
    Debugger entered on first try; Bugcheck callbacks have not been invoked.

    A fatal system error has occurred.
    环境:xp sp3,vmware workstation 10.0
    各位大大可有解?

  12. akisx 说:

    你好啊博主,符号枚举的服务器好像已经无效了啊,一直在枚举,时间很长了,即使是重启程序还是这样。

发表评论

发表评论前,请选对水果【Apple=苹果、Banana=香蕉、Pineapple=菠萝、Grapes=葡萄】Apple