#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <stdint.h>
typedef
struct
{
union
{
char
* ptr;
char
local_buf[16];
};
size_t
size;
size_t
capacity;
} EncryptedString;
int64_t decodestring(int64_t dest_ptr, EncryptedString* src,
int
key)
{
int
shift = key % 95;
if
(shift < 0)
{
shift += 95;
}
char
* data_start;
if
(src->capacity <= 15)
{
data_start = src->local_buf;
}
else
{
data_start = src->ptr;
}
size_t
length = src->size;
char
* data_end = data_start + length;
for
(
char
* p = data_start; p < data_end; ++p)
{
unsigned
char
c = *p;
if
(c >= 32 && c <= 126)
{
c = (c - 32 + shift) % 95;
*p = (
char
)(c + 32);
}
}
EncryptedString* dest = (EncryptedString*)dest_ptr;
*dest = *src;
src->capacity = 15;
src->size = 0;
src->local_buf[0] =
'\0'
;
return
(dest_ptr);
}
int
main(
void
)
{
char
out1[256] = { 0 };
char
out2[256] = { 0 };
char
p1[] = {
0x5E, 0x70, 0x75, 0x5D, 0x6C, 0x79, 0x70, 0x6D, 0x21, 0x5B, 0x79, 0x7C, 0x7A, 0x7B, 0x00, 0x00,
0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
char
p2[] = {
0x5F, 0x71, 0x76, 0x7C, 0x7A, 0x7D, 0x7B, 0x7C, 0x36, 0x6C, 0x74, 0x74, 0x00, 0x00, 0x00, 0x00,
0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
decodestring(out1, p1, 0xFFFFFFF9);
decodestring(out2, p2, 0xFFFFFFF8);
printf
(
"%s\n"
, out1);
printf
(
"%s\n"
, out2);
return
(0);
}