加殼技術--DRx解碼阻止除錯
這些程式碼是從我逆向出hying外殼原碼得來,有些描述不準確,湊合看吧
;//////////////////////////////////
;//drx 解碼
Call Push_drx_handler
Drx_handler Proc Near
Pframe = Dword Ptr 4
Pcontext = Dword Ptr 0ch
Mov Eax, [esp+pframe]
Mov Eax, [eax] ; Eax = Pframe->exceptioncode
Mov Ecx, [esp+pcontext] ; Ecx -> Context
Inc Dword Ptr [ecx+0b8h] ; Context.regeip++
Cmp Eax, Exception_breakpoint
Jnz Drx_not_breakpoint
Mov Eax, [ecx+0b4h] ; Eax <- Context.regebp
Lea Eax, [drx_0-@symbiont_start][eax]
Mov [ecx+4], Eax ; Dr0
Mov Eax, [ecx+0b4h] ; Eax <- Context.regebp
Lea Eax, [drx_1-@symbiont_start][eax]
Mov [ecx+8], Eax ; Dr1
Mov Eax, [ecx+0b4h]
Lea Eax, [drx_2-@symbiont_start][eax]
Mov [ecx+0ch], Eax ; Dr2
Mov Eax, [ecx+0b4h]
Lea Eax, [drx_3-@symbiont_start][eax]
Mov [ecx+10h], Eax ; Dr3
Xor Eax, Eax
And Dword Ptr [ecx+14h], 0ffff0ff0h ; 11111111111111110000111111110000b
Mov Dword Ptr [ecx+18h], 155h ; 101010101b
Jmp Drx_ret
Drx_not_breakpoint:
Cmp Eax, Exception_single_step
Jnz Drx_not_single
Call Drx_get_counet
Dd 0 ; 記錄單步斷點出現次數
Drx_get_counet:
Pop Eax
Inc Dword Ptr [eax]
Mov Eax, [eax]
Cmp Eax, 1 ; Dr0
Jnz Loc_401341
Not Dword Ptr [ecx+0b0h] ; Context.regeax
Jmp Drx_processed
Loc_401341:
Cmp Eax, 2 ; Dr1
Jnz Loc_401357
Mov Eax, [ecx+0b0h] ; Eax <- Context.regeax
Rol Eax, 13h
Mov [ecx+0b0h], Eax ; Eax -> Context.regeax
Jmp Drx_processed
Loc_401357:
Cmp Eax, 3 ; Dr2
Jnz Loc_401385
Add Dword Ptr [ecx+0b0h], 78787878 ; Context.regeax += 78787878h
Mov Eax, [ecx+0b0h] ; Eax <- Context.regeax
Mov Ebx, [ecx+0a4h] ; Ebx <- Context.regebx
Xchg Ax, Bx
Add Ax, Bx
Mov [ecx+0b0h], Eax ; Eax <- Context.regeax
Mov [ecx+0a4h], Ebx ; Ebx <- Context.regebx
Jmp Drx_processed
Loc_401385:
Mov Eax, [ecx+0a0h] ; Dr3
; Eax <- Context.regesi
Xor Byte Ptr [eax], 55h
Drx_processed:
Xor Eax, Eax
Jmp Drx_ret
Drx_not_single:
Cmp Eax, Exception_int_divide_by_zero
Jnz Drx_cannot_process
Inc Dword Ptr [ecx+0b8h] ; Context.regeip++ (2 Byte Code)
Xor Eax, Eax
And [ecx+4], Eax ; Context.idr0 <- 0
And [ecx+8], Eax ; Context.idr1 <- 0
And [ecx+0ch], Eax ; Context.idr2 <- 0
And [ecx+10h], Eax ; Context.idr3 <- 0
And Dword Ptr [ecx+14h], 0ffff0ff0h ; Context.idr6 <- 0ffff0ff0h
; 清 Bt,bs,bd,b3,b2,b1,b0 位
And Dword Ptr [ecx+18h], 0dc00h ; 僅保留 Gd,ge 位
Jmp Drx_ret
Drx_cannot_process:
Xor Eax, Eax
Inc Eax
Drx_ret:
Ret
Drx_handler Endp
Push_drx_handler:
Xor Eax, Eax
Push Dword Ptr Fs:0
Mov Fs:0, Esp
Int 3 ; 設定 Drx
Nop ; Int 3 後緊跟 Nop 通常是為了相容某些系統(9X與NT,發生INT3異常時,context.EIP不一樣。
)
Mov Ecx, Ebp
Sub Ecx, Esi
Xor Ebx, Ebx
Xor Eax, Eax
Drx_crc_13db:
Lodsb
Add Ebx, Eax
Loop Drx_crc_13db
Mov Eax, Ebx
Drx_0:
Clc ; Not Eax
Nop
Lea Esi, [drx_1-@symbiont_start][ebp]
Mov Ecx, @sumbiont_end-drx_1
Drx_decode_13ef:
Mul Ecx
Ror Eax, Cl
Xor [esi], Al
Inc Esi
Inc Eax
Aam
Loop Drx_decode_13ef
Mov Ecx, Drx_handler-@symbiont_start ; Esi -> Loader Data
Mov Esi, Ebp ; Mem Ptr Start
Xor Eax, Eax
Drx_crc_1404:
Xor Al, [esi]
Ror Eax, 8
Inc Esi
Loop Drx_crc_1404
Drx_1:
Cld ; Rol Eax, 13h
Nop
Mov Ecx, @sumbiont_end-drx_2
Lea Esi, [drx_2-@symbiont_start][ebp]
Drx_decode_1419:
Lea Eax, [ecx+eax*4+key_1] ; 43h
Xor [esi], Al
Aam
Inc Esi
Loop Drx_decode_1419
Mov Ecx, Drx_2-push_drx_handler
Shr Ecx, 2 ; Ecx /= 4 (sizeof Dword)
Lea Esi, [push_drx_handler-@symbiont_start][ebp]
Xor Ebx, Ebx
Drx_crc_1434:
Lodsd
Xor Ebx, Eax
Loop Drx_crc_1434
Drx_2:
Stc ; Add Eax, 78787878h
; Xchg Ax, Bx
; Add Ax, Bx
Nop
Mov Ecx, @sumbiont_end-drx_3
Shr Ecx, 2
Lea Esi, [drx_3-@symbiont_start][ebp]
Drx_decode_1449:
Xor Edx, Edx
Mul Ebx
Add Edx, 78787878
Xor [esi], Edx
Mov Eax, Ebx
Mov Ebx, Edx
Add Esi, 4
Loop Drx_decode_1449
Lea Esi, [crypted_code_start-@symbiont_start][ebp]
Mov Ecx, @sumbiont_end-crypted_code_start
Drx_decode_1469:
Not Byte Ptr [esi]
Drx_3:
Nop ; Xor Byte Ptr [esi], 55h
Nop
Inc Esi
Loop Drx_decode_1469
Crypted_code_start:
Mov Eax, 100h
Xor Edx, Edx
Xor Ebx, Ebx
Div Ebx ; :d
Nop
Pop Dword Ptr Fs:0
Pop Eax
相關文章
- 加殼技術探討-加殼時處理IAT2015-11-15
- 淺談被加殼ELF的除錯2020-08-19除錯
- Web除錯技術詳解2019-04-23Web除錯
- Bochs 除錯技術(轉)2007-08-11除錯
- 《除錯九法》:除錯是個技術活2016-12-24除錯
- iOS無線除錯技術2017-10-16iOS除錯
- 掌握 Linux 除錯技術2013-12-04Linux除錯
- 反除錯 -- 利用ptrace阻止偵錯程式附加2018-07-04除錯
- 深入Java除錯技術 -Ari Noman2020-06-03Java除錯
- Qt入門(10)——除錯技術2014-09-30QT除錯
- 掌握 Linux 除錯技術(轉)2007-08-11Linux除錯
- 掌握Linux除錯技術(轉)2007-08-14Linux除錯
- 關於java加殼和程式碼混淆2014-08-16Java
- Linux技術——gdb除錯基礎2016-04-03Linux除錯
- 嵌入式Linux的除錯技術2016-06-24Linux除錯
- vc6.0程式除錯技術總結2014-12-16除錯
- 「SAP技術」SAP MM 向交貨單的存在不阻止PO被刪除2020-06-23
- [技術討論]程式碼除錯,程式設計師的基本功2009-03-25除錯程式設計師
- iOS逆向學習之五(加殼?脫殼?)2019-10-10iOS
- 企業殼反除錯及hook檢測分析2018-01-25除錯Hook
- Android之Apk加殼2018-12-11AndroidAPK
- Windows 反除錯技術——OpenProcess 許可權過濾2018-04-11Windows除錯
- 五種前端開發必備的除錯技術2015-10-21前端除錯
- 從技術到醫療,雲知聲全棧AI技術為智慧醫療加碼2022-05-30全棧AI
- 安卓整體加殼(一代殼)原理及實踐2024-09-15安卓
- 使用IDA除錯SO脫殼,環境準備及各步驟原理詳解2017-10-31除錯
- Python 程式碼除錯—使用 pdb 除錯2019-12-26Python除錯
- 實現呼叫加殼的外殼中的子程式的一點見解。。 (1千字)2002-10-21
- HDC2021技術分論壇:分散式除錯、調優能力解決方案2021-11-19分散式除錯
- Krypton
0.5加殼程式脫殼及輸入表修復記2004-10-06
- ProGuard程式碼混淆技術詳解2016-05-27
- 閃回刪除技術:2016-09-30
- GDB 除錯程式碼2018-11-22除錯
- 除錯spark原始碼2015-06-22除錯Spark原始碼
- 京東加碼技術 築牢“以實助實”生態基座DLU2022-03-19
- 京東加碼技術 築牢“以實助實”生態基座II2022-03-17
- 漫談混淆技術----從Citadel混淆殼說起2020-08-19
- Armadillo3.60
加殼的EXE檔案脫殼全過程2004-09-08