Ja, das ist klar. Aber es muss ja compilierter Code sein. Ich kann doch keine Funktionsaufrufe im Klartext in die Exe schreiben und dann erwarten, dass diese ausgeführt werden.
Ich sehe gerade, er hat ja kompilierten Code in der AttacheProc. Aber warum macht er das so umständlich:
Delphi-Quellcode:
type
TGetProcAddress = function(hModule:HMODULE;lpProcName:LPCSTR):Pointer;stdcall;
TLoadLibrary = function(lpLibFileName:PChar):HMODULE;stdcall;
TFreeLibrary = function(hLibModule:HMODULE):BOOL;stdcall;
TExitProcess = procedure(uExitCode:UINT);stdcall;
TGetModuleHandle = function(lpModuleName:PChar):HMODULE;stdcall;
TGetMessage = function(var lpMsg:TMsg;hWnd:HWND;wMsgFilterMin,wMsgFilterMax:UINT):BOOL;stdcall;
// ...;
// ...;
Und
Delphi-Quellcode:
type
PAttachData=^TAttachData;
TAttachData=packed record
hLibUser32: HMODULE;
hLibGDI32: HMODULE;
_GetProcAddress: TGetProcAddress;
_LoadLibrary: TLoadLibrary;
_FreeLibrary: TFreeLibrary;
_ExitProcess: TExitProcess;
_GetModuleHandle: TGetModuleHandle;
// ...;
// ...;
szLibUser32: array[0..6] of Char; // "user32"
szLibGDI32: array[0..5] of Char; // "gdi32"
szLoadLibrary: array[0..12] of Char; // "LoadLibraryA"
szFreeLibrary: array[0..11] of Char; // "FreeLibrary"
szExitProcess: array[0..11] of Char; // "ExitProcess"
szGetModuleHandle: array[0..16] of Char; // "GetModuleHandleA"
szlstrlen: array[0..8] of Char; // "lstrlenA"
szGetMessage: array[0..11] of Char; // "GetMessageA"
szTranslateMessage: array[0..16] of Char; // "TranslateMessage"
szDispatchMessage: array[0..16] of Char; // "DispatchMessageA"
Könnte man nicht einfach eine Exe nehmen und diese an die original Exe hängen, den EntryPoint umbiegen? Allerdings wie ruft man dann den original EntryPoint auf?