目錄
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 }