前面两天在网上下了部的逆向方面的视频,挺不错的,就是有两个问题,一个是分辨率必须用1280×800,另一个是不能在虚拟机中观看。
碰巧的是,我的虚拟机分辨率用的就是1280×800的,还有一个是我看这种视频喜欢在虚拟机里面看,要想在vmware中观看,就
不的不过他的检测wmware.
通常反检测vmware的方法就是修改vmware的配置,我在这里简单介绍一下,如何配置。
1,用记事本打开虚拟系统镜像文件的配置文件,这个文件扩展名为vmx,比如我的虚拟系统名为XP,那这个文件就叫XP.vmx,然后在
其末尾添加这么一句,如下红色部分(注意,虚拟机不能在运行状态添加)
monitor_control.restrict_backdoor = "true"
monitor_control.restrict_backdoor = "true"
disable_acceleration = "TRUE"
这句的意思是关闭vmware的后门(什么后门?后面详细说)
2,开启vmware workstation,在里面的 虚拟机 -> 设置 -> 处理器 -> 勾上‘禁用二进制翻译加速’(不同汉化版翻译有所出入)
这两条一起用,可以躲过大部分检测,包括一些壳的检测,比如VMProtect等。
2,准备
要做一个准备工作,因为我只提供了播放器,没有提供视频内容文件(太大了),所以我们在播放器所在的目录下手工新建一个同名
文件,扩展名必须为key,如图二。新建文件什么内容都不需要,只是为分析过检测vmware罢了。
3,分析
接下来首先他检测虚拟机,我的第一反映就是试试我上面的那两个配置方法,经过我多次实验,本程序只需要第一条配置方案就行了
如果只是要用用,那这样就结了。但去了vmware的后门以后,vmwware tools这个工具也不能用了,我真的不习惯没有vmware tools的虚拟机。去后门,不行!只能从程序方面入手,剔除他的检测代码。
如何检测vmware的后门,我也不是很熟悉,我就去百度了以下检测vmware的代码,转载内容如下
VMware系统存在后门,用于虚拟系统和真实系统的交互。这是一些函数,你可以在程序中执行以判断。当然了,最好你
还要加上异常处理。mov ecx, 0Ah ; CX=function# (0Ah=get_version)
mov eax, 'VMXh’ ; EAX=magic
mov dx, 'VX’ ; DX=magic
in eax, dx ; specially processed io cmd
; output: EAX/EBX/ECX = data
cmp ebx, 'VMXh’ ; also eax/ecx modified (maybe vmw/os ver?)
je under_VMware 代码写的很清楚,填完参数以后,in eax, dx后ebx里面放着‘VMXh’那就是虚拟机了,注意字符串的顺序,‘V’是高
位,‘h’是低位,其他字符串也是这样
那我们现在第一步要做的就是定位关键代码,我选择定位字符串‘VMXh’,在整个内存范围中搜索‘hXMV'的ASCII码(为什么要倒过
来?上面说了注意高位低位!)
通过搜索,我们找到了两处代码(因为一些操作的失误,我为了定位这两处代码用了一天时间,最后说)
第一处005991F2 55 push ebp ; 附加数据
005991F3 68 B4864A00 push 004A86B4 ; 异常处理函数
005991F8 64:FF30 push dword ptr fs: ; prev字段
005991FB 64:8920 mov dword ptr fs:, esp ; 设置ExceptionList
005991FE B8 68584D56 mov eax, 564D5868
00599203 BB 00000000 mov ebx, 0
00599208 B9 0A000000 mov ecx, 0A
0059920D BA 58560000 mov edx, 5658
00599212 ED in eax, dx
00599213 81FB 68584D56 cmp ebx, 564D5868
00599219 75 07 jnz short 00599222第二处005992A1 55 push ebp ; 附加数据
005992A2 68 5F874A00 push 004A875F ; 这个程序共用一个异常处理
005992A7 64:FF30 push dword ptr fs: ; prev字段
005992AA 64:8920 mov dword ptr fs:, esp ; 设置ExceptionList
005992AD 52 push edx
005992AE 51 push ecx
005992AF 53 push ebx
005992B0 B8 68584D56 mov eax, 564D5868
005992B5 B9 0A000000 mov ecx, 0A
005992BA BA 58560000 mov edx, 5658
005992BF ED in eax, dx
005992C0 81FB 68584D56 cmp ebx, 564D5868
005992C6 0F9445 FF sete byte ptr ; 这条指令的意思是
; 如果ZF标志位为1,则操作数置1
; 反之ZF为0,则操作数置0检测虚拟机的代码跟网上面搜索到的代码如出一辙,填几个参数,然后用in eax, dx,然后对比
看到这里,以我以往的经验,只需要把他的判断改成相反的就行了啊
第一处的最后一句jnz改成je就行了,第二处的最后一句sete byte ptr 改成mov byte ptr , 0就行了
修改以后运行,诶,还是会检测到虚拟机(:funk:),这到底是哪里出错了呢?
在这里我们做一个实验就知道了,在真实的操作系统里面,随便找一个程序用OD打开,写一段代码
就写那几句检测虚拟机后门的代码行了mov eax, 564D5868
mov ecx, 0A
mov edx, 5658
mov ebx, 0
in eax, dx写好后就在OD中跟,看看发生什么情况,当eip走过in eax, dx这一句的时候,产生了异常,意思就是说,在真
实的操作系统中这几条参数指令是无效的,我们在回头看看我百度找到的那句话最后也说了,总算知道为什么要加上异常处理了!
当然了,最好你还要加上异常处理。
就在检测vmware的代码前面有处理异常的代码,异常处理中有一些判断ExceptionCode的代码,经我实验,并不重要,所以不去看他
了。
现在问题很简单,如果检测到虚拟机,那就会顺着in的指令继续执行下去,如果没有检测到虚拟机,那就会发生异常,然后跳转到异
常处理继续执行,那我们就试试让他跳到异常处理去看看
把in eax, dx这句的机器码0xED改成0xCC,这也是我们熟悉的int3断点,让他产生。改好两个地方保存(要改一个保存,在改一个在
保存,因为没有修改所有代码选项)
运行程序,一切正常,不检测虚拟机了(:lol)如图三,出现图三说明已经正常,按下确定便能观看。因为我没提供视频文件,所以
无法观看
最后说一点:
在OD的内存映射窗口中搜索数据,按下Ctrl+B搜索,按Ctrl+L搜索下一个。大家都知道。
在搜索下一个数据的时候你应该保证当前搜索到数据的弹出的数据窗口在最前方(有焦点)。
因为这个数据窗口代表一个内存块,这个内存块中可能会有很多个这样的数据,你应该保证这个数据窗口中的数据被搜索完。如果你不小心点了一下内存映射窗口(有焦点),他就会跳过当前的这个内存块去搜索下面的了,这样就会照成遗漏。
2.改虚拟机操作系统注册表的方法
找到下面的注册表项:
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Class/{4D36E968-E325-11CE-BFC1-08002BE10318}/0000
将DriverDesc 项的内容清空(千万不要删除此项)
碰巧的是,我的虚拟机分辨率用的就是1280×800的,还有一个是我看这种视频喜欢在虚拟机里面看,要想在vmware中观看,就
不的不过他的检测wmware.
通常反检测vmware的方法就是修改vmware的配置,我在这里简单介绍一下,如何配置。
1,用记事本打开虚拟系统镜像文件的配置文件,这个文件扩展名为vmx,比如我的虚拟系统名为XP,那这个文件就叫XP.vmx,然后在
其末尾添加这么一句,如下红色部分(注意,虚拟机不能在运行状态添加)
monitor_control.restrict_backdoor = "true"
monitor_control.restrict_backdoor = "true"
disable_acceleration = "TRUE"
这句的意思是关闭vmware的后门(什么后门?后面详细说)
2,开启vmware workstation,在里面的 虚拟机 -> 设置 -> 处理器 -> 勾上‘禁用二进制翻译加速’(不同汉化版翻译有所出入)
这两条一起用,可以躲过大部分检测,包括一些壳的检测,比如VMProtect等。
2,准备
要做一个准备工作,因为我只提供了播放器,没有提供视频内容文件(太大了),所以我们在播放器所在的目录下手工新建一个同名
文件,扩展名必须为key,如图二。新建文件什么内容都不需要,只是为分析过检测vmware罢了。
3,分析
接下来首先他检测虚拟机,我的第一反映就是试试我上面的那两个配置方法,经过我多次实验,本程序只需要第一条配置方案就行了
如果只是要用用,那这样就结了。但去了vmware的后门以后,vmwware tools这个工具也不能用了,我真的不习惯没有vmware tools的虚拟机。去后门,不行!只能从程序方面入手,剔除他的检测代码。
如何检测vmware的后门,我也不是很熟悉,我就去百度了以下检测vmware的代码,转载内容如下
VMware系统存在后门,用于虚拟系统和真实系统的交互。这是一些函数,你可以在程序中执行以判断。当然了,最好你
还要加上异常处理。mov ecx, 0Ah ; CX=function# (0Ah=get_version)
mov eax, 'VMXh’ ; EAX=magic
mov dx, 'VX’ ; DX=magic
in eax, dx ; specially processed io cmd
; output: EAX/EBX/ECX = data
cmp ebx, 'VMXh’ ; also eax/ecx modified (maybe vmw/os ver?)
je under_VMware 代码写的很清楚,填完参数以后,in eax, dx后ebx里面放着‘VMXh’那就是虚拟机了,注意字符串的顺序,‘V’是高
位,‘h’是低位,其他字符串也是这样
那我们现在第一步要做的就是定位关键代码,我选择定位字符串‘VMXh’,在整个内存范围中搜索‘hXMV'的ASCII码(为什么要倒过
来?上面说了注意高位低位!)
通过搜索,我们找到了两处代码(因为一些操作的失误,我为了定位这两处代码用了一天时间,最后说)
第一处005991F2 55 push ebp ; 附加数据
005991F3 68 B4864A00 push 004A86B4 ; 异常处理函数
005991F8 64:FF30 push dword ptr fs: ; prev字段
005991FB 64:8920 mov dword ptr fs:, esp ; 设置ExceptionList
005991FE B8 68584D56 mov eax, 564D5868
00599203 BB 00000000 mov ebx, 0
00599208 B9 0A000000 mov ecx, 0A
0059920D BA 58560000 mov edx, 5658
00599212 ED in eax, dx
00599213 81FB 68584D56 cmp ebx, 564D5868
00599219 75 07 jnz short 00599222第二处005992A1 55 push ebp ; 附加数据
005992A2 68 5F874A00 push 004A875F ; 这个程序共用一个异常处理
005992A7 64:FF30 push dword ptr fs: ; prev字段
005992AA 64:8920 mov dword ptr fs:, esp ; 设置ExceptionList
005992AD 52 push edx
005992AE 51 push ecx
005992AF 53 push ebx
005992B0 B8 68584D56 mov eax, 564D5868
005992B5 B9 0A000000 mov ecx, 0A
005992BA BA 58560000 mov edx, 5658
005992BF ED in eax, dx
005992C0 81FB 68584D56 cmp ebx, 564D5868
005992C6 0F9445 FF sete byte ptr ; 这条指令的意思是
; 如果ZF标志位为1,则操作数置1
; 反之ZF为0,则操作数置0检测虚拟机的代码跟网上面搜索到的代码如出一辙,填几个参数,然后用in eax, dx,然后对比
看到这里,以我以往的经验,只需要把他的判断改成相反的就行了啊
第一处的最后一句jnz改成je就行了,第二处的最后一句sete byte ptr 改成mov byte ptr , 0就行了
修改以后运行,诶,还是会检测到虚拟机(:funk:),这到底是哪里出错了呢?
在这里我们做一个实验就知道了,在真实的操作系统里面,随便找一个程序用OD打开,写一段代码
就写那几句检测虚拟机后门的代码行了mov eax, 564D5868
mov ecx, 0A
mov edx, 5658
mov ebx, 0
in eax, dx写好后就在OD中跟,看看发生什么情况,当eip走过in eax, dx这一句的时候,产生了异常,意思就是说,在真
实的操作系统中这几条参数指令是无效的,我们在回头看看我百度找到的那句话最后也说了,总算知道为什么要加上异常处理了!
当然了,最好你还要加上异常处理。
就在检测vmware的代码前面有处理异常的代码,异常处理中有一些判断ExceptionCode的代码,经我实验,并不重要,所以不去看他
了。
现在问题很简单,如果检测到虚拟机,那就会顺着in的指令继续执行下去,如果没有检测到虚拟机,那就会发生异常,然后跳转到异
常处理继续执行,那我们就试试让他跳到异常处理去看看
把in eax, dx这句的机器码0xED改成0xCC,这也是我们熟悉的int3断点,让他产生。改好两个地方保存(要改一个保存,在改一个在
保存,因为没有修改所有代码选项)
运行程序,一切正常,不检测虚拟机了(:lol)如图三,出现图三说明已经正常,按下确定便能观看。因为我没提供视频文件,所以
无法观看
最后说一点:
在OD的内存映射窗口中搜索数据,按下Ctrl+B搜索,按Ctrl+L搜索下一个。大家都知道。
在搜索下一个数据的时候你应该保证当前搜索到数据的弹出的数据窗口在最前方(有焦点)。
因为这个数据窗口代表一个内存块,这个内存块中可能会有很多个这样的数据,你应该保证这个数据窗口中的数据被搜索完。如果你不小心点了一下内存映射窗口(有焦点),他就会跳过当前的这个内存块去搜索下面的了,这样就会照成遗漏。
2.改虚拟机操作系统注册表的方法
找到下面的注册表项:
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Class/{4D36E968-E325-11CE-BFC1-08002BE10318}/0000
将DriverDesc 项的内容清空(千万不要删除此项)