反沙箱——SetErrorMode
目录
1.前言
2.原理讲解
3.代码实现
4.参考
1.前言
利用SetErrorMode进行反沙箱的技术,在2010年就有被提出,但是之前搜了很久都没有相关内容,这里简单的说一下这个反沙箱的实现。反沙箱参考GandCrab5.2。
2.原理讲解
首先讲一下SetErrorMode这个函数,SetErrorMode是用于设置如何处理程序错误的,设置不同的值有不同的作用,下面是机翻的结果。
而SetErrorMode有一个特点就是返回值为上次设置的值,如下代码和结果。
1 #include<Windows.h> 2 #include<stdio.h> 3 4 int main() 5 { 6 DWORD dwCode; 7 //开始没有设置任何值,所以返回值为0 8 dwCode = SetErrorMode(SEM_FAILCRITICALERRORS); 9 printf("the first dwCode:0x%x\n", dwCode); 10 11 //这里设置值SEM_NOGPFAULTERRORBOX是2,返回值为前面设置的值所以为1 12 dwCode = SetErrorMode(SEM_NOGPFAULTERRORBOX); 13 printf("the second dwCode:0x%x\n", dwCode); 14 15 return 0; 16 }
但是这里有一个特别的参数SEM_NOALIGNMENTFAULTEXCEPT,简单来说就是设置这个值后就不会消除这个值。
1 #include<Windows.h> 2 #include<stdio.h> 3 4 int main() 5 { 6 DWORD dwCode; 7 //开始没有设置任何值,所以返回值为0 8 dwCode = SetErrorMode(SEM_NOALIGNMENTFAULTEXCEPT); 9 printf("the first dwCode:0x%x\n", dwCode); 10 11 //这里设置为SEM_NOGPFAULTERRORBOX,返回值为上次设置的值为0x4 12 dwCode = SetErrorMode(SEM_NOGPFAULTERRORBOX); 13 printf("the second dwCode:0x%x\n", dwCode); 14 15 //这里设置为SEM_FAILCRITICALERRORS,返回值却不为0x2,这是由于前面设置的SEM_NOALIGNMENTFAULTEXCEPT不会清除,所以叠加0x4+0x2 16 dwCode = SetErrorMode(SEM_FAILCRITICALERRORS); 17 printf("the second dwCode:0x%x\n", dwCode); 18 19 return 0; 20 }
3.代码实现
那上面讲解的内容和反沙箱有什么关系呢?我们先看看cuckoosandbox里的一段代码,沙箱会预先设置值用于监控错误的发生,这里就用到了SetErrorMode并且其中的参数有SEM_NOALIGNMENTFAULTEXCEPT。
由于沙箱和运行的样本类似于进程和之进程的关系,所以利用SetErrorMode才可以检测,如果是同一系统下的两个进程设置了SetErrorMode是不会相互影响的。那么就可以利用这个设置来模拟一下沙箱环境下代码的运行情况,代码和效果如下
1 #include<Windows.h> 2 #include<stdio.h> 3 4 int main() 5 { 6 //模拟沙箱环境设置 7 SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOALIGNMENTFAULTEXCEPT | SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX); 8 9 DWORD dwCode ; 10 dwCode = SetErrorMode(0x400); //虽然没有参数的值为0x400,但是这里设置也可以正常运行 11 //这里返回前面设置的值,0x1+0x2+0x4+0x8000=0x8007 12 printf("the first dwCode:0x%x\n", dwCode); 13 dwCode = SetErrorMode(0x0); 14 //由于之前设置了SEM_NOALIGNMENTFAULTEXCEPT,所以这里返回值为是0x400+0x4=0x404 15 printf("the second dwCode:0x%x\n", dwCode); 16 //在沙箱下返回0x404与0x400不相等,所以可以判断是在沙箱下。如果在正常情况下返回0x400 17 if (dwCode != 0x400) 18 { 19 printf("In Sandbox\n"); 20 } 21 else 22 { 23 printf("In normal machine\n"); 24 } 25 26 return 0; 27 }
4.参考
http://joxeankoret.com/blog/2010/02/23/antiemulation-techniques-malware-tricks-ii/
https://asec.ahnlab.com/1202
谦谦君子,卑以自牧