Startseite ¦  was ist neu ¦  programmier tips ¦  indy artikel ¦  intraweb artikel ¦  informationen ¦  links ¦  interviews ¦  sonstiges
kylix ¦  tutorials ¦  online shop ¦  fotos ¦  Add&Win Gewinnspiel


Willkommen Gast. Bitte einloggen oder registrieren.
08.02.2012, 03:05:53
Übersicht Hilfe Suche Einloggen Registrieren

+  SwissDelphiCenter Forum
|-+  German Forums
| |-+  WinAPI Forum
| | |-+  Addresse von Binärstring im Prozessmemory finden
« vorheriges nächstes »
Seiten: [1] Drucken
Autor Thema: Addresse von Binärstring im Prozessmemory finden  (Gelesen 1323 mal)
Nexus2k
Newbie
*
Offline Offline

Beiträge: 3


« am: 10.06.2009, 19:56:58 »

Ich suche momentan nach einer möglichkeit mit ReadProcessMemory einen Binärstring bzw. Code des Programms zu suchen und mir die Addresse des gefundenen Strings zurück geben zu lassen.

Also ich suche z.bsp. im Prozess winrar.exe folgende abfolge von folgendem Binärcode/Hexcode:
$5AE8FC6C0900E8BF7909006A00
und möchte dann die Addresse: $0040102E zurück bekommen.

Mir ist bewusst, dass ich die Addresse statisch im Programm verwenden könnte, jedoch habe ich keine Lust jedesmal wenn das Programm gepatcht wird wieder die neue Adresse von Hand zu suchen.

Google weis dazu leider nichts...
Gespeichert
Nexus2k
Newbie
*
Offline Offline

Beiträge: 3


« Antworten #1 am: 10.06.2009, 22:11:46 »

Ich habs raus:

Code:
var
...
  PidHandle: integer;
  PidID : integer;
  byteArr : Array of byte;
Const
  ProgramName = 'winrar.exe';

function getAddr(start: Cardinal;size: Cardinal; Data: array of Byte): Cardinal;
var
Read: Cardinal;
Value: Array of byte;
Address: Cardinal;
Length: Cardinal;
begin
  Result := 0;
  Address:= start;
  Length:= SizeOf(Data);
  SetLength(Value,SizeOf(Data));
  while Address <> ((start+size)-SizeOf(Data)) do begin
    ReadProcessMemory(PidHandle, Pointer(Address), @Value[0], SizeOf(Data),Length);
    //ShowMessage(Format('%x',[Address]));
    //ShowMessage(Format('%x',[Value[0]]));
    if CompareMem(@Value[0],@Data[0],SizeOf(Data)) then begin
      result:=Address;
      break;
    end;
    Inc(Address);
  end;
end;

function GetProcessID(Const ExeFileName: string; var ProcessId: integer): boolean;
var
  ContinueLoop: BOOL;
  FSnapshotHandle: THandle;
  FProcessEntry32: TProcessEntry32;
begin
  result := false;
  FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
  ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
  while integer(ContinueLoop) <> 0 do begin
if (StrIComp(PChar(ExtractFileName(FProcessEntry32.szExeFile)), PChar(ExeFileName)) = 0)
   or (StrIComp(FProcessEntry32.szExeFile, PChar(ExeFileName)) = 0)  then begin
   ProcessId:= FProcessEntry32.th32ProcessID;
   result := true;
   break;
end;
ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
  end;
  CloseHandle(FSnapshotHandle);
end;

Und Die Verwendung der Funktion geht dann so:
Code:
procedure TForm1.Button1Click(Sender: TObject);
var
Result: Cardinal;
begin
 if GetProcessID(ProgramName, PidId) then
  begin
PidHandle  :=  OpenProcess(PROCESS_ALL_ACCESS,False,PidId);
  //ShowMessage(InttoStr(PidId));
  setlength(byteArr,13);
  byteArr[0]:= $5A;
  byteArr[1]:= $E8;
  byteArr[2]:= $FC;
  byteArr[3]:= $6C;
  byteArr[4]:= $09;
  byteArr[5]:= $00;
  byteArr[6]:= $E8;
  byteArr[7]:= $BF;
  byteArr[8]:= $79;
  byteArr[9]:= $09;
  byteArr[10]:= $00;
  byteArr[11]:= $6A;
  byteArr[12]:= $00;
  Result:=getAddr($00401000,$000A3000,byteArr);
  Memo1.Text:=Format('%x',[Result]);
  end;
end;

Vielen Dank für die Hilfe *fg*

Gespeichert
Seiten: [1] Drucken 
« vorheriges nächstes »
Gehe zu:  


Einloggen mit Benutzername, Passwort und Sitzungslänge

Powered by MySQL Powered by PHP Powered by SMF 1.1.11 | SMF © 2006, Simple Machines LLC Prüfe XHTML 1.0 Prüfe CSS