反沙箱——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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM