Autor Beitrag
cisum
Hält's aus hier
Beiträge: 8

WindowsXP Pro SP3
Turbo Delphi 2006 Explorer, Borland Developer Studio 2006, Delphi 7
BeitragVerfasst: Sa 14.11.09 13:27 
Moin Delphiforum,

ich habe zwei kleine Anwendungen geschreiben.

Die eine (Project1) ist eine Formularanwendung und hat einfach nur einen Button, mit folgender Prozedur:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.Button1Click(Sender: TObject);
begin
  MessageBoxA(0,'this is a test','test',0);
end;



Mein Zeil ist es nun über ein zweites Programm in diesen Aufruf von MessageBoxA einzugreifen und diesen zu manipulieren.
Habe dazu folgendes Programm geschrieben und teils aus den Beispielen der uallcollection kopiert:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
program hook;

{$APPTYPE CONSOLE}

uses
  Windows,
  uallHook,
  uallProcess;

var
  origMessageBoxA: function (hWnd: HWND; lpText, lpCaption: PAnsiChar; uType: UINT): Integer; stdcall;
  newMessageBoxA: function (hWnd: HWND; lpText, lpCaption: PAnsiChar; uType: UINT): Integer; stdcall;

function callbackMessageBoxA(hWnd: HWND; lpText, lpCaption: PAnsiChar; uType: UINT): Integer; stdcall;
begin
  Result := newMessageBoxA(hWnd,PChar(lpText+' [hooked]'),lpCaption,uType);
end;

procedure DllMain;
var
  dwoglModule: DWord;
begin
  dwoglModule := LoadLibrary('user32.dll');
  @origMessageBoxA := GetProcAddress(dwoglModule,'MessageBoxA');
  uallHook.HookCode(@origMessageBoxA,@callbackMessageBoxA,@newMessageBoxA);
end;

procedure Main;
var
  dwPID: DWord;
begin
  dwPID := uallProcess.FindProcess('Project1.exe');
  if (dwPID <> 0then
  begin
    uallHook.InjectMe(dwPID,@DllMain);
  end;
end;

begin
  Main;
end.


Wenn ich das Programm Project1 gestartet habe und das Programm hook starte bekomme ich immer folgende Fehlermeldungen:
Zitat:

---------------------------
Project1.exe - Fehler in Anwendung
---------------------------
Die Anweisung in "0x00ef1561" verweist auf Speicher in "0x00000008". Der Vorgang

"read" konnte nicht auf dem Speicher durchgeführt werden.


Klicken Sie auf "OK", um das Programm zu beenden.
Klicken Sie auf "Abbrechen", um das Programm zu debuggen.
---------------------------
OK Abbrechen
---------------------------


Zitat:

---------------------------
Project1.exe - Fehler in Anwendung
---------------------------
Die Anweisung in "0x00ef3281" verweist auf Speicher in "0x000c01b3". Der Vorgang

"read" konnte nicht auf dem Speicher durchgeführt werden.


Klicken Sie auf "OK", um das Programm zu beenden.
Klicken Sie auf "Abbrechen", um das Programm zu debuggen.
---------------------------
OK Abbrechen
---------------------------


Zitat:

---------------------------
Project1.exe - Fehler in Anwendung
---------------------------
Die Anweisung in "0x00ef32d2" verweist auf Speicher in "0x000c01b3". Der Vorgang

"read" konnte nicht auf dem Speicher durchgeführt werden.


Klicken Sie auf "OK", um das Programm zu beenden.
Klicken Sie auf "Abbrechen", um das Programm zu debuggen.
---------------------------
OK Abbrechen
---------------------------


Zitat:

---------------------------
Project1.exe - Fehler in Anwendung
---------------------------
Die Anweisung in "0x00ef3281" verweist auf Speicher in "0x000c01b3". Der Vorgang

"read" konnte nicht auf dem Speicher durchgeführt werden.


Klicken Sie auf "OK", um das Programm zu beenden.
Klicken Sie auf "Abbrechen", um das Programm zu debuggen.
---------------------------
OK Abbrechen
---------------------------


Zitat:

---------------------------
Project1.exe - Fehler in Anwendung
---------------------------
Die Anweisung in "0x00ef32d2" verweist auf Speicher in "0x000c01b3". Der Vorgang

"read" konnte nicht auf dem Speicher durchgeführt werden.


Klicken Sie auf "OK", um das Programm zu beenden.
Klicken Sie auf "Abbrechen", um das Programm zu debuggen.
---------------------------
OK Abbrechen
---------------------------


Habt ihr vielleicht eine Idee, worans liegen könnte?

Vielen Dank im Vorraus!

Gruß,
cisum
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Sa 14.11.09 16:30 
Kannst du bitte schauen, welches Modul an die Ausführungsoffsets in den Fehlermeldungen geladen ist? Probier zudem mal, was passiert, wenn du den Hook in eine eigene DLL auslagerst und diese injectest.

Ferner: Welches OS, welche Rechte?

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
cisum Threadstarter
Hält's aus hier
Beiträge: 8

WindowsXP Pro SP3
Turbo Delphi 2006 Explorer, Borland Developer Studio 2006, Delphi 7
BeitragVerfasst: Sa 14.11.09 17:19 
Zitat:
Kannst du bitte schauen, welches Modul an die Ausführungsoffsets in den Fehlermeldungen geladen ist?

Wie kann ich das herausfinden?

Edit:
OS ist WindowsXP und bin mit Adminrechten unterwegs

Edit2:
So nun läufts. :)
Habe das ganze in eine extra DLL gepackt und diese in den Prozess injeziert:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
library hook2;

uses
  Windows,
  uallHook;

{$R *.res}

var
  newMessageBoxA: function (hWnd: HWND; lpText, lpCaption: PAnsiChar; uType: UINT): Integer; stdcall;

function callbackMessageBoxA(hWnd: HWND; lpText, lpCaption: PAnsiChar; uType: UINT): Integer; stdcall;
begin
  Result := newMessageBoxA(hWnd,PChar(lpText+' [hooked]'),lpCaption,uType);
end;

procedure DllMain(dwReason: DWord);
begin
  if (dwReason = DLL_PROCESS_ATTACH) then
  begin
    uallHook.HookCode(GetProcAddress(GetModuleHandle('user32.dll'), 'MessageBoxA'),@callbackMessageBoxA,@newMessageBoxA);
  end;
end;

begin
  DllProc := @DllMain;
  DllMain(DLL_PROCESS_ATTACH);
end.


Muss mich in die Materie noch ein wenig einfuchsen.... :oops: