#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);
}
}