Mercurial > otakunoraifu
changeset 30:3fe3e5f184b5
* Added CLANNAD Full Voice's key
author | thib |
---|---|
date | Fri, 06 Mar 2009 21:25:42 +0000 |
parents | d229cce98f50 |
children | 5ae5533b3a9a |
files | system/file.cc system/file.h xlovesys.cc |
diffstat | 3 files changed, 45 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/system/file.cc +++ b/system/file.cc @@ -599,6 +599,43 @@ int FILESEARCH::InitRoot(char* root) { return 0; } +void FILESEARCH::SetXorKey(char *key) +{ + unsigned short int i; + for (i=0; i < 16; i++) + xor_key[i] = key[i]; +} + +void FILESEARCH::GuessXorKey(char *regname) +{ + char key1[16] = { + 0xa8, 0x28, 0xfd, 0x66, + 0xa0, 0x23, 0x77, 0x69, + 0xf9, 0x45, 0xf8, 0x2c, + 0x7c, 0x00, 0xad, 0xf4 + }; + + char key2[16] = { + 0xAF, 0x2F, 0xFB, 0x6B, + 0xAF, 0x30, 0x77, 0x17, + 0x87, 0x48, 0xFE, 0x2C, + 0x68, 0x1A, 0xB9, 0xF0 + }; + + + if (strcmp(regname, "KEY\\CLANNAD_FV") == 0) { + SetXorKey(key2); + } + else { + SetXorKey(key1); + } +} + +const char * FILESEARCH::GetXorKey(void) +{ + return xor_key; +} + void FILESEARCH::SetFileInformation(FILETYPE tp, ARCTYPE is_arc, char* filename) { int type = tp; if (type < 0 || type >= TYPEMAX) return; @@ -1386,12 +1423,7 @@ char ARCINFO2k::decode_seed[256] ={ ,0x20 ,0x50 ,0x6a ,0x00 ,0xe8 ,0x47 ,0x28 ,0x01 ,0x00 ,0x8b ,0x7d ,0xe8 ,0x89 ,0x45 ,0xf4 ,0x8b ,0xf0 ,0xa1 ,0xe0 ,0x30 ,0x44 ,0x00 ,0x83 ,0xc4 ,0x08 ,0x85 ,0xc0 ,0x75 ,0x56 ,0x8b ,0x1d ,0xd0 ,0xb0 ,0x43 ,0x00 ,0x85 ,0xff ,0x76 ,0x49 ,0x81 ,0xff ,0x00 ,0x00 ,0x04 ,0x00 ,0x6a ,0x00 ,0x76}; -char ARCINFO2k::decode_seed2[16] = { - 0xa8, 0x28, 0xfd, 0x66, - 0xa0, 0x23, 0x77, 0x69, - 0xf9, 0x45, 0xf8, 0x2c, - 0x7c, 0x00, 0xad, 0xf4 -}; + bool ARCINFO2k::ExecExtract(void) { int i; @@ -1424,9 +1456,10 @@ bool ARCINFO2k::ExecExtract(void) { while(lzExtract(Extract_DataType_SCN2k(), char(), s, d, send, dend)) ; } if (read_little_endian_int(data+4) == 0x1adb2) { // Little Busters! + const char *decode_key = file_searcher.GetXorKey(); int header_size = info.private_data; for (i=0x100; i<=0x200 && header_size+i < info.filesize; i++) { - ret_data[header_size+i] ^= decode_seed2[i&0x0f]; + ret_data[header_size+i] ^= decode_key[i&0x0f]; } } delete[] decoded_data;
--- a/system/file.h +++ b/system/file.h @@ -136,6 +136,7 @@ private: /* デフォルトの information */ static ARCTYPE default_is_archived[TYPEMAX]; static char* default_dirnames[TYPEMAX]; + char xor_key[16]; public: FILESEARCH(void); ~FILESEARCH(); @@ -153,6 +154,9 @@ public: /* ある種類のファイルをすべてリストアップ ** 末尾は NULL pointer */ + void SetXorKey(char*); + void GuessXorKey(char*); + const char* GetXorKey(void); char** ListAll(FILETYPE type); };