⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lde.asm

📁 LDE32反汇编引擎: 我把ADE32的反汇编引擎由C++改为MASM了。网上是有一个GAS的版本
💻 ASM
📖 第 1 页 / 共 3 页
字号:
    xor eax, eax
    cld
repeat_prefix:
    lodsb
    mov ebx, dword ptr [edx+eax]
    
    test ebx, C_ANYPREFIX
    jz end_prefix
    
    ;; twice LOCK,SEG,REP,66,67
    test ebx, flag
    jnz FailedExit
    
    mov ecx, flag
    or ecx, ebx
    mov flag, ecx
    
    test ebx, C_67
    jz disasm_Tmp0
    mov cl, 2
    xor cl, 4
    xor byte ptr [edi].disasm_defaddr, cl
    jmp continue_prefix
    disasm_Tmp0:
    
    test ebx, C_66
    jz disasm_Tmp1
    mov cl, 2
    xor cl, 4
    xor byte ptr [edi].disasm_defdata, cl 
    jmp continue_prefix
    disasm_Tmp1:
    
    test ebx, C_SEG
    jz disasm_Tmp2
    mov byte ptr [edi].disasm_seg, al
    jmp continue_prefix
    disasm_Tmp2:
    
    test ebx, C_REP
    jz disasm_Tmp3
    mov byte ptr [edi].disasm_rep, al
    jmp continue_prefix
    disasm_Tmp3:
    ;; LOCK
continue_prefix:
    jmp repeat_prefix
end_prefix:
    
    ;; start handle flag
    mov ecx, flag
    or ecx, ebx
    mov flag, ecx
    
    mov byte ptr [edi].disasm_opcode, al
    
    cmp al, 0Fh
    jnz disasm_Tmp4
    lodsb
    mov byte ptr [edi].disasm_opcode2, al
    ;; 2nd flagtable half
    mov ecx, dword ptr [edx+eax+256]
    or ecx, flag
    mov flag, ecx
    sub ecx, C_ERROR
    jz FailedExit
    jmp end_handle_flag
    
    disasm_Tmp4:
    cmp al, 0F7h
    jnz disasm_Tmp5
    mov ecx, opcode0
    mov cl, byte ptr [ecx]
    and cl, 038h
    jnz end_handle_flag
    mov ecx, flag
    or ecx, C_DATA66
    mov flag, ecx
    
    disasm_Tmp5:
    cmp al, 0F6h
    jnz disasm_Tmp6
    mov ecx, opcode0
    mov cl, byte ptr [ecx]
    and cl, 038h
    jnz end_handle_flag
    mov ecx, flag
    or ecx, C_DATA1
    mov flag, ecx
    
    disasm_Tmp6:
    cmp al, 0CDh
    jnz end_handle_flag
    lea ecx, opcode0
    mov cl, byte ptr [ecx]
    sub cl, 020h
    jnz disasm_Tmp7
    mov ecx, flag
    or ecx, C_DATA4
    mov flag, ecx
    jmp end_handle_flag
    
    disasm_Tmp7:
    mov ecx, flag
    or ecx, C_DATA1
    mov flag, ecx

end_handle_flag:
    
    ;; start handle mod and rm
    mov ecx, flag
    test ecx, C_MODRM
    jz end_handle_mod_rm
    lodsb
    mov byte ptr [edi].disasm_modrm, al
    mov cl, 038h
    and cl, al
    sub cl, 020h
    jnz disasm_Tmp8
    mov cl, byte ptr [edi].disasm_opcode
    sub cl, 0FFh
    jnz disasm_Tmp8
    mov ecx, flag
    or ecx, C_STOP
    mov flag, ecx
    
    disasm_Tmp8:
    mov mod_i, al
    and mod_i, 0C0h
    mov rm_i, al
    and rm_i, 07h
    
    mov cl, mod_i
    sub cl, 0C0h
    jz end_handle_mod_rm
    mov cl, byte ptr [edi].disasm_defaddr
    sub cl, 04h
    jnz disasm_Tmp9
    mov cl, rm_i
    sub cl, 04h
    jnz disasm_Tmp10
    mov ecx, flag
    or ecx, C_SIB
    mov flag, ecx
    lodsb
    mov byte ptr [edi].disasm_sib, al
    mov cl, al
    and cl, 07h
    mov rm_i, cl
    
    disasm_Tmp10:
    mov cl, mod_i
    sub cl, 040h
    jnz disasm_Tmp11
    mov ecx, flag
    or ecx, C_ADDR1
    mov flag, ecx
    jmp end_handle_mod_rm
    
    disasm_Tmp11:
    mov cl, mod_i
    sub cl, 080h
    jnz disasm_Tmp12
    mov ecx, flag
    or ecx, C_ADDR4
    mov flag, ecx
    jmp end_handle_mod_rm
    
    disasm_Tmp12:
    mov cl, rm_i
    sub cl, 05h
    jnz end_handle_mod_rm
    mov ecx, flag
    or ecx, C_ADDR4
    mov flag, ecx
    jmp end_handle_mod_rm
    
    ;; else
    disasm_Tmp9:
    mov cl, mod_i
    sub cl, 040h
    jnz disasm_Tmp13
    mov ecx, flag
    or ecx, C_ADDR1
    mov flag, ecx
    jmp end_handle_mod_rm
    
    disasm_Tmp13:
    mov cl, mod_i
    sub cl, 080h
    jnz disasm_Tmp14
    mov ecx, flag
    or ecx, C_ADDR2
    mov flag, ecx
    jmp end_handle_mod_rm
    
    disasm_Tmp14:
    mov cl, rm_i
    sub cl, 06h
    jnz end_handle_mod_rm
    mov ecx, flag
    or ecx, C_ADDR2
    mov flag, ecx

end_handle_mod_rm:

    mov ecx, flag
    mov dword ptr [edi].disasm_flag, ecx
    
    ;; eax -> a
    ;; edx -> d
    ;; ecx -> tmp
    ;; ebx -> tmp
    
    mov ecx, flag
    mov ebx, C_ADDR1
    or ebx, C_ADDR2
    or ebx, C_ADDR4
    and ecx, ebx
    mov eax, ecx
    
    mov ecx, flag
    mov ebx, C_DATA1
    or ebx, C_DATA2
    or ebx, C_DATA4
    and ecx, ebx
    shr ecx, 08h
    mov edx, ebx
     
    mov ecx, flag
    test ecx, C_ADDR67
    jz disasm_Tmp15
    mov cl, byte ptr [edi].disasm_defaddr
    movzx ecx, cl
    add eax, ecx
    
    disasm_Tmp15:
    mov ecx, flag
    test ecx, C_DATA66
    jz disasm_Tmp16
    mov cl, byte ptr [edi].disasm_defdata
    movzx ecx, cl
    add edx, ecx
    
    disasm_Tmp16: 
    mov dword ptr [edi].disasm_addrsize, eax
    mov dword ptr [edi].disasm_datasize, edx
    
    xor ecx, ecx
    mov ebx, eax
    lea edx, [edi].disasm_addr_b
    disasm_Tmp17:
    cmp ecx, ebx
    jz disasm_Tmp18
    lodsb
    mov byte ptr [edx+ecx], al
    inc ecx
    jmp disasm_Tmp17
    
    disasm_Tmp18:
    xor ecx, ecx
    mov ebx, eax
    lea edx, [edi].disasm_addr_b
    disasm_Tmp19:
    cmp ecx, ebx
    jz disasm_Tmp20
    lodsb
    mov byte ptr [edx+ecx], al
    inc ecx
    jmp disasm_Tmp19
    
    disasm_Tmp20:
    sub esi, opcode0
    mov dword ptr [edi].disasm_len, esi
    
    mov eax, dword ptr [edi].disasm_len
Exit_disasm:    
    ret
    
FailedExit:
    xor eax, eax
    jmp Exit_disasm
disasm endp

end Start

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -