Skip to content

Instantly share code, notes, and snippets.

@shuffle2
Created August 12, 2019 01:42
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save shuffle2/0be391dc80e30343ffa154d6dc43ecec to your computer and use it in GitHub Desktop.
Save shuffle2/0be391dc80e30343ffa154d6dc43ecec to your computer and use it in GitHub Desktop.
lzra decompile
void LZRA_decompress(u8 *dest, u32 out_size, u8 *compress_data, u8 **next_ptr) {
u8 *input; // r11@1
int v7; // r3@1
u8 v8; // r6@1
int v9; // r4@1
s32 v10; // lr@7
u8 *v11; // r12@7
u32 v12; // r9@7
s32 v13; // r3@7
u8 *v14; // r1@8
u32 v15; // r0@8
int v16; // r8@8
int v17; // r5@9
u32 v18; // r5@9
u32 v19; // r6@10
int v20; // r2@11
u32 v21; // r6@11
u8 *v22; // r2@16
int v23; // r0@17
u32 v24; // r2@17
s32 v25; // r8@19
u32 v26; // r10@19
int v27; // r2@19
u8 *v28; // r2@22
int v29; // r0@22
int v30; // r6@18
int v31; // r3@23
u32 v32; // r3@23
u32 v33; // r6@24
int v34; // r6@26
int v35; // r9@30
int v36; // lr@31
int v37; // r2@31
u32 v38; // r0@31
int v39; // r1@33
u32 v40; // r6@33
u32 v41; // r3@33
u32 v42; // r0@37
u32 v43; // r3@39
u32 v44; // r0@39
int v45; // r0@43
int v46; // r0@44
int v47; // r1@45
u32 v48; // r0@50
u32 v49; // r0@52
u32 v50; // r0@57
u32 v51; // r1@59
u32 v52; // r0@59
u32 v53; // r0@63
u32 v54; // r0@65
int v55; // r0@69
s32 v56; // r1@71
int v57; // lr@71
s32 v58; // r3@73
int v59; // r0@74
u32 v60; // r5@74
u32 v61; // r0@75
int v62; // r6@78
u32 v63; // r0@78
s32 v64; // r6@80
s32 v65; // r0@82
int v66; // r3@84
int v67; // r2@84
u32 v68; // r0@84
u32 v69; // lr@86
int v70; // r5@86
s32 v71; // r9@86
u32 v72; // r6@86
s32 v73; // r0@87
u32 v74; // r1@90
u32 v75; // r6@92
u32 v76; // r1@92
int v77; // r1@99
int v78; // r2@100
u32 v79; // r1@104
u32 v80; // r1@106
u32 v81; // r1@110
u32 v82; // r2@112
u32 v83; // r1@112
int v84; // r1@116
u32 v85; // r3@116
u32 v86; // r3@118
int v87; // r1@85
int v88; // r1@32
int v89; // r5@105
int v90; // r2@111
int v91; // r2@51
int v92; // r1@58
int v93; // r6@91
int v94; // r6@117
int v95; // r3@38
int v96; // r3@64
int v97; // r1@98
char v99; // [sp+20h] [bp-CD0h]@7
u8 *v100; // [sp+24h] [bp-CCCh]@7
u32 v101; // [sp+28h] [bp-CC8h]@7
u8 *v102; // [sp+2Ch] [bp-CC4h]@17
int v103; // [sp+34h] [bp-CBCh]@82
u8 dst[3240]; // [sp+38h] [bp-CB8h]@6
int v105; // [sp+CE0h] [bp-10h]@1
input = compress_data;
v105 = dword_C2190000;
v7 = compress_data[2];
v8 = *compress_data;
v9 = _byteswap_ulong(*(u32 *)(compress_data + 1));
if (*compress_data & 0x80) {
if (v9 <= out_size) {
memcpy(dest, compress_data + 5, v9);
if (next_ptr)
*next_ptr = &input[v9 + 5];
}
} else {
memset(dst, -128 - (2 * v8 & 0x30), 0xCA8);
if (out_size) {
v10 = 0;
v101 = (u32)&dest[out_size];
v99 = v8 & 7;
v11 = dest;
v12 = -1;
v13 = 0;
v100 = dest;
do {
v14 = dst;
v15 = (v13 & 0xFFFFF8FF | (((u8)v11 & 7) << 8)) >> v99;
v13 = 1;
v16 = 255 * (v15 & 7) - 1;
do {
v20 = v16 + v13;
v21 = *(&dst[v16] + v13);
if (v12 >> 24) {
v18 = v12;
} else {
v17 = (input++)[5];
v9 = v17 | (v9 << 8);
v18 = v12 << 8;
}
v13 *= 2;
v12 = (v18 >> 8) * v21;
v19 = v21 - (v21 >> 3);
if (v9 < v12) {
v19 = v19 + 31;
v13 |= 1u;
} else {
v9 -= v12;
v12 = v18 - v12;
}
dst[v20] = v19;
} while (v13 < 256);
v22 = v11;
while (1) {
v23 = v10 + 2920;
*v22 = v13;
v11 = v22 + 1;
v102 = v22;
v24 = v14[v10 + 2920];
if (!(v12 >> 24)) {
v30 = input[5];
v12 <<= 8;
++input;
v9 = v30 | (v9 << 8);
}
v25 = 0;
v26 = (v12 >> 8) * v24;
v27 = v24 - (v24 >> 4);
if (v9 < v26)
v25 = 1;
if (v9 >= v26)
break;
dst[v23] = v27 + 15;
v28 = &dst[v10 + 2928];
v29 = 0;
while (1) {
v33 = v28[8 * v29];
if (v26 >> 24) {
v32 = v26;
} else {
v31 = (input++)[5];
v9 = v31 | (v9 << 8);
v32 = v26 << 8;
}
v26 = (v32 >> 8) * v33;
v34 = v33 - (v33 >> 4);
if (v9 >= v26)
break;
v28[8 * v29++] = v34 + 15;
if (v29 == 7)
goto LABEL_30;
}
v9 -= v26;
v26 = v32 - v26;
*(&dst[8 * v29 + 0xB70] + v10) = v34;
LABEL_30:
v35 = v29 - 1;
if (v29 - 1 >= 0) {
v36 = v10 & 7 | 32 * v35 | 8 * ((u32)v11 << v35) & 0x18;
v37 = v36 + 2984;
v38 = dst[v36 + 2984];
if (!(v26 >> 24)) {
v88 = input[5];
v26 <<= 8;
++input;
v9 = v88 | (v9 << 8);
}
v39 = v35 - 3;
v40 = (v26 >> 8) * v38;
v41 = v38 - (v38 >> 4);
if (v9 >= v40) {
v9 -= v40;
v40 = v26 - v40;
v25 = 2;
} else {
v41 = v41 + 15;
v25 = 3;
}
dst[v37] = v41;
if (v39 < 0) {
v26 = v40;
} else {
if (v39 >= 1) {
v42 = (u8)v41;
if (!(v40 >> 24)) {
v95 = input[5];
v40 <<= 8;
++input;
v9 = v95 | (v9 << 8);
}
v25 *= 2;
v43 = (v40 >> 8) * v42;
v44 = v42 - (v42 >> 4);
if (v9 >= v43) {
v9 -= v43;
v43 = v40 - v43;
} else {
v44 = v44 + 15;
v25 |= 1u;
}
dst[v37] = v44;
if (v39 != 1) {
if (!(v43 >> 24)) {
v45 = input[5];
v43 <<= 8;
++input;
v9 = v45 | (v9 << 8);
}
v46 = 4 - v35;
do {
v47 = 2 * v25 | 1;
if (v9 >= v43 >> 1) {
v47 = 2 * v25;
v9 -= v43 >> 1;
}
++v46;
v43 >>= 1;
v25 = v47;
} while (v46);
v25 = v47;
}
v40 = v43;
}
v48 = dst[v36 + 3008];
if (!(v40 >> 24)) {
v91 = input[5];
v40 <<= 8;
++input;
v9 = v91 | (v9 << 8);
}
v25 *= 2;
v26 = (v40 >> 8) * v48;
v49 = v48 - (v48 >> 4);
if (v9 >= v26) {
v9 -= v26;
v26 = v40 - v26;
} else {
v49 = v49 + 15;
v25 |= 1u;
}
dst[v36 + 3008] = v49;
}
if (v35 >= 1) {
v50 = dst[v36 + 2992];
if (!(v26 >> 24)) {
v92 = input[5];
v26 <<= 8;
++input;
v9 = v92 | (v9 << 8);
}
v25 *= 2;
v51 = (v26 >> 8) * v50;
v52 = v50 - (v50 >> 4);
if (v9 >= v51) {
v9 -= v51;
v51 = v26 - v51;
} else {
v52 = v52 + 15;
v25 |= 1u;
}
dst[v36 + 2992] = v52;
if (v35 == 1) {
v26 = v51;
} else {
v53 = dst[v36 + 3000];
if (!(v51 >> 24)) {
v96 = input[5];
v51 <<= 8;
++input;
v9 = v96 | (v9 << 8);
}
v25 *= 2;
v26 = (v51 >> 8) * v53;
v54 = v53 - (v53 >> 4);
if (v9 >= v26) {
v9 -= v26;
v26 = v51 - v26;
} else {
v54 = v54 + 15;
v25 |= 1u;
}
dst[v36 + 3000] = v54;
}
}
if (v25 == 0xFF) {
if (next_ptr)
*next_ptr = input + 5;
goto LABEL_144;
}
}
v55 = v35;
if (v25 < 3)
v55 = v35 + 248;
v56 = 256;
v57 = v55 + 2033;
if (v25 < 3)
v56 = 64;
v58 = 8;
do {
if (v26 >> 24) {
v60 = v26;
} else {
v59 = input[5];
v60 = v26 << 8;
++input;
v9 = v59 | (v9 << 8);
}
v62 = v57 + v58;
v63 = *(&dst[v57] + v58);
v58 *= 2;
v26 = v63 * (v60 >> 8);
v61 = v63 - (v63 >> 3);
if (v9 < v26) {
v58 += 8;
v61 = v61 + 31;
} else {
v9 -= v26;
v26 = v60 - v26;
}
dst[v62] = v61;
v64 = v58 - v56;
} while (v58 - v56 < 0);
if (v58 == v56) {
v12 = v26;
} else {
v65 = 0;
v103 = (v64 >> 3) - 1;
if (v25 > 2)
v65 = 1;
v66 = v35 & 7 | 32 * ((v64 >> 3) - 1) | 8 * (v65 << ((v64 >> 3) - 1)) & 0x18;
v67 = v66 + 2344;
v68 = dst[v66 + 2344];
if (!(v26 >> 24)) {
v87 = input[5];
v26 <<= 8;
++input;
v9 = v87 | (v9 << 8);
}
v69 = (v26 >> 8) * v68;
v70 = (v64 >> 3) - 4;
v71 = v64 >> 3;
v72 = v68 - (v68 >> 4);
if (v9 >= v69) {
v9 -= v69;
v69 = v26 - v69;
v73 = 2;
} else {
v72 = v72 + 15;
v73 = 3;
}
dst[v67] = v72;
if (v70 < 0) {
v12 = v69;
} else {
if (v70 >= 1) {
v74 = (u8)v72;
if (!(v69 >> 24)) {
v93 = input[5];
v69 <<= 8;
++input;
v9 = v93 | (v9 << 8);
}
v73 *= 2;
v75 = v74 * (v69 >> 8);
v76 = v74 - (v74 >> 4);
if (v9 >= v75) {
v9 -= v75;
v75 = v69 - v75;
} else {
v76 = v76 + 15;
v73 |= 1u;
}
dst[v67] = v76;
if (v70 == 1) {
v69 = v75;
} else {
if (!(v75 >> 24)) {
v97 = input[5];
v75 <<= 8;
++input;
v9 = v97 | (v9 << 8);
}
v77 = 5 - v71;
do {
v78 = 2 * v73 | 1;
if (v9 >= v75 >> 1) {
v78 = 2 * v73;
v9 -= v75 >> 1;
}
++v77;
v75 >>= 1;
v73 = v78;
} while (v77);
v69 = v75;
v73 = v78;
}
}
v79 = dst[v66 + 2368];
if (!(v69 >> 24)) {
v89 = input[5];
v69 <<= 8;
++input;
v9 = v89 | (v9 << 8);
}
v73 *= 2;
v12 = (v69 >> 8) * v79;
v80 = v79 - (v79 >> 4);
if (v9 >= v12) {
v9 -= v12;
v12 = v69 - v12;
} else {
v80 = v80 + 15;
v73 |= 1u;
}
dst[v66 + 2368] = v80;
}
if (v103 >= 1) {
v81 = dst[v66 + 2352];
if (!(v12 >> 24)) {
v90 = input[5];
v12 <<= 8;
++input;
v9 = v90 | (v9 << 8);
}
v73 *= 2;
v82 = v81 * (v12 >> 8);
v83 = v81 - (v81 >> 4);
if (v9 >= v82) {
v9 -= v82;
v82 = v12 - v82;
} else {
v83 = v83 + 15;
v73 |= 1u;
}
dst[v66 + 2352] = v83;
if (v103 == 1) {
v12 = v82;
} else {
v84 = v66 + 2360;
v85 = dst[v66 + 2360];
if (!(v82 >> 24)) {
v94 = input[5];
v82 <<= 8;
++input;
v9 = v94 | (v9 << 8);
}
v73 *= 2;
v12 = (v82 >> 8) * v85;
v86 = v85 - (v85 >> 4);
if (v9 >= v12) {
v9 -= v12;
v12 = v82 - v12;
} else {
v86 = v86 + 15;
v73 |= 1u;
}
dst[v84] = v86;
}
}
v64 = v73 - 1;
}
if (v11 - v100 <= (u32)v64)
goto LABEL_144;
v22 = &v102[v25 + 1];
if ((u32)v22 >= v101)
goto LABEL_144;
v13 = v102[-v64];
do {
*v11 = v13;
--v25;
v13 = (v11++)[-v64];
} while (v25);
v10 = 7;
v14 = dst;
}
--v10;
dst[v23] = v27;
if (v10 < 0)
v10 = 0;
v9 -= v26;
v12 -= v26;
} while (v11 != (u8 *)v101);
}
}
LABEL_144:
//JUMPOUT(dword_C2190000, v105, sub_C20006DE);
return;
}
int main() {
//...
LZRA_decompress(
(u8 *)decompress_dest,
decompressed_size,
&compress_data[4],
&next);
//...
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment