You are on page 1of 3

/* public domain */

/* only tested with clang and gcc on linux, but it should also work on tcc on
windows */
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

#define data_size 848U


#define key_loc 0x1BF
#define id_loc 0x1DC
uint8_t rawData[848] = {
0x00, 0x01, 0x00, 0x04, 0xD1, 0x5E, 0xA5, 0xED, 0x15, 0xAB, 0xE1, 0x1A,
0xD1, 0x5E, 0xA5, 0xED, 0x15, 0xAB, 0xE1, 0x1A, 0xD1, 0x5E, 0xA5, 0xED,
0x15, 0xAB, 0xE1, 0x1A, 0xD1, 0x5E, 0xA5, 0xED, 0x15, 0xAB, 0xE1, 0x1A,
0xD1, 0x5E, 0xA5, 0xED, 0x15, 0xAB, 0xE1, 0x1A, 0xD1, 0x5E, 0xA5, 0xED,
0x15, 0xAB, 0xE1, 0x1A, 0xD1, 0x5E, 0xA5, 0xED, 0x15, 0xAB, 0xE1, 0x1A,
0xD1, 0x5E, 0xA5, 0xED, 0x15, 0xAB, 0xE1, 0x1A, 0xD1, 0x5E, 0xA5, 0xED,
0x15, 0xAB, 0xE1, 0x1A, 0xD1, 0x5E, 0xA5, 0xED, 0x15, 0xAB, 0xE1, 0x1A,
0xD1, 0x5E, 0xA5, 0xED, 0x15, 0xAB, 0xE1, 0x1A, 0xD1, 0x5E, 0xA5, 0xED,
0x15, 0xAB, 0xE1, 0x1A, 0xD1, 0x5E, 0xA5, 0xED, 0x15, 0xAB, 0xE1, 0x1A,
0xD1, 0x5E, 0xA5, 0xED, 0x15, 0xAB, 0xE1, 0x1A, 0xD1, 0x5E, 0xA5, 0xED,
0x15, 0xAB, 0xE1, 0x1A, 0xD1, 0x5E, 0xA5, 0xED, 0x15, 0xAB, 0xE1, 0x1A,
0xD1, 0x5E, 0xA5, 0xED, 0x15, 0xAB, 0xE1, 0x1A, 0xD1, 0x5E, 0xA5, 0xED,
0x15, 0xAB, 0xE1, 0x1A, 0xD1, 0x5E, 0xA5, 0xED, 0x15, 0xAB, 0xE1, 0x1A,
0xD1, 0x5E, 0xA5, 0xED, 0x15, 0xAB, 0xE1, 0x1A, 0xD1, 0x5E, 0xA5, 0xED,
0x15, 0xAB, 0xE1, 0x1A, 0xD1, 0x5E, 0xA5, 0xED, 0x15, 0xAB, 0xE1, 0x1A,
0xD1, 0x5E, 0xA5, 0xED, 0x15, 0xAB, 0xE1, 0x1A, 0xD1, 0x5E, 0xA5, 0xED,
0x15, 0xAB, 0xE1, 0x1A, 0xD1, 0x5E, 0xA5, 0xED, 0x15, 0xAB, 0xE1, 0x1A,
0xD1, 0x5E, 0xA5, 0xED, 0x15, 0xAB, 0xE1, 0x1A, 0xD1, 0x5E, 0xA5, 0xED,
0x15, 0xAB, 0xE1, 0x1A, 0xD1, 0x5E, 0xA5, 0xED, 0x15, 0xAB, 0xE1, 0x1A,
0xD1, 0x5E, 0xA5, 0xED, 0x15, 0xAB, 0xE1, 0x1A, 0xD1, 0x5E, 0xA5, 0xED,
0x15, 0xAB, 0xE1, 0x1A, 0xD1, 0x5E, 0xA5, 0xED, 0x15, 0xAB, 0xE1, 0x1A,
0xD1, 0x5E, 0xA5, 0xED, 0x15, 0xAB, 0xE1, 0x1A, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x6F, 0x6F, 0x74,
0x2D, 0x43, 0x41, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x33, 0x2D,
0x58, 0x53, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x63, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xFE, 0xED, 0xFA, 0xCE, 0xFE, 0xED, 0xFA, 0xCE, 0xFE, 0xED, 0xFA, 0xCE,
0xFE, 0xED, 0xFA, 0xCE, 0xFE, 0xED, 0xFA, 0xCE, 0xFE, 0xED, 0xFA, 0xCE,
0xFE, 0xED, 0xFA, 0xCE, 0xFE, 0xED, 0xFA, 0xCE, 0xFE, 0xED, 0xFA, 0xCE,
0xFE, 0xED, 0xFA, 0xCE, 0xFE, 0xED, 0xFA, 0xCE, 0xFE, 0xED, 0xFA, 0xCE,
0xFE, 0xED, 0xFA, 0xCE, 0xFE, 0xED, 0xFA, 0xCE, 0xFE, 0xED, 0xFA, 0xCE,
0x01, 0x00, 0x00, 0x26, 0x2D, 0x86, 0x0F, 0xAD, 0x1A, 0x08, 0x4C, 0x10,
0xEA, 0xA4, 0xF4, 0xDB, 0xA2, 0x57, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00,
0x10, 0x1C, 0x95, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x14, 0x00, 0x00, 0x00, 0xAC,
0x00, 0x00, 0x00, 0x14, 0x00, 0x01, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x84,
0x00, 0x00, 0x00, 0x84, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

uint32_t endian_convert(uint32_t n) {
return ((n & 0xFF) << 24)|((n & 0xFF00) << 8)|((n & 0xFF0000) >> 8)|((n &
0xFF000000) >> 24);
}

void read_key_string(uint8_t* key_out, char* key_str) {


if(key_out != NULL && key_str != NULL) {
uint32_t i;
for(i=0; i<16; ++i) {
uint32_t o;
char str_fix[9];
memset(str_fix, 0, 9);
memcpy(str_fix, &key_str[i*2], 2);
sscanf(str_fix, "%02x", &o);

key_out[i] = (uint8_t)(o & 0xFF);


}
}
}

void read_gid_string(uint8_t* gid_out, char* gid_str) {


if(gid_out != NULL && gid_str != NULL) {

uint32_t i;
for(i=0; i<4; ++i) {
char empty[4];
memset(empty, 0, 4);
memcpy(empty, &gid_str[i*2], 2);

gid_out[i] = (uint8_t)strtoul(empty, NULL, 16);


}
for(i=0; i<4; ++i) {
char empty[4];
memset(empty, 0, 4);
memcpy(empty, &gid_str[(i*2)+9], 2);

gid_out[i+4] = (uint8_t)strtoul(empty, NULL, 16);


}

}
}

int main(int argc, char** argv) {


if(argc != 3) {
printf("Title.tik generator\nOutputs Title.tik with specified
data\nUsage: tikmaker.exe XXXXGAME-IDXXXXXX key\n");
} else {
FILE* tik;
uint8_t* gid;
uint8_t* key;
key = &rawData[key_loc];
gid = &rawData[id_loc];

read_key_string(key, argv[2]);
read_gid_string(gid, argv[1]);

tik = fopen("Title.tik", "wb");


if(tik != NULL) {
fwrite(rawData, sizeof(char), data_size, tik);
fclose(tik);
printf("successfully written Title.tik!\nGame ID: %s\nKey: %s\n",
argv[1], argv[2]);
} else {
printf("Could not create Title.tik!\n");
}
}
return 0;
}

You might also like