📄 swift.asm
字号:
;
; GRDB
;
; Copyright(c) LADsoft
;
; David Lindauer, camille@bluegrass.net
;
;
; swift.asm
;
; function: swift (relatively) tracing to find the end of a procedure
;
.model small
.code
.386
include eexec.inc
traceon db 0 ;is swift tracing enabled
int3trace db 0 ;are we in the middle of a full-speed run to int3
image db 0 ;image at place int 3 is found
oldcs dw 0 ;position of int 3
oldip dw 0
oldsp dw 0 ;save so we can detect int 3 that we didn't
oldss dw 0 ; put there during swift trace...
public swiftrace,traceon,untrace
assume ds:nothing, es:dgroup
untrace proc
test [int3trace],1 ;
jz nounload2 ;
push ax ; registers picked because this used in
mov es,[oldcs] ; break interrupt too!!!!
mov bp,[oldip]
mov al,[image] ;
mov es:[bp],al ;
mov [int3trace],0 ;
pop ax
nounload2:
mov [traceon],0
ret
untrace endp
swiftrace PROC
test [traceon],0ffh
jz notrace
add sp,2 ; bump past ret
pusha ; get user CS:IP
mov bp,sp
push fs
push es
push dgroup
pop es
mov fs,[bp + 16 + 2]
mov bx,[bp + 16] ; unload int 3 call again
test [int3trace],1 ;
jz nounload ;
mov fs,[oldcs]
mov bx,[oldip]
cmp sp,[oldsp] ; this is a hack in case we run into an int 3
jnz noupdate ; during a subroutine run
mov ax,ss
cmp ax,[oldss]
jnz noupdate
mov [bp+16],bx ; point back where int 3 was
noupdate:
mov al,[image] ;
mov fs:[bx],al ;
mov [int3trace],0 ;
nounload:
mov al,fs:[bx]
cmp al,0cch
jz found3
call WadePrefix ; wade through prefixes
cmp al,9dh ; ehcek for popf
jnz notpopf
or word ptr [bp + 4 + 2 + 16],100h ; make sure popf will trace
jmp stx
notpopf:
cmp al,0c2h ; now check for rets
jz retx
cmp al,0c3h
jz retx
cmp al,0cbh
jz retx
cmp al,0cah
jz retx
cmp al,0cfh ; we WILL check iret here
jnz tracex ; none of those, check for call/int/string stepping
or word ptr [bp + 4 + 6 + 16],100h ; be sure iret will trace
retx:
mov [traceon],0 ; else kill trace flag and trace past ret/iret
tracex:
or word ptr [bp + 4+16],100h ; set trace flag
call callcheck ; see if call.int
jz setcall ; yep, set a break there
call cmpstring ; see if is string instruction
mov ax,1 ; else one byte
jz short setcall ; yes, set an int 3 instruction in place
stx:
pop es
pop fs
popa
iret
setcall:
add bx,ax
mov al,fs:[bx]
mov [image],al
mov byte ptr fs:[bx],0cch
inc [int3trace]
mov [oldcs],fs
mov [oldip],bx
mov [oldss],ss
mov [oldsp],sp
and word ptr [bp + 4 +16],0FEFFH ; no trace here
jmp stx
found3:
mov [traceon],0
pop es
pop fs
popa
notrace:
ret
swiftrace ENDP
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -