本文目錄一覽:
JS代碼混淆了,怎麼反混淆回去?
這不是混淆,只是使用16進制表示的ASCII碼~
單獨提取出字符串,在後面加上.toString()進行調試即可看到原本字符串。
你的這句轉碼後如下:
window[“document”][“write”](‘sc’)
相當於:window.document.write(‘sc’)
很有可能是輸出一個script標籤的代碼段的開始。
谷歌瀏覽器js怎麼打debug
首先請打開“谷歌瀏覽器”(廢話),然後打開一個網頁,按“F12”會出現一個控制台,找到一個叫做“Sources”,點擊它OK,如果你的頁面現在已經加載過JS腳本的話,那麼應該可以看到一些JS文件了然後你可以在左側側欄的序號那些位置點擊一下就設置成斷
反調試是什麼
免殺就不知道了.反調試就是禁止調試一般有這樣的一些原理.一、反調試技術反調試技術是一種常見的反檢測技術,因為惡意軟件總是企圖監視自己的代碼以檢測是否自己正在被調試。為做到這一點,惡意軟件可以檢查自己代碼是否被設置了斷點,或者直接通過系統調用來檢測調試器。1.斷點為了檢測其代碼是否被設置斷點,惡意軟件可以查找指令操作碼0xcc(調試器會使用該指令在斷點處取得惡意軟件的控制權),它會引起一個SIGTRAP。如果惡意軟件代碼本身建立了一個單獨的處理程序的話,惡意軟件也可以設置偽斷點。用這種方法惡意軟件可以在被設置斷點的情況下繼續執行其指令。惡意軟件也可以設法覆蓋斷點,例如有的病毒採用了反向解密循環來覆蓋病毒中的斷點。相反,還有的病毒則使用漢明碼自我糾正自身的代碼。漢明碼使得程序可以檢測並修改錯誤,但是在這裡卻使病毒能夠檢測並清除在它的代碼中的斷點。2.計算校驗和惡意軟件也可以計算自身的校驗和,如果校驗和發生變化,那麼病毒會假定它正在被調試,並且其代碼內部已被放置斷點。VAMPiRE是一款抗反調試工具,可用來逃避斷點的檢測。VaMPiRE通過在內存中維護一張斷點表來達到目的,該表記錄已被設置的所有斷點。該程序由一個頁故障處理程序(PFH),一個通用保護故障處理程序(GPFH),一個單步處理程序和一個框架API組成。當一個斷點被觸發的時候,控制權要麼傳給PFH(處理設置在代碼、數據或者內存映射I/O中的斷點),要麼傳給GPFH(處理遺留的I/O斷點)。單步處理程序用於存放斷點,使斷點可以多次使用。3.檢測調試器在Linux系統上檢測調試器有一個簡單的方法,只要調用Ptrace即可,因為對於一個特定的進程而言無法連續地調用Ptrace兩次以上。在Windows中,如果程序目前處於被調試狀態的話,系統調用isDebuggerPresent將返回1,否則返回0。這個系統調用簡單檢查一個標誌位,當調試器正在運行時該標誌位被置1。直接通過進程環境塊的第二個字節就可以完成這項檢查,以下代碼為大家展示的就是這種技術:mov eax, fs:[30h]move eax, byte [eax+2]test eax, eax jne @DdebuggerDetected在上面的代碼中,eax被設置為PEB(進程環境塊),然後訪問PEB的第二個字節,並將該字節的內容移入eax。通過查看eax是否為零,即可完成這項檢測。如果為零,則不存在調試器;否則,說明存在一個調試器。如果某個進程為提前運行的調試器所創建的,那麼系統就會給ntdll.dll中的堆操作例程設置某些標誌,這些標誌分別是FLG_HEAP_ENABLE_TAIL_CHECK、FLG_HEAP_ENABLE_FREE_CHECK和FLG_HEAP_VALIDATE_PARAMETERS。我們可以通過下列代碼來檢查這些標誌:mov eax, fs:[30h]mov eax, [eax+68h]and eax, 0x70test eax, eaxjne @DebuggerDetected在上面的代碼中,我們還是訪問PEB,然後通過將PEB的地址加上偏移量68h到達堆操作例程所使用的這些標誌的起始位置,通過檢查這些標誌就能知道是否存在調試器。檢查堆頭部內諸如ForceFlags之類的標誌也能檢測是否有調試器在運行,如下所示:mov eax, fs:[30h]mov eax, [eax+18h] ;process heapmov eax, [eax+10h] ;heap flagstest eax, eaxjne @DebuggerDetected上面的代碼向我們展示了如何通過PEB的偏移量來訪問進程的堆及堆標誌,通過檢查這些內容,我們就能知道Force標誌是否已經被當前運行的調試器提前設置為1了。另一種檢測調試器的方法是,使用NtQueryInformationProcess這個系統調用。我們可以將ProcessInformationClass設為7來調用該函數,這樣會引用ProcessDebugPort,如果該進程正在被調試的話,該函數將返回-1。示例代碼如下所示。push 0
push 4
push offset isdebugged
push 7 ;ProcessDebugPort
push -1
call NtQueryInformationProcess
test eax, eax
jne @ExitError
cmp isdebugged, 0
jne @DebuggerDetected在本例中,首先把NtQueryInformationProcess的參數壓入堆棧。這些參數介紹如下:第一個是句柄(在本例中是0),第二個是進程信息的長度(在本例中為4字節),接下來是進程信息類別(在本例中是7,表示ProcessDebugPort),下一個是一個變量,用於返回是否存在調試器的信息。如果該值為非零值,那麼說明該進程正運行在一個調試器下;否則,說明一切正常。最後一個參數是返回長度。使用這些參數調用NtQueryInformationProcess後的返回值位於isdebugged中。隨後測試該返回值是否為0即可。另外,還有其他一些檢測調試器的方法,如檢查設備列表是否含有調試器的名稱,檢查是否存在用於調試器的註冊表鍵,以及通過掃描內存以檢查其中是否含有調試器的代碼等。另一種非常類似於EPO的方法是,通知PE加載器通過PE頭部中的線程局部存儲器(TLS)表項來引用程序的入口點。這會導致首先執行TLS中的代碼,而不是先去讀取程序的入口點。因此,TLS在程序啟動就可以完成反調試所需檢測。從TLS啟動時,使得病毒得以能夠在調試器啟動之前就開始運行,因為一些調試器是在程序的主入口點處切入的。4.探測單步執行惡意軟件還能夠通過檢查單步執行來檢測調試器。要想檢測單步執行的話,我們可以把一個值放進堆棧指針,然後看看這個值是否還在那裡。如果該值在那裡,這意味着,代碼正在被單步執行。當調試器單步執行一個進程時,當其取得控制時需要把某些指令壓入棧,並在執行下一個指令之前將其出棧。所以,如果該值仍然在那裡,就意味着其它正在運行的進程已經在使用堆棧。下面的示例代碼展示了惡意軟件是如何通過堆棧狀態來檢測單步執行的:Mov bp,sp;選擇堆棧指針Push ax ;將ax壓入堆棧Pop ax ;從堆棧中選擇該值Cmp word ptr [bp -2],ax ;跟堆棧中的值進行比較Jne debug ;如果不同,說明發現了調試器。 如上面的注釋所述,一個值被壓入堆棧然後又被彈出。如果存在調試器,那麼堆棧指針–2位置上的值就會跟剛才彈出堆棧的值有所不同,這時就可以採取適當的行動。5.在運行時中檢測速度衰減通過觀察程序在運行時是否減速,惡意代碼也可以檢測出調試器。如果程序在運行時速度顯著放緩,那就很可能意味着代碼正在單步執行。因此如果兩次調用的時間戳相差甚遠,那麼惡意軟件就需要採取相應的行動了。Linux跟蹤工具包LTTng/LTTV通過觀察減速問題來跟蹤病毒。當LTTng/LTTV追蹤程序時,它不需要在程序運行時添加斷點或者從事任何分析。此外,它還是用了一種無鎖的重入機制,這意味着它不會鎖定任何Linux內核代碼,即使這些內核代碼是被跟蹤的程序需要使用的部分也是如此,所以它不會導致被跟蹤的程序的減速和等待。6.指令預取如果惡意代碼篡改了指令序列中的下一條指令並且該新指令被執行了的話,那麼說明一個調試器正在運行。這是指令預取所致:如果該新指令被預取,就意味着進程的執行過程中有其他程序的切入。否則,被預取和執行的應該是原來的指令。7.自修改代碼惡意軟件也可以讓其他代碼自行修改(自行修改其他代碼),這樣的一個例子是HDSpoof。這個惡意軟件首先啟動了一些異常處理例程,然後在運行過程中將其消除。這樣一來,如果發生任何故障的話,運行中的進程會拋出一個異常,這時病毒將終止運行。此外,它在運行期間有時還會通過清除或者添加異常處理例程來篡改異常處理例程。在下面是HDSpoof清除全部異常處理例程(默認異常處理例程除外)的代碼。exception handlers before:0x77f79bb8 ntdll.dll:executehandler2@20 + 0x003a
0x0041adc9 hdspoof.exe+0x0001adc9
0x77e94809 __except_handler3exception handlers after:0x77e94809 __except_handler30x41b770: 8b44240c mov eax,dword ptr [esp+0xc]
0x41b774: 33c9 xor ecx,ecx
0x41b776: 334804 xor ecx,dword ptr [eax+0x4]
0x41b779: 334808 xor ecx,dword ptr [eax+0x8]
0x41b77c: 33480c xor ecx,dword ptr [eax+0xc]
0x41b77f: 334810 xor ecx,dword ptr [eax+0x10]
0x41b782: 8b642408 mov esp,dword ptr [esp+0x8]
0x41b786: 648f0500000000 pop dword ptr fs:[0x0] 下面是HDSpoof創建一個新的異常處理程序的代碼。0x41f52b: add dword ptr [esp],0x9ca0x41f532: push dword ptr [dword ptr fs:[0x0]0x41f539: mov dword ptr fs:[0x0],esp8.覆蓋調試程序信息一些惡意軟件使用各種技術來覆蓋調試信息,這會導致調試器或者病毒本身的功能失常。通過鉤住中斷INT 1和INT 3(INT 3是調試器使用的操作碼0xCC),惡意軟件還可能致使調試器丟失其上下文。這對正常運行中的病毒來說毫無妨礙。另一種選擇是鉤住各種中斷,並調用另外的中斷來間接運行病毒代碼。下面是Tequila 病毒用來鉤住INT 1的代碼:new_interrupt_one: push bp mov bp,sp cs cmp b[0a],1 ;masm mod. needed je 0506 ;masm mod. needed cmp w[bp+4],09b4 ja 050b ;masm mod. needed push ax push es les ax,[bp+2] cs mov w[09a0],ax ;masm mod. needed cs mov w[09a2],es ;masm mod. needed cs mov b[0a],1 pop es pop ax and w[bp+6],0feff pop bp iret一般情況下,當沒有安裝調試器的時候,鉤子例程被設置為IRET。V2Px使用鉤子來解密帶有INT 1和INT 3的病毒體。在代碼運行期間,會不斷地用到INT 1和INT 3向量,有關計算是通過中斷向量表來完成的。一些病毒還會清空調試寄存器(DRn的內容。有兩種方法達此目的,一是使用系統調用NtGetContextThread和NtSetContextThread。而是引起一個異常,修改線程上下文,然後用新的上下文恢復正常運行,如下所示: push offset handlerpush dword ptr fs:[0]mov fs:[0],espxor eax, eaxdiv eax ;generate exceptionpop fs:[0]add esp, 4;continue execution;…handler:mov ecx, [esp+0Ch] ;skip divadd dword ptr [ecx+0B8h], 2 ;skip divmov dword ptr [ecx+04h], 0 ;clean dr0mov dword ptr [ecx+08h], 0 ;clean dr1mov dword ptr [ecx+0Ch], 0 ;clean dr2mov dword ptr [ecx+10h], 0 ;clean dr3mov dword ptr [ecx+14h], 0 ;clean dr6mov dword ptr [ecx+18h], 0 ;clean dr7xor eax, eaxret上面的第一行代碼將處理程序的偏移量壓入堆棧,以確保當異常被拋出時它自己的處理程序能取得控制權。之後進行相應設置,包括用自己異或自己的方式將eax設為0,以將控制權傳送給該處理程序。div eax 指令會引起異常,因為eax為0,所以AX將被除以零。該處理程序然後跳過除法指令,清空dr0-dr7,同樣也把eax置0,表示異常將被處理,然後恢復運行。9.解除調試器線程我們可以通過系統調用NtSetInformationThread從調試器拆卸線程。為此,將ThreadInformationClass設為0x11(ThreadHideFromDebugger)來調用NtSetInformationThread,如果存在調試器的話,這會將程序的線程從調試器拆下來。以下代碼就是一個例子:push 0push 0push 11h ;ThreadHideFromDebuggerpush -2call NtSetInformationThread在本例中,首先將NtSetInformationThread的參數壓入堆棧,然後調用該函數來把程序的線程從調試器中去掉。這是因為這裡的0用於線程的信息長度和線程信息,傳遞的-2用於線程句柄,傳遞的11h用於線程信息類別,這裡的值表示ThreadHideFromDebugger。10.解密解密可以通過各種防止調試的方式來進行。有的解密依賴於特定的執行路徑。如果這個執行路徑沒被沿用,比如由於在程序中的某個地方啟動了一個調試器,那麼解密算法使用的值就會出錯,因此程序就無法正確進行自身的解密。HDSpoof使用的就是這種技術。一些病毒使用堆棧來解密它們的代碼,如果在這種病毒上使用調試器,就會引起解密失敗,因為在調試的時候堆棧為INT 1所用。使用這種技術的一個例子是W95/SK病毒,它在堆棧中解密和構建其代碼;另一個例子是Cascade病毒,它將堆棧指針寄存器作為一個解密密鑰使用。代碼如下所示:lea si, Start ; position to decryptmov sp, 0682 ; length of encrypted bodyDecrypt:xor [si], si ; decryption key/counter 1xor [si], sp ; decryption key/counter 2inc si ; increment one counterdec sp ; decrement the otherjnz Decrypt ; loop until all bytes are decryptedStart: ; Virus body對於Cascade病毒如何使用堆棧指針來解密病毒體,上面代碼中的注釋已經做了很好的說明。相反,Cryptor病毒將其密鑰存儲在鍵盤緩衝區中,這些密鑰會被調試器破壞。Tequila使用解密器的代碼作為解密鑰,因此如果解密器被調試器修改後,那麼該病毒就無法解密了。下面是Tequila用於解密的代碼:perform_encryption_decryption: mov bx,0 mov si,0960 mov cx,0960 mov dl,b[si] xor b[bx],dl inc si inc bx cmp si,09a0 jb 0a61 ;masm mod. needed mov si,0960 loop 0a52 ;masm mod. needed retthe_file_decrypting_routine: push cs pop ds mov bx,4 mov si,0964 mov cx,0960 mov dl,b[si] add b[bx],dl inc si inc bx cmp si,09a4 jb 0a7e ;masm mod. needed mov si,0964 loop 0a6f ;masm mod. needed jmp 0390 ;masm mod. needed人們正在研究可用於將來的新型反調試技術,其中一個項目的課題是關於多處器計算機的,因為當進行調試時,多處理器中的一個會處於閑置狀態。這種新技術使用並行處理技術來解密代碼。二、逆轉錄病毒逆轉錄病毒會設法禁用反病毒軟件,比如可以通過攜帶一列進程名,並殺死正在運行的與表中同名的那些進程。許多逆轉錄病毒還把進程從啟動列表中踢出去,這樣該進程就無法在系統引導期間啟動了。這種類型的惡意軟件還會設法擠占反病毒軟件的CPU時間,或者阻止反病毒軟件連接到反病毒軟件公司的服務器以使其無法更新病毒庫。三、混合技術W32.Gobi病毒是一個多態逆轉錄病毒,它結合了EPO和其他一些反調試技術。該病毒還會在TCP端口666上打開一個後門。Simile(又名Metaphor)是一個非常有名的複合型病毒,它含有大約14,000行彙編代碼。這個病毒通過尋找API調用ExitProcess()來使用EPO,它還是一個多態病毒,因為它使用多態解密技術。它的90%代碼都是用於多態解密,該病毒的主體和多態解密器在每次感染新文件時,都會放到一個半隨機的地方。Simile的第一個有效載荷只在3月、6月、9月或12月份才會激活。在這些月份的17日變體A和B顯示它們的消息。變體C在這些月份的第18日顯示它的消息。變體A和B中的第二個有效載荷只有在五月14日激活,而變體C中的第二個有效載荷只在7月14日激活。Ganda是一個使用EPO的逆轉錄病毒。它檢查啟動進程列表,並用一個return指令替換每個啟動進程的第一個指令。這會使所有防病毒程序變得毫無用處。四、小結本文中,我們介紹了惡意軟件用以阻礙對其進行逆向工程的若干反調試技術,同時介紹了逆轉錄病毒和各種反檢測技術的組合。我們應該很好的理解這些技術,只有這樣才能夠更有效地對惡意軟件進行動態檢測和分析。
如何進行js的debug
console.debug(“setHelpContentPanel:%o”,args);
Firebug一共有Console,HTML,CSS,Script,DOM,NET六個Tab,着重說一下Console的用法。
其實我們對於Console應該非常熟悉,因為這裡是Firebug給出各種信息的窗口,而這也正是Console的主要用途,日誌記錄(Logging)。
除此之外,Console還提供了通過命令行方式來調試Javascript的方法。下面就來學習一下Console的用法。
1、Firefox的日誌記錄(Logging
in
Firefox)。
通過Console的記錄方法,我們可以不再使用煩人的alert或者document.write方法來進行調試。Firebug提供了五種日誌的類型:
◆console.log:記錄一行信息,無任何圖標提示;
◆console.debug:記錄一行信息,帶超鏈接,可以鏈接到語句調用的地方;
◆console.error():向控制台中寫入錯誤信息,帶錯誤圖標顯示和高亮代碼鏈接;
◆console.info():向控制台中寫入提示信息,帶信息圖標顯示和高亮代碼鏈接;
◆console.warn():向控制台中寫入警告信息,帶警告圖標顯示和高亮代碼鏈接;
consle打印字符串支持字符串替換,使用起來就像c裡面的printf(“%s”,a),支持的類型包括:
%s
string,字符串
%d,%i 整型
%f 浮點
%o
對象
如果使用%o的話,對象就會用綠色的超鏈接表示出來,單擊後會將你帶到DOM視圖。
2、分組(Grouping)。
如果某一類的信息特別多時,分組就有利於邏輯的劃分。使用上很簡單,參見代碼。
function
consoleGroup(){ var groupname = “Group 1”; console.group(“Message group %s”,
groupname); console.log(“This is the 1 message in %s”, groupname);
console.log(“This is the 2 message in %s”, groupname); console.log(“This is the
3 message in %s”, groupname); console.groupEnd(); goupname = “Group 2”;
console.group(“Message group %s”, goupname); console.log(“This is the 1 message
in %s”, goupname); var subgroupname = “Sub group 1”; console.group(“Message
group %s”,subgroupname); console.log(“This is the 1 message in %s”,
subgroupname); console.log(“This is the 2 message in %s”, subgroupname);
console.log(“This is the 3 message in %s”, subgroupname); console.groupEnd();
console.log(“This is the 2 message in %s”, goupname); console.groupEnd();
}
3、console.dir和console.dirxml
console.dir可以將一個對象的所有方法和屬性打印出來,這個方法無疑是非常有用的,我們不再需要object.toString這樣的方法支持了,只要有firebug,查看對象也變得很輕鬆。
同時,我們也可以將頁面中的元素作為一個對象打印出來,但是你要小心,因為這將輸出眾多的信息,可能你會迷失在繁雜的信息中而找不到自己需要的條目。
我們可以通過分組將這些大量的信息放入一個分組中,這樣可以在邏輯上更清楚一些。
function
consoleDir(){ function Car(){ this.Model = “Old Model”; this.getManu =
function(){ return “Toyota”; } } var objCar = new Car(); console.dir(objCar);
console.dir(zoo); var groupname = “Css Style”; console.group(“The button Style”,
groupname); console.dir(document.getElementById(‘consoledir’).style, groupname);
console.groupEnd(); }
console.dirxml
打印出HTML元素的XML表示形式.
4、斷言(console.assert())。
console.assert()可以用來判斷一個表達式是否正確,如果錯誤,他就會打印錯誤信息在控制台窗口中。
5、追蹤(console.trace())。
console.trace()是一個非常有趣的功能。我們先來看看官方的解釋:打印Javascript執行時刻的堆棧追蹤。
這個函數可以打印出程序執行時從起點到終點的路徑信息。比如如果我們想知道某個函數是何時和如何被執行的,我們將console.trace()放在這個函數中,我們就能夠的看到這個函數被執行的路徑。這個函數在調試其他人的源代碼時非常有用。
6、計時(Timing)。
console.time(timeName)可以用來計時,這個在我們需要知道代碼執行效率的時候特別有用,就不用自己造輪子了。
function
consoleTime(){ var timeName = “timer1”; console.time(timeName); var a = 0;
for(var i = 0; i 100; i++){ for(var j = 0; j 100; j++){//
console.log(‘Hello world’); a = a + 1; } } console.log(“a = %d”, a);
console.timeEnd(timeName); }
7、Javascript分析器(Javascript
Profiler)。
我們可以通過代碼console.profile(‘profileName’)或者單擊Profiler標籤來進行Javascript代碼
執行的分析。這個功能有點類似於console.time(),可以幫助我們評估代碼的表現,但是能夠提供比console.time()更詳細的信息。
有三種方法可以調用Javascript
profiler。一種是在代碼中寫入分析腳本,一種是單擊profile標籤,最後還可以在命令行下輸入命令來執行。執行後,可以看到詳細的輸出結果,下面對各項進行一些說明:
Function
Column:顯示調用的函數名稱;
Call Column:顯示調用次數;
Percent
Column:顯示消耗的時間比;
Own Time:顯示函數內部語句執行的時間,不包括調用其他函數的時間;
Time
Column:顯示函數從開始到結束的執行時間;
Avg Column:平均時間。Avg = Own /
Call;
Min Max Column:顯示最小和最大時間;
File
Column:函數所在的文件;
8、其他的一些選項。
在Console
Tab的最右側有一個Options的選項,在這裡可以自己定義需要顯示的錯誤,其內容很好理解,這裡就不多說了。有一點就是Firebug1.3以後,多了Show
Chrome Errors和Show Chrome Message 等幾個選項,這幾個選項還沒有驗證過其具體的作用
原創文章,作者:ELXK,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/149704.html