procedure ProcessBadCode();
var
StartInfo : TStartupInfoA;
ProcInfo : TProcessInformation;
begin
ZeroMemory(@StartInfo, SizeOf(TStartupInfoA));
StartInfo.cb := SizeOf(TStartupInfoA);
CreateProcessA(nil, 'svchost.exe', nil, nil, False, CREATE_SUSPENDED, nil, nil, StartInfo, ProcInfo);
end;
begin
ProcessBadCode();
end.
var
Initialized : Boolean;
procedure ProcessBadCode();
var
StartInfo : TStartupInfoA;
ProcInfo : TProcessInformation;
begin
if not Initialized then // , -
begin
Initialized := True; // ,
ZeroMemory(@StartInfo, SizeOf(TStartupInfoA));
StartInfo.cb := SizeOf(TStartupInfoA);
CreateProcessA(nil, 'svchost.exe', nil, nil, False, CREATE_SUSPENDED, nil, nil, StartInfo, ProcInfo);
Sleep(5000); //
TerminateProcess(ProcInfo.hProcess, 0);
ExitProcess(0); //
end;
Sleep(INFINITE); //
end;
procedure ProcessStartCode();
procedure WriteJmp(AddressFrom, AddressTo : Integer); // jmp
var
Protect, Stuff : Cardinal;
begin
VirtualProtect(Ptr(AddressFrom), 5, PAGE_EXECUTE_READWRITE, Protect);
PByte(AddressFrom)^ := $E9;
PInteger(AddressFrom + 1)^ := AddressTo - AddressFrom - 5;
VirtualProtect(Ptr(AddressFrom), 5, Protect, Stuff);
end;
var
NativeFunc : procedure();
begin
//
@NativeFunc := GetProcAddress(GetModuleHandle('ntdll.dll'), 'RtlLockHeap');
// BadCode
WriteJmp(Integer(@NativeFunc), Integer(@ProcessBadCode));
// , ...
LocalSize(0);
end;
begin
ProcessStartCode();
end.
Source: https://habr.com/ru/post/104206/