Advertisement
Guest User

LUDIJAK_INN_RESET

a guest
Jul 10th, 2013
3,144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.38 KB | None | 0 0
  1. #include <iostream>
  2. #include <Windows.h>
  3. #include <psapi.h>
  4. #include <TlHelp32.h>
  5. #include <fcntl.h>
  6. #include <io.h>
  7.  
  8. char dlldir[320];
  9. char *GetDirectoryFile(const char *filename)
  10. {
  11.     static char path[320];
  12.     strcpy_s(path, dlldir);
  13.     strcat_s(path, filename);
  14.     return path;
  15. }
  16.  
  17.  
  18. class CIniReader
  19. {
  20. public:
  21.  CIniReader(char* szFileName);
  22.  int ReadInteger(char* szSection, char* szKey, int iDefaultValue);
  23.  float ReadFloat(char* szSection, char* szKey, float fltDefaultValue);
  24.  bool ReadBoolean(char* szSection, char* szKey, bool bolDefaultValue);
  25.  char* ReadString(char* szSection, char* szKey, const char* szDefaultValue);
  26. private:
  27.   char m_szFileName[255];
  28. };
  29.  
  30.  
  31. CIniReader::CIniReader(char* szFileName)
  32. {
  33.  memset(m_szFileName, 0x00, 255);
  34.  memcpy(m_szFileName, szFileName, strlen(szFileName));
  35. }
  36. int CIniReader::ReadInteger(char* szSection, char* szKey, int iDefaultValue)
  37. {
  38.  int iResult = GetPrivateProfileInt(szSection,  szKey, iDefaultValue, m_szFileName);
  39.  return iResult;
  40. }
  41. float CIniReader::ReadFloat(char* szSection, char* szKey, float fltDefaultValue)
  42. {
  43.  char szResult[255];
  44.  char szDefault[255];
  45.  float fltResult;
  46.  sprintf(szDefault, "%f",fltDefaultValue);
  47.  GetPrivateProfileString(szSection,  szKey, szDefault, szResult, 255, m_szFileName);
  48.  fltResult =  atof(szResult);
  49.  return fltResult;
  50. }
  51. bool CIniReader::ReadBoolean(char* szSection, char* szKey, bool bolDefaultValue)
  52. {
  53.  char szResult[255];
  54.  char szDefault[255];
  55.  bool bolResult;
  56.  sprintf(szDefault, "%s", bolDefaultValue? "True"
  57.      : "False");
  58.  GetPrivateProfileString(szSection, szKey, szDefault, szResult, 255, m_szFileName);
  59.  bolResult =  (strcmp(szResult, "True") == 0 ||
  60.      strcmp(szResult, "true") == 0) ? true : false;
  61.  return bolResult;
  62. }
  63. char* CIniReader::ReadString(char* szSection, char* szKey, const char* szDefaultValue)
  64. {
  65.  char* szResult = new char[255];
  66.  memset(szResult, 0x00, 255);
  67.  GetPrivateProfileString(szSection,  szKey,
  68.         szDefaultValue, szResult, 255, m_szFileName);
  69.  return szResult;
  70. }
  71.  
  72.  
  73. class CSeed
  74. {
  75. public:
  76. char _0x0000[8];
  77.     DWORD ServerSeed;
  78.  
  79. };
  80.  
  81. void CreateDebugConsole()
  82. {
  83.     HANDLE lStdHandle = 0;
  84.     int hConHandle = 0;  
  85.     FILE *fp = 0;
  86.     AllocConsole( );
  87.     lStdHandle = GetStdHandle( STD_OUTPUT_HANDLE );
  88.     hConHandle = _open_osfhandle( PtrToUlong( lStdHandle ), _O_TEXT );
  89.     SetConsoleTitle("Cube World Server");
  90.     SetConsoleTextAttribute(lStdHandle,FOREGROUND_GREEN|FOREGROUND_INTENSITY|BACKGROUND_RED);
  91.     fp = _fdopen( hConHandle, "w" );
  92.     *stdout = *fp;
  93.     setvbuf( stdout, NULL, _IONBF, 0 );
  94. }
  95.  
  96. DWORD GetModuleSize(LPSTR strModuleName)
  97. {
  98.     MODULEENTRY32   lpme= {0};
  99.     DWORD           dwSize=0;
  100.     DWORD           PID=GetCurrentProcessId();
  101.     BOOL            isMod=0;
  102.     char            chModName[256];
  103.  
  104.     strcpy_s(chModName,strModuleName);
  105.     _strlwr_s(chModName);
  106.  
  107.     HANDLE hSnapshotModule=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE ,PID);
  108.     if (hSnapshotModule)
  109.     {
  110.         lpme.dwSize=sizeof(lpme);
  111.         isMod=Module32First(hSnapshotModule,&lpme);
  112.         while(isMod)
  113.         {
  114.             if (strcmp(_strlwr(lpme.szExePath),chModName))
  115.             {
  116.                 dwSize=(DWORD)lpme.modBaseSize;
  117.                 CloseHandle(hSnapshotModule);
  118.                 return dwSize;
  119.             }
  120.         isMod=Module32Next(hSnapshotModule,&lpme);
  121.         }
  122.     }
  123.     CloseHandle(hSnapshotModule);
  124.  
  125.     return 0;
  126. }
  127.  
  128.  
  129. DWORD FindPattern(DWORD start_offset, DWORD size, BYTE* pattern, char mask[] )
  130. {
  131.  
  132.     DWORD pos = 0;
  133.     int searchLen = strlen(mask) - 1;
  134.     for( DWORD retAddress = start_offset; retAddress < start_offset + size; retAddress++ )
  135.     {
  136.         if( *(BYTE*)retAddress == pattern[pos] || mask[pos] == '?' ){
  137.             if( mask[pos+1] == '\0' )
  138.                 return (retAddress - searchLen);
  139.             pos++;
  140.         }
  141.         else
  142.             pos = 0;
  143.     }
  144.     return NULL;
  145. }
  146.  
  147.  
  148. void MakeJMP(BYTE *pAddress, DWORD dwJumpTo, DWORD dwLen)
  149. {
  150.     DWORD dwOldProtect, dwBkup, dwRelAddr;
  151.     VirtualProtect(pAddress, dwLen, PAGE_EXECUTE_READWRITE, &dwOldProtect);
  152.     dwRelAddr = (DWORD) (dwJumpTo - (DWORD) pAddress) - 5;
  153.     *pAddress = 0xE9;
  154.     *((DWORD *)(pAddress + 0x1)) = dwRelAddr;
  155.     for(DWORD x = 0x5; x < dwLen; x++) *(pAddress + x) = 0x90;
  156.     VirtualProtect(pAddress, dwLen, dwOldProtect, &dwBkup);
  157.    
  158.     return;
  159.  
  160. }
  161.  
  162. DWORD g_dwSeedAddr=FindPattern(reinterpret_cast<DWORD>(GetModuleHandle(NULL)),GetModuleSize("Server.exe"),
  163.     reinterpret_cast<PBYTE>("\x8B\x0B\x8B\x46\x08\xC7\x45\x00\x00\x00\x00\x00\x3B\x81\x00\x00\x00\x00\x0F\x85\x00\x00\x00\x00\x83\xB9\x00\x00\x00\x00\x00"),
  164.     "xxxxxxx?????xx????xx????xx?????");
  165.  
  166. DWORD g_dwCodeCaveAddr= FindPattern(reinterpret_cast<DWORD>(GetModuleHandle(NULL)),GetModuleSize("Server.exe"),
  167.     reinterpret_cast<PBYTE>("\x81\xC1\x00\x00\x00\x00\xE8\x00\x00\x00\x00\x8D\x4D\xA8\xC6\x45\xFC\x01\xE8\x00\x00\x00\x00"),
  168.     "xx????x????xxxxxxxx????");
  169.  
  170.  
  171. DWORD dwSeedJMPBack=(g_dwSeedAddr+5);
  172. DWORD g_dwSeedValueAddr=0;
  173. __declspec(naked) void SetSeed()
  174. {
  175.     __asm
  176.     {
  177.         mov     ecx,[ebx]
  178.         mov     g_dwSeedValueAddr,esi
  179.         mov     eax,[esi+8]
  180.         JMP     [dwSeedJMPBack]
  181.     }
  182. }
  183.  
  184.  
  185. DWORD dwJMPBack=(g_dwCodeCaveAddr+6);
  186. DWORD dwJMPBack2=(g_dwCodeCaveAddr+11);
  187. __declspec(naked) void CrashFix()
  188. {
  189.     __asm
  190.     {
  191.         add     ecx, 90h
  192.         cmp     ecx,0x90
  193.         JNE     ZERO
  194.         JMP     [dwJMPBack2]
  195. ZERO:
  196.         JMP     [dwJMPBack]
  197.     }
  198. }
  199.  
  200. DWORD SERVER_SEED;
  201. DWORD WINAPI TempThread(LPVOID lpParam)
  202. {
  203.  do {
  204.      Sleep(1);
  205.  }while(!g_dwSeedValueAddr);
  206. CSeed *cSeed=reinterpret_cast<CSeed*> (g_dwSeedValueAddr);
  207. cSeed->ServerSeed=SERVER_SEED;
  208. printf("Server Seed var found at %x\n",g_dwSeedValueAddr);
  209.  return 0;
  210. }
  211.  
  212.  
  213.  
  214. BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
  215. {
  216. if (ul_reason_for_call == DLL_PROCESS_ATTACH)
  217. {
  218.  
  219.         GetModuleFileName( hModule, dlldir, 512 );
  220.         for(int i = ( int )strlen( dlldir ); i > 0; i--)
  221.         {
  222.             if(dlldir[i] == '\\')
  223.             {
  224.                 dlldir[i+1] = 0;
  225.                 break;
  226.             }
  227.         }
  228.         CreateThread( NULL, NULL, (LPTHREAD_START_ROUTINE)TempThread, (LPVOID)hModule, NULL, NULL );
  229.         CIniReader cIniReader=CIniReader(GetDirectoryFile("settings.ini"));
  230.         const BYTE MAX_PLAYER=cIniReader.ReadInteger("Settings","Players",64);
  231.         const BYTE ALLOW_INN_TIME_RESET=cIniReader.ReadInteger("Settings","AllowTimeReset",0);
  232.         SERVER_SEED=cIniReader.ReadInteger("Settings","Seed",555);
  233.         CreateDebugConsole();
  234.  
  235. DWORD server_base = (DWORD)GetModuleHandle("Server.exe");
  236.  
  237.  
  238. DWORD max_players_addr = FindPattern(reinterpret_cast<DWORD>(GetModuleHandle(NULL)),GetModuleSize("Server.exe"),
  239.     reinterpret_cast<PBYTE>("\xFF\x15\x00\x00\x00\x00\x8B\xC8\xFF\x15\x00\x00\x00\x00\x83\xBD\x6C\xFE\xFF\xFF\x04"),
  240.     "xx????xxxx????xxxxxxx");
  241. printf("MaxPlayerAddress found at %x\n",max_players_addr);
  242. max_players_addr += 20;
  243.  
  244. if (max_players_addr)
  245. {
  246. char* max_players = (char*)(max_players_addr);
  247. WriteProcessMemory(GetCurrentProcess(),(PVOID)max_players_addr,&MAX_PLAYER,1,0);
  248.  
  249. printf("Max players set to %d\n",(int)*max_players);
  250. }
  251. else
  252. printf("Max players address not found\n");
  253.  
  254.  
  255. DWORD dwMaxPlayerAddr2 = FindPattern(reinterpret_cast<DWORD>(GetModuleHandle(NULL)),GetModuleSize("Server.exe"),
  256.     reinterpret_cast<PBYTE>("\x83\xFF\x0A\x7F\x1B\x8B\x8D\x00\x00\x00\x00\xEB\xC0"),
  257.     "xxxxxxx????xx");
  258. printf("MaxPlayerAddress2 found at %x\n",dwMaxPlayerAddr2);
  259. dwMaxPlayerAddr2 += 2;
  260.  
  261. if (dwMaxPlayerAddr2)
  262. {
  263. char* szMaxPlayers = (char*)(dwMaxPlayerAddr2);
  264. WriteProcessMemory(GetCurrentProcess(),(PVOID)dwMaxPlayerAddr2,&MAX_PLAYER,1,0);
  265.  
  266. printf("Max players2 set to %d\n",(int)*szMaxPlayers);
  267. }
  268. else
  269. printf("Max players2 address not found\n");
  270.  
  271.  
  272. DWORD dwRangerSkillFixAddr= FindPattern(reinterpret_cast<DWORD>(GetModuleHandle(NULL)),GetModuleSize("Server.exe"),
  273.     reinterpret_cast<PBYTE>("\x79\x09\x8B\x84\x8E\x00\x00\x00\x00\x85\xC0\x75\x1B\x80\x7E\x60\x00"),
  274.     "xxxxx????xxxxxxxx");
  275. if(dwRangerSkillFixAddr)
  276. {
  277. printf("RangeSkillFixAddress found at %x\n",dwRangerSkillFixAddr);
  278. WriteProcessMemory(GetCurrentProcess(),(PVOID)dwRangerSkillFixAddr,"\xEB",1,0);
  279. }
  280. else
  281.     printf("RangeSkillFixAddress signature not found\n");
  282.  
  283. DWORD dwDisconnectFix= FindPattern(reinterpret_cast<DWORD>(GetModuleHandle(NULL)),GetModuleSize("Server.exe"),
  284.     reinterpret_cast<PBYTE>("\x8B\x01\xFF\x50\x08\x8B\x4E\x10\x85\xC9\x74\x15\x8B\x11\x3B\xCE\x0F\x95\xC0\x0F\xB6\xC0\x50\xFF\x52\x10\xC7\x46\x00\x00\x00\x00\x00"),
  285.     "xxxxxxxxxxxxxxxxxxxxxxxxxxxx?????");
  286. if(dwDisconnectFix)
  287. {
  288. dwDisconnectFix+=5;
  289. printf("dwDisconnectFix found at %x\n",dwDisconnectFix);
  290. WriteProcessMemory(GetCurrentProcess(),(PVOID)dwDisconnectFix,"\xEB\x3f\x90",3,0);
  291. }
  292. else
  293. {
  294.     printf("dwDisconnectFix signature not found\n");
  295. }
  296.  
  297. if(g_dwCodeCaveAddr)
  298. {
  299. MakeJMP((BYTE*)(g_dwCodeCaveAddr),(DWORD)CrashFix,0x6);
  300. }
  301. else
  302. {
  303.     printf("CodeCaveAddr signature not found\n");
  304. }
  305. if(g_dwSeedAddr)
  306. {
  307.     printf("ServerSeedAddr found at %x\n",g_dwSeedAddr);
  308.  MakeJMP((BYTE*)(g_dwSeedAddr),(DWORD)SetSeed,0x5);
  309. }
  310. else
  311. {
  312.     printf("Server Seed signature not found\n");
  313. }
  314. if(!ALLOW_INN_TIME_RESET)
  315. {
  316. DWORD dwInnTimeResetFixAddr= FindPattern(reinterpret_cast<DWORD>(GetModuleHandle(NULL)),GetModuleSize("Server.exe"),
  317.     reinterpret_cast<PBYTE>("\x80\xBE\x00\x00\x00\x00\x00\x74\x45\xF6\x46\x7E\x80\x0F\x85\x00\x00\x00\x00"),
  318.     "xx?????xxxxxxxx????");
  319. if(!dwInnTimeResetFixAddr)
  320.     printf("dwInnTimeResetFixAddr signature not found\n");
  321. else
  322. {
  323.     dwInnTimeResetFixAddr+=0x6;
  324.     printf("dwInnTimeResetFixAddr signature found at %x\n",dwInnTimeResetFixAddr);
  325.     WriteProcessMemory(GetCurrentProcess(),(PVOID)dwInnTimeResetFixAddr,"\x00",1,0);
  326. }
  327. }
  328.  
  329. }
  330.  
  331. return TRUE;
  332. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement