Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Delphi: WinAPI и системное программирование > Как пользоваться Zw/NtCreateProcess? |
Автор: Акакий 5.9.2011, 10:46 |
Если кто может, пожалуйста, покажите пример на Delphi использования Nt(Zw)CreateProcess. Особенно интересует запись параметров(ком.строка, текущий каталог и т.п.) в РЕВ. Заранее спасибо ![]() |
Автор: Акакий 6.9.2011, 10:51 |
Riply, спасибо конечно, но все это я видел еще в 200-лохматом годе, когда Клерк давал ссылки на исходники мелкомягких(на paste.org.ru по моему), да и у Зомби есть куча примеров на асме(правда там tls не обрабатывается)....вообще теории выше крыши ![]() ![]() ЗЗЗЗЫ!!!! И таки везде только одни обсуждения за боянистую тему про перехват NtCreateProcess и нигде нет как эту фукн-ю пользовать. И даже здесь http://forum.sources.ru/index.php?showtopic=316652&st=15&#entry2741053, ув. Riply, Вы не приводите исходники самой интересной Вашей процедуры Proc_AllocAndWriteParameters(какая досада...) |
Автор: Riply 7.9.2011, 09:53 | ||||
Чудом раскопала исходники. В этой процедуре ничего особенного нет. Выделяем память в целевом, да пишем туда, что нужно ![]() Очень сложно выдергивать из проекта, бо она использует другие самодельные ф-ии, но вдруг поможет ?
P.S. В том топике говорила, еще раз повторю: отнюдь не факт, что здесь ошибок меньше чем строчек ![]() |
Автор: Акакий 7.9.2011, 13:30 | ||||
![]() итого мы делаем: 1) Var pp :RTL_USER_PROCESS_PARAMETERS; ImageFile :PUNICODE_STRING; //путь к ехе-шнику RtlCreateProcessParameters(@pp,ImageFile,Nil,CurrentDirectory,CommandLine,Nil,Nil,Nil,Nil,Nil); 2) формируем "блок окружения процесса",
pp.Environment:=pEnv; 3) пишем в процесс структуру RTL_USER_PROCESS_PARAMETERS: Var p2 :Pointer = Nil; ZwAllocateVirtualMemory(hProcess,p2,0,SizeOf(pp),...) ZwWriteVirtualMemory(hProcess,p2,pp,...) 4) получаем адрес РЕВ созданного процесса: Var pbi :PROCESS_BASIC_INFORMATION; ZwQueryInformationProcess(...,@pbi,...); и пишем в РЕВ(согласно его структуре) по смещению $10 адрес, по которому мы записали RTL_USER_PROCESS_PARAMETERS(т.е. указатель p2): ZwWriteVirtualMemory(hProcess,pbi.PebBaseAddress+$10,p2,4,...) ЗЫ ну и теперь дело остается за малым - в очередной раз убедиться, что все это не работает...(3 раза тьфу чтоб не сглазить) |
Автор: Riply 7.9.2011, 17:50 |
Акакий, с первого взгляда, вроде, похоже на правду. |
Автор: Акакий 7.9.2011, 23:40 | ||
небольшая неточность - неверно определяется размер окружения - не учитываются нули в конце строк, нужно так:
|
Автор: Riply 8.9.2011, 08:50 |
1. Почему or ? Вроде надо and. 2. Почему +1, а не SizeOf(CHAR) ? (и здесь аналогично: "Env1+2") |
Автор: Акакий 8.9.2011, 11:46 | ||
Мы ищем в последовательности байтов(на начало которой указывает Env1) два нуля подряд. Поэтому пока какой-нибудь из 2-х соседних байтов не ноль((Env2^<>#0) or (PChar(DWord(Env2)+1)^<>#0)) делаем Inc. В итоге получаем размер окружения, равный Env2-Env1+2(+2, т.к. в самом конце оставляем 2 нуля). |
Автор: Акакий 11.9.2011, 18:55 | ||||
все создается, процесс, поток и т.д., проходит примерно секунда и за сим процесс уходит в мир иной... |
Автор: Акакий 13.9.2011, 21:12 |
Иго-го!!!! Оказывается, приложение можно запустить, вообще не вызывая Nt/ZwCreateProcess/Int $2E/call fs:[$C0]. И притом сделать это из ring3!!!! Проверено на WinXP32/64bit и Win7 32/64bit. Иго-го!!!! ![]() |
Автор: kami 19.9.2011, 12:48 | ||
"Народ требует опровержения" (с) чье-то. В смысле - каким путем для этого нужно пойти? (понятно, что верным путем, но тем не более). |
Автор: Акакий 20.9.2011, 00:11 | ||
Натурально ничего сверхъестественного, мне до Воланда и его свиты, как Акакию до собора парижской богоматери и даже дальше... вообщем - далеко очень ![]() Берем сисер и смотрим, что происходит по адресу, записанному в IDT по смещению $170 при eax=$2F ![]() Только не все так гладко, как сладко... Созданный таким образом процесс имеет ограничения: - в процессе не будут работь следующие API: CreateProcess, Sleep/NtDelayExecution/WaitForSingleObject, WaitForDebugEvent, ContinueDebugEvent; - из предыдущего, в числе прочего, следует, что такой процесс будет полностью съедать ресурсы 1 ядра CPU. Но выход из ситуации все же есть - вызывать для потоков нашего процесса SuspendThread/ResumeThread из другого процесса, кроме того, то же самое можно делать из потоков, внедренных в процесс извне(но не из созданных самим процессом) |