#include <stdio.h>
#include <stdint.h>
#include <Windows.h>
void Dec(unsigned int* data, unsigned int* key)
{
unsigned int sum = 0x8771109D * 60;
unsigned int v0 = data[0];
unsigned int v1 = data[1];
unsigned int round;
for (round = 0; round < 60; round++)
{
v1 = v1 - (0x7C77AF7C + ((sum + v0) ^ v0 ^ (key[2] + 16 * v0) ^ (key[3] + (v0 >> 5)) ^ 0x4321) - 0x5901181B);
sum += 0x788EEF63;
v0 -= (sum + key[sum & 3]) ^ (v1 + ((v1 >> 5) ^ (16 * v1)));
}
data[0] = v0;
data[1] = v1;
}
void xor_crypt(uint8_t* data, uint64_t len) {
char v19[5];
char v20[7];
*(DWORD*)v19 = 0x12CDAD89;
v19[4] = 0x56;
*(DWORD*)v20 = 0xEF586958;
*(WORD*)&v20[4] = 0x46B3;
v20[6] = 0x23;
DWORD v9 = (((unsigned __int64)len - 1) >> 1) + 1;
do
{
int j = 0;
int i = 0;
do
{
unsigned char key = j++ + len + v19[i % 5] + v20[i % 7];
data[i++] ^= key;
} while (j < 8);
data += 8;
--v9;
} while (v9);
}
char reverse_transform(uint8_t result, uint8_t a2) {
for (uint8_t bit_count = 0; bit_count <= 8; bit_count++) {
uint8_t permutation_table[8] = { 0, 1, 2, 3, 4, 5, 6, 7 };
uint64_t rng_state = bit_count;
for (int i = 7; i > 0; i--) {
rng_state = 0x3F5713FCCC7C79AA * rng_state + 0x3A7D9E5B36F498B2;
uint32_t rand_idx = (rng_state >> 32) % (i + 1);
uint8_t temp = permutation_table[i];
permutation_table[i] = permutation_table[rand_idx];
permutation_table[rand_idx] = temp;
}
uint8_t xor_val = 0;
for (int i = 0; i < 8; i++) {
uint8_t bit_pos = permutation_table[i];
uint8_t bit = (result >> i) & 1;
xor_val |= (bit << bit_pos);
}
uint8_t a1 = a2 ^ xor_val;
uint8_t actual_bit_count = 0;
if (a1 != a2) {
uint8_t tmp = xor_val;
while (tmp) {
actual_bit_count += tmp & 1;
tmp >>= 1;
}
}
if (actual_bit_count == bit_count) {
return a1;
}
}
}
int main() {
unsigned int key[4];
key[0] = 0x89;
key[1] = 0xFE;
key[2] = 0x76;
key[3] = 0xA0;
unsigned int FlagEnc[34] = {
0x199354C3, 0xB1FD7BE6, 0x73205B55, 0xDE5C4D43, 0xA4EF9954, 0xA97651D4, 0xEFBA6B6A, 0xC6E221DE,
0x8FA342FE, 0x4C1C63BE, 0xD0AEE4C6, 0xC6F63D4B, 0x3807EBDA, 0x2ADF5814, 0x7A83C42E, 0x9E348D33,
0x782779E4, 0xC4A55FC0, 0xDC0B64D0, 0x7EE36C5D, 0xE43BE42C, 0xD5E405CA, 0xB772C9A7, 0x0030CDC7,
0x2F09B31C, 0xFA839DD7, 0x57547B88, 0xF754B5AE, 0x231F7B75, 0x13160770, 0x6EB71579, 0x0FA28BBD,
0x6103E890, 0xEF604E1D
};
xor_crypt((UINT8*)FlagEnc, 34);
for (size_t i = 0; i < 34; i += 2)
{
Dec(&FlagEnc[i], key);
}
unsigned long long key_key = 0x66711265FD2;
for (size_t i = 0; i < 34; i++)
{
auto a = reverse_transform(FlagEnc[i] ^ ((uint8_t*)&key_key)[i % 6], i);
printf("%c", a);
}
}