В общем вкратце информация.
1) Есть DLL которая ставит хук (сплайсинг) на CreateProcessA/W для процесса в котором запущена
2) Если требуется то запускает определенный процесс через ShellExecute
3) В хуке правится флаг запуска на SUSPENDED
4) Записывается шелкод который подгрузит эту же DLL в запускаемый процесс (через LdrLoadDll).
5) Далее QueueUserApc на адрес шелкода.
6) ResumeThread
В итоге всегда наша DLL будет стартовать перед кодом запускаемой программы.
Всё работает идеально и ровно.... но до тех пор пока DLL не стартует в rundll32
В данном случае при запуске нужного процесса из DLL, попадаю на хук, далее всё выполняется как надо, но запускаемый процесс падает, причем падение происходит в недрах ntdll. LdrLoadDll -> RtlDosApplyFileIsolationRedirection -> еще штук 5 вложенных вызовов. т.е. DLL еще даже не пытается грузить, просто проверяются пути (что-то связанное с технологией winsxs)
т.е. получается что rundll32 что-то правит у себя, и это наследуется в дочернем процессе и собственно говоря не дает нормально работать коду
P.S.
1) QueueUserApc потому что обязательное требование чтобы код DLL выполнился до старта кода программы
2) LdrLoadDll - используется из-за определенное специфики, которая не имеет отношение к вопросу
3) ShellExecute потому что приходится запускать некоторые программы заранее не зная расположение их, а также запускать не только программы но и открывать файлы.
4) Тестил на Win Vista x32 SP2 / Win Vista x64 SP2 / Win Vista x64 SP1 / Win 7 x32 / Win 7 x64 / Win 7 x64 SP 1 - везде один и тот же результат.
В общем главный вопрос - что мог такого сделать rundll чтобы появлялась такая ошибка. Или как можно избежать этого?
P.P.S
В общем IDA + HexRay показали что такой баг не возникает, если прибить в rundll вызов ActivateActCtx. Теперь интересно, чтоже там могло такого произойти серьездного
1) Есть DLL которая ставит хук (сплайсинг) на CreateProcessA/W для процесса в котором запущена
2) Если требуется то запускает определенный процесс через ShellExecute
3) В хуке правится флаг запуска на SUSPENDED
4) Записывается шелкод который подгрузит эту же DLL в запускаемый процесс (через LdrLoadDll).
5) Далее QueueUserApc на адрес шелкода.
6) ResumeThread
В итоге всегда наша DLL будет стартовать перед кодом запускаемой программы.
Всё работает идеально и ровно.... но до тех пор пока DLL не стартует в rundll32
В данном случае при запуске нужного процесса из DLL, попадаю на хук, далее всё выполняется как надо, но запускаемый процесс падает, причем падение происходит в недрах ntdll. LdrLoadDll -> RtlDosApplyFileIsolationRedirection -> еще штук 5 вложенных вызовов. т.е. DLL еще даже не пытается грузить, просто проверяются пути (что-то связанное с технологией winsxs)
т.е. получается что rundll32 что-то правит у себя, и это наследуется в дочернем процессе и собственно говоря не дает нормально работать коду
P.S.
1) QueueUserApc потому что обязательное требование чтобы код DLL выполнился до старта кода программы
2) LdrLoadDll - используется из-за определенное специфики, которая не имеет отношение к вопросу
3) ShellExecute потому что приходится запускать некоторые программы заранее не зная расположение их, а также запускать не только программы но и открывать файлы.
4) Тестил на Win Vista x32 SP2 / Win Vista x64 SP2 / Win Vista x64 SP1 / Win 7 x32 / Win 7 x64 / Win 7 x64 SP 1 - везде один и тот же результат.
В общем главный вопрос - что мог такого сделать rundll чтобы появлялась такая ошибка. Или как можно избежать этого?
P.P.S
В общем IDA + HexRay показали что такой баг не возникает, если прибить в rundll вызов ActivateActCtx. Теперь интересно, чтоже там могло такого произойти серьездного