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 1:02

Here is a manually disassembled version. Note the obsence of memcpy (which were erroneously supplied by decompiler)

static int decodeLZ(u1 *Dst, u1 *Src) {
  u4 A=0, B=0, C=0, D=0;
  u1 *P, *O = Dst;

  for (AL = *Src++; AL != 0xFF; AL = *Src++) {
    if (!(AL&0x80)) {
      DL = AL;
      AL = *Src++;
      AH = AL;
      AL &= 0x18;
      if (AL) {
        AL >>= 3;
        for (CL=AL; CL; CL--) *Dst++ = *Src++;
      }
      CL = (AH&7)+3; //backref len
      AL = AH;
      P = Dst - (((AX<<2)&0x380)|DL) - 1; //backref off
      for (; CL; CL--) *Dst++ = *P++;
    } else if (!(AL&0x40)) {
      DL = AL;
      AL = *Src++;
      AH = AL;
      AL = *Src++;
      DH = AL;
      AL &= 3;
      for (CL=AL; CL; CL--) *Dst++ = *Src++;
      CL = (AH&0x1F)+3;
      DH = (DH>>1)&0x7E;
      DL = 0x3F;
      AL = AH;
      P = Dst - (((AX<<1)&0x1C0)|DX) - 1;
      for (; CL; CL--) *Dst++ = *P++;
    } else if (!(AL&0x30)) {
      CL = ((AL&0xF)+1)<<2;
      for (; CL; CL--) *Dst++ = *P++;
    } else {
      for (CL=AL&0xF; CL; CL--) *Dst++ = *Src++;
    }
  }

  return Dst-O;
}

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