230 lines
5.7 KiB
C++
230 lines
5.7 KiB
C++
// sun_dump_decoder.cpp : 콘솔 응용 프로그램에 대한 진입점을 정의합니다.
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
|
|
#include <fstream>
|
|
#include <conio.h>
|
|
//#include <iostream>
|
|
#include <tchar.h>
|
|
#include <direct.h>
|
|
|
|
#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;
|
|
}
|