Skip to content

Instantly share code, notes, and snippets.

@oblivia-simplex
Created April 14, 2023 15:57
Show Gist options
  • Save oblivia-simplex/04f45ae66682c58e673ace6c27acca7e to your computer and use it in GitHub Desktop.
Save oblivia-simplex/04f45ae66682c58e673ace6c27acca7e to your computer and use it in GitHub Desktop.
Demonstration of G-3PO Annotating a Decompiled Binary: Before
/* DISPLAY WARNING: Type casts are NOT being printed */
void * FUN_4520a9bc(uint *param_1,uint *param_2,size_t param_3)
{
undefined8 *puVar1;
undefined8 *puVar2;
uint *puVar3;
byte *pbVar4;
uint *puVar5;
undefined8 *puVar6;
uint *puVar7;
byte bVar8;
undefined2 uVar9;
uint uVar10;
uint uVar11;
uint uVar12;
uint uVar13;
uint uVar14;
uint uVar15;
byte bVar16;
uint uVar17;
uint in_r12;
uint uVar18;
bool bVar19;
bool bVar20;
undefined8 in_d0;
uint uVar21;
undefined8 in_d1;
uVar10 = param_1 - param_2;
bVar19 = uVar10 == 0;
if (param_2 <= param_1) {
bVar19 = param_3 == uVar10;
}
if ((param_2 <= param_1 && uVar10 <= param_3) && !bVar19) {
puVar1 = param_1 + param_3;
puVar6 = param_2 + param_3;
if (3 < param_3) {
bVar19 = (puVar1 & 3) == 0;
do {
if (!bVar19) {
puVar6 = puVar6 + -1;
param_3 = param_3 - 1;
puVar1 = puVar1 + -1;
*puVar1 = *puVar6;
}
bVar19 = (puVar1 & 3) == 0;
} while (!bVar19);
uVar10 = puVar6 & 3;
if (uVar10 == 0) {
while (uVar10 = param_3 - 0x10, 0xf < param_3) {
in_d0 = puVar6[-2];
in_d1 = puVar6[-1];
puVar1[-2] = in_d0;
puVar1[-1] = in_d1;
puVar1 = puVar1 + -2;
puVar6 = puVar6 + -2;
param_3 = uVar10;
}
uVar21 = in_d1;
bVar19 = uVar10 >> 3 & 1;
uVar11 = param_3 << 0x1d;
if (bVar19) {
puVar6 = puVar6 + -1;
in_d0 = *puVar6;
}
if (uVar11 < 0) {
puVar6 = puVar6 + -4;
uVar21 = *puVar6;
}
puVar2 = puVar1;
if (bVar19) {
puVar2 = puVar1 + -1;
*puVar2 = in_d0;
*(puVar1 + -4) = in_d0 >> 0x20;
}
if (uVar11 < 0) {
puVar2 = puVar2 + -4;
*puVar2 = uVar21;
}
if ((uVar10 & 3) != 0) {
bVar20 = uVar10 >> 1 & 1;
uVar10 = param_3 << 0x1f;
bVar19 = uVar10 < 0;
if (bVar20) {
puVar6 = puVar6 + -2;
uVar11 = *puVar6;
}
if (bVar19) {
uVar10 = *(puVar6 + -1);
}
if (bVar20) {
puVar2 = puVar2 + -2;
*puVar2 = uVar11;
}
if (bVar19) {
*(puVar2 + -1) = uVar10;
}
return puVar2;
}
return puVar2;
}
bVar19 = 3 < param_3;
param_3 = param_3 - 4;
if (bVar19) {
puVar7 = puVar6 - uVar10;
in_r12 = *puVar7;
if (uVar10 < 2) {
do {
puVar3 = puVar7;
uVar10 = in_r12 << 0x18;
puVar7 = puVar3 + -1;
in_r12 = *puVar7;
bVar19 = 3 < param_3;
param_3 = param_3 - 4;
uVar10 = uVar10 | in_r12 >> 8;
puVar1 = puVar1 + -4;
*puVar1 = uVar10;
} while (bVar19);
puVar6 = puVar3 + -3;
}
else if (uVar10 < 3) {
do {
puVar3 = puVar7;
uVar10 = in_r12 << 0x10;
puVar7 = puVar3 + -1;
in_r12 = *puVar7;
bVar19 = 3 < param_3;
param_3 = param_3 - 4;
uVar10 = uVar10 | in_r12 >> 0x10;
puVar1 = puVar1 + -4;
*puVar1 = uVar10;
} while (bVar19);
puVar6 = puVar3 + -2;
}
else {
do {
puVar3 = puVar7;
uVar10 = in_r12 << 8;
puVar7 = puVar3 + -1;
in_r12 = *puVar7;
bVar19 = 3 < param_3;
param_3 = param_3 - 4;
uVar10 = uVar10 | in_r12 >> 0x18;
puVar1 = puVar1 + -4;
*puVar1 = uVar10;
} while (bVar19);
puVar6 = puVar3 + -1;
}
}
}
bVar16 = in_r12;
bVar8 = uVar10;
bVar20 = param_3 >> 1 & 1;
uVar10 = param_3 << 0x1f;
bVar19 = uVar10 < 0;
if (bVar20) {
bVar8 = *(puVar6 + -1);
puVar6 = puVar6 + -2;
bVar16 = *puVar6;
}
if (bVar19) {
uVar10 = *(puVar6 + -1);
}
if (bVar20) {
*(puVar1 + -1) = bVar8;
puVar1 = puVar1 + -2;
*puVar1 = bVar16;
}
if (bVar19) {
*(puVar1 + -1) = uVar10;
}
return puVar1;
}
if (3 < param_3) {
uVar10 = param_1 & 3;
in_r12 = uVar10;
if (uVar10 != 0) {
bVar8 = *param_2;
puVar7 = param_2 + 1;
if (uVar10 < 3) {
puVar7 = param_2 + 2;
in_r12 = *(param_2 + 1);
}
*param_1 = bVar8;
param_2 = puVar7;
if (uVar10 < 2) {
param_2 = puVar7 + 1;
bVar8 = *puVar7;
}
puVar7 = param_1 + 1;
if (uVar10 < 3) {
puVar7 = param_1 + 2;
*(param_1 + 1) = in_r12;
}
param_3 = (param_3 + uVar10) - 4;
param_1 = puVar7;
if (uVar10 < 2) {
param_1 = puVar7 + 1;
*puVar7 = bVar8;
}
}
uVar10 = param_2 & 3;
if (uVar10 == 0) {
uVar11 = param_3 - 0x20;
if (0x1f < param_3) {
for (; 0x7f < uVar11; uVar11 = uVar11 - 0x20) {
HintPreloadData(param_2 + 0x20);
uVar10 = *param_2;
uVar21 = param_2[1];
uVar12 = param_2[2];
uVar13 = param_2[3];
uVar14 = param_2[4];
uVar15 = param_2[5];
uVar17 = param_2[6];
uVar18 = param_2[7];
param_2 = param_2 + 8;
*param_1 = uVar10;
param_1[1] = uVar21;
param_1[2] = uVar12;
param_1[3] = uVar13;
param_1[4] = uVar14;
param_1[5] = uVar15;
param_1[6] = uVar17;
param_1[7] = uVar18;
param_1 = param_1 + 8;
}
do {
uVar10 = *param_2;
uVar21 = param_2[1];
uVar12 = param_2[2];
uVar13 = param_2[3];
uVar14 = param_2[4];
uVar15 = param_2[5];
uVar17 = param_2[6];
uVar18 = param_2[7];
param_2 = param_2 + 8;
bVar19 = 0x1f < uVar11;
uVar11 = uVar11 - 0x20;
*param_1 = uVar10;
param_1[1] = uVar21;
param_1[2] = uVar12;
param_1[3] = uVar13;
param_1[4] = uVar14;
param_1[5] = uVar15;
param_1[6] = uVar17;
param_1[7] = uVar18;
param_1 = param_1 + 8;
} while (bVar19);
}
if (uVar11 >> 4 & 1) {
uVar10 = *param_2;
uVar21 = param_2[1];
uVar12 = param_2[2];
uVar13 = param_2[3];
param_2 = param_2 + 4;
*param_1 = uVar10;
param_1[1] = uVar21;
param_1[2] = uVar12;
param_1[3] = uVar13;
param_1 = param_1 + 4;
}
if (uVar11 << 0x1c < 0) {
uVar10 = *param_2;
uVar21 = param_2[1];
param_2 = param_2 + 2;
*param_1 = uVar10;
param_1[1] = uVar21;
param_1 = param_1 + 2;
}
puVar3 = param_1;
puVar7 = param_2;
if (uVar11 >> 2 & 1) {
puVar7 = param_2 + 1;
uVar10 = *param_2;
puVar3 = param_1 + 1;
*param_1 = uVar10;
}
uVar9 = uVar10;
if ((uVar11 & 3) != 0) {
bVar20 = uVar11 >> 1 & 1;
uVar11 = uVar11 << 0x1f;
bVar19 = uVar11 < 0;
puVar5 = puVar7;
if (bVar20) {
puVar5 = puVar7 + 2;
uVar9 = *puVar7;
}
if (bVar19) {
uVar11 = *puVar5;
}
puVar7 = puVar3;
if (bVar20) {
puVar7 = puVar3 + 2;
*puVar3 = uVar9;
}
puVar3 = puVar7;
if (bVar19) {
puVar3 = puVar7 + 1;
*puVar7 = uVar11;
}
return puVar3;
}
return puVar3;
}
bVar19 = 3 < param_3;
param_3 = param_3 - 4;
if (bVar19) {
puVar3 = param_2 - uVar10;
in_r12 = *puVar3;
puVar7 = param_1;
if (uVar10 == 2) {
do {
puVar5 = puVar3;
uVar10 = in_r12 >> 0x10;
puVar3 = puVar5 + 1;
in_r12 = *puVar3;
bVar19 = 3 < param_3;
param_3 = param_3 - 4;
uVar10 = uVar10 | in_r12 << 0x10;
param_1 = puVar7 + 1;
*puVar7 = uVar10;
puVar7 = param_1;
} while (bVar19);
param_2 = puVar5 + 6;
}
else if (uVar10 < 3) {
do {
puVar5 = puVar3;
uVar10 = in_r12 >> 8;
puVar3 = puVar5 + 1;
in_r12 = *puVar3;
bVar19 = 3 < param_3;
param_3 = param_3 - 4;
uVar10 = uVar10 | in_r12 << 0x18;
param_1 = puVar7 + 1;
*puVar7 = uVar10;
puVar7 = param_1;
} while (bVar19);
param_2 = puVar5 + 5;
}
else {
do {
puVar5 = puVar3;
uVar10 = in_r12 >> 0x18;
puVar3 = puVar5 + 1;
in_r12 = *puVar3;
bVar19 = 3 < param_3;
param_3 = param_3 - 4;
uVar10 = uVar10 | in_r12 << 8;
param_1 = puVar7 + 1;
*puVar7 = uVar10;
puVar7 = param_1;
} while (bVar19);
param_2 = puVar5 + 7;
}
}
}
bVar16 = in_r12;
bVar8 = uVar10;
bVar20 = param_3 >> 1 & 1;
uVar10 = param_3 << 0x1f;
bVar19 = uVar10 < 0;
if (bVar20) {
pbVar4 = param_2 + 1;
bVar8 = *param_2;
param_2 = param_2 + 2;
bVar16 = *pbVar4;
}
if (bVar19) {
uVar10 = *param_2;
}
if (bVar20) {
pbVar4 = param_1 + 1;
*param_1 = bVar8;
param_1 = param_1 + 2;
*pbVar4 = bVar16;
}
puVar7 = param_1;
if (bVar19) {
puVar7 = param_1 + 1;
*param_1 = uVar10;
}
return puVar7;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment