过VMP,TMD的虚拟机检测
搜索了论坛,好像只有简单的讲了IN 指令修改( eax,dx清零),其实这个只是一部分,所以很多人在改完了,还是会被检测到。上2张图。很郁闷吧。
。
首先,设置下SOD和调试选项。看图
.
TMD过检测:
载入程序:
我们现在 VirtualAlloc 末尾RET处下好断点,一般这样可以简单的过些断点检测 ;-)
F9运行,中断下来了,这时F7,返回到类似于这样的。
这时,我们把代码窗口拉到最上面。点右键-》查找-》常量,输入564D5868,好,确定搜索。
这时我们可以搜索到2处,也有搜索到1处的。处理起来都是一样的,就是在最后1处时要稍微注意下。
在IN指令的上面那一行下硬件访问断点(如果直接在IN指令处下断点,会出现些不明的错误)。下好如下
重载程序(Ctrl+F2),F9运行,断下来了。
经典的IN检测(Eax和Dx清零过检测),这里因为我们停在IN的上一条指令,所以,我们只要把EAX清零,然后修改下
mov dx,0x5658
成
mov dx,0
并在后面的RETN处下个断点(主要是为了把修改的代码撤销掉,就是还原回原来的,避免有内存校验)。如图中红色字体
F9运行,停在RETN处,把刚才修改的代码选择,右键-》撤销选择处修改,原来修改的代码变回去了,并取消这个断点。
F9运行,停在第2处IN指令。
同样的,我们把eax清零,然后修改
sub edx, 0x345FE8
成寄存器里edx同样的值(0x34B640),就是要sub 后,让edx变成0;
然后在cmp指令后的某个代码处下个断点,这里我下在图中的位置。目的和刚才说的一样(把修改的代码改回原来的。)
然后运行,中断下来后,把修改的代码撤销修改,并且把断点取消。看到下面的sldt指令了吧(图中倒数3行)。
F7单步走到sldt指令处。看下面的信息窗口,此时的值 :
stack: ss:=0000
我们在ss:=0000 上 右键-》数据窗口跟随,可以看到堆栈中的数据为0000,这2个数据等下要修改的。
好,F7步过sldt指令,我们发现【0012FFA2】中的数据被改变了
【0012FFA2】=60
【0012FFA3】=40
在堆栈里把这改成,如图中红色字体处。
【0012FFA2】=00
【0012FFA3】=00
这样修改后,Shift+F9就可以运行起来了。
BTW:
对于在开始搜索时,只有1处IN指令的。操作一样,这里也简单介绍下,免得有些人不会。
中断在IN指令的上一条指令处,eax清零,我这里修改寄存器edx=0x345FE8,使
sub edx,0x345FE8
指令执行后清0.。
在红色标志处下个断点。(在这里下,是因为上面的JNZ不管跳不跳,都会来到这里)。弄好这些,F9运行。
我们就会中断在上图的断点处,好了,F7单步。来到sldt指令。
哈哈,一样的操作。大家都知道了。不知道,就从新看看上面的方法。
TMD的虚拟机检测就到此结束了。我们来看看VMP的吧。
-------------------------------------------------------------------------------------------
VMP:
其实VMP的过检测大牛都说了,就是找VM_RETN。我只是操作给大家看看的。
载入程序,不用说了吧。
在EP处右键-》FKVMP->Start(感谢大牛的工具,OD插件名称fkvmp.dl,这个没有的话,自己找l),稍微等下,我们
Alt+L,打开Log窗口,找VM_RETN地址。
在retn那行,右键->复制->地址。我的地址为013942B0。好,按Ctrl+G,填入地址013942B0,我们来到
看到retn那个标签了吧。我们点图中最后那个CALL进入,01393D3E
然后再点下面的JMP 01393171进入,来到这里
我们看到上图中那个红色的js指令吧。这个之前我也没注意,直接在retn的上面那个push指令下断跟踪,怎么弄都被虚拟机检测到,后来我是直接在VM_RETN地址013942B0处直接单步走,才发现,原来这js有时也是会跳转的,他直接跳过了那个RETN。所以我们在图上RETN上面的push指令处下个断点,013931BA。
然后也要顺着js指令的跳转走。遇到call就进入,遇到jmp就跟随跳入。
这样我们也来到这样的一个地方,同样的,在RETN上面的push指令下个断点 01392854。好了,现在我们有2个断点了。
F9运行,中断下来了。
返回的地址是系统的,我们不用管,直接F9。这样,当返回是系统的,我们直接F9通过,当中断返回是程序段的,我们就要
F7跟踪。
好了,返回时程序领空,我们F7单步,来到
看到了吧,来到了str指令(也是个虚拟机检测指令)。此时的数据为0000(信息窗口ss:=0000),
在ss:=0000上右键 数据跟随,我们看到上图中堆栈里的数据也是0000的。
F7单步通过str指令,我们发现此时原来的处的数据变成了0040,好,我们把它改成0000,如下图堆栈窗口
改好后,F9运行,中断时,返回地址是程序领空的,我们都F7跟踪。这样,我们都会碰到那些经典的虚拟机检测指令。
因为上面TMD里都有介绍,这里就不多说了,上图就好了。
IN指令,把eax,edx都清零就好了。
最后,我们还会看到如下的虚拟机检测指令,不知道是插件已经帮我们patch了,还是这些指令不起作用,不需要进行什么
修改也没检测到虚拟机。
POPFD RDTSC
指令
vmware处理rdtsc的一个漏洞,在TF标志职位的情况下执行rdtsc,vmware和真机对eip处理不同,前者多加了1。
POPFD CPUID
指令
这里引发单步异常,去检测cpuid返回。
一般走到popfd cpuid,我们的程序已经完了。所以,我们只能从头再来过。在碰到POPFD RDTSC这个指令时,把我们
原来下的断点都禁止掉。然后 shift + f9就可以运行起来了。
好了VMP的也搞定了。
这里上个VMP的做例子给大家试试吧。步骤我就直接放图了。大家可跟跟试试。VMP的壳,可能会报毒。
跟进call
又跟进Call,在push下断
f9
不管,再f9
f7跟进
str指令,熟悉吧。
f7后。
自己修改值咯。
改好后,f9
f7跟进,又看到IN指令了,这里我改好了哦。
OVer,shift + f9 运行起来了。
---------------------------------------------------------------------------------
抓图可真不容易啊。
wyongbin 发表于 2014-5-3 20:31
vmp按照楼主的方法不成功,于是处理了一下POPFD RDTSC,就成功了,奇怪,楼主的机子难道不用处理这个吗
求教一下大大,popfd rdtsc那一部分应该怎么处理呢? currwin 发表于 2014-5-25 12:39
求教一下大大,popfd rdtsc那一部分应该怎么处理呢?
走到rdtsc时nop掉,单步步过后撤销还原 辛苦了@!! 有空试试 看着是不错嘿嘿 每一次都要这样操作 调试起来不方便啊 这个我是新手 完全不懂.. 不错 看看学习哈 来支持一下楼主,感谢分享经验,辛苦了。 学习了 !! 收藏了,谢谢了,老被检测到 真恶心 唔。一般来说虚拟机检测VMP和SE以及TMD的话 关闭虚拟机的后门再禁止二进制 原版OD+SOD可以过大部分。TMD的是重点。学习了