Read/WriteProcess Memory

06/28/2013 21:38 Padmak#16
Mein Vorschlag zur Lösung:
Code:
DWORD* addr = (DWORD*)(*(DWORD*)((*(DWORD*)0x7E3E20) + 0x08) + 0x680);
*addr = 0;
*addr = 1;
Probier's einfach mal aus :P

Padmak
07/08/2013 08:44 EXTEЯNAL#17
Man könnte hier auch mit Templates arbeiten.

PHP Code:
template <typename T>
T ReadMemory(unsigned int Address)
{
    
T Value;
    
memset(&Value0sizeof(T));
    
DWORD dwOldProtection 0;
    if(
VirtualProtect((void*)Addresssizeof(Value), VPANTICP_RW, &dwOldProtection))
    {
        
memcpy(&Value, (void*)Addresssizeof(Value));
        
VirtualProtect((void*)Addresssizeof(Value), dwOldProtectionNULL);
    }
    return 
Value;

PHP Code:
unsigned int Address ReadMemory<unsigned int>(0xFFFFFFFF)
float fHP ReadMemory<float>(0xEFEFEFEF
Quote:
Originally Posted by Dr. Coxxy View Post
im eigenen prozess rpm und wpm, bei euch hakts aber noch, oder?
Könntest du mir evtl. erklären warum? Ich meine mal gehört zu haben, dass ein WPM Aufruf in einer DLL mit GetCurrentProcess() sogar vorteile hätte, Google sagt leider nichts brauchbares, arbeite selber mit VP und memcpy intern.


Quote:
Originally Posted by Padmak View Post
Mein Vorschlag zur Lösung:
Code:
DWORD* addr = (DWORD*)(*(DWORD*)((*(DWORD*)0x7E3E20) + 0x08) + 0x680);
*addr = 0;
*addr = 1;
Probier's einfach mal aus :P

Padmak
Kein VirtualProtect Aufruf, keine NULL Checks ... Nicht wirklich eine saubere Lösung.
07/08/2013 09:47 snow#18
^Ich denke mal, RPM / WPM sollte nicht im eigenen Prozess verwendet werden, da es dort erst in den Kernel geht, dort der Call für den Prozess erfolgt und das ganze wieder ins eigene Programm kommt, das dürften ein paar Schritte mehr sein als ein einfaches *address = value;
Kenne mich aber ehrlich gesagt zu wenig mit den Windows Internals aus, um da was über die unterschiedlichen Laufzeiten zu sagen.
07/08/2013 13:01 Padmak#19
Quote:
Originally Posted by Momo5000 View Post
Kein VirtualProtect Aufruf, keine NULL Checks ... Nicht wirklich eine saubere Lösung.
Ist schon klar, aber es ging mehr um die Logik^^

Padmak
07/08/2013 14:12 Dr. Coxxy#20
Quote:
Originally Posted by Momo5000 View Post
Man könnte hier auch mit Templates arbeiten.

Code:
 // Unnützer lahmer shice
Könntest du mir evtl. erklären warum? Ich meine mal gehört zu haben, dass ein WPM Aufruf in einer DLL mit GetCurrentProcess() sogar vorteile hätte, Google sagt leider nichts brauchbares, arbeite selber mit VP und memcpy intern.
wüsste keinen vorteil.
Pointer sind halt deutlich schneller (wie snow schon richtig erklärt hat), außerdem muss nicht das ganze eventuell ziemlich große objekt in lokalen speicher kopiert werden.

Quote:
Kein VirtualProtect Aufruf, keine NULL Checks ... Nicht wirklich eine saubere Lösung.
virtualprotect ist normalerweise nicht nötig, da die pointer über die das spiel auch auf seine objekte zugreift diese normalerweise nicht readprotected (warum sollte man so nen schwachsinn auch machen?).
NULL pointer überprüfung ist auch nicht immer nötig - generell gilt, wenn das spiel nicht auf nullpointer prüft, musst du es auch nicht - kann allerdings bei mehreren threads/verschiedenen timings probleme verursachen, weswegen man es immer tun sollte, wenn man nicht sicherstellen kann, dass der pointer immer gültig ist.

EDIT:
übrigens ist dein code sogar grob falsch, da er offensichtlich ungültige pointer per virtualprotect gültig macht, was wohl kaum das richtige verhalten ist.