目錄
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.參考