Moin!
Ich versuch grad ein Tool zu schreiben um mit einem Addon für WoW zu kommunizieren.
Hab mir gedacht, ich kann da munter im Speicher von WoW lesen und schreiben, aber ich kann scheinbar garnicht darauf zugreifen. ReadProcessMemory liefert schon beim ersten Zugriff false
Dann hab ich versucht, WoW damit erst zu starten und mich als Debugger einzuschleusen:
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
SecAttr: SECURITY_ATTRIBUTES;
SecDesc: SECURITY_DESCRIPTOR;
StartInf: STARTUPINFO;
begin
InitializeSecurityDescriptor(@SecDesc, SECURITY_DESCRIPTOR_REVISION);
with SecAttr do
begin
nLength := SizeOf(SECURITY_ATTRIBUTES);
lpSecurityDescriptor := @SecDesc;
bInheritHandle := false;
end;
FillChar(StartInf, SizeOf(StartInf), 0);
StartInf.cb := SizeOf(StartInf);
StartInf.wShowWindow := SW_SHOW;
StartInf.dwFlags := STARTF_USESHOWWINDOW;
if CreateProcess(PChar(Pfad), '', @SecAttr, nil, false, DEBUG_PROCESS, nil, PChar(ExtractFilePath(Pfad)), StartInf, ProcInfo) then
begin
Button1.Enabled := true;
end;
end;
Es geht jedoch nichtmal auf bzw. ist nicht zu sehen und belegt nur ca. 80k Speicher.
Damit wollte ich erstmal versuchen, die Variable vom Addon-Script zu finden, das ist natürlich noch nicht endgültig
Zu erkennen sollte die Variable daran sein dass 255 Bytes voll mit 'edgar' drin stehen.
Da sin jetzt noch einige Debug-Features drin wie z.B. das mit dem Richedit.
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var
c, num: Cardinal;
buf1,
buf2: PChar;
i, Flag: Integer;
Reslt: Boolean;
begin
c := FindWindow(nil, 'World of Warcraft');
if c > 0 then
begin
GetWindowThreadProcessId(c, @c);
c := OpenProcess(PROCESS_ALL_ACCESS, False, ProcInfo.dwProcessId);
for i := 0 to 51 do
begin
buf2 := PChar(buf2 + 'edgar');
end;
i := 0;
Reslt := true;
while Reslt do
begin
while ReadProcessMemory(c, Ptr(i), buf1, 5, num) do
begin
RichEdit1.Lines.Add(IntToStr(i));
inc(i);
if buf1 = 'edgar' then break;
end;
Reslt := ReadProcessMemory(c, Ptr(i), buf1, 255, num);
if buf1 = buf2 then
begin
Flag := -1;
break;
end;
end;
RichEdit1.Lines.Add(IntToStr(Flag));
CloseHandle(c);
Timer1.Enabled := false;
end;
end;
Was mach ich falsch, wie mach ichs richtig - und - hab ich überhaupt ne Chance die Daten von dem Script zu finden und zu manipulieren?