gxwtk 发表于 2013-12-26 22:01

过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 运行起来了。
---------------------------------------------------------------------------------

抓图可真不容易啊。




currwin 发表于 2014-5-25 12:39

wyongbin 发表于 2014-5-3 20:31
vmp按照楼主的方法不成功,于是处理了一下POPFD RDTSC,就成功了,奇怪,楼主的机子难道不用处理这个吗

求教一下大大,popfd rdtsc那一部分应该怎么处理呢?

wyongbin 发表于 2014-5-25 17:26

currwin 发表于 2014-5-25 12:39
求教一下大大,popfd rdtsc那一部分应该怎么处理呢?

走到rdtsc时nop掉,单步步过后撤销还原

jiaxiangyida 发表于 2013-12-26 22:04

辛苦了@!!

179836774 发表于 2013-12-26 22:09

有空试试   看着是不错嘿嘿

1354669803 发表于 2013-12-26 22:19

每一次都要这样操作 调试起来不方便啊

hash0530 发表于 2013-12-26 22:23

这个我是新手 完全不懂..

MC红桃A 发表于 2013-12-26 22:30

不错   看看学习哈

yhym599 发表于 2013-12-26 22:31

来支持一下楼主,感谢分享经验,辛苦了。

小淫仙 发表于 2013-12-26 22:32

学习了 !!

cui464450064 发表于 2013-12-26 22:59

收藏了,谢谢了,老被检测到 真恶心

Cari丶 发表于 2013-12-27 00:03

唔。一般来说虚拟机检测VMP和SE以及TMD的话 关闭虚拟机的后门再禁止二进制 原版OD+SOD可以过大部分。TMD的是重点。学习了
页: [1] 2 3 4 5 6 7
查看完整版本: 过VMP,TMD的虚拟机检测