/* @ NosTale Text File Extractor @ */ //--INCLUDES-- #include #include //--INCLUDES-- //--Decrypt text file-- int decryptnosfile(unsigned char *cData, unsigned int f_buffer, unsigned char *cOut, unsigned int &nOut) { static unsigned char table[] = { 0, 0x20,'-','.','0','1','2','3','4','5','6','7','8','9', 0x0d }; unsigned int i, offset, len; unsigned char size, c; len = f_buffer; unsigned char *cBuffer; cBuffer = (unsigned char*)malloc(f_buffer + 1); memcpy(cBuffer, cData, f_buffer); offset = nOut = 0; while(offset < len) { if(cBuffer[offset] == 0xFFu) { offset++; *(cOut + nOut++) = 0x0d; continue; } size = cBuffer[offset++]; i = 0; if ((size & 0x80U) == 0) { while ((i++ < size) && (offset < len)) { *(cOut + nOut++) = (cBuffer[offset++] ^ 0x33U); } } else { size &= 0x7FU; while ((i < size) && (offset < len)) { c = cBuffer[offset++]; *(cOut + nOut++) = (table[(c & 0xF0U) >> 4]); if (table[c & 0x0FU] != 0) *(cOut + nOut++) = table[c & 0x0FU]; i += 2; } } } free(cBuffer); return offset; } //--Decrypt text file-- //--MAIN-- void main() { std::string infile_name; unsigned int file_num, file_count, file_name_size, file_crypto_mode, file_size; FILE *inFile, *outFile; std::cout << " NTExtractor" << std::endl << " Write file name: "; std::cin >> infile_name; inFile = fopen(infile_name.c_str(),"rb"); if(inFile == NULL) return; fread(&file_num, 1, 4, inFile); std::cout << file_num << " files found" << std::endl; for(auto i = 0; i < file_num; i++) { fread(&file_count, 1, 4, inFile); fread(&file_name_size, 1, 4, inFile); char *file_name = (char*)malloc(file_name_size+1); fread(file_name, 1, file_name_size, inFile); file_name[file_name_size] = 0; fread(&file_crypto_mode, 1, 4, inFile); fread(&file_size, 1, 4, inFile); unsigned char *file = (unsigned char*)malloc(file_size+1); fread(file, 1, file_size, inFile); file[file_size] = 0; std::cout << " File [" << file_count << "] '"<< file_name <<"' size: " << file_size / 1024 << "KB" << std::endl; outFile = fopen(file_name,"wb"); unsigned char *file_decrypted = (unsigned char*)malloc(2*file_size); unsigned int file_decrypted_lenght = 0; decryptnosfile(file, file_size, file_decrypted, file_decrypted_lenght); fwrite(file_decrypted,1, file_decrypted_lenght,outFile); std::cout << " The file are decrypted and saved!" << std::endl; fclose(outFile); } fclose(inFile); std::cout << " Files extracted correctly" << std::endl; _sleep(1000); } //--MAIN--