Files
2022-10-26 12:25:11 +08:00

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;
}