Wie code ich n Patcher in c++ ?

05/05/2011 00:23 t.burns#1
Hiho ePvpers

erst mal will ich was los werden: Ihr seid sowas von krank, dass ihr mich voll angesteckt habt. :D Ich habe hier einige gute Tuts gefunden und hab es hingekriegt n kleinen Trainer zu coden (ShaiyaDE, Climb-,Speed-, Wall- und n Rangehack für Bogi / Jäger. Das Ganze hab ich in MFC/C++ realisiert und muss nun mal den Code bereinigen, da es in der Source aussieht wie n Saustall^^

Ich hab auch von euch gelernt, wie ich die game.exe patchen kann mit CE/OllyDbg.

Dafür ein fettes Thx an euch.

Nun zu meinem Probnlem:
Nach einigen Stunden Suchen und Lesen hab ich leider nix gefunden, was mir weiterhilft, die Patches zu automatisieren. Nach jedem Serverupdate muss ich all die Adressen manuell wieder suchen und in meiner Source anpassen (Könnte auch alternativ mit nem cfg-file gemacht werden).

Meine Idee: die game.exe importieren, die zu patchenden Stellen suchen und die "neue" Exe wieder speichern.

Bloss wie bekomm ich die Exe in einem lesbaren Format eingelesen?

Mein Ansatz (erst mal als Konsolenanwendung):
Code:
    fstream f;
    char cstring[256];
	f.open(filename, ios::in);
    while (!f.eof())
    {
        f.getline(cstring, sizeof(cstring));
        cout << cstring << endl;
    }
    f.close();
Wenn ich wenigstens den Input in ein Format wie in CE/OllyDbg (hex oder asm) bringen könnte, wär mir schon sehr geholfen. - Bloss wie?

Thx für eventuelle Hilfe :)
05/09/2011 11:25 meak1#2
[Only registered and activated users can see links. Click Here To Register...]

schau dir das mal an, dort ist erklärt wie man mithilfe von SearchPattern Pointer erstellt die nach Update jeweils auch weiterhin funktionieren.
05/10/2011 07:17 t.burns#3
woww, vielen Dank, hab schnell reingeschaut und einige neue Dinge gelernt. Werd am Abend mal genauer hinschauen. Das mit den Basepointern ist mir schon bekannt, aber das mit den Pattern eröffnet mir wohl einige neue Möglichkeiten :)

Ein fettes THX.
05/10/2011 16:55 xNopex#4
Zu deinem Ansatz: Bitte im binary-mode einlesen! Hex darstellung wäre dann auch kein Problem mehr, du speicherst den Wert jedes Bytes (unsigned char) als unsigned int und gibst sie dann im Format deiner Wahl aus (Dec,Hex,Oct). Um das ganze dann so darzustellen, wie in Olly, müsstest du noch ne "asm-Lib" zu rate ziehen, die dir die Opcodes übersetzt, oder du programmierst das aufwendig selber.
05/10/2011 22:11 t.burns#5
Quote:
Originally Posted by xNopex View Post
Bitte im binary-mode einlesen!
Genau DA bin ich wohl gescheitert. Beim Einlesen Vergleichen einer Textdatei hat es funktioniert, bei ner EXE nicht. Und nun läuft es :)

Ich hab mich erst mal damit beschäftigt, 2 Files zu vergleichen. Ich werd das jedoch mal kurz so wie es is belassen und mal die Variante von meak1 durchgehn und schauen, ob ich das irgendwie bei mir einfliessen lassen kann.

btw, hier mal mein bisheriger Code:
Code:
#include <fstream> 
#include <iostream>  
#include <sys/stat.h>
#include <sys/types.h>

using namespace std;

//Deklaration der Funktionen
int dateigroesse(char dateiname[]);

//Deklaration der Variablen
struct stat buf;
char dateiname1[]="M:\\Tools\\game_original.exe";
char dateiname2[]="M:\\Tools\\game_patched.exe";
//char dateiname1[]="M:\\Tools\\Test1.txt";
//char dateiname2[]="M:\\Tools\\Test2.txt";


int main() { 
    
    // Deklaration der Variablen
    char ch1;
    char ch2;
    int countSpalte=0;
    int countZeile=0;
    int byteCount=0;
    
    int tmpData1=dateigroesse(dateiname1);
    int tmpData2=dateigroesse(dateiname2);
    int tmp=tmpData1-tmpData2;
    
    if(tmp>0)
    {
         tmp=tmpData1;
    }
     else
     {
         tmp=tmpData2;
     }   
          

    
    ofstream outFile;
    ifstream inFile1;
    ifstream inFile2;
    
   
    //BinFile: einzelne Bytes lesen-also HexEditor simuleren 
	inFile1.open(dateiname1,[B] ios::binary[/B]); 
    inFile2.open(dateiname2,[B] ios::binary[/B]); 

    inFile1.clear(); //resetet eof(), good(), fail(),... 
    inFile2.clear(); //resetet eof(), good(), fail(),... 
    //cout << endl << endl << "Inhalt von" << datei << ":" << endl;
    

    while (byteCount++ < tmp) { 

    inFile1.read((char*)&ch1, sizeof(char)); 
    inFile2.read((char*)&ch2, sizeof(char)); 
    //cout << hex << (int)(ch1 & 0xff) << " ";
    
    if(ch1!=ch2)
    {
         cout << "Diffefernz in Zeile " << countZeile 
         << ", Spalte " << countSpalte << endl;
    }
    
    if(++countSpalte==17)
    {
        //cout << endl << endl;
        countSpalte=0;
        countZeile++;
    }

    } 
    inFile1.close();  
    inFile2.close(); 
    
    cout << endl;
    system("PAUSE");
    return 0; 

    } 

    
int dateigroesse(char dateiname[])
{
    stat(dateiname,&buf);
    int groesse = buf.st_size;
    cout << "Dateigroesse von " << dateiname << ":" << groesse << endl;
    cout << "Letzte Aenderung:" << buf.st_mtime << endl;
    
    return groesse;
}