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: Cudder !MhMRSATORI!FBeUS42x4uM+kgp 2011-11-11 5:02

Post the original, I'll try it with mine.

>>15

char byte_curbits;
short word_maxvalue;
short word_dicreset;
short word_incbits;
unsigned short *dword_buff2;
char *dword_buff3;
char *dword_buff4;
unsigned int dword_427B51;
char byte_427B4C;
unsigned short word_nextcode;
int dword_427B4D;
short word_427ABE;
short word_427AC2;
short word_427AC0;
char *dword_stack;
int dword_usize;
int dword_psize;
int dword_outbf;
int dword_input;
unsigned short dword_buff2_b[0x4680];
char dword_buff3_b[0x4680];
char dword_buff4_b[0xFA0];

int unlzw(char *arg_1, char *arg_2, int arg_3, int arg_4) {
 dword_usize = arg_4;
 dword_psize = arg_3;
 dword_outbf = arg_2;
 dword_input = arg_1;
 char *v_edi = dword_outbf;
 dword_buff2 = &dword_buff2_b;
 dword_buff3 = &dword_buff3_b;
 dword_buff4 = &dword_buff4_b;
 dword_427B51 = 0;
 char *v_esi = dword_input;
 sub_40BAA9(v_esi, dword_outbf);
 lzwinit();
 byte_427B4C = 0;
 short v_ax;
 do { /* loc_40BB49 */
  word_nextcode = 256;
  int v_ebx = dword_427B4D;
  char v_ch = byte_curbits;
  char v_cl = byte_427B4C;
  unsigned int v_edx = dword_427B51;
  do { /* loc_40BB6A */
   v_ebx = (v_ebx<<8) | *v_esi++;
   v_cl += 8;
   if(!v_edx && !--v_edx) {
    v_esi = dword_input;
    dword_427B51 = 0;
   }
  } while(v_ch > v_cl);
  dword_427B51 = v_edx;
  v_cl -= v_ch;
  v_ax = (v_ebx<<v_cl)&word_maxvalue;
  byte_427B4C = v_cl;
  dword_427B4D = v_ebx;
  word_427ABE = v_ax;
  word_427AC2 = v_ax;
  *v_edi++ = v_ax;
 loc_40BBBC:
  v_ebx = dword_427B4D;
  v_ch = byte_curbits;
  v_cl = byte_427B4C;
  v_edx = dword_427B51;
  do { /* loc_40BBD4 */
   v_ebx = (v_ebx<<8) | *v_esi++;
   v_cl += 8;
   if(!v_edx && !--v_edx) {
    v_esi = dword_input;
    dword_427B51 = 0;
   }
  } while(v_ch > v_cl);
  dword_427B51 = v_edx;
  v_cl -= v_ch;
  v_ax = (v_ebx<<v_cl)&word_maxvalue;
  byte_427B4C = v_cl;
  dword_427B4D = v_ebx;
  word_427AC0 = v_ax;
  if(v_ax == word_maxvalue)
   return 0;
 } while(v_ax == word_dicreset);
 unsigned char *v_ebp = dword_buff4;
 unsigned short v_bx = v_ax;
 if(v_ax >= word_nextcode) {
  *v_ebp++ = word_427AC2;
  v_bx = word_427ABE;
 }
 unsigned short v_cx = 0;
 while(v_bx > 255) {
  *v_ebp++ = dword_buff3[v_bx];
  v_bx = dword_buff2[v_bx];
  if(++v_cx >= 4000)
   return 1;
 }
 *v_ebp = v_bx;
 word_427AC2 = *v_ebp;
 while(v_ebp >= dword_buff4)
  *v_edi++ = *v_ebp--;
 dword_buff2[word_nextcode] = word_427ABE;
 dword_buff3[word_nextcode++] = word_427AC2;
 if((signed short)word_nextcode > word_incbits && byte_curbits < 14)
  lzwinit();
 word_427ABE = v_ax;
 goto loc_40BBBC;
}

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