Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- xmmword_140867F90 = FC FF FF FF 01 00 00 00 02 00 00 00 03 00 00 00
- xmmword_140867FA0 = 00 00 00 00 00 00 00 00 00 00 00 00 FF FF FF FF
- __int64 __fastcall decompress(unsigned __int8 *scr_buff, unsigned __int8 *dst_buff, int decompressed_size)
- {
- int v3; // ebp
- unsigned __int8 *v4; // rbx
- unsigned __int8 *v5; // rsi
- unsigned __int8 *v6; // rax
- __int64 result; // rax
- unsigned int v8; // ecx
- unsigned __int64 v9; // r9
- size_t v10; // rdi
- __int64 v11; // xmm0_8
- unsigned __int8 *v12; // rbx
- unsigned __int8 *v13; // rax
- unsigned __int64 v14; // r9
- unsigned __int64 v15; // r11
- unsigned __int8 *v16; // r8
- __int64 v17; // rcx
- unsigned __int8 *v18; // r8
- signed __int64 v19; // rdx
- unsigned __int8 *v20; // rbx
- __int64 v21; // rdx
- unsigned __int64 v22; // r9
- unsigned __int64 v23; // r10
- unsigned __int8 *v24; // r8
- unsigned __int8 *v25; // r8
- __int64 v26; // rcx
- unsigned __int8 *v27; // rax
- unsigned __int8 *v28; // r9
- unsigned __int8 *v29; // rdx
- signed __int64 v30; // rcx
- unsigned __int64 v31; // rdx
- unsigned __int64 v32; // r9
- _QWORD *v33; // rcx
- signed __int64 v34; // r8
- int v35[3]; // [rsp+20h] [rbp-78h]
- __int64 v36; // [rsp+2Ch] [rbp-6Ch]
- int v37; // [rsp+34h] [rbp-64h]
- int v38; // [rsp+38h] [rbp-60h]
- int v39; // [rsp+3Ch] [rbp-5Ch]
- __int128 v40[2]; // [rsp+40h] [rbp-58h]
- v3 = scr_buff;
- v4 = scr_buff;
- v5 = &dst_buff[decompressed_size];
- v35[0] = 0;
- v35[2] = 2;
- v35[1] = 1;
- v6 = dst_buff;
- v36 = 1i64;
- v37 = 4;
- v38 = 4;
- v39 = 4;
- v40[0] = _mm_load_si128(&xmmword_140867FA0);
- v40[1] = _mm_load_si128(&xmmword_140867F90);
- if ( !decompressed_size )
- {
- result = 0xFFFFFFFFi64;
- if ( !*scr_buff )
- result = 1i64;
- return result;
- }
- while ( 1 )
- {
- while ( 1 )
- {
- v8 = *v4++;
- v9 = v8;
- v10 = v8 & 0xF;
- if ( v10 > 8 || v6 > v5 - 26 )
- break;
- v11 = *v4;
- v12 = &v4[v10];
- *v6 = v11;
- v13 = &v6[v10];
- v14 = v8 >> 4;
- v15 = *v12;
- v4 = v12 + 2;
- v16 = &v13[-v15];
- if ( v14 == 15 || v15 < 8 )
- goto LABEL_16;
- *v13 = *v16;
- *(v13 + 1) = *(v16 + 1);
- *(v13 + 8) = *(v16 + 8);
- v6 = &v13[v14 + 4];
- }
- if ( v10 == 15 )
- {
- do
- {
- v17 = *v4++;
- v10 += v17;
- }
- while ( v17 == 255 );
- }
- v18 = &v6[v10];
- if ( &v6[v10] > v5 - 8 )
- break;
- v19 = v4 - v6;
- do
- {
- *v6 = *&v6[v19];
- v6 += 8;
- }
- while ( v6 < v18 );
- v20 = &v4[v10];
- v13 = v18;
- v15 = *v20;
- v4 = v20 + 2;
- v16 = &v18[-v15];
- v14 = v9 >> 4;
- LABEL_16:
- *v13 = v15;
- if ( v14 == 15 )
- {
- do
- {
- v21 = *v4++;
- v14 += v21;
- }
- while ( v21 == 255 );
- }
- v22 = v14 + 4;
- v23 = &v13[v22];
- if ( v15 >= 8 )
- {
- v26 = *v16;
- v25 = v16 + 8;
- *v13 = v26;
- }
- else
- {
- *v13 = *v16;
- v13[1] = v16[1];
- v13[2] = v16[2];
- v13[3] = v16[3];
- v24 = &v16[v35[v15]];
- *(v13 + 1) = *v24;
- v25 = &v24[-*(v40 + v15)];
- }
- v27 = v13 + 8;
- if ( v23 <= (v5 - 12) )
- {
- *v27 = *v25;
- if ( v22 > 0x10 )
- {
- v33 = v27 + 8;
- v34 = v25 - (v27 + 8);
- do
- {
- *v33 = *(v33 + v34 + 8);
- ++v33;
- }
- while ( v33 < v23 );
- }
- goto LABEL_35;
- }
- v28 = v5 - 7;
- if ( v23 > (v5 - 5) )
- return (v3 - v4 - 1);
- if ( v27 < v28 )
- {
- v29 = v27;
- do
- {
- *v29 = *&v29[v25 - v27];
- v29 += 8;
- }
- while ( v29 < v28 );
- v30 = v28 - v27;
- v27 = v5 - 7;
- v25 += v30;
- }
- v31 = 0i64;
- v32 = v23 - v27;
- if ( v27 > v23 )
- v32 = 0i64;
- if ( v32 )
- {
- do
- {
- ++v31;
- *v27++ = *v25++;
- }
- while ( v31 < v32 );
- v6 = v23;
- }
- else
- {
- LABEL_35:
- v6 = v23;
- }
- }
- if ( v18 == v5 )
- {
- memmove(v6, v4, v10);
- return (v4 + v10 - v3);
- }
- return (v3 - v4 - 1);
- }
Advertisement
Add Comment
Please, Sign In to add comment