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-11 5:39

>>25

0003F499                 push    ds
0003F49A                 pop     es
0003F49B                 push    ecx
0003F49C                 push    esi
0003F49D                 push    edi
0003F49E                 mov     esi, eax
0003F4A0                 mov     edi, edx
0003F4A2                 xor     ecx, ecx
0003F4A4
0003F4A4 head:                                   ; CODE XREF: hlib_decodeLZ_sub+49j
0003F4A4                                         ; hlib_decodeLZ_sub+8Bj ...
0003F4A4                 lodsb
0003F4A5                 or      al, al
0003F4A7                 jl      short al_has_0x80
0003F4A9                 mov     dl, al
0003F4AB                 lodsb
0003F4AC                 mov     ah, al
0003F4AE                 and     al, 18h
0003F4B0                 jz      short skip_copy1
0003F4B2                 shr     al, 1
0003F4B4                 shr     al, 1
0003F4B6                 shr     al, 1
0003F4B8                 mov     cl, al
0003F4BA                 rep movsb
0003F4BC
0003F4BC skip_copy1:                             ; CODE XREF: hlib_decodeLZ_sub+17j
0003F4BC                 mov     cl, ah
0003F4BE                 and     cl, 7
0003F4C1                 inc     cl
0003F4C3                 inc     cl
0003F4C5                 inc     cl
0003F4C7                 mov     al, ah
0003F4C9                 shl     ax, 1
0003F4CC                 shl     ax, 1
0003F4CF                 and     ax, 380h
0003F4D3                 or      al, dl
0003F4D5                 inc     ax
0003F4D7                 push    esi
0003F4D8                 mov     esi, edi
0003F4DA                 movzx   eax, ax
0003F4DD                 sub     esi, eax
0003F4DF                 rep movsb
0003F4E1                 pop     esi
0003F4E2                 jmp     short head
0003F4E4 ; ---------------------------------------------------------------------------
0003F4E4
0003F4E4 al_has_0x80:                            ; CODE XREF: hlib_decodeLZ_sub+Ej
0003F4E4                 test    al, 40h
0003F4E6                 jnz     short al_has_0x40
0003F4E8                 mov     dl, al
0003F4EA                 lodsb
0003F4EB                 mov     ah, al
0003F4ED                 lodsb
0003F4EE                 mov     dh, al
0003F4F0                 and     al, 3
0003F4F2                 jz      short skip_copy2
0003F4F4                 mov     cl, al
0003F4F6                 rep movsb
0003F4F8
0003F4F8 skip_copy2:                             ; CODE XREF: hlib_decodeLZ_sub+59j
0003F4F8                 mov     cl, ah
0003F4FA                 and     cl, 1Fh
0003F4FD                 inc     cl
0003F4FF                 inc     cl
0003F501                 inc     cl
0003F503                 shr     dh, 1
0003F505                 and     dh, 7Eh
0003F508                 and     dl, 3Fh
0003F50B                 mov     al, ah
0003F50D                 shl     ax, 1
0003F510                 and     ax, 1C0h
0003F514                 or      ax, dx
0003F517                 inc     ax
0003F519                 push    esi
0003F51A                 mov     esi, edi
0003F51C                 movzx   eax, ax
0003F51F                 sub     esi, eax
0003F521                 rep movsb
0003F523                 pop     esi
0003F524                 jmp     head
0003F529 ; ---------------------------------------------------------------------------
0003F529
0003F529 al_has_0x40:                            ; CODE XREF: hlib_decodeLZ_sub+4Dj
0003F529                 test    al, 30h
0003F52B                 jnz     short al_has_0x30
0003F52D                 and     al, 0Fh
0003F52F                 inc     al
0003F531                 shl     al, 1
0003F533                 shl     al, 1
0003F535                 mov     cl, al
0003F537                 rep movsb
0003F539                 jmp     head
0003F53E ; ---------------------------------------------------------------------------
0003F53E
0003F53E al_has_0x30:                            ; CODE XREF: hlib_decodeLZ_sub+92j
0003F53E                 cmp     al, 0FFh
0003F540                 jz      short end
0003F542                 and     al, 0Fh
0003F544                 mov     cl, al
0003F546                 rep movsb
0003F548                 jmp     head
0003F54D ; ---------------------------------------------------------------------------
0003F54D
0003F54D end:                                    ; CODE XREF: hlib_decodeLZ_sub+A7j
0003F54D                 mov     eax, esi
0003F54F                 pop     edi
0003F550                 pop     esi
0003F551                 pop     ecx
0003F552                 retn

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