RORDbg 对于一些新壳的确是不错的选择,可惜我的机器太慢,但也可以给一个小程序加壳来分析壳的大致走向。
由于是虚拟执行,所以异常是调试器自己识别出来的,不是CPU报告,这里就有一个小漏洞可以利用,就是 RaiseException。
RORDbg 某个版本之后会识别对此函数的调用,视为异常,于是去找 SEH,但如果 RaiseException 之后没有异常,没有 SEH,程序就会卡住,呆若木鸡。
看一个例子,并跟踪一下就会明白了,这个例子可以在 RORDbg 中跑 123 条指令后停下来。
; fuck RORDbg 0.25
; only a little trick to fool it
.386
.model flat, stdcall
option casemap :none
include windows.inc
include kernel32.inc
includelib kernel32.lib
@pushsz macro sz
local __0
call __0
db sz, 0
__0:
endm
.code
start: @pushsz <"kernel32.dll">
call GetModuleHandleA
@pushsz <"OutputDebugStringA">
push eax
call GetProcAddress
@pushsz <"i am the rordbg fucker">
push offset ExitProcess
push dword ptr [eax+1] ; stolen push xxx
add eax, 5
jmp eax
;
;7C859B5C > $ 68 34020000 PUSH 234
;7C859B61 . 68 889E857C PUSH 7C859E88
;7C859B66 . E8 6089FAFF CALL 7C8024CB
;7C859B6B . A1 CC36887C MOV EAX, [7C8836CC]
;7C859B70 . 8945 E4 MOV [EBP-1C], EAX
;7C859B73 . 8B4D 08 MOV ECX, [EBP+8]
;7C859B76 . 898D C4FDFFFF MOV [EBP-23C], ECX
;7C859B7C . 8365 FC 00 AND DWORD PTR [EBP-4], 0
;7C859B80 . 8BC1 MOV EAX, ECX
;7C859B82 . 8D70 01 LEA ESI, [EAX+1]
;7C859B85 > 8A10 MOV DL, [EAX]
;7C859B87 . 40 INC EAX
;7C859B88 . 84D2 TEST DL, DL
;7C859B8A .^ 75 F9 JNZ SHORT 7C859B85
;7C859B8C . 2BC6 SUB EAX, ESI
;7C859B8E . 40 INC EAX
;7C859B8F . 8985 BCFDFFFF MOV [EBP-244], EAX
;7C859B95 . 898D C0FDFFFF MOV [EBP-240], ECX
;7C859B9B . 8D85 BCFDFFFF LEA EAX, [EBP-244]
;7C859BA1 . 50 PUSH EAX ; /pArguments
;7C859BA2 . 6A 02 PUSH 2 ; |nArguments = 2
;7C859BA4 . 6A 00 PUSH 0 ; |ExceptionFlags = EXCEPTION_CONTINUABLE
;7C859BA6 . 68 06000140 PUSH 40010006 ; |ExceptionCode = 40010006
;7C859BAB . E8 314FFCFF CALL RaiseException ; \RaiseException
;7C859BB0 . E9 52020000 JMP 7C859E07
;
end start
Firewall 多多改进你的工具,真得很不错。