Einzelnen Beitrag anzeigen

Astat

Registriert seit: 2. Dez 2009
Ort: München
320 Beiträge
 
Lazarus
 
#8

Re: Float Addresse aus RAM laden???

  Alt 6. Feb 2010, 20:55
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.dllname '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
Lanthan Astat
06810110811210410503210511511603209711003210010110 9032084097103
03211611111604403209711003210010110903210010510103 2108101116122
11610103209010110510810103206711110010103210511003 2068101108112
10410503210310111509910411410510109810111003211910 5114100046
  Mit Zitat antworten Zitat