一小段代码,写的比较烂,为了清晰没有优化 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 | |