反沙箱——SetErrorMode
生活随笔
收集整理的這篇文章主要介紹了
反沙箱——SetErrorMode
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
目錄
1.前言
2.原理講解
3.代碼實(shí)現(xiàn)
4.參考
?
1.前言
利用SetErrorMode進(jìn)行反沙箱的技術(shù),在2010年就有被提出,但是之前搜了很久都沒有相關(guān)內(nèi)容,這里簡單的說一下這個反沙箱的實(shí)現(xiàn)。反沙箱參考GandCrab5.2。
?
2.原理講解
首先講一下SetErrorMode這個函數(shù),SetErrorMode是用于設(shè)置如何處理程序錯誤的,設(shè)置不同的值有不同的作用,下面是機(jī)翻的結(jié)果。
?
而SetErrorMode有一個特點(diǎn)就是返回值為上次設(shè)置的值,如下代碼和結(jié)果。
1 #include<Windows.h> 2 #include<stdio.h> 3 4 int main() 5 { 6 DWORD dwCode; 7 //開始沒有設(shè)置任何值,所以返回值為0 8 dwCode = SetErrorMode(SEM_FAILCRITICALERRORS); 9 printf("the first dwCode:0x%x\n", dwCode); 10 11 //這里設(shè)置值SEM_NOGPFAULTERRORBOX是2,返回值為前面設(shè)置的值所以為1 12 dwCode = SetErrorMode(SEM_NOGPFAULTERRORBOX); 13 printf("the second dwCode:0x%x\n", dwCode); 14 15 return 0; 16 }?
但是這里有一個特別的參數(shù)SEM_NOALIGNMENTFAULTEXCEPT,簡單來說就是設(shè)置這個值后就不會消除這個值。
1 #include<Windows.h> 2 #include<stdio.h> 3 4 int main() 5 { 6 DWORD dwCode; 7 //開始沒有設(shè)置任何值,所以返回值為0 8 dwCode = SetErrorMode(SEM_NOALIGNMENTFAULTEXCEPT); 9 printf("the first dwCode:0x%x\n", dwCode); 10 11 //這里設(shè)置為SEM_NOGPFAULTERRORBOX,返回值為上次設(shè)置的值為0x4 12 dwCode = SetErrorMode(SEM_NOGPFAULTERRORBOX); 13 printf("the second dwCode:0x%x\n", dwCode); 14 15 //這里設(shè)置為SEM_FAILCRITICALERRORS,返回值卻不為0x2,這是由于前面設(shè)置的SEM_NOALIGNMENTFAULTEXCEPT不會清除,所以疊加0x4+0x2 16 dwCode = SetErrorMode(SEM_FAILCRITICALERRORS); 17 printf("the second dwCode:0x%x\n", dwCode); 18 19 return 0; 20 }?
3.代碼實(shí)現(xiàn)
那上面講解的內(nèi)容和反沙箱有什么關(guān)系呢?我們先看看cuckoosandbox里的一段代碼,沙箱會預(yù)先設(shè)置值用于監(jiān)控錯誤的發(fā)生,這里就用到了SetErrorMode并且其中的參數(shù)有SEM_NOALIGNMENTFAULTEXCEPT。
?
由于沙箱和運(yùn)行的樣本類似于進(jìn)程和之進(jìn)程的關(guān)系,所以利用SetErrorMode才可以檢測,如果是同一系統(tǒng)下的兩個進(jìn)程設(shè)置了SetErrorMode是不會相互影響的。那么就可以利用這個設(shè)置來模擬一下沙箱環(huán)境下代碼的運(yùn)行情況,代碼和效果如下
1 #include<Windows.h> 2 #include<stdio.h> 3 4 int main() 5 { 6 //模擬沙箱環(huán)境設(shè)置 7 SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOALIGNMENTFAULTEXCEPT | SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX); 8 9 DWORD dwCode ; 10 dwCode = SetErrorMode(0x400); //雖然沒有參數(shù)的值為0x400,但是這里設(shè)置也可以正常運(yùn)行 11 //這里返回前面設(shè)置的值,0x1+0x2+0x4+0x8000=0x8007 12 printf("the first dwCode:0x%x\n", dwCode); 13 dwCode = SetErrorMode(0x0); 14 //由于之前設(shè)置了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
轉(zhuǎn)載于:https://www.cnblogs.com/QKSword/p/10739142.html
總結(jié)
以上是生活随笔為你收集整理的反沙箱——SetErrorMode的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LOJ.6435.[PKUSC2018]
- 下一篇: codeforces 1136E-Nas