Advertisement
ZxZ666

Исполнение удаленного кода без CreateRemoteThread

Oct 15th, 2011
167
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Следующий код запускает процесс "зомби", в контексте которого будет исполняться наша DLL:
  2. { создание процесса "зомби", в контексте которого будет выполняться наша DLL }
  3. function CreateZombieProcess(lpCommandLine: pchar;
  4.                              var lpProcessInformation: TProcessInformation;
  5.                              ModulePath: PChar): boolean;
  6. var
  7.   Memory:pointer;
  8.   Code: dword;
  9.   BytesWritten: dword;
  10.   Context: _CONTEXT;
  11.   lpStartupInfo: TStartupInfo;
  12.   Inject: packed record
  13.            PushCommand : byte;
  14.            PushArgument: DWORD;
  15.            CallCommand: WORD;
  16.            CallAddr: DWORD;
  17.            PushExitThread: byte;
  18.            ExitThreadArg: dword;
  19.            CallExitThread: word;
  20.            CallExitThreadAddr: DWord;
  21.            AddrLoadLibrary: pointer;
  22.            AddrExitThread: pointer;
  23.            LibraryName: array[0..MAX_PATH] of Char;
  24.           end;
  25. begin
  26.   Result := False;
  27.   //запускаем процесс
  28.   ZeroMemory(@lpStartupInfo, SizeOf(TStartupInfo));
  29.   lpStartupInfo.cb := SizeOf(TStartupInfo);
  30.   if not CreateProcess(nil, lpCommandLine, nil, nil,
  31.                        false, CREATE_SUSPENDED, nil, nil,
  32.                        lpStartupInfo, lpProcessInformation) then Exit;
  33.   //выделяем память для внедряемого кода
  34.   Memory := VirtualAllocEx(lpProcessInformation.hProcess, nil, SizeOf(Inject),
  35.                            MEM_COMMIT, PAGE_EXECUTE_READWRITE);
  36.   if Memory = nil then
  37.      begin
  38.      TerminateProcess(lpProcessInformation.hProcess, 0);
  39.      Exit;
  40.      end;
  41.   Code := dword(Memory);
  42.   //инициализация внедряемого кода:
  43.   Inject.PushCommand    := $68;
  44.   inject.PushArgument   := code + $1E;
  45.   inject.CallCommand    := $15FF;
  46.   inject.CallAddr       := code + $16;
  47.   inject.PushExitThread := $68;
  48.   inject.ExitThreadArg  := 0;
  49.   inject.CallExitThread := $15FF;
  50.   inject.CallExitThreadAddr := code + $1A;
  51.   inject.AddrLoadLibrary := GetProcAddress(GetModuleHandle('kernel32.dll'),
  52.                                            'LoadLibraryA');
  53.   inject.AddrExitThread  := GetProcAddress(GetModuleHandle('kernel32.dll'),
  54.                                            'ExitThread');
  55.   lstrcpy(@inject.LibraryName, ModulePath);
  56.   //записать машинный код по зарезервированному адресу
  57.   WriteProcessMemory(lpProcessInformation.hProcess, Memory,
  58.                      @inject, sizeof(inject), BytesWritten);
  59.  
  60.   //получаем текущий контекст первичной нити процесса
  61.   Context.ContextFlags := CONTEXT_FULL;
  62.   GetThreadContext(lpProcessInformation.hThread, Context);
  63.   //изменяем контекст так, чтобы выполнялся наш код
  64.   Context.Eip := code;
  65.   SetThreadContext(lpProcessInformation.hThread, Context);
  66.   //запускаем нить
  67.   ResumeThread(lpProcessInformation.hThread);
  68. end;
  69.  
Advertisement
Advertisement
Advertisement
RAW Paste Data Copied
Advertisement