随着正义力量的不断提升,过去调试器所使用的插int3,利用Drx调试寄存器的硬件中断已经在某些环境下难以正常使用了。各种针对int3和Drx调试寄存器的anti方法使用的越来越多,我们必须使用一种新的没有数量限制的难以被检测的断点设置方式(吐槽:其实是去年看到了某滴水宣传的硬件调试器能不用Drx调试寄存器而且可以下无限硬件断点,心里痒痒但又买不起,最终只能靠自己YY了。这里要感谢cpu大大给我指明了道路,还要感谢群里对我进行各种科普的同志们。)--借助于硬件虚拟化的无限硬件中断(Unlimited Break Works)。

简介
无限硬件中断(Unlimited Break Works)究竟是啥?
虽然名字很牛X但是也没滴水同学宣传的硬件调试器的价格那样吓人,只是一种利用虚拟化手段达到简单模拟硬件中断过程而已。UBW的概念其实很简单,对于硬件执行断点就是以前ollybone(break on excute)的思路改内存页属性然后处理异常来实现,只是细节上有些不同而已。对于内存读写中断也是通过改页属性实现,其实只是把以前idt hook做的事放到vt里去了而已。

运作流程
你需要这样一些材料:一个虚拟化框架(可从各种虚拟化框架中A代码出来,xen,kvm,v大发的dbvmsrc等等),od的sdk一个,ollybone源码或softworm大大的用dep的bone代码若干(因为懒得写pae的处理我这里就直接用ollybone了),耐心少许。

首先你需要把ollybone的ring3部分代码稍做修改后编译好,放着备用。
然后将ollybone的ring0部分代码选取若干放到虚拟化框架中不停搅拌。。。
编译完后还要对虚拟机做初始化的设置
设置完虚拟化初始化环境后重启选择中间那个进入操作系统

这样就能在ollydbg 里使用我们之前写好的插件了


原理与代码
ollybone的做法是首先将断点所在的内存页表的特权级别改为User(在PAE下可开启dep把页表改成不可执行NX)。等代码执行到该页就会产生缺页异常(#PF pagefault)之后和ollybone的做法就有区别了ollybone的做法是对pagefault用idt hook来处理这个异常遇到自己改的页就直接转给Trap01处理这样就断下来了,但是他这样也就能定位到内存页并不能定位到具体的指令。

UBW的做法如下:

UBW在(#DB debug)的处理如下:

这样虽然能做到无限硬件中断但是对系统的消耗很大,性能较低但是相对于bochs已经很高了。

问答
问:LZ你用的好像是AMD的虚拟化为啥不搞Intel的呢?
答:因为LZ乃一介贫民买不起高端的Intel cpu(而且听说某位同学要用intel那个写论文不好和人撞车)。

问:LZ我好崇拜你啊!你的虚拟化框架怎么搞的能否放bin开源?
答:我的虚拟化框架也是从很多开源的框架里A出来的,垃圾的很搞了很久还是很蓝而且会莫名其妙的蓝或者死机(死机什么的最讨厌了~),全靠LZ的高人品才能偶尔出现奇迹得到试验的结果。bin还是先不放了不能祸害大家。

问:LZ你骗人你这虚拟化弄出来后咋调试的,不是没办法调试VT的吗?
答:初期还没有进入虚拟化前可以通过bochs,windbg等尝试些代码研究进入虚拟化。后期进入虚拟化后LZ靠着坚定的信念,和无限死机的觉悟,不断的YY,不断向大大们请教,等稍微稳定后通过vt中将结果放在eax然后注入中断的恶心方法勉强调试着。(吐槽:其实是因为LZ机器没com口而且pci槽也全部用完所造成的)。

问:LZ真傻X啊这明显有个漏洞啊,人家万一把页表属性改回来了怎么办啊?
答:关于这个问题softworm大大的方法是hook KeInterlockedSwapPte,想在vt上搞的话听cpu大大说拦截invlpg指令可以达到相同效果。因为我拦截了之后反而页属性被改回来了(可能是我的代码有问题)所以就没发出来。

问:LZ你这个支持多核吗?支持Vista,win7吗?支持x64吗?
答:不支持我是在关闭一核的情况下试验的。试验环境为xp x86 sp3。vista和win7都没试过。

总结
其实就是把ollybone放到VT里去而已,大大们闭着眼睛都能搞出来了,我就不多嗦了(吐槽:发完了好累,继续潜水学VM去了)。
最后求包养,求笼罩,有砖的拍砖,有槽的吐槽,欢迎滴水同学和各位大大前来围观,来的时候放点代码什么的就更好了。

Impossibile arrivare al vero segreto se non ci si accorge di tutto l'amore