|
You last visited: Today at 05:57
Advertisement
[C#] GetMemoryModuleBaseAddress
Discussion on [C#] GetMemoryModuleBaseAddress within the .NET Languages forum part of the Coders Den category.
02/09/2014, 08:26
|
#1
|
elite*gold: 426
Join Date: Oct 2012
Posts: 4,339
Received Thanks: 953
|
[C#] GetMemoryModuleBaseAddress
Hay.
In autoit (NomadMemory.au3) gibt es eine Funktion die nennt sich:
_MemoryModuleGetBaseAddress(PID, ModuleName)
Code:
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)
Nun alles was ich gefunden habe ist;
Code:
Process.GetProcessesByName("Name..")[0].MainModule.BaseAddress
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.
|
|
|
02/09/2014, 09:46
|
#2
|
elite*gold: 46
Join Date: Oct 2010
Posts: 782
Received Thanks: 525
|
GetModuleHandle aus kernel32.dll Importen und dann aufrufen.
|
|
|
02/09/2014, 10:02
|
#3
|
elite*gold: 426
Join Date: Oct 2012
Posts: 4,339
Received Thanks: 953
|
Quote:
Originally Posted by omitma
GetModuleHandle aus kernel32.dll Importen und dann aufrufen.
|
Bekomm ich 00000000 zurück anstatt 0x00FE0000
Getestet in C++
|
|
|
02/09/2014, 10:22
|
#4
|
elite*gold: 46
Join Date: Oct 2010
Posts: 782
Received Thanks: 525
|

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#.
|
|
|
02/09/2014, 14:56
|
#5
|
elite*gold: 2932
Join Date: Oct 2009
Posts: 6,966
Received Thanks: 1,097
|
haste mal versucht das ganze als admin zu starten?
|
|
|
02/09/2014, 17:17
|
#6
|
elite*gold: 426
Join Date: Oct 2012
Posts: 4,339
Received Thanks: 953
|
Quote:
Originally Posted by omitma

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 !
AutoIt kommt heute auf: 0x00FA0000
|
|
|
02/09/2014, 20:59
|
#7
|
elite*gold: 724
Join Date: Mar 2011
Posts: 10,479
Received Thanks: 3,318
|
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.
|
|
|
02/09/2014, 21:10
|
#8
|
elite*gold: 46
Join Date: Oct 2010
Posts: 782
Received Thanks: 525
|
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 ?
|
|
|
02/09/2014, 21:16
|
#9
|
elite*gold: 426
Join Date: Oct 2012
Posts: 4,339
Received Thanks: 953
|
Quote:
Originally Posted by snow911
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.
|
Code:
DWORD GetModuleBaseAddress(LPCWSTR szProcessName, LPCWSTR szModuleName)
{
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 pe32;
if(hSnap == INVALID_HANDLE_VALUE)
{
return 0;
}
pe32.dwSize = sizeof(PROCESSENTRY32);
if(Process32First(hSnap, &pe32) == 0)
{
CloseHandle(hSnap);
return 0;
}
do
{
if(lstrcmp(pe32.szExeFile, szProcessName)== 0)
{
int PID;
PID = pe32.th32ProcessID;
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, PID);
MODULEENTRY32 xModule;
if (hSnap == INVALID_HANDLE_VALUE)
{
return 0;
}
xModule.dwSize = sizeof(MODULEENTRY32);
if (Module32First(hSnap, &xModule) == 0)
{
CloseHandle(hSnap);
return 0;
}
do
{
if (lstrcmp(xModule.szModule, szModuleName) == 0)
{
CloseHandle(hSnap);
return (DWORD)xModule.modBaseAddr;
}
}
while (Module32Next(hSnap, &xModule));
CloseHandle(hSnap);
return 0;
}
}
while (Process32Next(hSnap, &pe32));
CloseHandle(hSnap);
return 0;
}
Bereits versucht .. kommt wieder nur 0 zurück...
Aufgerufen mit:
Code:
GetModuleBaseAddress((LPCWSTR)"Fiesta.bin", (LPCWSTR)"FiestaOnline");
Quote:
Originally Posted by omitma
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.
|
|
|
02/09/2014, 21:24
|
#10
|
elite*gold: 46
Join Date: Oct 2010
Posts: 782
Received Thanks: 525
|
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.
|
|
|
02/09/2014, 21:30
|
#11
|
elite*gold: 426
Join Date: Oct 2012
Posts: 4,339
Received Thanks: 953
|
Quote:
Originally Posted by omitma
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.
|
|
|
02/09/2014, 21:39
|
#12
|
elite*gold: 724
Join Date: Mar 2011
Posts: 10,479
Received Thanks: 3,318
|
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.
|
|
|
02/09/2014, 21:40
|
#13
|
elite*gold: 46
Join Date: Oct 2010
Posts: 782
Received Thanks: 525
|
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 -.-
|
|
|
02/09/2014, 21:51
|
#14
|
elite*gold: 426
Join Date: Oct 2012
Posts: 4,339
Received Thanks: 953
|
Quote:
Originally Posted by snow911
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
|
|
|
02/09/2014, 21:56
|
#15
|
elite*gold: 724
Join Date: Mar 2011
Posts: 10,479
Received Thanks: 3,318
|
Dann ist das dein Prozess & das Modul ist ebenfalls Fiesta.bin. std::string(pe32.szExeFile).find("Fiesta") != std::string::npos dürfte dir helfen.
|
|
|
All times are GMT +1. The time now is 05:58.
|
|