Hallo Hagen,
hab zwar noch nicht das Gefühl, dass ich das wirklich allein hinbekomme
.. habe aber dennoch schonmal angefangen, Deinen Pseudocode umzuwandeln
Bis hierin bin ich gekommen, lässt sich aber nicht compilieren.
Bei dem Assembler Code sagt er mir in Zeile: JMP [EAX].VirtualFree
"Ungültige Kombination von Opcode und Operanden". ?
Hier der Quelltext:
Delphi-Quellcode:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
PHookData = ^THookData;
THookData =
packed record
SaveWindowProc: Pointer;
hWnd: HWnd;
GetWindowLong:
function(hWnd : HWND; nIndex : INTEGER ): LongInt;
stdcall;
SetWindowLong:
function(hWnd : HWND; nIndex : INTEGER; wNewLong : LongInt): LongInt;
stdcall;
ExitThread:
procedure(dwExitCode : DWORD);
stdcall;
CallWndProc:
function(lpPrevWndFunc : TFNWndProc; hWnd: HWND; Msg: WORD; wParam: WPARAM; lParam: LPARAM): lResult;
stdcall;
VirtualFree:
function(lpAddress : Pointer; dwSize : DWORD; dwFreeType : DWORD) : bool;
stdcall;
// richtige Parameter ?
WindowProc:
array[0..0]
of Byte;
// hier wird MyWndProc rein kopiert
ThreadCode:
array[0..0]
of Byte;
// hier wird ThreadProc hineinkopiert
end;
TForm1 =
class(TForm)
Button1: TButton;
private
public
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function MyWndProc(hWnd: HWND; Msg: WORD; wParam: WPARAM; lParam: LPARAM): lResult;
stdcall;
var
Memory: PHookData;
begin
asm
CALL @@1
@@1: POP EAX
AND EAX,$FFFFF000
// align
MOV Memory,EAX
end;
if Msg = wm_Destroy
then
begin
Memory.CallWndProc(Memory.SaveWindowProc, hWnd, Msg, wParam, lParam);
// hier Memory freigeben, wichtig dabei das der aktuelle Code ja in diesem Memory^ liegt
// wir müssen also die Reücksrungadresse aus dem Stack holen. Dann Memory auf den Stack pushen
// danach Rücksrungadresse pushen und einem Jump nach VirtualFree() durchführen.
// Somit kehrt VirtualFree NICHT in unseren nun freigegebene Memory zurück, sondern zum
// Aufrufer von MyWndProc().
asm
POP EDX
MOV EAX,Memory
PUSH EAX
PUSH EDX
JMP [EAX].VirtualFree
end;
end else
if Msg = wm_Close
then
begin
end else
Result := Memory.CallWndProc(Memory.SaveWindowProc, hWnd, Msg, wParam, lParam);
end;
end.