// sun_dump_decoder.cpp : ÄÜ¼Ö ÀÀ¿ë ÇÁ·Î±×·¥¿¡ ´ëÇÑ ÁøÀÔÁ¡À» Á¤ÀÇÇÕ´Ï´Ù. // #include "stdafx.h" #include #include //#include #include #include #include "AuMD5Encrypt.h" #define MOVE_FILE_FOLDER // ±¹°¡º°·Î ÆÄÀÏÀ» À̵¿ ½ÃŲ´Ù. #define _EXECUTE_MD5 // md5 Àû¿ëÇϱâ using namespace std; #define DEVERSION 101 //¹öÀü #define HashKey "1111" #define NPCMANAGER_HASHKEY "npcmanager_key" #define HASH_KEY_STRING_SERVERINFO "1111" _TCHAR version_string[64] = {0,}; enum { kNation_KR = 0, kNation_JP, kNation_CH, kNation_GSP, kNation_RU, kNation_Max, }; _TCHAR nation_name[kNation_Max][8] = {"Çѱ¹", "ÀϺ»", "Áß±¹", "±Û·Î¹ú", "·¯½Ã¾Æ"}; int GetNation(const _TCHAR* filename) { int nation_number = kNation_Max; _TCHAR* string_buffer = (_TCHAR*)filename; if (_tcsstr(_tcslwr(string_buffer), "jp")) { nation_number = kNation_JP; } else if (_tcsstr(_tcslwr(string_buffer), "ch")) { nation_number = kNation_CH; } else if (_tcsstr(_tcslwr(string_buffer), "gsp")) { nation_number = kNation_GSP; } else if (_tcsstr(_tcslwr(string_buffer), "ru")) { nation_number = kNation_RU; } else//kr { nation_number = kNation_KR; } return nation_number; } _TCHAR* GetVersion(const _TCHAR* filename) { _TCHAR* string_buffer; const int kVersion_Depth = 15; //strlen("120104_0410.dmp") string_buffer = _tcsstr(_tcslwr((_TCHAR*)filename), "sungame_"); int string_length = 0; if (string_buffer) { string_length = (int)_tcslen(string_buffer); } if (string_length - kVersion_Depth >= 0) { _TCHAR* string_pointer = string_buffer + (string_length - kVersion_Depth); sprintf(version_string, "webzen@%d", _tstoi(string_pointer)); } else { sprintf(version_string, "webzen@version"); } printf("version(%s)\n", version_string); return version_string; } int _tmain(int argc, _TCHAR* argv[]) { if (argc < 2) { printf("input file name...\r\n"); _getch(); return 0; } bool is_md5 = true; bool is_filemove = false; TCHAR string_folder[1024] = {0,}; TCHAR string_filename[1024] = {0,}; fstream file; string filename = argv[1]; printf("[SUN DUMP DECODER Ver.%d]\n", DEVERSION); //---------ȯ°æÆÄÀÏ Àбâ------------- sprintf(string_folder, "%s", argv[0]); strrchr(string_folder, '\\')[1] = '\0'; //Æú´õ¸í¸¸ »Ì¾Æ³½´Ù. sprintf(string_filename, "%s\\decoder_env.ini", string_folder); FILE* fp = fopen(string_filename, "r"); TCHAR buffer[1024] = {0,}; if (fp) { fgets(buffer, 1024, fp); if (strstr(buffer, "MD5=1")) { printf("¿É¼Ç: MD5 Àû¿ë, "); is_md5 = true; } else { printf("¿É¼Ç: MD5 Àû¿ë¾ÈÇÔ, "); is_md5 = false; } fgets(buffer, 1024, fp); if (strstr(buffer, "FILEMOVE=1")) { printf("ÆÄÀÏÀ̵¿\n\n"); is_filemove = true; } else { printf("ÆÄÀÏÀ̵¿¾ÈÇÔ\n\n"); is_filemove = false; } fclose(fp); } else { printf("ȯ°æÆÄÀÏÀÌ ¾ø½À´Ï´Ù. MD5¸¸ Àû¿ëµË´Ï´Ù.\n\n"); } //=================================== #ifdef MOVE_FILE_FOLDER if (is_filemove) { for (int j = kNation_KR; j < kNation_Max; ++j) { sprintf(string_folder, "%s", filename.c_str()); strrchr(string_folder, '\\')[1] = '\0'; //Æú´õ¸í¸¸ »Ì¾Æ³½´Ù. _TCHAR string_mkfolder[1024] = {0,}; sprintf(string_mkfolder, "%s\\%s", string_folder, nation_name[j]); _mkdir(string_mkfolder); } } #endif//MOVE_FILE_FOLDER for (int i = 1; i < argc; ++i) { filename = argv[i]; sprintf(string_folder, "%s", filename.c_str()); strrchr(string_folder, '\\')[1] = '\0'; //Æú´õ¸í¸¸ »Ì¾Æ³½´Ù. sprintf(string_filename, "%s", strrchr(filename.c_str(), '\\')+1);//ÆÄÀÏ¸í¸¸ »Ì¾Æ³½´Ù. #ifdef _EXECUTE_MD5 if (is_md5) { printf("%d. ÆÄÀÏ Àбâ: %s\n", i, filename.c_str()); file.open(filename.c_str(), ios::in | ios::out | ios::binary); if (!file) { printf("%d-1. ÆÄÀÏÀ» ¿­¼ö ¾ø½À´Ï´Ù(%s)\n", i, filename.c_str()); _getch(); return NULL; } file.seekg(0, ios::end); size_t size = file.tellg(); char* buffer = new char[size]; file.seekg(0, ios::beg); file.read(buffer, (unsigned int)size); AuMD5Encrypt crypt; printf("%d. º¯È¯ ½ÃÀÛ: ", i); if (!crypt.DecryptString(GetVersion(filename.c_str()), buffer, (unsigned int)size)) { _getch(); printf("\n%d-2. DecryptString ¿¡·¯(%s)\n", i, filename.c_str()); return 0; } printf("%d. º¯È¯ ¿Ï·á\n", i); file.seekp(0, ios::beg); file.write(buffer, (unsigned int)size); file.close(); if (buffer) { delete[] buffer; } } #endif//EXECUTE_MD5 #ifdef MOVE_FILE_FOLDER if (is_filemove) { printf("%d. %s ±¹°¡ Æú´õ·Î À̵¿\n\n", i, nation_name[GetNation(filename.c_str())]); TCHAR system_cmd[1024] = {0,}; sprintf(system_cmd, "move \"%s\" \"%s\%s\\%s\"", filename.c_str(), string_folder, nation_name[GetNation(filename.c_str())], string_filename); system(system_cmd); } #endif//MOVE_FILE_FOLDER } printf("\n<¿Ï·á: ÆÄÀÏ %d°³>\n", i-1); _getch(); return 0; }