• 标 题: 辅助修复Armadillo int3 的小东西
  • 作 者:shinegood
  • 时 间:2004年3月14日 08:58
  • 链 接:http://bbs.pediy.com

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