Под NT deploit работает как положено.
Под w2k при задании PID — процесса System тоже работает как надо.
При задании процесса, запущенного от системного аккаунта, например процессов:
smss.exe или lsass.exe или других — все работает как надо, но после завершения моей программы винда выводит окошко, что соотв. процесс завершился с кодом 0 и винда будет перегружена.
При задании процесса winlogon — опять все идет как надо, но после завершения моей программы — примерно через секунду, хлоп — и комп уходит в мнгновенную перезагрузку как будето reset нажали.
Код деплоита один в один скопирован в моей программе.
Если я запускаю ERunAsX2 и задаю ему соотв. процесс, с которым у меня проблемы, то программа потом просто не завершается, подвисает, но запускается и работает нормально. Правда ERunAsX2 консольный, а у меня прога гуевая.
Можно было бы просто использовать процесс system и работать с ним, но мне по некоторым причинам это не подходит. Мне подходит любой другой процесс, запущенный от системного аккаунта.
При исследовании выяснилось, что
if (hDbgSsApiPort<>0) or (ZwConnectPort(@hDbgSsApiPort, @DbgSsApiPortNameUS, @QoS, nil, nil, nil, nil, nil)>= 0) then begin
if (DbgUiConnectToDbg>= 0) then begin // DebuggerCID must be registered in debugss
//Вот если прервать тут, то после завершения проги ничего не упадет, но нам-то нужно дальше
ZeroMemory(@DbgSsCpMsg,sizeof(DbgSsCpMsg));
with DbgSsCpMsg do begin
DataSize:=DBG_SS_CP_LPC_DATA_SIZE;
MessageSize:=sizeof(DbgSsCpMsg);
dwSsDebugEventCode:=2; //SS_CREATE_PROCESS_REQUEST;
DebuggeePID:=ProcessId;
DebuggeeTID:=0;
DebuggerPID:=GetCurrentProcessId;
DebuggerTID:=GetCurrentThreadId;
end;
if(ZwRequestPort(hDbgSsApiPort, @DbgSsCpMsg) >= 0) then begin // call DbgpSsCreateProcess which creates handle
//А вот тут уже возврата нет. Хендл получим все дальше отработает ок, но после завершения проги см. выше.
if (WaitForDebugEvent(DbgEvent,512)) then begin // call DbgpCreateProcess which duplicates handle(s)
if(DbgEvent.dwDebugEventCode = CREATE_PROCESS_DEBUG_EVENT) then begin
тут дальнейший код понятен.
В конце я через closehandle как положено закрываю полученный хендл процесса и hDbgSsApiPort. От этого ничего не падает. Падает все через секунду после завершения моей программы. Может после ZqRequestPort нужно вызывать еще какую-нибудь функцию, чтобы сложить с себя полномочия отладки процесса, заданного по ProcessID. Тогда какая функция это делает? Набрел на ZwCompleteConnectPort(handle:THandle) но это не то. Как вариант — запретить завершение своего процесса вообще, но этот вариант не очень нравится.