天行健 发表于 2024-12-26 22:12:15

C++反汇编入门27.处理不当的反汇编代码

# 处理不当的反汇编代码

逆向工程师经常需要处理不当的反汇编代码

## 28.1反汇编于不正确起始位置(x86)

不同于ARM和MIPS架构(任何指令长度只有2个字节长度或者4个字节长度), x86架构的指令长度是不定长的,因此,任何反汇编器从x86指令中间开始反汇编,可能会长生不正确的结果。

举个例子:

```
add , cl
dec dword ptr
dec dword ptr
inc dword ptr
fdiv st(4), st
;-------------------------------------------------------------
db 0FFh
;-------------------------------------------------------------
dec dword ptr
dec dword ptr
dec dword ptr
dec dword ptr
dec dword ptr
dec dword ptr
jmp dword ptr
;-------------------------------------------------------------
xchg eax, ebp
clc
std
;-------------------------------------------------------------
db 0FFh
db 0FFh
;-------------------------------------------------------------
mov word ptr , cs
mov word ptr , ds
mov word ptr , es
mov word ptr , fs
mov word ptr , gs
pushf
pop dword ptr
mov eax,
mov , eax
lea eax,
mov , eax
mov dword ptr , 10001h
mov eax,
mov , eax
mov eax,
mov , eax
mov eax,
mov , eax
mov eax,
mov , eax
call ds:IsDebuggerPresent
mov edi, eax
lea eax,
push eax
call sub_407663
pop ecx
test eax, eax
jnz short loc_402D7B
```

虽然上面的代码片段一开始是从错误的起始位置反汇编的,但最终,反汇编器能够自己调整到正确的轨道上。

## 28.2不正确的反汇编代码的特点

可以很容易发现它们的共同特点是:

很少出现大尺寸的指令,最常见的有x86指令的push,mov,call。 但是我们可以看到这些指令来自各个不同的指令组,有FPU指令,IN/OUT指令,少数的系统指令,一切都是因为反汇编器从一个错误的位置上开始反汇编机器码给搞砸了。
偏移量和立即数都是一些随机值,而且数值较大。
跳转到不正确的偏移地址常常会跳转到另一个指令的中间。
代码清单28.1:x86架构不正确的反汇编代码示例

```
    mov   bl, 0Ch
    mov   ecx, 0D38558Dh
    mov   eax, ds:2C869A86h
    db      67h
    mov   dl, 0CCh
    insb
    movsb
    push    eax
    xor   , ah
    fcom    qword ptr
    pop   esp
    pop   ss
    in      eax, dx
    dec   ebx
    push    esp
    lds   esp,
    retf
    rcl   dword ptr , cl
    mov   cl, 9Ch
    mov   ch, 0DFh
    push    cs
    insb
    mov   esi, 0D9C65E4Dh
    imul    ebp, , 66h
    pushf
    sal   dword ptr , cl
    sub   eax, 0AC433D64h
    out   8Ch, eax
    pop   ss
    sbb   , ebx
    aas
    xchg    cl,
    jecxz   short near ptr loc_58+1
    xor   al, 0C6h
    inc   edx
    db      36h
    pusha
    stosb
    test    , ebx
    sub   al, 0D3h ; 'L'
    pop   eax
    stosb

loc_58: ; CODE XREF: seg000:0000004A
    test    , eax
    inc   ebp
    das
    db      64h
    pop   ecx
    das
    hlt

    pop   edx
    out   0B0h, al
    lodsb
    push    ebx
    cdq
    out   dx, al
    sub   al, 0Ah
    sti
    outsd
    add   dword ptr , 96FCBE4Bh
    and   eax, 0E537EE4Fh
    inc   esp
    stosd
    cdq
    push    ecx
    in      al, 0CBh
    mov   ds:0D114C45Ch, al
    mov   esi, 659D1985h
    enter   6FE8h, 0D9h
    enter   6FE6h, 0D9h
    xchg    eax, esi
    sub   eax, 0A599866Eh
    retn

    pop   eax
    dec   eax
    adc   al, 21h ; '!'
    lahf
    inc   edi
    sub   eax, 9062EE5Bh
    bound   eax,

loc_A2: ; CODE XREF: seg000:00000120
    wait
    iret

    jnb   short loc_D7
    cmpsd
    iret

    jnb   short loc_D7
    sub   ebx,
    in      al, 0Ch
    add   esp, esp
    mov   bl, 8Fh
    xchg    eax, ecx
    int   67h
    pop   ds
    pop   ebx
    db      36h
    xor   esi,
    mov   ebx, 0EB4F980Ch
    repne add bl, dh
    imul    ebx, , 67A4D1EEh
    xchg    eax, ebp
    scasb
    push    esp
    wait
    mov   dl, 11h
    mov   ah, 29h ; ')'
    fist    dword ptr

loc_D7: ; CODE XREF: seg000:000000A4
      ; seg000:000000A8 ...
    dec   dword ptr
    call    near ptr 622FEE3Eh
    sbb   ax, 5A2Fh
    jmp   dword ptr cs:

    xor   ch,
    inc   esp
    push    edi
    xor   esp,
    pop   eax
    int   3               ; Trap to Debugger
    rcl   byte ptr , cl
    xor   , bl
    sbb   al,
    xor   ah,
    push    edi
    xor   ah, cl
    popa
    cmp   dword ptr , 46h ; 'F'
    dec   eax
    in      al, 69h
    dec   ebx
    iret

    or      al, 6
    jns   short near ptr loc_D7+3
    shl   byte ptr , 42h
    repne adc , eax
    icebp
    cmpsd
    leave
    push    esi
    jmp   short loc_A2

    and   eax, 0F2E41FE9h
    push    esi
    loop    loc_14F
    add   ah, fs:

loc_12D: ; CODE XREF: seg000:00000169
    mov   dh, 0F7h
    add   , esp
    mov   edi, 79F19525h
    rcl   byte ptr , cl
    cli
    sub   al, 0D2h ; 'T'
    dec   eax
    mov   ds:0A81406F5h, eax
    sbb   eax, 0A7AA179Ah
    in      eax, dx

loc_14F: ; CODE XREF: seg000:00000128
    and   , ah
    pop   ecx
    push    esi
    mov   bl, 2Dh ; '-'
    in      eax, 2Ch
    stosd
    inc   edi
    push    esp

locret_15E: ; CODE XREF: seg000:loc_1A0
    retn    0C432h

    and   al, 86h
    cwde
    and   al, 8Fh
    cmp   ebp,
    jz      short loc_12D
    sub   bh, ch
    or      dword ptr , 8A16C0F7h
    db      65h
    insd
    mov   al, ds:0A3A5173Dh
    dec   ecx
    push    ds
    xor   al, cl
    jg      short loc_195
    push    6Eh ; 'n'
    out   0DDh, al
    inc   edi
    sub   eax, 6899BBF1h
    leave
    rcr   dword ptr , cl
    sbb   ch,

loc_195: ; CODE XREF: seg000:0000017F
    push    es
    repne sub ah,
    cmc
    and   ch, al

loc_1A0: ; CODE XREF: seg000:00000217
    jnp   short near ptr locret_15E+1
    or      ch,
    add   , esi
    out   dx, al
    db      2Eh
    call    far ptr 1AAh:6832F5DDh
    jz      short near ptr loc_1DA+1
    sbb   esp,
    xchg    eax, edi
    xor   , edx

loc_1C1: ; CODE XREF: seg000:00000212
    cmp   eax, 1BE9080h
    add   , edi
    aad   0
    imul    esp, , 0A8990126h
    or      dword ptr , 4Bh
    popf

loc_1DA: ; CODE XREF: seg000:000001B2
    mov   ecx, cs
    aaa
    mov   al, 39h ; '9'
    adc   byte ptr , 0C7h
    add   , bl
    retn    0DD42h

    db      3Eh
    mov   fs:, edi
    and   , esp
    db      64h
    xchg    eax, ebp
    push    cs
    adc   eax,
    mov   bh, 0C7h
    sub   eax, 0A710CBE7h
    xchg    eax, ecx
    or      eax, 51836E42h
    xchg    eax, ebx
    inc   ecx
    jb      short near ptr loc_21E+3
    db      64h
    xchg    eax, esp
    and   dh,
    mov   ch, 13h
    add   ebx, edx
    jnb   short loc_1C1
    db      65h
    adc   al, 0C5h
    js      short loc_1A0
    sbb   eax, 887F5BEEh

loc_21E: ; CODE XREF: seg000:00000207
    mov   eax, 888E1FD6h
    mov   bl, 90h
    cmp   , ecx
    rep int 61h             ; reserved for user interrupt
    and   edx,
    fisttpqword ptr
    jmp   short loc_27C

    fadd    st, st(2)
    db      3Eh
    mov   edx, 54C03172h
    retn

    db      64h
    pop   ds
    xchg    eax, esi
    rcr   ebx, cl
    cmp   , ebx
    repne xor , dh
    insd
    adc   dl,
    push    ss
    xor   , ecx
    mov   cl,
    or      , ebp
    cmpsb
    lodsb
    iret
```

代码清单28.2:x86_64架构不正确的反汇编代码示例

```
    lea   esi,

loc_AF3: ; CODE XREF: seg000:0000000000000B46
    rcl   byte ptr , 1
    lea   ecx, cs:0FFFFFFFFB2A6780Fh
    mov   al, 96h
    mov   ah, 0CEh
    push    rsp
    lods    byte ptr

    db2Fh ; /

    pop   rsp
    db      64h
    retf    0E993h

    cmp   ah,
    movzx   rsi, dword ptr
    push    4Ah
    movzx   rdi, dword ptr

    db9Ah

    rcr   byte ptr , cl
    lodsd
    xor   , edx
    xor   , edx
    push    rbx
    sbb   ch,
    stosd
    int   87h
    db      46h, 4Ch
    out   33h, rax
    xchg    eax, ebp
    test    ecx, ebp
    movsd
    leave
    push    rsp

    db16h

    xchg    eax, esi
    pop   rdi

loc_B3D: ; CODE XREF: seg000:0000000000000B5F
    mov   ds:93CA685DF98A90F9h, eax
    jnz   short near ptr loc_AF3+6
    out   dx, eax
    cwde
    mov   bh, 5Dh ; ']'
    movsb
    pop   rbp

    db60h ; `

    movsxdrbp, dword ptr
    pop   rbx
    out   7Dh, al
    add   eax, 0D79BE769h

    db1Fh

    retf    0CAB9h

    jl      short near ptr loc_B3D+4
    sal   dword ptr , 0D3h
    mov   cl, 41h ; 'A'
    imul    eax, , 1DDE6E5h
    imul    ecx, ebx, 66359BCCh
    xlat

    db60h ; `

    cmp   bl,
    and   ebp,
    stc
    sub   , al
    jmp   short loc_C05

    db4Bh ; K

    int   3               ; Trap to Debugger
    xchg    ebx,

    db 0D6h

    mov   esp, 0C5BA61F7h
    out   0A3h, al      ; Interrupt Controller #2, 8259A
    add   al, 0A6h
    pop   rbx
    cmp   bh, fs:
    and   ch, cl
    cmp   al, 0F3h

    db0Eh

    xchg    dh,
    stosd
    xor   , ebx
    stosb
    xchg    eax, ecx
    push    rsi
    insd
    fidiv   word ptr
    xchg    eax, ecx
    mov   dh, 0C0h ; 'L'
    xchg    eax, esp
    push    rsi
    mov   dh,
    xchg    eax, ebp
    out   9Dh, al

loc_BC0: ; CODE XREF: seg000:0000000000000C26
    or      , ch
    int   67h             ;- LIM EMS
    push    rdx
    sub   al, 43h ; 'C'
    test    ecx, ebp
    test    , cl

    db    7

    imul    ebx, , 2BB30231h
    xor   ebx,
    jns   short near ptr loc_C56+1
    ficompdword ptr
    and   eax, 69BEECC7h
    mov   esi, 37DA40F6h
    imul    r13, , 0FFFFFFFFF35CDD30h
    or      , edx
    imul    esi, , 0CDA42B87h

    db36h ; 6
    db1Fh


loc_C05: ; CODE XREF: seg000:0000000000000B86
    add   dh,
    mov   edi, 0DD3E659h
    ror   byte ptr , cl
    xlat
    db      48h
    sub   rsi,

    db1Fh
    db    6

    xor   , bh
    cmpsb
    sub   esi,
    pop   rbp
    sbb   al, 62h ; 'b'
    mov   dl, 33h ; '3'

    db4Dh ; M
    db17h

    jns   short loc_BC0
    push    0FFFFFFFFFFFFFF86h

loc_C2A: ; CODE XREF: seg000:0000000000000C8F
    sub   , eax

    db 0FEh

    cmpsb
    wait
    rcr   byte ptr , cl
    cmp   bl, al
    pushfq
    xchg    ch, cl

    db4Eh ; N
    db37h ; 7

    mov   ds:0E43F3CCD3D9AB295h, eax
    cmp   ebp, ecx
    jl      short loc_C87
    retn    8574h

    out   3, al         ; DMA controller, 8237A-5.
                            ; channel 1 base address and word count

loc_C4C: ; CODE XREF: seg000:0000000000000C7F
    cmp   al, 0A6h
    wait
    push    0FFFFFFFFFFFFFFBEh

    db82h

    ficom   dword ptr

loc_C56: ; CODE XREF: seg000:0000000000000BDE
    jnz   short loc_C76
    xchg    eax, edx
    db      26h
    wait
    iret

    push    rcx

    db48h ; H
    db9Bh
    db64h ; d
    db3Eh ; >
    db2Fh ; /

    mov   al, ds:8A7490CA2E9AA728h
    stc

    db60h ; `

    test    , ebp
    int   3               ; Trap to Debugger
    xlat

loc_C72: ; CODE XREF: seg000:0000000000000CC6
    mov   bh, 98h

    db2Eh ; .
    db 0DFh


loc_C76: ; CODE XREF: seg000:loc_C56
    jl      short loc_C91
    sub   ecx, 13A7CCF2h
    movsb
    jns   short near ptr loc_C4C+1
    cmpsd
    sub   ah, ah
    cdq

    db6Bh ; k
    db5Ah ; Z


loc_C87: ; CODE XREF: seg000:0000000000000C45
    or      ecx,
    rep in eax, 0Eh         ; DMA controller, 8237A-5.
                            ; Clear mask registers.
                            ; Any OUT enables all 4 channels.
    cmpsb
    jnb   short loc_C2A

loc_C91: ; CODE XREF: seg000:loc_C76
    scasd
    add   dl,
    enter   0FFFFFFFFFFFFC733h, 7Ch
    insd
    mov   ecx, gs
    in      al, dx
    out   2Dh, al
    mov   ds:6599E434E6D96814h, al
    cmpsb
    push    0FFFFFFFFFFFFFFD6h
    popfq
    xor   ecx, ebp
    db      48h
    insb
    test    al, cl
    xor   , cl
    and   al, 9Bh

    db9Ah

    push    rsp
    xor   al, 8Fh
    cmp   eax, 924E81B9h
    clc
    mov   bh, 0DEh
    jbe   short near ptr loc_C72+1

    db1Eh

    retn    8FCAh

    db 0C4h ; -


loc_CCD: ; CODE XREF: seg000:0000000000000D22
    adc   eax, 7CABFBF8h

    db38h ; 8

    mov   ebp, 9C3E66FCh
    push    rbp
    dec   byte ptr
    sahf
    fidivrword ptr

    db1Fh

    db      3Eh
    xchg    eax, esi

loc_CE2: ; CODE XREF: seg000:0000000000000D5E
    mov   ebx, 0C7AFE30Bh
    clc
    in      eax, dx
    sbb   bh, bl
    xchg    eax, ebp

    db3Fh ; ?

    cmp   edx, 3EC3E4D7h
    push    51h
    db      3Eh
    pushfq
    jl      short loc_D17
    test    , ebx

    db2Fh ; /

    rdtsc
    jns   short near ptr loc_D40+4
    mov   ebp, 0B2BB03D8h
    in      eax, dx

    db1Eh

    fsubr   dword ptr
    jns   short loc_D70
    scasd
    mov   ch, 0C1h ; '+'
    add   edi,

    db 0E7h


loc_D17: ; CODE XREF: seg000:0000000000000CF7
    jp      short near ptr unk_D79
    scasd
    cmc
    sbb   ebx,
    fsubr   dword ptr
    retn

    db    3

    jnp   short near ptr loc_CCD+4
    db      36h
    adc   r14b, r13b

    db1Fh

    retf

    test    , ebx
    cdq
    or      ebx, edi
    test    eax, 310B94BCh
    ffreepst(7)
    cwde
    sbb   esi,
    push    5372CBAAh

loc_D40: ; CODE XREF: seg000:0000000000000D02
    push    53728BAAh
    push    0FFFFFFFFF85CF2FCh

    db0Eh

    retn    9B9Bh

    movzx   r9, dword ptr
    adc   , ebp
    in      al, 31h

    db37h ; 7

    jl      short loc_DC5
    icebp
    sub   esi,
    clc
    pop   rdi
    jb      short near ptr loc_CE2+1
    or      al, 8Fh
    mov   ecx, 770EFF81h
    sub   al, ch
    sub   al, 73h ; 's'
    cmpsd
    adc   bl, al
    out   87h, eax      ; DMA page register 74LS612:
                            ; Channel 0 (address bits 16-23)

loc_D70: ; CODE XREF: seg000:0000000000000D0E
    adc   edi, ebx
    db      49h
    outsb
    enter   33E5h, 97h
    xchg    eax, ebx

unk_D79   db 0FEh ; CODE XREF: seg000:loc_D17
          db 0BEh
          db 0E1h
          db82h


loc_D7D: ; CODE XREF: seg000:0000000000000DB3
    cwde

    db    7
    db5Ch ; \
    db10h
    db73h ; s
    db 0A9h
    db2Bh ; +
    db9Fh


loc_D85: ; CODE XREF: seg000:0000000000000DD1
    dec   dh
    jnz   short near ptr loc_DD3+3
    mov   ds:7C1758CB282EF9BFh, al
    sal   ch, 91h
    rol   dword ptr , cl
    fbstp   tbyte ptr
    repne mov al, ds:4BFAB3C3ECF2BE13h
    pushfq
    imul    edx, , 8EDC09C6h
    cmp   , al
    jg      short loc_D7D
    xor   , edx
    test    eax, 14E3AD7h
    insd

    db38h ; 8
    db80h
    db 0C3h


loc_DC5: ; CODE XREF: seg000:0000000000000D57
         ; seg000:0000000000000DD8
    cmp   ah,
    sbb   eax, 5FC631F0h
    jnb   short loc_D85

loc_DD3: ; CODE XREF: seg000:0000000000000D87
    call    near ptr 0FFFFFFFFC03919C7h
    loope   near ptr loc_DC5+3
    sbb   al, 0C8h
    std
```

代码清单28.2:ARM架构(ARM 模式)不正确的反汇编代码示例

```
BLNE    0xFE16A9D8
BGE   0x1634D0C
SVCCS   0x450685
STRNVTR5, ,#-0x964
LDCGE   p6, c14, ,#0x168
STCCSLp9, c9, ,#0x14C
CMNHIPPC, R10,LSL#22
FLDMIADNV LR!, {D4}
MCR   p5, 2, R2,c15,c6, 4
BLGE    0x1139558
BLGT    0xFF9146E4
STRNEBR5, ,#0xCA2
STMNEIB R5, {R0,R4,R6,R7,R9-SP,PC}
STMIA   R8, {R0,R2-R4,R7,R8,R10,SP,LR}^
STRB    SP, ,PC,ROR#18
LDCCS   p9, c13,
LDRGE   R8,
STRNEBR5, ,#-0x8C3
STCCSLp15, c9,
RSBLS   LR, R2, R11,ASR LR
SVCGT   0x9B0362
SVCGT   0xA73173
STMNEDB R11!, {R0,R1,R4-R6,R8,R10,R11,SP}
STR   R0, ,#-0xCE4
LDCGT   p15, c8,
LDRCCBR1, ,-R7,ROR#30
BLLT    0xFED9D58C
BL      0x13E60F4
LDMVSIB R3!, {R1,R4-R7}^
USATNER10, #7, SP,LSL#11
LDRGEBLR, ,#0xE56
STRPLTR9, ,#0x567
LDRLT   R11, ,#-0x29B
SVCNV   0x12DB29
MVNNVSR5, SP,LSL#25
LDCL    p8, c14,
STCNELp2, c6, !
SVCNV   0x2E5A2F
BLX   0x1A8C97E
TEQGE   R3, #0x1100000
STMLSIA R6, {R3,R6,R10,R11,SP}
BICPLSR12, R2, #0x5800
BNE   0x7CC408
TEQGE   R2, R4,LSL#20
SUBS    R1, R11, #0x28C
BICVS   R3, R12, R7,ASR R0
LDRMI   R7, ,R3,LSL#21
BLMI    0x1A79234
STMVCDB R6, {R0-R3,R6,R7,R10,R11}
EORMI   R12, R6, #0xC5
MCRRCSp1, 0xF, R1,R3,c2
```

代码清单28.2:ARM架构(Thumb 模式)不正确的反汇编代码示例

```
    LSRS    R3, R6, #0x12
    LDRH    R1,
    SUBS    R0, #0x55 ; 'U'
    ADR   R1, loc_3C
    LDR   R2,
    CMP   R4, #0x86
    SXTB    R7, R4
    LDR   R4,
    STR   R4,
    STR   R0,
    BGT   0xFFFFFF72
    LDRH    R7,
    LDRSH   R0,
    LDRB    R2,

    DCB 0x17
    DCB 0xED

    STRB    R3,
    STR   R5,
    LDMIA   R3, {R0-R5,R7}
    ASRS    R3, R2, #3
    LDR   R4,
    SVC   0xB5
    LDR   R6,
    LDR   R5, =0xB2C5CA32
    STMIA   R6, {R1-R4,R6}
    LDR   R1,
    STR   R1,
    BCC   0xFFFFFF70
    LDR   R4,
    STR   R5,
    ORRS    R5, R7

loc_3C ; DATA XREF: ROM:00000006
    B       0xFFFFFF98

    ASRS    R4, R1, #0x1E
    ADDS    R1, R3, R0
    STRH    R7,
    LDR   R3,
    CBZ   R6, loc_90
    MOVS    R4, R2
    LSRS    R3, R4, #0x17
    STMIA   R6!, {R2,R4,R5}
    ADDS    R6, #0x42 ; 'B'
    ADD   R2, SP, #0x180
    SUBS    R5, R0, R6
    BCC   loc_B0
    ADD   R2, SP, #0x160
    LSLS    R5, R0, #0x1A
    CMP   R7, #0x45
    LDR   R4,

    DCB 0x2F ; /
    DCB 0xF4

    B       0xFFFFFD18

    ADD   R4, SP, #0x2C0
    LDR   R1,
    CMP   R4, #0xEE

    DCB0xA
    DCB 0xFB

    STRH    R7,
    LDR   R3, loc_78

    DCB 0xBE ; -
    DCB 0xFC

    MOVS    R5, #0x96

    DCB 0x4F ; O
    DCB 0xEE

    B       0xFFFFFAE6

    ADD   R3, SP, #0x110

loc_78 ; DATA XREF: ROM:0000006C
    STR   R1,
    LDMIA   R3!, {R2,R5-R7}
    LDRB    R2,
    ASRS    R4, R0, #0x13
    BKPT    0xD1
    ADDS    R5, R0, R6
    STR   R5,
```

代码清单28.2:MIPS架构(小端序)不正确的反汇编代码示例

```
lw      $t9, 0xCB3($t5)
sb      $t5, 0x3855($t0)
sltiu   $a2, $a0, -0x657A
ldr   $t4, -0x4D99($a2)
daddi   $s0, $s1, 0x50A4
lw      $s7, -0x2353($s4)
bgtzl   $a1, 0x17C5C

.byte 0x17
.byte 0xED
.byte 0x4B# K
.byte 0x54# T

lwc2    $31, 0x66C5($sp)
lwu   $s1, 0x10D3($a1)
ldr   $t6, -0x204B($zero)
lwc1    $f30, 0x4DBE($s2)
daddiu$t1, $s1, 0x6BD9
lwu   $s5, -0x2C64($v1)
cop0    0x13D642D
bne   $gp, $t4, 0xFFFF9EF0
lh      $ra, 0x1819($s1)
sdl   $fp, -0x6474($t8)
jal   0x78C0050
ori   $v0, $s2, 0xC634
blez    $gp, 0xFFFEA9D4
swl   $t8, -0x2CD4($s2)
sltiu   $a1, $k0, 0x685
sdc1    $f15, 0x5964($at)
sw      $s0, -0x19A6($a1)
sltiu   $t6, $a3, -0x66AD
lb      $t7, -0x4F6($t3)
sd      $fp, 0x4B02($a1)

.byte 0x96
.byte 0x25# %
.byte 0x4F# O
.byte 0xEE

swl   $a0, -0x1AC9($k0)
lwc2    $4, 0x5199($ra)
bne   $a2, $a0, 0x17308

.byte 0xD1
.byte 0xBE
.byte 0x85
.byte 0x19

swc2    $8, 0x659D($a2)
swc1    $f8, -0x2691($s6)
sltiu   $s6, $t4, -0x2691
sh      $t9, -0x7992($t4)
bne   $v0, $t0, 0x163A4
sltiu   $a3, $t2, -0x60DF
lbu   $v0, -0x11A5($v1)
pref    0x1B, 0x362($gp)
pref    7, 0x3173($sp)
blez    $t1, 0xB678
swc1    $f3, flt_CE4($zero)
pref    0x11, -0x704D($t4)
ori   $k1, $s2, 0x1F67
swr   $s6, 0x7533($sp)
swc2    $15, -0x67F4($k0)
ldl   $s3, 0xF2($t7)
bne   $s7, $a3, 0xFFFE973C
sh      $s1, -0x11AA($a2)
bnel    $a1, $t6, 0xFFFE566C
sdr   $s1, -0x4D65($zero)
sd      $s2, -0x24D7($t8)
scd   $s4, 0x5C8D($t7)

.byte 0xA2
.byte 0xE8
.byte 0x5C# \
.byte 0xED

bgtz    $t3, 0x189A0
sd      $t6, 0x5A2F($t9)
sdc2    $10, 0x3223($k1)
sb      $s3, 0x5744($t9)
lwr   $a2, 0x2C48($a0)
beql    $fp, $s2, 0xFFFF3258
```

同样重要的是要记住,巧妙地运用解压缩和解密技术(包括自修改),可能看起来像是一段不正确的反汇编代码,但是,它是能够正确运行的(注1)。

注1: 一段代码在经过压缩或者加密之后,他的机器码全都变乱了,因此,反汇编结果得到的是一段错误的反汇编代码。但是经过一段解压缩程序或者解密程序处理之后,它就能够还原出原来的机器码,因此反汇编出来的代码和运行结果都是正确的。

## 28.3 代码的熵值

(熵在理想的情况是,压缩(或加密)文件是每字节8位;如果每字节的熵为0,它可能是任意大小的空白文件) 在这里我们可以看到当CPU(ARM模式的ARM架构或者MIPS架构)采用4个字节的指令代码的时候,在这个意义上是最有效率的。

### 28.3.1 x86

Windows 2003系统下ntoskrnl.exe文件中的.text节表:`熵 = 每字节6.662739位。 最佳的压缩方法将这个593920个字节大小的文件的大小减少16%。 `Windows 7 x64系统下ntoskrnl.exe文件中的.text节表:`熵 = 每字节6.549586位。 最佳的压缩方法将这个1685504个字节大小的文件的大小减少18%。`

### 28.3.2 ARM(Thumb模式)

AngryBirds Classic `熵 = 每字节7.058766位。 最佳的压缩方法将这个3336888个字节大小的文件的大小减少11%。`

### 28.3.3 ARM(ARM模式)

Linux Kernel 3.8.8: `熵 = 每字节6.036160位。 最佳的压缩方法将这个6946037个字节大小的文件的大小减少24%。`

### 28.3.4 MIPS(小端序)

Windows NT 4系统下user32.dll文件中的.text节表: 熵 = 每字节6.098227位。 最佳的压缩方法将这个433152个字节大小的文件的大小减少23%。
页: [1]
查看完整版本: C++反汇编入门27.处理不当的反汇编代码