Ask Question

Name:
Title:
Your Question:

Answer Question

Name:
Your Answer:
User Submitted Source Code!


Description:
  001CC
Language: C/C++
Code:
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <string>
 
static std:: vector<char> ReadAllBytes( char const*  filename);
 
int main()
{
     // set up sig
 std:: string sig =  "84 C0 75 ?? 48 8D 15 ?? ?? ?? ?? 49 8B ?? E8 ?? ?? ?? ?? 48";
     short siglen =  ( sig.size()  +  1 )  /  3;
     
     // check if file exists
     struct stat buffer;
     if ( stat("DayZServer_x64.exe",  & buffer) != 0)
     {
 std:: cout < <  "File not found. Place this program in the same directory as the server exe" < <  std:: endl;
 getchar();
          return 0;
     }
     
     // read all bytes into array
 std:: vector<char> bytes =  ReadAllBytes("DayZServer_x64.exe");
     long size =  bytes.size();
     
     // split sig into parts
     uint8_t*  sigparts =  new uint8_t[ siglen];
     for ( int i =  0;  i <  siglen;  i++)
     {
 sigparts[ i]  =  sig.substr(i *  3 ,  2 ).compare("??") == 0 ? 0 :  std:: stoi( sig.substr(i *  3,  2 ),  nullptr,  16);
     }
 
     long location =  0;
     for (long i = 0; i < size; i++)
     {
          if ((uint8_t)bytes[i] == sigparts[0])
          {
               bool found = false;
               for (int j = 1; j < siglen; j++)
               {
                    // ?? was turned into 0, we can skip it as we don't care what value is here
                    if (sigparts[j] == 0)
                         continue;
                    // if the byte doesn't match the byte in the sig, don't continue looking
                    if ((uint8_t)bytes[i + j] != sigparts[j])
                         break;
                    // if all bytes match, we found our sig and can exit
                    else if (j == siglen - 1)
 found = true;
               }
               // if we found our sig, record the location and exit the loop
               if (found)
               {
 location = i;
                    break;
               }
          }
     }
 
     if (location != 0)
     {
          // if we found our sig, patch the location
          std::cout << "patching..." << std::endl;
          std::fstream s("DayZServer_x64.exe");
          s.seekp(location, std::ios_base::beg);
          char* patch = new char[2] { 0x3c, 0x02 };
          s.write(patch, 2);
          std::cout << "done patching!" << std::endl;
          std::cout << "Remember to remove or rename the battleye folder to disable battleye" << std::endl;
     }
     else
     {
          // sig didn't find a match
          std::cout << "sig not found" << std::endl;
     }
 
     getchar();
}
 
// credit Martin York on stackoverflow
// https://codereview.stackexchange.com/a/22907
static std::vector<char> ReadAllBytes(char const* filename)
{
     std::ifstream ifs(filename, std::ios::binary | std::ios::ate);
     std::ifstream::pos_type pos = ifs.tellg();
 
     std::vector<char> result(pos);
 
     ifs.seekg(0, std::ios::beg);
     ifs.read(&result[0], pos);
 
     return result;
}
          
Comments: