Антивирусы перехватывают гораздо глубже, в ядре. И прекрасно видят, что создаётся поток не в контексте процесса, вызывающего API. Замена WinAPI-шной функцию на Native-ную ничего не даст в плане обхода антивирусов. Но даст существенный гемморой. Нативные функции не регистрируют созданный поток в csrss. А значит бОльшая часть WinAPI будет недоступна (многие winapi функции проверяют, является ли поток win32-шным, обращаясь к csrss)
Доброго времени суток
Вычитал в Рихтере способ внедрения dll в адресное пространство с помощью функции CreateRemoteThread. В Windows 7 CreateRemoteThread передает управление NativeApi функции NtCreateThreadEx, которая перехватывается аналогом антивируса, в то время как NtCreateThread вызывается свободно...
Вопрос: можно ли напрямую вызвать NtCreateRemoteThread?
Я пытался подсоединить ntdll к проекту, и вызывать NtCreateRemoteThread напрямую, добился появления нового потока у целевого процесса в "счетчике потоков" диспетчера задач.
Подскажите, как можно заставить созданный поток выполнять код (конкретно — LoadLibrary)? Возможно, есть какой-то способ заставить CreateRemoteThread вызывать старую функцию NtCreateRemoteThread??
Заранее спасибо
PPV>Вопрос: можно ли напрямую вызвать NtCreateRemoteThread? PPV>Я пытался подсоединить ntdll к проекту, и вызывать NtCreateRemoteThread напрямую, добился появления нового потока у целевого процесса в "счетчике потоков" диспетчера задач. PPV>Подскажите, как можно заставить созданный поток выполнять код (конкретно — LoadLibrary)? Возможно, есть какой-то способ заставить CreateRemoteThread вызывать старую функцию NtCreateRemoteThread??
описАлся... Естественно — имею ввиду NtCreateThread
Насколько я понимаю, что бы вызвать LoadLibrary новым потоком, достаточно получить ее адрес и выставить EIP контекста нового потока на него? Подскажите, как, в таком случае, передать этой функции строку с параметром?
Здравствуйте, PotapovPV, Вы писали:
PPV>Насколько я понимаю, что бы вызвать LoadLibrary новым потоком, достаточно получить ее адрес и выставить EIP контекста нового потока на него? Подскажите, как, в таком случае, передать этой функции строку с параметром?
непонятно чо за проблемы ты решаешь? у Рихтера же полное описание есть (во всяким случает раньше было).
в качестве стартового адреса для CreateRemoteThread указываешь адрес LoadLibrary (благо он во всех процессах один и тот же). строку с именем dll пишешь в адресное пространство целевого процесса с помощью WriteProcessMemory. адрес этой строки в удаленном процессе передаешь в remote_thread_function с помощью CreateRemoteThread. еще какие-то детали нужны или осилишь дальше сам?
c SetContext и установкой eip лучше не связываться — нормально работать не будет.
если по каким-то причинам не подходит CreateRemoteThread юзай NtCreateRemoteThread.
Здравствуйте, _cb_, Вы писали:
__>непонятно чо за проблемы ты решаешь? у Рихтера же полное описание есть (во всяким случает раньше было).
Видимо, я недостаточно четко описал проблему: меня не устраивает вызов NtCreateThreadEx, который осуществляют такие функции как CreateRemoteThread и RtlCreateUserThread, задача стоит именно в вызове NtCreateThread, о чем Рихтер не упоминает.
__>если по каким-то причинам не подходит CreateRemoteThread юзай NtCreateRemoteThread.
К сожалению, о такой функции я первый раз слышу, ntdll ее не экспортирует. Где ее можно найти?
Здравствуйте, IID, Вы писали:
IID>Здравствуйте, PotapovPV, Вы писали:
IID>Антивирусы перехватывают гораздо глубже, в ядре. И прекрасно видят, что создаётся поток не в контексте процесса, вызывающего API. Замена WinAPI-шной функцию на Native-ную ничего не даст в плане обхода антивирусов. Но даст существенный гемморой. Нативные функции не регистрируют созданный поток в csrss. А значит бОльшая часть WinAPI будет недоступна (многие winapi функции проверяют, является ли поток win32-шным, обращаясь к csrss)
Собственно, я недаром написал "аналог антивируса": у меня простенький стенд, на котором перехватывается вызов NtCreateThreadEx и у меня стоит задача вызвать NtCreateThread. Очевидно, что реальный антивирусы действуют глубже.
Касательно регистрации потока в csrss есть пример у Неббета, однако, хотелось бы найти где-нибудь некоторое количество теории по этому поводу...
Можно ли где-нибудь найти пример создания контекста потока?
Здравствуйте, PotapovPV, Вы писали:
PPV>Видимо, я недостаточно четко описал проблему: меня не устраивает вызов NtCreateThreadEx, который осуществляют такие функции как CreateRemoteThread и RtlCreateUserThread, задача стоит именно в вызове NtCreateThread, о чем Рихтер не упоминает.
я уже давно это все не исследовал и чо и как сейчас сделано точно не знаю, но думаю что даже если ты будешь вызывать NtCreateThread, то этот метод все равно в конечном итоге вызовет NtCreateThreadEx.
__>>если по каким-то причинам не подходит CreateRemoteThread юзай NtCreateRemoteThread. PPV>К сожалению, о такой функции я первый раз слышу, ntdll ее не экспортирует. Где ее можно найти?
ты сам про нее написал в исходном посте. на сколько я понимаю сейчас такой функции уже не существует, вроде бы она была в каких-то старых осях.
я не знаю какую именно задачу ты пытаешься решить, но может забить на все эти CreateRemoteThread и прописать свою dll в AppInitDlls?
если очень хочется поэкспериментировать с созданием удаленных потоков, то можешь попробовать заставить работать вариант с SetThreadContext. но там достаточно много возни, в том числе и с поддержкой x64. плюс есть предположение что метод ненадежный и может обвалить целевой процесс: http://blog.not-a-kernel-guy.com/2010/05/04/812
PPV>>Видимо, я недостаточно четко описал проблему: меня не устраивает вызов NtCreateThreadEx, который осуществляют такие функции как CreateRemoteThread и RtlCreateUserThread, задача стоит именно в вызове NtCreateThread, о чем Рихтер не упоминает. __>я уже давно это все не исследовал и чо и как сейчас сделано точно не знаю, но думаю что даже если ты будешь вызывать NtCreateThread, то этот метод все равно в конечном итоге вызовет NtCreateThreadEx.
Вообщето, как ни странно, скорее будет наоборот
__>>>если по каким-то причинам не подходит CreateRemoteThread юзай NtCreateRemoteThread. PPV>>К сожалению, о такой функции я первый раз слышу, ntdll ее не экспортирует. Где ее можно найти? __>ты сам про нее написал в исходном посте. на сколько я понимаю сейчас такой функции уже не существует, вроде бы она была в каких-то старых осях.
Не было таких.
Как много веселых ребят, и все делают велосипед...
Здравствуйте, ononim, Вы писали:
O>Вообщето, как ни странно, скорее будет наоборот
может и так... согласен что это выглядит странно...
__>>ты сам про нее написал в исходном посте. на сколько я понимаю сейчас такой функции уже не существует, вроде бы она была в каких-то старых осях. O>Не было таких.
Здравствуйте, ononim, Вы писали:
O>Вообщето, как ни странно, скорее будет наоборот
Они не вызывают друг друга... Они независимы.
Однако, до Vista вызывается NtCreateThread, а начиная с Vista — NtCreateThreadEx
__>>>>если по каким-то причинам не подходит CreateRemoteThread юзай NtCreateRemoteThread. PPV>>>К сожалению, о такой функции я первый раз слышу, ntdll ее не экспортирует. Где ее можно найти? __>>ты сам про нее написал в исходном посте. на сколько я понимаю сейчас такой функции уже не существует, вроде бы она была в каких-то старых осях. O>Не было таких.
Верно. В исходном посте я опечатался.
Нигде не найду найти информацию по созданию контекста процесса
PPV>Верно. В исходном посте я опечатался. PPV>Нигде не найду найти информацию по созданию контекста процесса
неужели у когото еще нету стыренных исходников винды?
Как много веселых ребят, и все делают велосипед...
В результате вкуривания исходников win2k, Неббета и всех найденых примеров получил приведенный ниже код...
Пытаюсь создать поток, например, в одном из процессов Google Chrome, однако при вызове NtResumeThread процесс просто падает.
Большая просьба посмотреть и по возможности сообщить — что я забыл, или сделал неправильно
Здравствуйте, ononim, Вы писали:
O>стек падения процесса-жертвы неплохо бы увидеть
Я тесно общаюсь с дебаггерами всего лишь около месяца, поэтому не слишком силен в теории.
Подскажите, пожалуйста, метод получения стека процесса на момент падения
O>>стек падения процесса-жертвы неплохо бы увидеть PPV>Я тесно общаюсь с дебаггерами всего лишь около месяца, поэтому не слишком силен в теории. PPV>Подскажите, пожалуйста, метод получения стека процесса на момент падения
Да какая тут теория.. Аттачите(F6) windbg к работающему процессу который в дальнейшем упадет, и когда он упадет — (вы это увидите) — пишете kv ffff
Как много веселых ребят, и все делают велосипед...
Здравствуйте, ononim, Вы писали: O>Да какая тут теория.. Аттачите(F6) windbg к работающему процессу который в дальнейшем упадет, и когда он упадет — (вы это увидите) — пишете kv ffff
После падения получаем:
Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax=00000000 ebx=01060000 ecx=00008000 edx=00000000 esi=cccccccc edi=cccccccc
eip=00000000 esp=03fb0000 ebp=cccccccc iopl=0 nv up ei pl zr na pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=0038 gs=0000 efl=00010246
00000000 ?? ???
0:005> kv ffff
Memory ChildEBP RetAddr Args to Child
WARNING: Frame IP not in any known module. Following frames may be wrong.
cccccccc 00000000 00000000 00000000 00000000 0x0
PPV>Здравствуйте, ononim, Вы писали: O>>Да какая тут теория.. Аттачите(F6) windbg к работающему процессу который в дальнейшем упадет, и когда он упадет — (вы это увидите) — пишете kv ffff PPV>После падения получаем: PPV>
PPV>Access violation - code c0000005 (first chance)
PPV>First chance exceptions are reported before any exception handling.
PPV>This exception may be expected and handled.
PPV>eax=00000000 ebx=01060000 ecx=00008000 edx=00000000 esi=cccccccc edi=cccccccc
PPV>eip=00000000 esp=03fb0000 ebp=cccccccc iopl=0 nv up ei pl zr na pe nc
PPV>cs=001b ss=0023 ds=0023 es=0023 fs=0038 gs=0000 efl=00010246
PPV>00000000 ?? ???
PPV>0:005> kv ffff
PPV> Memory ChildEBP RetAddr Args to Child
PPV>WARNING: Frame IP not in any known module. Following frames may be wrong.
PPV> cccccccc 00000000 00000000 00000000 00000000 0x0
PPV>
PPV>Я неверно формирую контекст потока?
Похоже на то. Кстати еще советую изучить как работает BaseThreadInitThunk — вполне возможно что ее поведение поменялось с тех пор как сорсы винды были сперты. К примеру (чисто гипотетически) может ей надо еще контекст на стек ложить.
Вобщем сделайте еще так — заатачьтесь windbg к процессу, поставьте бряк на BaseThreadInitThunk и посмотрите что произойдет когда BaseThreadInitThunk придет для вашего потока (если придет)
Как много веселых ребят, и все делают велосипед...
Здравствуйте, ononim, Вы писали: O>Похоже на то. Кстати еще советую изучить как работает BaseThreadInitThunk — вполне возможно что ее поведение поменялось с тех пор как сорсы винды были сперты. К примеру (чисто гипотетически) может ей надо еще контекст на стек ложить.
Кажется, Ошибка в том, что я что-то перепутал именно с функцией: ума не приложу откуда я вынул этот BaseThreadInitThunk. Исходники винды говорят о BaseThreadStartThunk, которую я сейчас и пытаюсь найти...