一小段代码,写的比较烂,为了清晰没有优化
For Armadillo 3.6
我这个其实就是一个黑盒判断函数,只要他是通过这样的函数原型
代码:
int CheckJumpable(int EFlags, int ecx)
return 1; // Jumpable
return 0; // otherwise
验证跳转情形就没问题
使用方法是修改***行中4b2690h为你的程序中一个跳转情况判断的函数表的偏移地址,然后编译,用OD的Binary Copy & Binary Paste来贴到脱壳后的程序中的一个小空间里,运行获得结果,便于写代码修复int3
其实这个和那个什么for Armadillo的软件执行的功能一样,只是这个定制性更强,大家顺便看看是不是有错误
;*****************************************************
代码:
.386
.model flat,stdcall
option casemap : none
CF equ 0001h
PF equ 0004h
ZF equ 0040h
SF equ 0080h
OF equ 0800h
.code
start proc near
LOCAL Func :DWORD ; 跳转类型判断函数
LOCAL FunType[251] :DWORD ; 保存跳转类型
LOCAL i :DWORD ; 记数参数
mov [i], 0
mov esi, 4b2690h ; 修改4b2690h为一个跳转函数表的地址 ***
GetType:
lodsd ; 载入函数地址
push esi
mov [Func], eax ; 保存
;****************************************************************************
;JO 0F 80 dd / 70 db OF = 1
;JNO 0F 81 dd / 71 db OF = 0
;JB 0F 82 dd / 72 db CF = 1
;JNB 0F 83 dd / 73 db CF = 0
;JE 0F 84 dd / 74 db ZF = 1
;JNE 0F 85 dd / 75 db ZF = 0
;JBE 0F 86 dd / 76 db CF = 1 or ZF = 1
;JA 0F 87 dd / 77 db CF = 0 and ZF = 0
;JS 0F 88 dd / 78 db SF = 1
;JNS 0F 89 dd / 79 db SF = 0
;JPE 0F 8A dd / 7A db PF = 1
;JPO 0F 8B dd / 7B db PF = 0
;JL 0F 8C dd / 7C db SF <> OF
;JGE 0F 8D dd / 7D db SF = OF
;JLE 0F 8E dd / 7E db ZF = 1 or SF <> OF
;JG 0F 8F dd / 7F db ZF = 0 and SF = OF
push 0 ; Ecx
push 0 ; EFlags
call [Func]
add esp, 4 ; 恢复栈堆,不过保留 Ecx
test al, al
je _JOJBJEJBEJSJPEJLJLE
_JNOJNBJNEJAJNSJPOJGEJG:
push CF or PF or ZF or SF ; EFlags
call [Func]
add esp, 4
test al, al
jne _JMPJNOJECXZ
_JNO_JNBJNEJAJNSJPOJGEJG:
push CF or ZF
call [Func]
add esp, 4
test al, al
jne _JNOJNSJPOJGE
_JNBJNEJAJG:
push CF
call [Func]
add esp, 4
test al, al
jne _JNEJG
_JAJNB:
push ZF
call [Func]
add esp, 4
test al, al
jne _JNB
jmp _JA
_JNEJG:
push SF
call [Func]
add esp, 4
test al, al
jne _JNE
jmp _JG
_JNOJNSJPOJGE:
push SF
call [Func]
add esp, 4
test al, al
jne _JNOJPO
_JNSJGE:
push OF
call [Func]
add esp, 4
test al, al
jne _JNS
jmp _JGE
_JNOJPO:
push OF
call [Func]
add esp, 4
test al, al
jne _JPO
jmp _JNO
_JOJBJEJBEJSJPEJLJLE:
push CF or ZF
call [Func]
add esp, 4
test al, al
jne _JBJEJBEJGE
_JOJSJPEJG:
push SF or PF
call [Func]
add esp, 4
test al, al
jne _JSJPE
_JOJG:
push ZF or OF or SF
call [Func]
add esp, 4
test al, al
jne _JO
jmp _JG
_JSJPE:
push SF
call [Func]
add esp, 4
test al, al
jne _JS
jmp _JPE
_JBJEJBEJGE:
push CF
call [Func]
add esp, 4
test al, al
jne _JBJGE
_JEJBE:
push ZF
call [Func]
add esp, 4
test al, al
jne _JE
jmp _JBE
_JBJGE:
push CF or SF
call [Func]
add esp, 4
test al, al
jne _JB
jmp _JGE
_JMPJNOJECXZ:
push OF
call [Func]
add esp, 4
test al, al
jne _JMPJECXZ
jmp _JNO
_JMPJECXZ:
add esp, 4
push 1
push 0
call [Func]
add esp, 4
test al, al
jne _JMP
jmp _JECXZ
; 跳转类型返回值
_JECXZ:
push 10h
jmp @F
_JMP:
push -1
jmp @F
_JO:
push 0
jmp @F
_JNO:
push 1
jmp @F
_JB:
push 2
jmp @F
_JNB:
push 3
jmp @F
_JE:
push 4
jmp @F
_JNE:
push 5
jmp @F
_JBE:
push 6
jmp @F
_JA:
push 7
jmp @F
_JS:
push 8
jmp @F
_JNS:
push 9
jmp @F
_JPE:
push 0Ah
jmp @F
_JPO:
push 0Bh
jmp @F
_JL:
push 0Ch
jmp @F
_JGE:
push 0Dh
jmp @F
_JLE:
push 0Eh
jmp @F
_JG:
push 0Fh
jmp @F
@@:
pop eax
add esp, 4
mov ecx, [i]
mov [FunType+ecx*4], eax
cmp ecx, 0FBh
jge @F
inc ecx
mov [i], ecx
pop esi
jmp GetType
@@:
ret
start endp
end start