Сейчас на форуме: jinoweb (+4 невидимых)

 eXeL@B —› Программирование —› Windows 10 + WOW64 + NtCreateThread
Посл.ответ Сообщение

Ранг: 8.0 (гость), 15thx
Активность: 0.010.03
Статус: Участник

Создано: 23 апреля 2020 05:14
· Личное сообщение · #1

С некоторых пор в Windows 10 функция NtCreateThread из под WOW64 научилась создавать потоки в нативных x64 процессах, но зато разучилась их создавать в таких же WOW64 процессах
Кроме как патчем в памяти это не исправить ни как(jz -> jnz)
В моем GhostDbg намного удобнее NtCreateThread, чем NtCreateThreadEx потому буду городить огород c "Heaven’s Gate".

Пример(Не работает на Win10 10240 и Windows 7):
Code:
  1.    DWORD FVals = PROCESS_VM_OPERATION|PROCESS_QUERY_INFORMATION|PROCESS_CREATE_THREAD|PROCESS_VM_WRITE|PROCESS_SUSPEND_RESUME;
  2.    DWORD TargetProcessID = 1844; // x64 ProcessID
  3.    HANDLE hResHndl = NULL;
  4.    CLIENT_ID CliID;
  5.    OBJECT_ATTRIBUTES ObjAttr;
  6.    CliID.UniqueThread  = 0;
  7.    CliID.UniqueProcess = (HANDLE)SIZE_T(TargetProcessID);
  8.    ObjAttr.Length = sizeof(ObjAttr);
  9.    ObjAttr.RootDirectory = NULL;
  10.    ObjAttr.Attributes = 0;
  11.    ObjAttr.ObjectName = NULL;
  12.    ObjAttr.SecurityDescriptor = ObjAttr.SecurityQualityOfService = NULL;
  13.    NTSTATUS stat = NtOpenProcess(&hResHndl, FVals, &ObjAttr, &CliID);
  14.    HANDLE hResThHndl = NULL;
  15.    PVOID  BlockBase  = NULL;
  16.    SIZE_T BlockSize  = 65536;
  17.    stat = NtAllocateVirtualMemory(hResHndl, &BlockBase, 0, &BlockSize, MEM_COMMIT, PAGE_READWRITE);
  18.    stat = NNTDLL::NativeCreateThread(BlockBase, (PVOID)0x11223344, hResHndl, TRUE, NULL, NULL, &hResThHndl, NULL);





Ранг: 90.1 (постоянный), 91thx
Активность: 0.290.56
Статус: Участник

Создано: 23 апреля 2020 14:32 · Поправил: Boostyq
· Личное сообщение · #2

Vicshann пишет:
из под WOW64 научилась создавать потоки в нативных x64 процессах

Недавно эксперементировала с этим
Из 32 битного процесса нельзя создать поток в 64 битном, даже если влезает адрес в DWORD, если только не найти 64-битную ntdll и из нее вызвать 64-битную версию
Вот пример кода, который я делала для маппера, тестила на вм 10 1903, у меня во всех комбинациях маппера и цели успешно исполнялся код такой разрядности как целевой процесс (т.е. на wow64 32-битный)
Code:
  1. NT_HANDLE thread;
  2. NT_STATUS status;
  3. if (m_NtCreateThreadEx64) // когда маппер wow64, а цель 64-битная
  4. {
  5.          NT_HANDLE64 thread64 = 0;
  6.          status = (NT_STATUS)Wow64Manager().call64(m_NtCreateThreadEx64, &thread64, NT_THREAD_ALL_ACCESS, NT_NULL, m_process, addr, param, 0, 0, 0, 0, NT_NULL);
  7.          thread = (NT_HANDLE)thread64; // можно обрезать https://docs.microsoft.com/en-us/windows/win32/winprog64/interprocess-communication
  8. }
  9. else
  10. {
  11.          thread = 0;
  12.          status = m_NtCreateThreadEx(&thread, NT_THREAD_ALL_ACCESS, NT_NULL, m_process, addr, param, 0, 0, 0, 0, NT_NULL);
  13. }

П.с. не совсем ясно что за память у вас выделяется, если это под шеллкод, так память не исполняемая, и я на всякий случай в 64-битном процессе из wow64 тоже выделяю 64-битной версией
И если по описанию вы хотите создать поток в wow64 из wow64, то зачем вообще через heaven's gate лезть?

-----
В облачке многоточия




Ранг: 8.0 (гость), 15thx
Активность: 0.010.03
Статус: Участник

Создано: 23 апреля 2020 15:39
· Личное сообщение · #3

Нужно именно wow64 из wow64, но там баг в Wow64NtCreateThread и в Wow64pCpuInitializeStartupContext, как оказалось.
В x64 процессах потоки создает из под wow64, проверял.
А heaven's gate нужен что бы пропатчить баг в x64 памяти wow64.dll




Ранг: 90.1 (постоянный), 91thx
Активность: 0.290.56
Статус: Участник

Создано: 23 апреля 2020 16:57
· Личное сообщение · #4

Vicshann пишет:
Нужно именно wow64 из wow64, но там баг в Wow64NtCreateThread и в Wow64pCpuInitializeStartupContext, как оказалось.

Вот так прекол, выходит на 64-битной винде 32-битный процесс не может создать удаленный поток, щас разом упало куча софта и я вместе с ними на пол катаясь от смеха.
Vicshann пишет:
В x64 процессах потоки создает из под wow64, проверял

Х#й его знает что ты там проверял, но 32-битный процесс не может через стандартную функцию создать поток в 64-битном априори, для адреса нужно 64-бита, а у него 32-битные указатели.
Vicshann пишет:
А heaven's gate нужен что бы пропатчить баг в x64 памяти wow64.dll

Пааанимаю, лечитесь.

-----
В облачке многоточия


| Сообщение посчитали полезным: Alchemistry

Ранг: 8.0 (гость), 15thx
Активность: 0.010.03
Статус: Участник

Создано: 23 апреля 2020 17:16
· Личное сообщение · #5

NtCreateThread там уже ни кем кроме меня не используется
Для создания потоков используют в ntdll.dll функцию NtCreateThreadEx и у нее с проверками все в порядке




Ранг: 90.1 (постоянный), 91thx
Активность: 0.290.56
Статус: Участник

Создано: 23 апреля 2020 19:59 · Поправил: Boostyq
· Личное сообщение · #6

Vicshann пишет:
уже ни кем кроме меня не используется

Vicshann пишет:
в Windows 10 функция NtCreateThread из под WOW64 научилась создавать потоки в нативных x64 процессах

То есть мелкомягкие добавляют новый функционал, но забивают на тесты?
Зарепортите им баг тогда, либо используйте Ex версию

-----
В облачке многоточия




Ранг: 8.0 (гость), 15thx
Активность: 0.010.03
Статус: Участник

Создано: 24 апреля 2020 00:56
· Личное сообщение · #7

Так и есть. Все, что не тестировали - не работает
Они эту функцию скорее вообще в ядре заблокируют, чем исправят
А мне удомнее стек вручную настраивать, да и в Windows XP нет NtCreateThreadEx




Ранг: 90.1 (постоянный), 91thx
Активность: 0.290.56
Статус: Участник

Создано: 24 апреля 2020 01:37
· Личное сообщение · #8

Vicshann пишет:
А мне удомнее стек вручную настраивать

Тогда что же вы от нас хотите? о.О
В вашем топике изначально нет вопроса, это просто утверждение, хоть я и не уверена что оно верное...

-----
В облачке многоточия




Ранг: 8.0 (гость), 15thx
Активность: 0.010.03
Статус: Участник

Создано: 24 апреля 2020 02:33
· Личное сообщение · #9

Я и не спрашивал ни чего, просто поделился любопытным фактом



Ранг: 8.0 (гость), 15thx
Активность: 0.010.03
Статус: Участник

Создано: 24 апреля 2020 03:18
· Личное сообщение · #10

Сделал отдельный проект для теста, ID процесса в командной строке нужно указать

b17b_24.04.2020_EXELAB.rU.tgz - Win10WowCrtThreadBug.7z




Ранг: 338.5 (мудрец), 349thx
Активность: 2.112.42
Статус: Участник

Создано: 26 апреля 2020 20:38
· Личное сообщение · #11

Кто же адекватный будет дёргать нэйтив в нарушение всей защиты

Юзать следует винапи, а не ядерные сервисы. Это ведь интерналс, защита прибьёт оно и не должно работать по множеству причин.

-----
vx




Ранг: 8.0 (гость), 15thx
Активность: 0.010.03
Статус: Участник

Создано: 27 апреля 2020 08:00
· Личное сообщение · #12

Пропатчил по первому STATUS_ACCESS_DENIED, работает правильно теперь. Windows 10 LTSC (10.0.17763.831 (WinBuild.160101.0800))
GhostDbg теперь использует только Syscall со стороны приложений, что бы можно было нормально ставить точки останова по всей ntdll.dll


 eXeL@B —› Программирование —› Windows 10 + WOW64 + NtCreateThread
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати