pointer hilfe

04/24/2009 16:41 __wadim#1
also ich hab eine dll erstellt und möchte nun werte aus bestimmten adressen lesen. hab das jetzt so gemacht:
Code:
float posx = *(float*)(0x123456);
// das funktioniert!
jetzt will ich aber das hier lesen:
Code:
  unsigned long a;
  float x = 0;

    ReadProcessMemory( hGW, (void*)0x00123456, &a, sizeof(a), 0 );
    ReadProcessMemory( hGW, (void*)(a + 0x12), &a, sizeof(a), 0 );
    ReadProcessMemory( hGW, (void*)(a + 0x34), &a, sizeof(a), 0 );
    ReadProcessMemory( hGW, (void*)(a + 0x56), &a, sizeof(a), 0 );
    ReadProcessMemory( hGW, (void*)(a + target * 0x78), &a, sizeof(a), 0 );
    ReadProcessMemory( hGW, (void*)(a + 0x90), &x, sizeof(x), 0 );
das hab ich dann so versucht:
Code:
float posx = *(float*)(((((((0x123456) + 0x12) + 0x23) +0x34)+0x56)+target*78)+0x90);
warum geht das nicht? was mach ich falsch? wie kann ich das lösen?
04/24/2009 17:07 Adroxxx#2
Weil du die zwischenschritte nicht machst.
IMO!

PHP Code:
float posx = *(float*)(0x123456);
// das funktioniert! 
Da liest du ja nur eine adresse aus. ( btw. nette schreibweise, hab ich das erste mal in einem script von L.Spiro gesehen ^^ )

Nun willst du den Pointer auslesen.

Du liest den Speicher bei der Adresse 0x0123 aus. schreibst es in a.
Dann liest du den Speicher bei der Adresse [0x123]+0x12 aus. ( [0x123] heißt inhalt von 0x123) schreibst es wieder in a.

Bei der Version da unten
PHP Code:
float posx = *(float*)(((((((0x123456) + 0x12) + 0x23) +0x34)+0x56)+target*78)+0x90); 
Lässt du die einzelnen Schritte des auslesens weg.
So wie ich das sehe, liest du dort die Adresse (((((((0x123456) + 0x12) + 0x23) +0x34)+0x56)+target*78)+0x90) aus.
Als ganze.
Das Problem ist, du brauchst immer den Inhalt von 0x123456 und den folgenden um weiter machen zu können.

Mit dieser Schreibweise hast du aber die Adresse : 0x1235A5+target*78.

Wenn du das jetzt per ReadPMem auslesen würdest, würde er dir die Werte einfach zusammenrechnen.

Du müsstest dir eine extra ReadPointer Funktion schreiben imo. Wo du
PHP Code:
float posx = *(float*)(((((((0x123456) + 0x12) + 0x23) +0x34)+0x56)+target*78)+0x90); 
Aufteilst und dann jedes einzelne glied davon ausliest.

EDIT:

Habs gefunden, © L.Spiro
PHP Code:
UINT_PTR DerefUINT_PTR uiPtr ) {
    ::
ReadProcessMemoryg_hProcess, (LPCVOID)uiPtr, &uiPtrsizeofuiPtr ), NULL );
    return 
uiPtr;
}


VOID WriteFloatUINT_PTR uiBaseDWORD dwOffsets[3], FLOAT fValue ) {
    for ( 
DWORD I 03; ++) {
        
uiBase DerefuiBase );
        
uiBase += dwOffsets[I];
    }
    (*(
FLOAT *)uiBase) = fValue;

Die Offsets packst du dann in deOffsets:
PHP Code:
DWORD dwOffsets[3] = { 0x000x000x00 };
   
WriteFloat(0x00400000dwOffsets1000); 
04/24/2009 18:50 __wadim#3
ich hab mir jetzt ein makro geschrieben:
Code:
#define mem_read(cast, address) (*(cast*)address)
damit gehts zwar, nur stürtzt dann der prozess ab wenn ich die entgültige adresse lesen möchte.
04/24/2009 20:14 Adroxxx#4
Hast du es mal mit der Funktion von L.Spiro versucht?