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-12 4:20

>>26
Raw output:

_Optlink char *l_0003F499(char *arg_1, char *arg_2) {
 char *v_esi = arg_1;
 char *v_edi = arg_2;
 char v_al;
 char v_ah;
 char v_cl;
 char v_dl;
 char v_dh;
 while(1) {
  unsigned short v_ax;
  v_al = *v_esi++;
  if(v_al>=0) {
   v_dl = v_al;
   v_al = *v_esi++;
   v_ah = v_al;
   if(v_al&=24) {
    v_cl = v_al<<3;
    while(v_cl) {
     *v_edi++ = *v_esi++;
     v_cl--;
    }
   }
   v_cl = (v_ah&7) + 3;
   v_al = v_ah;
   v_ax = (v_ah<<8)|v_al;
   v_ax = (((v_ax<<2)&0x380)|v_dl)+1;
   {
    char *v_esi = v_edi - v_ax;
    while(v_cl) {
     *v_edi++ = *v_esi++;
     v_cl--;
    }
   }
   continue;
  } else if(v_al&64) {
   v_dl = v_al;
   v_ah = *v_esi++;
   v_al = *v_esi++;
   v_dh = v_al;
   if(v_al&=3) {
    v_cl = v_al;
    while(v_cl) {
     *v_edi++ = *v_esi++;
     v_cl--;
    }
   }
   v_cl = (v_ah&31) + 3;
   v_dh = (v_dh>>1)&126;
   v_dl &= 63;
   v_al = v_ah;
   v_ax = (((((v_ah<<8)|v_al)<<1)&0x1c0)|(v_dh<<8)|v_dl)+1;
   {
    char *v_esi = v_edi - v_ax;
    while(v_cl) {
     *v_edi++ = *v_esi++;
     v_cl--;
    }
   }
   continue;
  } else if(v_al&48) {
   v_cl = ((v_al&15)+1)<<2;
   while(v_cl) {
    *v_edi++ = *v_esi++;
    v_cl--;
   }
   continue;
  } else if(v_al==-1)
   break;
  v_cl = v_al&15;
  while(v_cl) {
   *v_edi++ = *v_esi++;
   v_cl--;
  }
 }
 return v_esi;
}

Name: Cudder !MhMRSATORI!FBeUS42x4uM+kgp 2011-11-12 4:22

After some minor expression substitution:

__Optlink char *l_0003F499(char *arg_1, char *arg_2) {
 char *v_esi = arg_1;
 char *v_edi = arg_2;
 char v_al;
 char v_ah;
 char v_cl;
 char v_dl;
 char v_dh;
 while(1) {
  unsigned short v_ax;
  v_al = *v_esi++;
  if(v_al>=0) {
   v_dl = v_al;
   v_al = *v_esi++;
   v_ah = v_al;
   if(v_al&=24) {
    v_cl = v_al<<3;
    while(v_cl) {
     *v_edi++ = *v_esi++;
     v_cl--;
    }
   }
   v_cl = (v_ah&7) + 3;
   v_ax = (((((v_ah<<8)|v_ah)<<2)&0x380)|v_dl)+1;
   {
    char *v_esi = v_edi - v_ax;
    while(v_cl) {
     *v_edi++ = *v_esi++;
     v_cl--;
    }
   }
   continue;
  } else if(v_al&64) {
   v_dl = v_al;
   v_ah = *v_esi++;
   v_al = *v_esi++;
   v_dh = v_al;
   if(v_al&=3) {
    v_cl = v_al;
    while(v_cl) {
     *v_edi++ = *v_esi++;
     v_cl--;
    }
   }
   v_cl = (v_ah&31) + 3;
   v_ax = (((((v_ah<<8)|v_ah)<<1)&0x1c0)|(((v_dh>>1)&126)<<8)|(v_dl&63))+1;
   {
    char *v_esi = v_edi - v_ax;
    while(v_cl) {
     *v_edi++ = *v_esi++;
     v_cl--;
    }
   }
   continue;
  } else if(v_al&48) {
   v_cl = ((v_al&15)+1)<<2;
   while(v_cl) {
    *v_edi++ = *v_esi++;
    v_cl--;
   }
   continue;
  } else if(v_al==-1)
   break;
  v_cl = v_al&15;
  while(v_cl) {
   *v_edi++ = *v_esi++;
   v_cl--;
  }
 }
 return v_esi;
}

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