[c++]reverse engineering (Teil 1)

03/16/2009 09:26 Tyrar#1
so, ich schreib hier jetzt mal mein erstes tut...
WENN es euch weiterhilft, oder mehr haben wollt, schreib ich noch nen 2ten teil.
in dem teil gehts darum, eigenen code in das spiel reinzubringen.

was man braucht:
- am besten grunderfahrung in c++, um den code besser zu verstehen.
- eine c++ ide (meine is [Only registered and activated users can see links. Click Here To Register...])
- einen disassembler ([Only registered and activated users can see links. Click Here To Register...])

los gehts
fangen wir an, als erstes starten wir ida, und öffnen die .exe von dem spiel (ich nehm einfach cod4 multiplayer, geht natürlich auch mit jedem anderen).
wartet bis die datei fertig geladen ist (wenn ein fenster auftaucht wo ihr was anhaken könnt, klickt einfach ok).
sucht bei den registerkarten nach imports, sucht in der spalte rechts nach dem eintrag d3d9 (weil davon am wenigsten drin steht = weniger arbeit).
öffnet euer visual c++, ein win32 projekt (nennt es am besten d3d9), wählt dll aus, und auf fertig stellen klicken.
dann müsst ihr DIESE funktion/en bei den imports der einen dll in eurer nachbauen.
hier der code, is soweit alles kommentiert:
PHP Code:
#include <string> // is denke ich klar
#include <windows.h> // denke ich auch

HINSTANCE lib 0//auch klar, definition der originaldll instanz
FARPROC d3dc9 0//der original funktion

BOOL WINAPI DllMain(HINSTANCE hInst,DWORD reason,LPVOID)
{
    if (
reason == DLL_PROCESS_ATTACH//wenn dll geladen wird DANN:
     
{
            
char d3dorig[MAX_PATH]; // sollte auch klar sein
            
GetSystemDirectoryA(d3dorig,sizeof(d3dorig)); //C:\WINDOWS\system32 sollte normalerweise rauskommen
            
strcat_s(d3dorig,"\\d3d9.dll"); //hinten noch ein \d3d9.dll dranhängen
            
lib LoadLibraryA(d3dorig); //dll laden
            
if(!lib//wenn NICHT geladen dann:
            
{
                
MessageBox(HWND_DESKTOP,L"original nicht geladen",L"fehler",MB_OK); //die box
                
return 0//und beenden
            
}
                
MessageBox(HWND_DESKTOP,L"im prozess...",L"OK",MB_OK);
        
d3dc9 GetProcAddress(lib,"Direct3DCreate9"); //die funktion aus dll holen
    
}
    if (
reason == DLL_PROCESS_DETACH//wenn dll entladen wird DANN:
    
{
        
FreeLibrary(lib); //C:\WINDOWS\system32\d3d9.dll entladen
    
}
    return 
1//ende
}
extern "C" __declspec(naked__declspec(dllexportvoid Direct3DCreate9()
{
    
// eure aufrufe (z.B. HINSTANCE _lib = LoadLibraryA("my_dll.dll"); // besser da man nicht abhängig von dem einen aufruf ist!
    
__asm jmp d3dc9 }; //Direct3DCreate9 in der C:\WINDOWS\system32\d3d9.dll aufrufen (damit das spiel NICHT abstürzt)

packt diese .dll dann in den spiel ordner, startet das spiel und fertig!
wenn alles geklappt hat sollte eine messagebox mit der meldung "im prozess..." auftauchen.
hoffe man konnte es verstehen;)
03/16/2009 10:22 verT!c4L#2
Quote:
Originally Posted by HeavyHacker View Post
PHP Code:
#include <string> // is denke ich klar
#include <windows.h> // denke ich auch

HINSTANCE lib 0//auch klar, definition der originaldll instanz
FARPROC d3dc9 0//der original funktion

BOOL WINAPI DllMain(HINSTANCE hInst,DWORD reason,LPVOID)
{
    if (
reason == DLL_PROCESS_ATTACH//wenn dll geladen wird DANN:
     
{
            
char d3dorig[MAX_PATH]; // sollte auch klar sein
            
GetSystemDirectoryA(d3dorig,sizeof(d3dorig)); //C:\WINDOWS\system32 sollte normalerweise rauskommen
            
strcat_s(d3dorig,"\\d3d9.dll"); //hinten noch ein \d3d9.dll dranhängen
            
lib LoadLibraryA(d3dorig); //dll laden
            
if(!lib//wenn NICHT geladen dann:
            
{
                
MessageBox(HWND_DESKTOP,L"original nicht geladen",L"fehler",MB_OK); //die box
                
return 0//und beenden
            
}
                
MessageBox(HWND_DESKTOP,L"im prozess...",L"OK",MB_OK);
        
d3dc9 GetProcAddress(lib,"Direct3DCreate9"); //die funktion aus dll holen
    
}
    if (
reason == DLL_PROCESS_DETACH//wenn dll entladen wird DANN:
    
{
        
FreeLibrary(lib); //C:\WINDOWS\system32\d3d9.dll entladen
    
}
    return 
1//ende
}
extern "C" __declspec(naked__declspec(dllexportvoid Direct3DCreate9()
{
    
// eure aufrufe (z.B. HINSTANCE _lib = LoadLibraryA("my_dll.dll"); // besser da man nicht abhängig von dem einen aufruf ist!
    
__asm jmp d3dc9 }; //Direct3DCreate9 in der C:\WINDOWS\system32\d3d9.dll aufrufen (damit das spiel NICHT abstürzt)

Für'n Anfang nicht schlecht, Code aber lieber in dem php-tag posten, ist angenehmer zu lesen für die Augen ;)
Is das denn dann jetz eine DLL-Injection oder nen Hook? :P
03/16/2009 13:10 Tyrar#3
Quote:
Originally Posted by verT!c4L View Post
Für'n Anfang nicht schlecht, Code aber lieber in dem php-tag posten, ist angenehmer zu lesen für die Augen ;)
Is das denn dann jetz eine DLL-Injection oder nen Hook? :P
hm... würd ma sagen dll injection, nen hook is systemweit;)
ich editier ma den php tag, hab das jetz auch nich so genau beschrieben, aber hoffe man versteht es:)

man muss natürlich selbst sehn welche dll man nimmt, und wo die originale liegt. wenn die originale im spielordner ist, natürlich umbenennen und die dann direkt aus dem ordner laden
03/16/2009 13:17 Bot_interesierter#4
Was hat das jetzt mit Reverseengineering zu tun?
So weit ich sehe gar nichts, alles was du hier Zeigst ist eine simple Methode um Direct3DCreate9 zu Hooken und eigentlich brauchst du keinen Inline Asembler um die Original Funktion auf zu rufen, es sei denn du möchtest ein zusätzliches return vermeiden.

Und für ein Tutorial ist das ganze auch ziemlich Mager, du erklärst nicht was das ganze bezweckt und für das was du ins hier gezeigt hast ist es völlig unnötig IDA zu öffnen und auch nur eine Zeile disasmbler an zu sehen.

Wenn du dieses Tutorial immer noch fortführen möchtest, dann ändere den Titel zu einem Passenderen ab und erkläre ausführlicher was du tust und zu welchem Zweck, denn so wie das Tutorial bisher aufgebaut ist kann nur jemand der schon Ahnung hat erraten worum es geht.
03/16/2009 13:24 Tyrar#5
Quote:
Originally Posted by Bot_interesierter View Post
Was hat das jetzt mit Reverseengineering zu tun?
So weit ich sehe gar nichts, alles was du hier Zeigst ist eine simple Methode um Direct3DCreate9 zu Hooken und eigentlich brauchst du keinen Inline Asembler um die Original Funktion auf zu rufen, es sei denn du möchtest ein zusätzliches return vermeiden.

Und für ein Tutorial ist das ganze auch ziemlich Mager, du erklärst nicht was das ganze bezweckt und für das was du ins hier gezeigt hast ist es völlig unnötig IDA zu öffnen und auch nur eine Zeile disasmbler an zu sehen.

Wenn du dieses Tutorial immer noch fortführen möchtest, dann ändere den Titel zu einem Passenderen ab und erkläre ausführlicher was du tust und zu welchem Zweck, denn so wie das Tutorial bisher aufgebaut ist kann nur jemand der schon Ahnung hat erraten worum es geht.
was muss beim reverse engineering als erstes passieren? man muss eigenen code reinbringen -> dllinjector is zu umständlich = lieber ne proxy dll rein. "reverse engineering teil 1 - proxy dll" oder was? als nächstes würde der aufruf von funktionen im prozess kommen (von dll funktion in der exe aufrufen).
ausserdem war es mein erstes tut, man kann nich alles gleich zu anfang gut machen
03/16/2009 13:29 xilehack#6
Quote:
was muss beim reverse engineering als erstes passieren? man muss eigenen code reinbringen
uhm ne, ich behaupte mal das ist nicht so. muss nicht immer so sein.

du baust doch auch keine eigene bauteile rein wenn du z.B. ein laptop reverse engineering'en willst....
da baust du alles außeinander und analysierst die bauteile und deren funktionen und versuchst das nachzubauen. :D
(die chinesen sind da teilweise nicht mal so schlecht da drin) :D
hooken und injection sind sicher methoden dazu, aber nicht fundamental.
03/16/2009 13:31 Tyrar#7
Quote:
Originally Posted by xilehack View Post
uhm ne, ich behaupte mal das ist nicht so. muss nicht immer so sein.

du baust doch auch keine eigene bauteile rein wenn du z.B. ein laptop reverse engineering'en willst....
da baust du alles außeinander und analysierst die bauteile und deren funktionen und versuchst das nachzubauen. :D
(die chinesen sind da teilweise nicht mal so schlecht da drin) :D
hooken und injection sind sicher methoden dazu, aber nicht fundamental.
aber meinermeinung is das so leichter;)
03/16/2009 13:39 Adroxxx#8
Sorry, imo ist das Tutorial ziemlich low.

Ist eher eine schlechte DIY Anleitung als ein richtiges Tutorial.
Du erklärst so ziemlich gar nichts. Den Teil mit IDA bist du überflogen, sodass die Leute gar nicht wissen was abgeht.

Desweiteren finde ich DirektX Hook != Reverse Engeneering.

Ich verstehe unter Reverse Engeneering eher das finden von Werten und Funktionen über einen Debugger.
Unpacking, Keygening, Code Caving, Code Shifting usw. Beim Reverse Engeneering geht es darum das Programm verstehen zu lernen. Und dessen Funktionsweise.

Ansich vielleicht ein nettes Programmier Tutorial für DLLs + Injection aber kein Reverse Engeneering.

Mal schauen was uns Teil 2 bringt :)