Func _MemoryModuleGetBaseAddress($iPID, $sModule)
If Not ProcessExists($iPID) Then Return SetError(1, 0, 0)
If Not IsString($sModule) Then Return SetError(2, 0, 0)
Local $PSAPI = DllOpen("psapi.dll")
;Get Process Handle
Local $hProcess
Local $PERMISSION = BitOR(0x0002, 0x0400, 0x0008, 0x0010, 0x0020) ; CREATE_THREAD, QUERY_INFORMATION, VM_OPERATION, VM_READ, VM_WRITE
If $iPID > 0 Then
Local $hProcess = DllCall("kernel32.dll", "ptr", "OpenProcess", "dword", $PERMISSION, "int", 0, "dword", $iPID)
If $hProcess[0] Then
$hProcess = $hProcess[0]
EndIf
EndIf
;EnumProcessModules
Local $Modules = DllStructCreate("ptr[1024]")
Local $aCall = DllCall($PSAPI, "int", "EnumProcessModules", "ptr", $hProcess, "ptr", DllStructGetPtr($Modules), "dword", DllStructGetSize($Modules), "dword*", 0)
If $aCall[4] > 0 Then
Local $iModnum = $aCall[4] / 4
Local $aTemp
For $i = 1 To $iModnum
$aTemp = DllCall($PSAPI, "dword", "GetModuleBaseNameW", "ptr", $hProcess, "ptr", Ptr(DllStructGetData($Modules, 1, $i)), "wstr", "", "dword", 260)
If $aTemp[3] = $sModule Then
DllClose($PSAPI)
Return Ptr(DllStructGetData($Modules, 1, $i))
EndIf
Next
EndIf
DllClose($PSAPI)
Return SetError(-1, 0, 0)
EndFunc
Nun die funktion gibt mir die Base Addresse von der -> MEMORY <- zurück in dem aktuellen fall ("0x00FE0000")
jz hab ich mir die finger wund gesucht um die gleiche funktion auch für C#
zu finden weil ich für Memory Read die base addresse von der Memory brauche
um den Dynamischen Pointer darauf zu rechen ((Base + Pointer) + Offset)
Das ist aber nicht die base addresse von der memory.. ich hab 10 such anfragen bei google durchlaufen lassen aber immer wieder kommt dieser %?&/§" you know ?
wäre nett wenn mir jemand diese funktion in C# umschreiben kann
btw mir verrät wie ich diese memory base addresse bekomme.
Weiß jetzt nicht genau was du machst o.o
DWORD base = (DWORD)GetModuleHandle(NULL);
So geht es bei mir in c++ aufjedenfall. Ist dann, wenn du es ausgibst, nur in dezimal. Musste halt zu hex ändern. Macht aber kein Unterschied für WriteProcessMemory oder was auch immer du damit anstellen möchtest.
Wieso willst du das überhaupt in c# machen, wenn du es in c++ testen kannst ? C++ ist bei gamehacking (oder generellen nativen sachen) weitaus besser als c#.
Weiß jetzt nicht genau was du machst o.o
DWORD base = (DWORD)GetModuleHandle(NULL);
So geht es bei mir in c++ aufjedenfall. Ist dann, wenn du es ausgibst, nur in dezimal. Musste halt zu hex ändern. Macht aber kein Unterschied für WriteProcessMemory oder was auch immer du damit anstellen möchtest.
Wieso willst du das überhaupt in c# machen, wenn du es in c++ testen kannst ? C++ ist bei gamehacking (oder generellen nativen sachen) weitaus besser als c#.
Sry hab die falsche konvertierung xD
Warum C# ?
Ich kann nur ne hand voll C++ sachen (die basic sachen) wie
Socket, Memory, File Read/Write, Processe, Do, For halt diese Sachen
So komplizierte befehle wie ein Window zu erstellen blick ich noch nicht durch.
Zudem ich für den nächsten schritt einen Timer brauche der sich nach
500 ms erneuert.
Aber danke für deine Hilfe
Edit:
Funktioniert noch immer nicht.
Wenn ich:
Code:
DWORD base = (DWORD)GetModuleHandle((LPCWSTR)"FiestaOnline");
Kommt 0 zurück egal was ich da für ein window namen eingebe es kommt immer nur 0
wenn ich aber:
Code:
DWORD base = (DWORD)GetModuleHandle(NULL);
mache kommt eine dynamische zahl. das kann aber nicht die base memory sein.
ich verstehs einfach nicht. ich will einfach nur die base addresse von der memory und nicht von der exe !
GetModuleHandle in einem Prozess außerhalb des eigentlichen Prozesses auszuführen, ergibt keinen Sinn, das Modul "FiestaOnline" wird natürlich nicht im eigenen Prozess gefunden.
Wenn du die Base-Address, mit der Windows den Prozess mapped, willst, würde ich CreateToolhelp32Snapshot, Process32First, Process32Next und dann Module32First nutzen, um an die Base-Address des Hauptmoduls zu kommen.
Timer brauchst du eigentlich nie. Und ja native Fenster mit der Windows API erstellen ist häslich. Und wer sagt, dass die Base nicht dynamisch sein kann ?
GetModuleHandle in einem Prozess außerhalb des eigentlichen Prozesses auszuführen, ergibt keinen Sinn, das Modul "FiestaOnline" wird natürlich nicht im eigenen Prozess gefunden.
Wenn du die Base-Address, mit der Windows den Prozess mapped, willst, würde ich CreateToolhelp32Snapshot, Process32First, Process32Next und dann Module32First nutzen, um an die Base-Address des Hauptmoduls zu kommen.
Timer brauchst du eigentlich nie. Und ja native Fenster mit der Windows API erstellen ist häslich. Und wer sagt, dass die Base nicht dynamisch sein kann ?
Das die Base Dynamisch ist, ist mir klar. Wäre ja zu schön wenn alles Static
ist würde die arbeit um tonnen einfacher machen.
Die Offsets von der Base dürften aber statisch sein. Und habe deinen Post so verstanden, dass die Base nicht dynamisch sein kann. Sry für das Missverständnis dann. Wenn du kb auf die Offsets hast, kannst du immernoch mit Patterns Funktionen finden die auf deinen Pointer zugreifen, die Funktion hooken, dann den Pointer aus der gehookten Funktion Auslesen, ggf. überschriebenes wieder herstellen und dann den Wert von dem Pointer ändern.
Die Offsets von der Base dürften aber statisch sein. Und habe deinen Post so verstanden, dass die Base nicht dynamisch sein kann. Sry für das Missverständnis dann. Wenn du kb auf die Offsets hast, kannst du immernoch mit Patterns Funktionen finden die auf deinen Pointer zugreifen, die Funktion hooken, dann den Pointer aus der gehookten Funktion Auslesen, ggf. überschriebenes wieder herstellen und dann den Wert von dem Pointer ändern.
Die Pointer und Offsets passen doch, das ist kein problem hier geht es um
die baseadresse das ganzen games.
Ich brauch diese Adresse um das auf den pointer drauf zu rechnen sprich
(BaseAdress+Pointer) + Offset dann bekomm ich immer den richtigen pointer
um meine HP vom spiel auszulesen auch wenn ich Neustart mache.
Aber da sich die Base Adresse von dem memory modul ändert brauch ich in c++ oder c# eine funktion wie bei autoit (MemoryModuleGetBaseAddress) siehe Erster Post -> Spoiler der mir die adresse zurück gibt. und zwar als pointer (0x00F40000)
und da ich iwas falsch mache und überall nur 0 zurück kommt brauche ich hilfe.
Hast du denn schon mal mit z.B. Process Hacker geschaut, wie das Modul und der Prozess heißen? Sicher, dass das korrekt ist? FiestaOnline klingt nicht nach einem korrekten Modulnamen. Und lass das ganze LPSTR Gedöns weg & verwende std::string, das ist viel komfortabler.
Mit GetModuleHandle kannst du nur Adressen von Modulen in deinem Programm bekommen. Entweder du nimmst ne dll oder snows Methode. Snows Methode muss eigentlich funktionieren.
Edit : Sollte die Seite vor dem Posten wohl demnächst aktualisieren -.-
Hast du denn schon mal mit z.B. Process Hacker geschaut, wie das Modul und der Prozess heißen? Sicher, dass das korrekt ist? FiestaOnline klingt nicht nach einem korrekten Modulnamen. Und lass das ganze LPSTR Gedöns weg & verwende std::string, das ist viel komfortabler.
Wo kann ich den nachsehen wie das Modul heißt ? der Process also
was in dem reiter "Namen" steht = Fiesta.bin