Skip to content

Instantly share code, notes, and snippets.

@uyjulian
Last active January 3, 2024 08:01
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 uyjulian/7048f061148774bf807570143dee1703 to your computer and use it in GitHub Desktop.
Save uyjulian/7048f061148774bf807570143dee1703 to your computer and use it in GitHub Desktop.
#include <stdint.h>
#include <stdio.h>
uint64_t FUN_00293a60(uint64_t param_1) //OK
{
int iVar1;
uint64_t uVar2;
uint64_t uVar3;
uint64_t uVar4;
uint64_t uVar5;
uint64_t uVar6;
uint64_t uVar7;
uint64_t uVar8;
uint64_t uVar9;
uint64_t uVar10;
uint64_t uVar11;
uint64_t uVar12;
iVar1 = 8;
uVar11 = 0;
uVar12 = 0;
do {
uVar2 = (int64_t)(1 << ((iVar1 + 0xffffU) & 0x1f));
uVar7 = 0;
if ((param_1 & 2) != 0) {
uVar7 = uVar2;
}
uVar3 = 0;
if ((param_1 & 1) != 0) {
uVar3 = uVar2 << 0x20;
}
uVar4 = 0;
if ((param_1 & 4) != 0) {
uVar4 = uVar2 << 0x28;
}
uVar8 = 0;
if ((param_1 & 8) != 0) {
uVar8 = uVar2 << 8;
}
uVar5 = 0;
if ((param_1 & 0x10) != 0) {
uVar5 = uVar2 << 0x30;
}
uVar9 = 0;
if ((param_1 & 0x20) != 0) {
uVar9 = uVar2 << 0x10;
}
uVar6 = 0;
if ((param_1 & 0x40) != 0) {
uVar6 = uVar2 << 0x38;
}
uVar10 = 0;
if ((param_1 & 0x80) != 0) {
uVar10 = uVar2 << 0x18;
}
uVar11 = uVar11 | uVar3 | uVar4 | uVar5 | uVar6;
iVar1 = iVar1 + 0xffff;
uVar12 = uVar12 | uVar7 | uVar8 | uVar9 | uVar10;
param_1 = param_1 >> 8;
} while (iVar1 != 0);
return uVar11 | uVar12;
}
uint64_t FUN_00293b28(uint64_t param_1) //OK
{
uint32_t uVar1;
uint64_t uVar2;
uint64_t uVar3;
uint64_t uVar4;
uint64_t uVar5;
uint64_t uVar6;
uint64_t uVar7;
uint64_t uVar8;
uint64_t uVar9;
uint64_t uVar10;
uint64_t uVar11;
uint64_t uVar12;
uVar1 = 0;
uVar11 = 0;
uVar12 = 0;
do {
uVar2 = (int64_t)(1 << (((uVar1 >> 2 ^ 1) & 0x1f) | (uVar1 & 3) << 1));
uVar3 = 0;
if ((param_1 & 1) != 0) {
uVar3 = uVar2 << 0x38;
}
uVar7 = 0;
if ((param_1 & 2) != 0) {
uVar7 = uVar2 << 0x30;
}
uVar4 = 0;
if ((param_1 & 4) != 0) {
uVar4 = uVar2 << 0x28;
}
uVar8 = 0;
if ((param_1 & 8) != 0) {
uVar8 = uVar2 << 0x20;
}
uVar5 = 0;
if ((param_1 & 0x10) != 0) {
uVar5 = uVar2 << 0x18;
}
uVar9 = 0;
if ((param_1 & 0x20) != 0) {
uVar9 = uVar2 << 0x10;
}
uVar10 = 0;
if ((param_1 & 0x80) != 0) {
uVar10 = uVar2;
}
uVar6 = 0;
if ((param_1 & 0x40) != 0) {
uVar6 = uVar2 << 8;
}
uVar1 = uVar1 + 1;
uVar12 = uVar12 | uVar7 | uVar8 | uVar9 | uVar10;
uVar11 = uVar11 | uVar3 | uVar4 | uVar5 | uVar6;
param_1 = param_1 >> 8;
} while (uVar1 < 8);
return uVar11 | uVar12;
}
uint64_t dat_36d940[0x20] = {
0x8000000000020000, 0x0000000000040000, 0x0000000000080000, 0x0000000000500000, 0x0000000000a00000, 0x0000000001000000, 0x0000000002000000, 0x0000000014000000, 0x0000000028000000, 0x0000000040000000, 0x0000000080000000, 0x0000000500000000, 0x0000000a00000000, 0x0000001000000000, 0x0000002000000000, 0x0000014000000000, 0x0000028000000000, 0x0000040000000000, 0x0000080000000000, 0x0000500000000000, 0x0000a00000000000, 0x0001000000000000, 0x0002000000000000, 0x0014000000000000, 0x0028000000000000, 0x0040000000000000, 0x0080000000000000, 0x0500000000000000, 0x0a00000000000000, 0x1000000000000000, 0x2000000000000000, 0x4000000000010000
};
uint64_t FUN_00293c08(uint64_t param_1) // OK
{
uint64_t uVar1;
int iVar2;
uint64_t uVar3;
uint64_t *puVar4;
puVar4 = dat_36d940; //0x36d940
iVar2 = 0x20;
uVar3 = 0x20;
uVar1 = 0;
do {
iVar2 -= 1;
if (((param_1 >> uVar3) & 1) != 0) {
uVar1 |= *puVar4;
}
uVar3 += 1;
puVar4 += 1;
} while (iVar2 != 0);
return uVar1;
}
uint8_t dat_36dac0[512] = {
0x0D, 0x02, 0x08, 0x04, 0x06, 0x0F, 0x0B, 0x01, 0x0A, 0x09, 0x03, 0x0E, 0x05, 0x00, 0x0C, 0x07, 0x01, 0x0F, 0x0D, 0x08, 0x0A, 0x03, 0x07, 0x04, 0x0C, 0x05, 0x06, 0x0B, 0x00, 0x0E, 0x09, 0x02, 0x07, 0x0B, 0x04, 0x01, 0x09, 0x0C, 0x0E, 0x02, 0x00, 0x06, 0x0A, 0x0D, 0x0F, 0x03, 0x05, 0x08, 0x02, 0x01, 0x0E, 0x07, 0x04, 0x0A, 0x08, 0x0D, 0x0F, 0x0C, 0x09, 0x00, 0x03, 0x05, 0x06, 0x0B, 0x04, 0x0B, 0x02, 0x0E, 0x0F, 0x00, 0x08, 0x0D, 0x03, 0x0C, 0x09, 0x07, 0x05, 0x0A, 0x06, 0x01, 0x0D, 0x00, 0x0B, 0x07, 0x04, 0x09, 0x01, 0x0A, 0x0E, 0x03, 0x05, 0x0C, 0x02, 0x0F, 0x08, 0x06, 0x01, 0x04, 0x0B, 0x0D, 0x0C, 0x03, 0x07, 0x0E, 0x0A, 0x0F, 0x06, 0x08, 0x00, 0x05, 0x09, 0x02, 0x06, 0x0B, 0x0D, 0x08, 0x01, 0x04, 0x0A, 0x07, 0x09, 0x05, 0x00, 0x0F, 0x0E, 0x02, 0x03, 0x0C, 0x0C, 0x01, 0x0A, 0x0F, 0x09, 0x02, 0x06, 0x08, 0x00, 0x0D, 0x03, 0x04, 0x0E, 0x07, 0x05, 0x0B, 0x0A, 0x0F, 0x04, 0x02, 0x07, 0x0C, 0x09, 0x05, 0x06, 0x01, 0x0D, 0x0E, 0x00, 0x0B, 0x03, 0x08, 0x09, 0x0E, 0x0F, 0x05, 0x02, 0x08, 0x0C, 0x03, 0x07, 0x00, 0x04, 0x0A, 0x01, 0x0D, 0x0B, 0x06, 0x04, 0x03, 0x02, 0x0C, 0x09, 0x05, 0x0F, 0x0A, 0x0B, 0x0E, 0x01, 0x07, 0x06, 0x00, 0x08, 0x0D, 0x02, 0x0C, 0x04, 0x01, 0x07, 0x0A, 0x0B, 0x06, 0x08, 0x05, 0x03, 0x0F, 0x0D, 0x00, 0x0E, 0x09, 0x0E, 0x0B, 0x02, 0x0C, 0x04, 0x07, 0x0D, 0x01, 0x05, 0x00, 0x0F, 0x0A, 0x03, 0x09, 0x08, 0x06, 0x04, 0x02, 0x01, 0x0B, 0x0A, 0x0D, 0x07, 0x08, 0x0F, 0x09, 0x0C, 0x05, 0x06, 0x03, 0x00, 0x0E, 0x0B, 0x08, 0x0C, 0x07, 0x01, 0x0E, 0x02, 0x0D, 0x06, 0x0F, 0x00, 0x09, 0x0A, 0x04, 0x05, 0x03, 0x07, 0x0D, 0x0E, 0x03, 0x00, 0x06, 0x09, 0x0A, 0x01, 0x02, 0x08, 0x05, 0x0B, 0x0C, 0x04, 0x0F, 0x0D, 0x08, 0x0B, 0x05, 0x06, 0x0F, 0x00, 0x03, 0x04, 0x07, 0x02, 0x0C, 0x01, 0x0A, 0x0E, 0x09, 0x0A, 0x06, 0x09, 0x00, 0x0C, 0x0B, 0x07, 0x0D, 0x0F, 0x01, 0x03, 0x0E, 0x05, 0x02, 0x08, 0x04, 0x03, 0x0F, 0x00, 0x06, 0x0A, 0x01, 0x0D, 0x08, 0x09, 0x04, 0x05, 0x0B, 0x0C, 0x07, 0x02, 0x0E, 0x0A, 0x00, 0x09, 0x0E, 0x06, 0x03, 0x0F, 0x05, 0x01, 0x0D, 0x0C, 0x07, 0x0B, 0x04, 0x02, 0x08, 0x0D, 0x07, 0x00, 0x09, 0x03, 0x04, 0x06, 0x0A, 0x02, 0x08, 0x05, 0x0E, 0x0C, 0x0B, 0x0F, 0x01, 0x0D, 0x06, 0x04, 0x09, 0x08, 0x0F, 0x03, 0x00, 0x0B, 0x01, 0x02, 0x0C, 0x05, 0x0A, 0x0E, 0x07, 0x01, 0x0A, 0x0D, 0x00, 0x06, 0x09, 0x08, 0x07, 0x04, 0x0F, 0x0E, 0x03, 0x0B, 0x05, 0x02, 0x0C, 0x0F, 0x01, 0x08, 0x0E, 0x06, 0x0B, 0x03, 0x04, 0x09, 0x07, 0x02, 0x0D, 0x0C, 0x00, 0x05, 0x0A, 0x03, 0x0D, 0x04, 0x07, 0x0F, 0x02, 0x08, 0x0E, 0x0C, 0x00, 0x01, 0x0A, 0x06, 0x09, 0x0B, 0x05, 0x00, 0x0E, 0x07, 0x0B, 0x0A, 0x04, 0x0D, 0x01, 0x05, 0x08, 0x0C, 0x06, 0x09, 0x03, 0x02, 0x0F, 0x0D, 0x08, 0x0A, 0x01, 0x03, 0x0F, 0x04, 0x02, 0x0B, 0x06, 0x07, 0x0C, 0x00, 0x05, 0x0E, 0x09, 0x0E, 0x04, 0x0D, 0x01, 0x02, 0x0F, 0x0B, 0x08, 0x03, 0x0A, 0x06, 0x0C, 0x05, 0x09, 0x00, 0x07, 0x00, 0x0F, 0x07, 0x04, 0x0E, 0x02, 0x0D, 0x01, 0x0A, 0x06, 0x0C, 0x0B, 0x09, 0x05, 0x03, 0x08, 0x04, 0x01, 0x0E, 0x08, 0x0D, 0x06, 0x02, 0x0B, 0x0F, 0x0C, 0x09, 0x07, 0x03, 0x0A, 0x05, 0x00, 0x0F, 0x0C, 0x08, 0x02, 0x04, 0x09, 0x01, 0x07, 0x05, 0x0B, 0x03, 0x0E, 0x0A, 0x00, 0x06, 0x0D
};
uint64_t FUN_00293ca8(uint64_t param_1) //OK
{
uint32_t uVar1;
uint64_t uVar2;
int iVar3;
uint64_t uVar4;
uint8_t *iVar5; // pointer
uint8_t *pbVar6;
uint64_t uVar7;
iVar3 = 8;
uVar4 = 0x20;
iVar5 = dat_36dac0; //0x36dac0
uVar2 = 0;
do {
uVar1 = (uint32_t)param_1;
iVar3 -= 1;
pbVar6 = (uint8_t *)(((uVar1 & 0x20) | ((uVar1 >> 1) & 0xf) | (uVar1 & 1) << 4) + iVar5);
iVar5 = iVar5 + 0x40;
param_1 = param_1 >> 6;
uVar7 = (uint64_t)*pbVar6 << uVar4;
uVar4 = (uint64_t)((int)uVar4 + 4);
uVar2 = uVar2 | uVar7;
} while (iVar3 != 0);
return uVar2;
}
uint32_t dat_36da40[0x20] = {
0x00000800, 0x00020000, 0x00000020, 0x08000000, 0x02000000, 0x00000400, 0x00100000, 0x00000001, 0x00002000, 0x00200000, 0x00000008, 0x10000000, 0x20000000, 0x00000080, 0x00040000, 0x01000000, 0x80000000, 0x00400000, 0x00001000, 0x00000040, 0x04000000, 0x00000004, 0x00010000, 0x00000100, 0x00004000, 0x40000000, 0x00000010, 0x00080000, 0x00000002, 0x00000200, 0x00008000, 0x00800000
};
uint64_t FUN_00293c5c(uint64_t param_1) //OK
{
uint64_t uVar1;
int iVar2;
uint64_t uVar3;
uint32_t *piVar4;
uint64_t uVar5;
uint64_t uVar6;
piVar4 = dat_36da40; // 0x36da40
iVar2 = 0x20;
uVar3 = 0x20;
uVar1 = 0;
do {
uVar5 = param_1 >> uVar3;
iVar2 -= 1;
uVar3 = (uint64_t)((int)uVar3 + 1);
uVar6 = 0;
if ((uVar5 & 1) != 0) {
uVar6 = (uint64_t)*piVar4;
}
piVar4 = piVar4 + 1;
uVar1 = uVar1 | uVar6;
} while (iVar2 != 0);
return uVar1 << 0x20;
}
uint8_t dat_36dcc0[0x38] = {
0x07, 0x0F, 0x17, 0x1F, 0x27, 0x2F, 0x37, 0x3F, 0x06, 0x0E, 0x16, 0x1E, 0x26, 0x2E, 0x36, 0x3E, 0x05, 0x0D, 0x15, 0x1D, 0x25, 0x2D, 0x35, 0x3D, 0x04, 0x0C, 0x14, 0x1C, 0x01, 0x09, 0x11, 0x19, 0x21, 0x29, 0x31, 0x39, 0x02, 0x0A, 0x12, 0x1A, 0x22, 0x2A, 0x32, 0x3A, 0x03, 0x0B, 0x13, 0x1B, 0x23, 0x2B, 0x33, 0x3B, 0x24, 0x2C, 0x34, 0x3C
};
uint8_t dat_36dd00[0x30] = {
0x32, 0x2F, 0x35, 0x28, 0x3F, 0x3B, 0x3D, 0x24, 0x31, 0x3A, 0x2B, 0x36, 0x29, 0x2D, 0x34, 0x3C, 0x26, 0x38, 0x30, 0x39, 0x25, 0x2C, 0x33, 0x3E, 0x17, 0x0C, 0x21, 0x1B, 0x11, 0x09, 0x22, 0x18, 0x0D, 0x13, 0x1F, 0x10, 0x14, 0x0F, 0x19, 0x08, 0x1E, 0x0B, 0x12, 0x16, 0x0E, 0x1C, 0x23, 0x20
};
uint64_t kek[0x10];
void FUN_00293d08(uint64_t *param_1,uint64_t param_2)
{
uint64_t uVar1;
uint64_t uVar2;
uint32_t uVar3;
int iVar4;
uint8_t *pbVar5;
uint64_t uVar6;
uint64_t uVar7;
uint32_t uVar8;
uint32_t uVar9;
uint32_t uVar11;
uint32_t uVar12;
iVar4 = 0x38;
pbVar5 = dat_36dcc0; //0x36dcc0
uVar6 = 1ll << (32 + 0x1f);//0x8000000000000000;
uVar1 = 0; // v0?
do {
if ((param_2 & (1ll << (*pbVar5))) != 0) {
uVar1 |= uVar6;
}
iVar4 -= 1;
pbVar5 += 1;
uVar6 >>= 1;
} while (iVar4 != 0);
// v0=0xCA9F390B5DA70B00
uVar6 = uVar1 >> 0x24ll;
uVar1 = uVar1 >> 8ll & 0xfffffff;
uVar3 = 0x10;
do {
uVar11 = (uint32_t)uVar6;
uVar12 = (uint32_t)uVar1;
if (((uVar3 < 0xf) && (uVar3 != 8)) && (uVar8 = uVar11 >> 0x1all, uVar3 != 1)) {
uVar9 = uVar12 >> 0x1all;
iVar4 = uVar11 << 2ll;
uVar12 = uVar12 << 2ll;
}
else {
uVar8 = uVar11 >> 0x1bll; //.., 1
uVar9 = uVar12 >> 0x1bll; //.., 0
iVar4 = uVar11 << 1ll; //.., 0x12A7CE42
uVar12 = uVar12 << 1ll; //.., 0x0D769C2E
}
uVar6 = ((uint64_t)iVar4 & 0xfffffffll) | (uint64_t)uVar8;
uVar1 = (uint64_t)(uVar12 | uVar9) & 0xfffffffll;
iVar4 = 0x30;
pbVar5 = dat_36dd00; // 0x36dd00
uVar7 = 1ll << (32 + 0x1f); // 0x8000000000000000
uVar2 = 0ll; // v0?
do {
if ((((uVar6 << (32 + 0x4)) | uVar1 << (0x8)) & (1ll << *pbVar5)) != 0) {
uVar2 |= uVar7;
}
iVar4 -= 1;
pbVar5 += 1;
uVar7 >>= 1;
} while (iVar4 != 0);
// v0 = 0xA9CF467F63340000
uVar3 -= 1;
*param_1 = uVar2;
param_1 += 1;
} while (uVar3 != 0);
return;
}
int main(int argc, char **argv)
{
if (argc != 3)
{
return 0x10;
}
FILE *f = fopen(argv[1], "rb");
if (!f)
{
return 0x11;
}
uint64_t buf[64];
size_t count = fread(buf, 1, sizeof(buf), f);
if (count != sizeof(buf))
{
return 0x12;
}
FUN_00293d08(kek, ((0xD774444561237516 ^ 0x2cbadb31cccb12f6) - 5) - 0x87F95C7F3EBCDB15);
for (int i = 0; i < 64; i += 1)
{
int uVar13 = 0xf;
uint64_t * puVar12 = kek + uVar13;
uint64_t uVar5 = FUN_00293a60(buf[i]);
// v1=0xffffffffffffffff
uint64_t uVar6 = uVar5 << 0x20ll;
//uVar5 = uVar5 & 0xffff00000000ll;
uVar5 = uVar5 & 0xffffffffffffffff;
uint64_t uVar7 = 0;
uint64_t uVar11 = 0;
do {
uVar11 = uVar6;
uVar6 = /* 0xCAD40D6FE8530000 */ FUN_00293c08(uVar11 /* 0x492f63409686df09,0x52D8A34500000000 */);
uVar13 -= 1;
uint64_t uVar9 = *puVar12;
puVar12 -= 1;
uVar7 = FUN_00293ca8((uVar6 ^ uVar9) >> 0x10ll /* 0x56723AD2F9B4,0x68A696CA5519 */);
uVar6 = FUN_00293c5c(uVar7 /* 0xC162CADA00000000,0x9B45929000000000 */);
uVar6 = uVar6 ^ uVar5;
uVar5 = uVar11;
} while (-1 < uVar13);
uVar7 = /* 0x5445534552 */ FUN_00293b28(uVar6 | uVar11 >> 0x20ll /* 0xF8A85870000000A0 */);
buf[i] = uVar7;
}
FILE *wf = fopen(argv[2], "wb");
if (!wf)
{
return 0x21;
}
size_t wcount = fwrite(buf, 1, sizeof(buf), wf);
if (wcount != sizeof(buf))
{
return 0x22;
}
// Write the rest of the data
uint8_t bbuf[0xffff];
while (1)
{
size_t rrcount = fread(bbuf, 1, sizeof(bbuf), f);
if (rrcount == 0)
{
break;
}
size_t wwcount = fwrite(bbuf, 1, rrcount, wf);
if (wwcount != rrcount)
{
return 0x31;
}
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment