Guest User

SNK Comrpession

a guest
Sep 17th, 2021
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.17 KB | None | 0 0
  1. xmmword_140867F90 = FC FF FF FF 01 00 00 00 02 00 00 00 03 00 00 00
  2. xmmword_140867FA0 = 00 00 00 00 00 00 00 00 00 00 00 00 FF FF FF FF
  3.  
  4. __int64 __fastcall decompress(unsigned __int8 *scr_buff, unsigned __int8 *dst_buff, int decompressed_size)
  5. {
  6.   int v3; // ebp
  7.   unsigned __int8 *v4; // rbx
  8.   unsigned __int8 *v5; // rsi
  9.   unsigned __int8 *v6; // rax
  10.   __int64 result; // rax
  11.   unsigned int v8; // ecx
  12.   unsigned __int64 v9; // r9
  13.   size_t v10; // rdi
  14.   __int64 v11; // xmm0_8
  15.   unsigned __int8 *v12; // rbx
  16.   unsigned __int8 *v13; // rax
  17.   unsigned __int64 v14; // r9
  18.   unsigned __int64 v15; // r11
  19.   unsigned __int8 *v16; // r8
  20.   __int64 v17; // rcx
  21.   unsigned __int8 *v18; // r8
  22.   signed __int64 v19; // rdx
  23.   unsigned __int8 *v20; // rbx
  24.   __int64 v21; // rdx
  25.   unsigned __int64 v22; // r9
  26.   unsigned __int64 v23; // r10
  27.   unsigned __int8 *v24; // r8
  28.   unsigned __int8 *v25; // r8
  29.   __int64 v26; // rcx
  30.   unsigned __int8 *v27; // rax
  31.   unsigned __int8 *v28; // r9
  32.   unsigned __int8 *v29; // rdx
  33.   signed __int64 v30; // rcx
  34.   unsigned __int64 v31; // rdx
  35.   unsigned __int64 v32; // r9
  36.   _QWORD *v33; // rcx
  37.   signed __int64 v34; // r8
  38.   int v35[3]; // [rsp+20h] [rbp-78h]
  39.   __int64 v36; // [rsp+2Ch] [rbp-6Ch]
  40.   int v37; // [rsp+34h] [rbp-64h]
  41.   int v38; // [rsp+38h] [rbp-60h]
  42.   int v39; // [rsp+3Ch] [rbp-5Ch]
  43.   __int128 v40[2]; // [rsp+40h] [rbp-58h]
  44.  
  45.   v3 = scr_buff;
  46.   v4 = scr_buff;
  47.   v5 = &dst_buff[decompressed_size];
  48.   v35[0] = 0;
  49.   v35[2] = 2;
  50.   v35[1] = 1;
  51.   v6 = dst_buff;
  52.   v36 = 1i64;
  53.   v37 = 4;
  54.   v38 = 4;
  55.   v39 = 4;
  56.   v40[0] = _mm_load_si128(&xmmword_140867FA0);
  57.   v40[1] = _mm_load_si128(&xmmword_140867F90);
  58.   if ( !decompressed_size )
  59.   {
  60.     result = 0xFFFFFFFFi64;
  61.     if ( !*scr_buff )
  62.       result = 1i64;
  63.     return result;
  64.   }
  65.   while ( 1 )
  66.   {
  67.     while ( 1 )
  68.     {
  69.       v8 = *v4++;
  70.       v9 = v8;
  71.       v10 = v8 & 0xF;
  72.       if ( v10 > 8 || v6 > v5 - 26 )
  73.         break;
  74.       v11 = *v4;
  75.       v12 = &v4[v10];
  76.       *v6 = v11;
  77.       v13 = &v6[v10];
  78.       v14 = v8 >> 4;
  79.       v15 = *v12;
  80.       v4 = v12 + 2;
  81.       v16 = &v13[-v15];
  82.       if ( v14 == 15 || v15 < 8 )
  83.         goto LABEL_16;
  84.       *v13 = *v16;
  85.       *(v13 + 1) = *(v16 + 1);
  86.       *(v13 + 8) = *(v16 + 8);
  87.       v6 = &v13[v14 + 4];
  88.     }
  89.     if ( v10 == 15 )
  90.     {
  91.       do
  92.       {
  93.         v17 = *v4++;
  94.         v10 += v17;
  95.       }
  96.       while ( v17 == 255 );
  97.     }
  98.     v18 = &v6[v10];
  99.     if ( &v6[v10] > v5 - 8 )
  100.       break;
  101.     v19 = v4 - v6;
  102.     do
  103.     {
  104.       *v6 = *&v6[v19];
  105.       v6 += 8;
  106.     }
  107.     while ( v6 < v18 );
  108.     v20 = &v4[v10];
  109.     v13 = v18;
  110.     v15 = *v20;
  111.     v4 = v20 + 2;
  112.     v16 = &v18[-v15];
  113.     v14 = v9 >> 4;
  114. LABEL_16:
  115.     *v13 = v15;
  116.     if ( v14 == 15 )
  117.     {
  118.       do
  119.       {
  120.         v21 = *v4++;
  121.         v14 += v21;
  122.       }
  123.       while ( v21 == 255 );
  124.     }
  125.     v22 = v14 + 4;
  126.     v23 = &v13[v22];
  127.     if ( v15 >= 8 )
  128.     {
  129.       v26 = *v16;
  130.       v25 = v16 + 8;
  131.       *v13 = v26;
  132.     }
  133.     else
  134.     {
  135.       *v13 = *v16;
  136.       v13[1] = v16[1];
  137.       v13[2] = v16[2];
  138.       v13[3] = v16[3];
  139.       v24 = &v16[v35[v15]];
  140.       *(v13 + 1) = *v24;
  141.       v25 = &v24[-*(v40 + v15)];
  142.     }
  143.     v27 = v13 + 8;
  144.     if ( v23 <= (v5 - 12) )
  145.     {
  146.       *v27 = *v25;
  147.       if ( v22 > 0x10 )
  148.       {
  149.         v33 = v27 + 8;
  150.         v34 = v25 - (v27 + 8);
  151.         do
  152.         {
  153.           *v33 = *(v33 + v34 + 8);
  154.           ++v33;
  155.         }
  156.         while ( v33 < v23 );
  157.       }
  158.       goto LABEL_35;
  159.     }
  160.     v28 = v5 - 7;
  161.     if ( v23 > (v5 - 5) )
  162.       return (v3 - v4 - 1);
  163.     if ( v27 < v28 )
  164.     {
  165.       v29 = v27;
  166.       do
  167.       {
  168.         *v29 = *&v29[v25 - v27];
  169.         v29 += 8;
  170.       }
  171.       while ( v29 < v28 );
  172.       v30 = v28 - v27;
  173.       v27 = v5 - 7;
  174.       v25 += v30;
  175.     }
  176.     v31 = 0i64;
  177.     v32 = v23 - v27;
  178.     if ( v27 > v23 )
  179.       v32 = 0i64;
  180.     if ( v32 )
  181.     {
  182.       do
  183.       {
  184.         ++v31;
  185.         *v27++ = *v25++;
  186.       }
  187.       while ( v31 < v32 );
  188.       v6 = v23;
  189.     }
  190.     else
  191.     {
  192. LABEL_35:
  193.       v6 = v23;
  194.     }
  195.   }
  196.   if ( v18 == v5 )
  197.   {
  198.     memmove(v6, v4, v10);
  199.     return (v4 + v10 - v3);
  200.   }
  201.   return (v3 - v4 - 1);
  202. }
Advertisement
Add Comment
Please, Sign In to add comment