Return Styles: Pseud0ch, Terminal, Valhalla, NES, Geocities, Blue Moon. Entire thread

LZ unpacker

Name: Anonymous 2011-11-10 13:07

Have you seen original source code for following routine?

_BYTE *__fastcall decodeLZ_sub(_BYTE *Dst, void *Src)
{
  _BYTE *D; // esi@1
  _BYTE *S; // edi@1
  unsigned int i; // ecx@1
  char v5; // al@2
  _BYTE *R; // esi@2
  char v7; // dl@3
  char v8; // al@3
  __int16 v9; // ax@3
  __int16 v10; // ax@5
  char v11; // dl@7
  char v12; // al@7
  _BYTE *v13; // esi@7
  unsigned __int8 v14; // dh@7
  __int16 v15; // ax@7
  __int16 v16; // dx@9

  D = Dst;
  S = Src;
  for ( i = 0; ; S += i )
  {
    while ( 1 )
    {
      while ( 1 )
      {
        while ( 1 )
        {
          v5 = *D;
          R = D + 1;
          if ( v5 < 0 )
            break;
          v7 = v5;
          v8 = *R;
          D = R + 1;
          HIBYTE(v9) = v8;
          LOBYTE(v9) = v9 & 0x18;
          if ( (_BYTE)v9 )
          {
            LOBYTE(i) = (unsigned __int8)v9 >> 3;
            memcpy(S, D, i);
            D += i;
            S += i;
            i = 0;
          }
          LOBYTE(i) = (HIBYTE(v9) & 7) + 3;
          LOBYTE(v9) = HIBYTE(v9);
          v10 = 4 * v9 & 0x380;
          LOBYTE(v10) = v7 | v10;
          memcpy(S, &S[-(unsigned __int16)(v10 + 1)], i);
          S += i;
        }
        if ( v5 & 0x40 )
          break;
        v11 = v5;
        v12 = *R;
        v13 = R + 1;
        HIBYTE(v15) = v12;
        LOBYTE(v15) = *v13;
        D = v13 + 1;
        v14 = v15;
        LOBYTE(v15) = v15 & 3;
        if ( (_BYTE)v15 )
        {
          LOBYTE(i) = v15;
          memcpy(S, D, i);
          D += i;
          S += i;
          i = 0;
        }
        LOBYTE(i) = (HIBYTE(v15) & 0x1F) + 3;
        HIBYTE(v16) = (v14 >> 1) & 0x7E;
        LOBYTE(v16) = v11 & 0x3F;
        LOBYTE(v15) = HIBYTE(v15);
        memcpy(S, &S[-(unsigned __int16)((v16 | 2 * v15 & 0x1C0) + 1)], i);
        S += i;
      }
      if ( v5 & 0x30 )
        break;
      LOBYTE(i) = 4 * ((v5 & 0xF) + 1);
      memcpy(S, R, i);
      D = &R[i];
      S += i;
    }
    if ( v5 == -1 )
      break;
    LOBYTE(i) = v5 & 0xF;
    memcpy(S, R, i);
    D = &R[i];
  }
  return R;
}

Name: Anonymous 2011-11-10 19:08

An example of code it wont decompile:




.data



byte_curbits db 0

word_maxvalue dw 0

word_dicreset dw 0

word_incbits dw 0



dword_buff2 dd 0

dword_buff3 dd 0

dword_buff4 dd 0



dword_427B51 dd 0

byte_427B4C db 0

word_nextcode dw 0

dword_427B4D dd 0

word_427ABE dw 0

word_427AC2 dw 0

word_427AC0 dw 0



dword_stack dd ?



dword_usize dd ?

dword_psize dd ?

dword_outbf dd ?



dword_input dd ?

dword_buff2_b db 8D00h dup(?)

dword_buff3_b db 4680h dup(?)

dword_buff4_b db 0FA0h dup(?)



.code

proc unlzw

        pop    eax ; retnaddr

        pop    [dword_usize]

        pop    [dword_psize]

        pop    [dword_outbf]

        pop    [dword_input] ; input

        push    eax ;retnaddr



        push    ebp

        mov    ebp, esp

        push    ebx

        push    esi

        push    edi



        mov    [dword_stack], esp



        mov    ebx, [dword_usize] ; u

        mov    eax, [dword_psize] ; p

        mov    edi, [dword_outbf] ; out



        push    edi ; output buffer

        push    eax ; packed size

        push    ebx ; unpacked size (edi size)



        mov edx, dword_buff2_b

        mov [dword_buff2], edx



        mov edx, dword_buff3_b

        mov [dword_buff3], edx



        mov edx, dword_buff4_b

        mov [dword_buff4], edx



        pop    ebx

        pop    eax

        pop    edi

        push    edi

        mov    edx, eax

        mov    eax, edx

        mov    [dword_427B51], 0

        mov    esi, [dword_input]

        push    esi

        mov    edi, [dword_input]

;               call    sub_40BAA9 ; read from file to buffer

        pop    esi

        pop    edi

        ; start unpacking code

        mov    al, 9

        call    lzwinit

        mov    [byte_427B4C], 0



loc_40BB49:

        mov    [word_nextcode], 100h

        mov    ebx, [dword_427B4D]

        mov    ch, [byte_curbits]

        mov    cl, [byte_427B4C]

        mov    edx, [dword_427B51]



loc_40BB6A:

        shl    ebx, 8

        mov    bl, [esi]

        inc    esi

        add    cl, 8

        or    edx, edx

        jz    short loc_40BB8C

        dec    edx

        or    edx, edx

        ja    short loc_40BB8C

        mov    esi, [dword_input]

        mov    [dword_427B51], 0



loc_40BB8C:



        cmp    ch, cl

        jg    short loc_40BB6A

        mov    [dword_427B51], edx

        sub    cl, ch

        mov    eax, ebx

        shr    eax, cl

        and    ax, [word_maxvalue]

        mov    [byte_427B4C], cl

        mov    [dword_427B4D], ebx

        mov    [word_427ABE], ax

        mov    [word_427AC2], ax

        stosb



loc_40BBBC:

        mov    ebx, [dword_427B4D]

        mov    ch, [byte_curbits]

        mov    cl, [byte_427B4C]

        mov    edx, [dword_427B51]



loc_40BBD4:

        shl    ebx, 8

        mov    bl, [esi]

        inc    esi

        add    cl, 8

        or    edx, edx

        jz    short loc_40BBF6

        dec    edx

        or    edx, edx

        ja    short loc_40BBF6

        mov    esi, [dword_input]

        mov    [dword_427B51], 0



loc_40BBF6:



        cmp    ch, cl

        jg    short loc_40BBD4

        mov    [dword_427B51], edx

        sub    cl, ch

        mov    eax, ebx

        shr    eax, cl

        and    ax, [word_maxvalue]

        mov    [byte_427B4C], cl

        mov    [dword_427B4D], ebx

        mov    [word_427AC0], ax

        cmp    ax, [word_maxvalue]

        jz    loc_endproc

        cmp    ax, [word_dicreset]

        jz    loc_40BB49

        mov    ebp, [dword_buff4]

        mov    bx, ax

        cmp    ax, [word_nextcode]

        jl    short loc_40BC5D

        mov    dx, [word_427AC2]

        mov    [ebp+0], dl

        inc    ebp

        mov    bx, [word_427ABE]



loc_40BC5D:

        push    ax

        xor    cx, cx

        jmp    short loc_40BC93

; ---------------------------------------------------------------------------



loc_40BC64:

        movzx    ebx, bx

        mov    edx, [dword_buff3]

        mov    al, [ebx+edx]

        mov    [ebp+0], al

        inc    ebp

        shl    ebx, 1

        mov    edx, [dword_buff2]

        mov    bx, [edx+ebx]

        inc    cx

        cmp    cx, 0FA0h

        jb    short loc_40BC93

                ; Fatal error, code depth too great.

        xor    eax, eax

        inc    eax

        mov    esp, [dword_stack] ; restore stack

        jmp    loc_endproc_error

; ---------------------------------------------------------------------------



loc_40BC93:



        cmp    bx, 0FFh

        jg    short loc_40BC64

        mov    [ebp+0], bl

        movzx    ax, byte [ebp+0]

        mov    [word_427AC2], ax



loc_40BCA8:

        cmp    ebp, [dword_buff4]

        jb    short loc_40BCB7

        mov    al, [ebp+0]

        stosb

        dec    ebp

        jmp    short loc_40BCA8

; ---------------------------------------------------------------------------



loc_40BCB7:

        xor    ebp, ebp

        mov    bp, [word_nextcode]

        shl    bp, 1

        add    ebp, [dword_buff2]

        mov    ax, [word_427ABE]

        mov    [ebp+0], ax

        xor    ebp, ebp

        mov    bp, [word_nextcode]

        add    ebp, [dword_buff3]

        mov    ax, [word_427AC2]

        mov    [ebp+0], al

        inc    [word_nextcode]

        mov    ax, [word_nextcode]

        cmp    ax, [word_incbits]

        jle    short loc_40BD16

        cmp    [byte_curbits], 0Eh

        jge    short loc_40BD16

        mov    al, [byte_curbits]

        inc    al

        call    lzwinit



loc_40BD16:



        pop    ax

        mov    [word_427ABE], ax

        jmp    loc_40BBBC

; ---------------------------------------------------------------------------



loc_endproc:

        xor    eax, eax

loc_endproc_error:

        pop    edi

        pop    esi

        pop    ebx

        pop    ebp

        retn

endp

Newer Posts
Don't change these.
Name: Email:
Entire Thread Thread List