Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdint.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <stdbool.h>
- #include <string.h>
- #include <direct.h>
- FILE *fHcgData;
- unsigned int hcgKey;
- unsigned char hcgAkey[0x10];
- int hcgPosition2;
- int hcgPosition;
- uint8_t hcgRootFilesCount;
- int hcgEntryRootOff;
- int hcgEntryDirOff;
- int hcgEntryFilesOff;
- unsigned short hcgeFillAkey() {
- hcgKey = 0x41C64E6D * hcgKey + 12345;
- return (hcgKey >> 16) & 0x7FFF;
- }
- uint8_t hcgeDecryptByte()
- {
- uint8_t kpos = (hcgPosition ^ hcgAkey[((uint8_t)hcgPosition ^ (uint8_t)(hcgPosition >> 4)) & 0xF]) & 0xF;
- char v1 = fgetc(fHcgData);
- char v2 = hcgPosition++;
- return hcgAkey[kpos] ^ v2 ^ v1;
- }
- uint8_t hcgeDecryptByte2() {
- uint8_t kpos = (hcgPosition2 ^ hcgAkey[((uint8_t)hcgPosition2 ^ (uint8_t)((uint32_t)hcgPosition2 >> 4)) & 0xF]) & 0xF;
- char v1 = fgetc(fHcgData);
- char v2 = hcgPosition2++;
- return hcgAkey[kpos] ^ v2 ^ v1;
- }
- bool hcgeOpenHcg(char *path) {
- int i;
- FILE *f = fopen(path, "rb");
- if (!f) return false;
- fHcgData = f;
- fseek(f, -0x100C, SEEK_END);
- hcgKey = fgetc(f) << 24;
- fseek(f, 2, SEEK_CUR);
- hcgKey += fgetc(f) << 16;
- fseek(f, 2, SEEK_CUR);
- hcgKey += fgetc(f) << 8;
- fseek(f, 2, SEEK_CUR);
- hcgKey += fgetc(f) << 0;
- for (i = 0; i < 0x10; i++) {
- hcgAkey[i] = hcgeFillAkey();
- }
- fseek(f, -0x100B, SEEK_END);
- hcgPosition2 = ftell(f);
- hcgEntryDirOff = hcgeDecryptByte2() << 24;
- hcgEntryFilesOff = hcgeDecryptByte2() << 24;
- fgetc(fHcgData);
- hcgPosition2++;
- hcgEntryDirOff += hcgeDecryptByte2() << 16;
- hcgEntryFilesOff += hcgeDecryptByte2() << 16;
- fgetc(fHcgData);
- hcgPosition2++;
- hcgEntryDirOff += hcgeDecryptByte2() << 8;
- hcgEntryFilesOff += hcgeDecryptByte2() << 8;
- fgetc(fHcgData);
- hcgPosition2++;
- hcgEntryDirOff += hcgeDecryptByte2();
- hcgEntryFilesOff += hcgeDecryptByte2();
- rewind(fHcgData);
- fseek(fHcgData, hcgEntryDirOff, SEEK_SET);
- hcgPosition2 = hcgEntryDirOff;
- hcgEntryRootOff = hcgeDecryptByte2() << 16;
- hcgEntryRootOff += hcgeDecryptByte2() << 8;
- hcgEntryRootOff += hcgeDecryptByte2();
- hcgEntryRootOff += hcgEntryFilesOff;
- hcgRootFilesCount = hcgeDecryptByte2();
- return true;
- }
- int Read2(uint8_t *data, int offset) {
- return (data[offset + 0] << 8) | (data[offset + 1] << 8);
- }
- int Read3(uint8_t *data, int offset) {
- return (data[offset + 0] << 16) | (data[offset + 1] << 8) | (data[offset + 2] << 0);
- }
- int Read4(uint8_t *data, int offset) {
- return (data[offset + 0] << 24) | (data[offset + 1] << 16) | (data[offset + 2] << 8) | (data[offset + 3] << 0);
- }
- int main() {
- char buf[0x100];
- if (hcgeOpenHcg("game.hcg")) {
- int i, j, len;
- char buf[0x100];
- fseek(fHcgData, 0, SEEK_END);
- len = ftell(fHcgData);
- rewind(fHcgData);
- hcgPosition = 0;
- uint8_t *dec = (uint8_t*)malloc(len);
- for (i = 0; i < len; i++)
- dec[i] = hcgeDecryptByte();
- fclose(fHcgData);
- int dirsCount = dec[hcgEntryDirOff + 8];
- int dirsOff = hcgEntryDirOff + 11;
- for (i = 0; i < dirsCount; i++) {
- int entryLen = dec[dirsOff];
- char *strDirname = (char*)&dec[dirsOff + 1];
- int strLen = strlen(strDirname);
- int off = Read3(dec, dirsOff + strLen + 2);
- int count = dec[dirsOff + strLen + 5];
- int filesOff = hcgEntryFilesOff + off;
- _mkdir(strDirname);
- for (j = 0; j < count; j++) {
- int fileEntryLen = dec[filesOff];
- char *strFilename = (char*)&dec[filesOff + 1];
- int strLen = strlen(strFilename);
- int off = Read4(dec, filesOff + strLen + 2);
- int len = Read3(dec, filesOff + strLen + 6);
- filesOff += fileEntryLen;
- sprintf(buf, "%s\\%s", strDirname, strFilename);
- printf("%s\n", buf);
- FILE *fOut = fopen(buf, "wb");
- if (fOut) {
- fwrite(dec + off, 1, len, fOut);
- fclose(fOut);
- }
- }
- dirsOff += entryLen;
- }
- int rootOff = hcgEntryRootOff;
- for (i = 0; i < hcgRootFilesCount; i++) {
- int fileEntryLen = dec[rootOff];
- char *strFilename = (char*)&dec[rootOff + 1];
- int strLen = strlen(strFilename);
- int off = Read4(dec, rootOff + strLen + 2);
- int len = Read3(dec, rootOff + strLen + 6);
- rootOff += fileEntryLen;
- printf("%s\n", strFilename);
- FILE *fOut = fopen(strFilename, "wb");
- if (fOut) {
- fwrite(dec + off, 1, len, fOut);
- fclose(fOut);
- }
- }
- free(dec);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement