从一个CRACKME,分析反调试技术——(成都信息工程学院信安大赛题目)
首先,我是小菜,第一次在博客园写博客。
链接下载https://files.cnblogs.com/crazypurple/crackme2.zip
这个题是成都信息工程学院西南大赛的一道比赛题。我第一次做这个题的时候,只是为了单纯的找key,后来经人提醒,才知道,这个题用了很多反调试技术。因为是小菜。哈哈哈
首先拿到这个题,发现有壳的,很简单的一个壳,用ESP定律就ok
脱壳之后运行一些。
发现这个程序是反虚拟机的。在虚拟机下不能运行,那么我们就要来接触这个反虚拟机机制。
先用IDA载入,看到这里:
这里看到了这个“毫秒”,就知道这里就是在退出了,那么上面的那个比较和跳转就很关键,其实改掉那个跳转就可以了。
但是我们还要分析下,这个CM是怎么反虚拟机的。用OD载入,来到刚才我们分析的那个地方:
看到上面的那个CALL。大致就可以判断里面是在对虚拟机进行检测了。
进去之后,看到这里:
这里有一个IN,之前没有见过,先百度:
端口是主机与外设进行数据交换的。(外设接口电路有专用于数据交互的寄存器。为了与CPU中的寄存器相区别,称之为“端口”)。端口有数据端口,状态端口和控制端口3种。PC机给予每一个端口分配了一个地址(称为端口号),形成一个独立于内存空间的I/O地址空间。在8086/8088中,端口地址的范围是0000至FFFFCPU对外设的操作通过专门的端口读写指令来完成。读端口用IN指令,写端口用OUT指令。
这里的in eax,dx dx里面应该放的是端口号,ecx里面放的是指定功能号,就是获取VM的版本。会在ebx中返回其版本号。后面判断ebx中是否与其版本相同。
这里就可以判断这个程序是通过特殊指令来判断程序是不是在虚拟机里的。
这是这个程序的反虚拟机手段。。。那么要解除这个反虚拟机手段,只需要将刚刚的那个跳转改掉就ok、
其实这个程序还有其他的反调试手段。。。让我们再来仔细看看吧。
首先用OD载入程序,单步走,来到这里:
看到这个函数了吗?GetStartupIofoA
STARTUPINFO结构,该结构用于指定新进程的主窗口特性,windows系统中,explorer.exe创建进程的时候会把startupinfo结构值设为0,而非explorer.exe创建的进程,会忽略这个结构中的值,也就是该结构的值不为0,只有,程序就可以利用这个结构来判断是否在调试中了。
然后继续走:
然后看到了这个函数,FindWindowsA。这个函数返回与指定字符串相匹配的窗口类名或窗口名的最顶层窗口的窗口句柄。也就是说,这里就检测到了OLLYDBG。
哈哈哈。我是小菜我只能分析这么多了。。。55555555
据大牛说,这个题还有其他的反调试手段。哎,我技术还不好,还分析不来。。
望大牛赐教!!!!!
好累。哈哈哈。累还是要加油学习。