nirai: improve data decryption

This commit is contained in:
Master Jumblespeed 2015-08-16 12:29:30 -04:00
parent 61b8cc4fd3
commit 723603f5a8
2 changed files with 21 additions and 14 deletions

View file

@ -31,14 +31,12 @@ def niraicall_obfuscate(code):
niraimarshal.niraicall_obfuscate = niraicall_obfuscate niraimarshal.niraicall_obfuscate = niraicall_obfuscate
class StridePackager(NiraiPackager): class StridePackager(NiraiPackager):
HEADER = 'TTSROCKS' HEADER = 'TTSTRIDE'
BASEDIR = '..' + os.sep BASEDIR = '..' + os.sep
def __init__(self, outfile): def __init__(self, outfile):
NiraiPackager.__init__(self, outfile) NiraiPackager.__init__(self, outfile)
self.__manglebase = self.get_mangle_base(self.BASEDIR) self.__manglebase = self.get_mangle_base(self.BASEDIR)
#self.add_panda3d_dirs()
#self.add_default_lib()
def add_source_dir(self, dir): def add_source_dir(self, dir):
self.add_directory(self.BASEDIR + dir, mangler=self.__mangler) self.add_directory(self.BASEDIR + dir, mangler=self.__mangler)
@ -95,7 +93,7 @@ class StridePackager(NiraiPackager):
# Compile the engine # Compile the engine
if args.compile_cxx: if args.compile_cxx:
compiler = NiraiCompiler('stride.exe', libs=set(glob.glob('C:/repos/libpandadna/libpandadna.dir/Release/*.obj'))) compiler = NiraiCompiler('stride.exe', libs=set(glob.glob('libpandadna/libpandadna.dir/Release/*.obj')))
compiler.add_nirai_files() compiler.add_nirai_files()
compiler.add_source('src/stride.cxx') compiler.add_source('src/stride.cxx')

View file

@ -8,7 +8,7 @@
extern "C" __declspec(dllexport) void initlibpandadna(); extern "C" __declspec(dllexport) void initlibpandadna();
void init_libpandadna(); void init_libpandadna();
const char* header = "TTSROCKS"; const char* header = "TTSTRIDE";
const int header_size = 8; const int header_size = 8;
const int key_and_iv_size = 16; const int key_and_iv_size = 16;
@ -51,9 +51,9 @@ int niraicall_onLoadGameData()
std::string brawdata = ss.str(); std::string brawdata = ss.str();
// Decrypted the encrypted key and iv // Decrypted the encrypted key and iv
std::string enckeyandiv = brawdata.substr(0, 48); std::string enckeyandiv = brawdata.substr(0, (key_and_iv_size * 2) + key_and_iv_size);
unsigned char* deckeyandiv = new unsigned char[32]; unsigned char* deckeyandiv = new unsigned char[enckeyandiv.size()];
unsigned char* fixed_key = new unsigned char[key_and_iv_size]; unsigned char* fixed_key = new unsigned char[key_and_iv_size];
unsigned char* fixed_iv = new unsigned char[key_and_iv_size]; unsigned char* fixed_iv = new unsigned char[key_and_iv_size];
@ -67,15 +67,24 @@ int niraicall_onLoadGameData()
int deckeyandivsize = AES_decrypt((unsigned char*)enckeyandiv.c_str(), enckeyandiv.size(), fixed_key, fixed_iv, deckeyandiv); int deckeyandivsize = AES_decrypt((unsigned char*)enckeyandiv.c_str(), enckeyandiv.size(), fixed_key, fixed_iv, deckeyandiv);
std::stringstream sss; delete[] fixed_key;
sss << deckeyandiv; delete[] fixed_iv;
std::string strdeckeyandiv = sss.str();
unsigned char* key = new unsigned char[key_and_iv_size];
unsigned char* iv = new unsigned char[key_and_iv_size];
// Move the decrypted key and iv into their subsequent char
for (int i = 0; i < key_and_iv_size; ++i)
iv[i] = deckeyandiv[i];
for (int i = 0; i < key_and_iv_size; ++i)
key[i] = deckeyandiv[i + key_and_iv_size];
// Decrypt the game data // Decrypt the game data
std::string rawdata = brawdata.substr(48); std::string rawdata = brawdata.substr((key_and_iv_size * 2) + key_and_iv_size);
unsigned char* iv = (unsigned char*)strdeckeyandiv.substr(0, key_and_iv_size).c_str();
unsigned char* key = (unsigned char*)strdeckeyandiv.substr(key_and_iv_size).c_str();
unsigned char* decrypted_data = new unsigned char[rawdata.size()]; unsigned char* decrypted_data = new unsigned char[rawdata.size()];
int decsize = AES_decrypt((unsigned char*)rawdata.c_str(), rawdata.size(), key, iv, decrypted_data); // Assumes no error int decsize = AES_decrypt((unsigned char*)rawdata.c_str(), rawdata.size(), key, iv, decrypted_data); // Assumes no error
delete[] key; delete[] key;