C++ Pointer Problem

07/10/2014 21:17 supercracker13#1
Hallo, ich habe nach langer Zeit noch mal versucht nen kleinen Hack zu schreiben. Unzwar nicht mehr mit AutoIT (keine schöne Sprache) sondern in C++.

Ich benutze dafür ne Dll und nen kleinen Injector. Der Hack soll einfach einen Wert von einem selbst geschrieben Programm verändern.
Den Pointer hab ich mal im Anhang. (Ein Bild von CE)

Dann habe ich folgenden Code versucht:
PHP Code:
#include <windows.h>
#define Adress 0x93f873

void RewriteValues()
{
    
int *MyPoint;
    
MyPoint=(int *)Adress;
    *
MyPoint=2000;
}

BOOL WINAPI DllMain(HINSTANCE hinstDll,DWORD Reason,LPVOID Reserved)
{
    switch(
Reason)
    {
    case 
DLL_PROCESS_ATTACH:
        
RewriteValues();
        break;
        
//6.
    
case DLL_PROCESS_DETACH:
        
MessageBox(NULL,"Hack geschlossen","Ende",0);
        break;
    }
    return 
TRUE;

Welcher auch funktioniert hat. Nur dann habe ich versucht den Pointer einzuarbeiten und das ist dann schief gelaufen.
Bin jetzt kein C++ Pro darum wollte ich mal fragen ob mir jemand helfen kann.
07/10/2014 21:34 th0rex#2
Guck dir mal die Adresse auf dem Bild genau an und die Adresse die du definest. Vielleicht fällt dir da bei der letzten stelle was auf ...
07/10/2014 21:36 milomir#3
[Only registered and activated users can see links. Click Here To Register...]
07/10/2014 21:43 th0rex#4
Quote:
Originally Posted by milomir View Post
[Only registered and activated users can see links. Click Here To Register...]
He is using a dll. Why would you use WPM in a dll ?
07/10/2014 21:53 supercracker13#5
@omitma Also ich weis schon das die offsets dazu addiert werden. Nur das eigentliche Problem das sich mir gestellt hat war "THREADSTACK0"-00000150

Also ich gehe mal davon aus das es der BasePointer ist (Ich habs nicht so mit den Namen, ich meine auf jeden Fall den Pointer wovon die anderen Adressen abhängig sind also die die sich bei jedem Start ändern)
Und ich weis nicht genau wie man den findet. Ich hatte schon mal
PHP Code:
DWORD ImageBase = (DWORD)GetModuleHandle(0); 
Aber da kam immer 0 raus und das kann ja nicht ganz stimmen.

Wenn ich diese Adresse habe muss ja eigentlich nur die "150" und "E0" dazu addieren oder ?
07/10/2014 21:57 newchild#6
in dem code schreibst du
#define Adress 0x93f873
aber in CE steht
0x93f874
07/10/2014 22:04 supercracker13#7
Das ist egal war nur ein Beispiel. Aber die Adresse ändert sich bei jedem Start und daher bringt mir das nicht viel
07/11/2014 01:40 Mostey#8
Quote:
Originally Posted by supercracker13 View Post
Ich hatte schon mal
PHP Code:
DWORD ImageBase = (DWORD)GetModuleHandle(0); 
Aber da kam immer 0 raus und das kann ja nicht ganz stimmen.

Wenn ich diese Adresse habe muss ja eigentlich nur die "150" und "E0" dazu addieren oder ?
[Only registered and activated users can see links. Click Here To Register...]

Quote:
If the function succeeds, the return value is a handle to the specified module.
If the function fails, the return value is NULL. To get extended error information, call GetLastError.
Die Adressen (bzw. die Offsets) sind relativ zur Modulbase, daher müsstest du die Offsets eben auf diese addieren um stetig auf deine Wunschadresse zu kommen.
07/11/2014 09:31 supercracker13#9
Ok theoretisch habe ich das verstanden nur das umsetzen geht in die Hose.

Hab probiert
PHP Code:
#define Adress 0xe0

void RewriteValues()
{
    
int *MyPoint;
    
DWORD base = (DWORD*)GetModuleHandle(0) - 0x150;
    
MyPoint=(int *)(base Adress);
    *
MyPoint=2000;

Ich habe jetzt "-0x150" gerechnet weil bei CE stand ja Threadstack - 150.
Aber egal was ich da mache das ganze Läuft nicht :confused:
07/11/2014 12:10 Jeoni#10
Das liegt vermutlich daran, dass "Threadstack" gar nicht das Hauptmodul ist, sondern das, wonach es sich anhört: der Stack eines Threads. Oder heißt das Target zufällig "Threadstack.exe" bzw. "Threadstack0.exe"? Das kommt daher, dass das, was du suchst im Target eine lokale Variable ist, und damit auf dem Stack liegt, was in der Praxis im Gamehacking unüblich ist und selten bis gar nicht vorkommt (ich hab's jedenfalls nie gesehen oder gehört).
Wenn du das Problem trotzdem lösen möchtest, musst du schauen, zu welchem Thread der Stack gehört, ihn zur Laufzeit während einer Threaditeration identifizieren, schauen, an welchem Punkt er sich gerade befindet (== welche instruktion als nächstes ausgeführt wird: EIP-/RIP-Register) und anhand dessen über sein ESP-/RSP-Register +- einem Offset (was abhängig von EIP/RIP ist, da Code im Target ja mit pushs und pops oder direkt ESP/RSP verändern kann) zur gewünschten Adresse kommen.
Weiterhin zu beachten ist, dass die lokale Variable natürlich invalid wird, wenn die Funktion, zu der sie gehört, returnt. Theoretisch ist sie danach zwar noch im Speicher, kann aber von z.B. der nächsten Funktion überschrieben werden. Um das zu verifizieren, bietet es sich wieder an zu schauen, ob EIP/RIP (und damit der Thread zur Zeit) in der gewünschten Funktion liegt.

Ich hoffe, dass ich helfen konnte ;)
Jeoni

Btw. hoffe ich, dass dir bewusst ist, dass
Code:
DWORD* x = (DWORD*)y + z; // z is an integral type, like -0x150
wertmäßig zu soetwas führt: x = y + z*sizeof(DWORD)
Entsprechend zeigt x nicht auf z Bytes über y, sondern auf z*sizeof(DWORD) Bytes über y.
Für mehr Details dazu, such nach "Pointerarithmetik".