Zitat von
Muellermilchtrinker:
Servus
DP,Wie lade ich eine Float Addresse aus dem
RAM???
Hallo Muellermilchtrinker, anbei Sample.
Es werden von der calc.exe 8 Byte, dies entspricht der Größe eines Double = 5.0 x 10^-324 .. 1.7 x 10^308
ausgelesen. Willst du nun die ausgelesenen 8 Bytes einer Double Variablen zuweisen, kannst Du dies einfach mit
move(ptrData^, d, SizeOf(Double)) durchführen.
Delphi-Quellcode:
function AdjustTokenPrivileges(TokenHandle: THandle; DisableAllPrivileges: BOOL;
const NewState: TTokenPrivileges; BufferLength: DWORD;
PreviousState: PTokenPrivileges; ReturnLength: PDWORD): BOOL; stdcall;
external 'advapi32.dll' name 'AdjustTokenPrivileges'
function EnableProcessPrivilege(const Enable: Boolean;
const Privilege: string): Boolean;
const
PrivAttrs: array [Boolean] of DWORD = (0, SE_PRIVILEGE_ENABLED);
var
Token: THandle;
TokenPriv: TTokenPrivileges;
begin
Result := False;
if OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES, Token) then
begin
TokenPriv.PrivilegeCount := 1;
LookupPrivilegeValue(nil, PChar(Privilege), TokenPriv.Privileges[0].Luid);
TokenPriv.Privileges[0].Attributes := PrivAttrs[Enable];
AdjustTokenPrivileges(Token, False, TokenPriv, SizeOf(TokenPriv), nil, nil);
Result := GetLastError = ERROR_SUCCESS;
CloseHandle(Token);
end;
end;
function MemRead(PID: DWORD; ptrOffset: Pointer; cbData: DWORD): Pointer; stdcall;
var
cbRead: DWORD;
hProc: THandle;
begin
result := nil;
if not EnableProcessPrivilege(true, 'SeDebugPrivilege') then
RaiseLastWin32Error;
hProc := OpenProcess(PROCESS_VM_READ ,False , PID);
if hProc <> 0 then begin
GetMem(Result, cbData);
if not ReadProcessMemory(hProc, ptrOffset, Result, cbData, cbRead) then
RaiseLastWin32Error;
CloseHandle(hProc);
end else
RaiseLastWin32Error;
end;
function BinToHexStr(AData: Pointer; ADataLen: Integer): String;
const
HEX_DIGITS: array [0..15] of Char = '0123456789ABCDEF';
var
LSrc: PChar;
i: Integer;
Begin
LSrc := AData;
SetString(Result, NIL, ADataLen * 2);
for i := 0 to ADataLen -1 do begin
Result[i * 2 + 1] := HEX_DIGITS[ord(LSrc^) shr 4];
Result[i * 2 + 2] := HEX_DIGITS[ord(LSrc^) and $F];
inc(LSrc);
end;
End;
var
ptrData: Pointer;
hWindow: HWND;
dwPID: DWORD;
d: Double;
begin
hWindow := FindWindow(nil, 'Rechner');
if hWindow <> 0 then begin
if GetWindowThreadProcessId(hWindow ,@dwPID) <> 0 then begin
ptrData := MemRead(dwPID, ptr($01000010), 8);
move(ptrData^, d, SizeOf(Double));
writeln(FloatToStr(d));
writeln(BinToHexStr(ptrData, 8));
FreeMem(ptrData);
end else
RaiseLastWin32Error;
end else
RaiseLastWin32Error;
readln;
end.
lg. Astat