Witam,
Mam taką funkcję:
function GetModuleBaseAddress(ProcessID: Cardinal): Pointer;
var
Modules : Array of HMODULE;
cbNeeded, i : Cardinal;
ModuleInfo : TModuleInfo;
ModuleName : Array[0..MAX_PATH] of Char;
begin
Result := nil;
SetLength(Modules, 1024);
if (IDProcess <> 0) then
begin
EnumProcessModules(IDProcess, @Modules[0], 1024 * SizeOf(HMODULE), cbNeeded); //Getting the enumeration of modules
SetLength(Modules, cbNeeded div SizeOf(HMODULE)); //Setting the number of modules
for i := 0 to Length(Modules) - 1 do //Start the loop
begin
GetModuleBaseName(IDProcess, Modules[i], ModuleName, SizeOf(ModuleName)); //Getting the name of module
if AnsiCompareText(MName, ModuleName) = 0 then //If the module name match with the name of module we are looking for...
begin
GetModuleInformation(IDProcess, Modules[i], @ModuleInfo, SizeOf(ModuleInfo)); //Get the information of module
Result := ModuleInfo.lpBaseOfDll; //Return the information we want (The image base address)
//CloseHandle(PHandle);
Exit;
end;
end;
end;
end;
Funkcja teoretycznie zwraca BaseAddress procesu np: gg.exe z tym, że jest to zawsze wartość $00800000
Nie jestem pewny czy jest to rzeczywiście poprawny BaseAddress procesu.
W necie znajduję masę przykładów C# odnośnie odczytywania poszczególnych danych z procesu np gier itp na podstawie BaseAddress + offset.
Przykład odczytania:
Health: "Diablo III.exe"+00FE31CC + 0x18 + 0xC8 + 0xC + 0x2A0 + 0x14
problem w tym, że nie rozumiem tego w jaki sposób jest to liczone. Co oznacza to "Diablo III.exe" czy w tym miejscu ma być podstawiony baseaddres ? następnie czym jest kolejny adres i offsety.
Prosiłbym o wytłumaczenie zasady działania takiego schematu, ewentualnie jakies strony z omówieniem podstaw wyciągania wartości z pamięci (baseaddres, offsety, pointery).
Przykład kodu odczytania ilości życia w grze:
BlackMagic diablo = new BlackMagic();
diablo.OpenProcessAndThread(SProcess.GetProcessFromWindowTitle("Diablo III"));
IntPtr baseDiablo = diablo.MainModule.BaseAddress; // czym jest base address oraz jak powinien wygladac,
// jak go pobrać?
Console.WriteLine("baseDiablo: " + baseDiablo);
// Try to get current health
uint value = diablo.ReadUInt((uint)baseDiablo + 0xFE31CC); // co jest dodawane do base addresu, offset ?
value += 0x18;
value = diablo.ReadUInt(value);
value += 0xC8;
value = diablo.ReadUInt(value);
value += 0xC;
value = diablo.ReadUInt(value);
value += 0x2A0;
value = diablo.ReadUInt(value);
value += 0x14;
float hp = diablo.ReadFloat(value);
Kombinuję w CE, przejrzałem tutorial ale niestety za wiele z niego dowiedzieć się nie można. Czy macie może jakieś praktyczne przykłady kodu wykorzystania BaseAddress + offset, szukanie pointerów itp?
Chciałbym poznać zasadę działania takiego schematu, a w necie znajduję jedynie fragmenty które są tłumaczone w taki sposób, że gość z podstawową wiedzą na ten temat nie jest w stanie tego ogarnąć.