Форум программистов, компьютерный форум, киберфорум
Assembler: MASM64, х64/long mode
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.84/25: Рейтинг темы: голосов - 25, средняя оценка - 4.84
4 / 4 / 6
Регистрация: 03.05.2014
Сообщений: 101
1

WIN32 API в Windows 7: как вызывать функцию NtCreateThread из ntdll.dll

07.02.2016, 13:26. Показов 4720. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Значит дело такое, решил я узнать, как вызывать функцию NtCreateThread из ntdll.dll
Прототип был найден
C
1
2
3
4
5
6
7
8
9
10
11
NtCreateThread(
 
 
  OUT PHANDLE             ThreadHandle,
  IN ACCESS_MASK          DesiredAccess,
  IN POBJECT_ATTRIBUTES   ObjectAttributes OPTIONAL,
  IN HANDLE               ProcessHandle,
  OUT PCLIENT_ID          ClientId,
  IN PCONTEXT             ThreadContext,
  IN PINITIAL_TEB         InitialTeb,
  IN BOOLEAN              CreateSuspended );
Но не совсем понятны некоторые параметры. Поэтому принял решение: посмотреть как её вызывает Kernel32.dll.
Я с ужасом обнаружил там заглушку на заглушку, отправляющую нас в api-ms-win-core-processthreads-l1-1-0.dll
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
.text:0000000078D36210                 sub     rsp, 48h
.text:0000000078D36214                 mov     rax, [rsp+48h+lpThreadId]
.text:0000000078D36219                 mov     [rsp+48h+var_10], rax ; lpThreadId
.text:0000000078D3621E                 mov     eax, [rsp+48h+dwCreationFlags]
.text:0000000078D36222                 mov     [rsp+48h+lpAttributeList], 0 ; lpAttributeList
.text:0000000078D3622B                 mov     [rsp+48h+var_20], eax ; dwCreationFlags
.text:0000000078D3622F                 mov     [rsp+48h+lpParameter], r9 ; lpParameter
.text:0000000078D36234                 mov     r9, r8          ; lpStartAddress
.text:0000000078D36237                 mov     r8, rdx         ; dwStackSize
.text:0000000078D3623A                 mov     rdx, rcx        ; lpThreadAttributes
.text:0000000078D3623D                 or      rcx, 0FFFFFFFFFFFFFFFFh ; hProcess
.text:0000000078D36241                 call    CreateRemoteThreadEx_1
.text:0000000078D36246                 add     rsp, 48h
.text:0000000078D3624A                 retn
Assembler
1
2
3
4
5
.text:0000000078D36254 ; HANDLE __stdcall CreateRemoteThreadEx_1(HANDLE hProcess, LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPPROC_THREAD_ATTRIBUTE_LIST lpAttributeList, LPDWORD lpThreadId)
.text:0000000078D36254 CreateRemoteThreadEx_1 proc near        ; CODE XREF: CreateThreadStub+31p
.text:0000000078D36254                                         ; CreateRemoteThreadStub+29p
.text:0000000078D36254                 jmp     cs:__imp_CreateRemoteThreadEx
.text:0000000078D36254 CreateRemoteThreadEx_1 endp
А вот в этом самом api-ms-win-core-processthreads-l1-1-0.dll мы видим еще более крутую заглушку на все экспортируемые функции:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
.text:000007FF2C801068 ; BOOL __stdcall SetProcessShutdownParameters(LPPROC_THREAD_ATTRIBUTE_LIST lpAttributeList, DWORD dwFlags, DWORD_PTR Attribute, PVOID lpValue, SIZE_T cbSize, PVOID lpPreviousValue, PSIZE_T lpReturnSize)
.text:000007FF2C801068                 public SetProcessShutdownParameters
.text:000007FF2C801068 SetProcessShutdownParameters proc near  ; DATA XREF: .text:off_7FF2C8010B8o
.text:000007FF2C801068                 xor     eax, eax        ; CreateProcessA
.text:000007FF2C801068                                         ; CreateProcessAsUserW
.text:000007FF2C801068                                         ; CreateProcessW
.text:000007FF2C801068                                         ; CreateRemoteThread
.text:000007FF2C801068                                         ; CreateRemoteThreadEx
.text:000007FF2C801068                                         ; CreateThread
.text:000007FF2C801068                                         ; GetCurrentProcess
.text:000007FF2C801068                                         ; GetCurrentProcessId
.text:000007FF2C801068                                         ; GetCurrentThread
.text:000007FF2C801068                                         ; GetCurrentThreadId
.text:000007FF2C801068                                         ; GetExitCodeProcess
.text:000007FF2C801068                                         ; GetExitCodeThread
.text:000007FF2C801068                                         ; GetPriorityClass
.text:000007FF2C801068                                         ; GetProcessId
.text:000007FF2C801068                                         ; GetProcessIdOfThread
.text:000007FF2C801068                                         ; GetProcessTimes
.text:000007FF2C801068                                         ; GetProcessVersion
.text:000007FF2C801068                                         ; GetThreadId
.text:000007FF2C801068                                         ; GetThreadPriority
.text:000007FF2C801068                                         ; GetThreadPriorityBoost
.text:000007FF2C801068                                         ; InitializeProcThreadAttributeList
.text:000007FF2C801068                                         ; OpenProcessToken
.text:000007FF2C801068                                         ; OpenThread
.text:000007FF2C801068                                         ; OpenThreadToken
.text:000007FF2C801068                                         ; ProcessIdToSessionId
.text:000007FF2C801068                                         ; QueryProcessAffinityUpdateMode
.text:000007FF2C801068                                         ; QueueUserAPC
.text:000007FF2C801068                                         ; ResumeThread
.text:000007FF2C801068                                         ; SetPriorityClass
.text:000007FF2C801068                                         ; SetProcessAffinityUpdateMode
.text:000007FF2C801068                                         ; SetProcessShutdownParameters
.text:000007FF2C801068                                         ; SetThreadPriority
.text:000007FF2C801068                                         ; SetThreadPriorityBoost
.text:000007FF2C801068                                         ; SetThreadStackGuarantee
.text:000007FF2C801068                                         ; SetThreadToken
.text:000007FF2C801068                                         ; SuspendThread
.text:000007FF2C801068                                         ; SwitchToThread
.text:000007FF2C801068                                         ; TerminateProcess
.text:000007FF2C801068                                         ; TerminateThread
.text:000007FF2C801068                                         ; TlsAlloc
.text:000007FF2C801068                                         ; TlsFree
.text:000007FF2C801068                                         ; TlsGetValue
.text:000007FF2C801068                                         ; TlsSetValue
.text:000007FF2C80106A                 retn
.text:000007FF2C80106A SetProcessShutdownParameters endp
Так как оно работает? Где находится весь код?
P.S.: Немного оффтоп, но объясните мне, пожалуйста, какая из функций (Zw или Nt) выполняет валидацию параметров, а какая нет. А то я запутался.

Добавлено через 7 минут
Нашёл реализацию в kernelbase.dll
Но всё-таки: как оно работает?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.02.2016, 13:26
Ответы с готовыми решениями:

Как исправить ошибку, связанную с atidxx32.dll и ntdll.dll
Могу ли я что-то сделать с этими ошибками или вина полностью лежит на разработчиках игры?

Ошибка в ntdll.dll при игре в Diablo 1 на Windows XP SP2
Здравствуйте. Решил поиграть в Diablo 1 , установил, начал играть при спуске в подземелье вылетает...

При запуске своей проги на Windows 7, ругается на ntdll.dll
Прогу пишу в BDS2006, а проблема по всей видимости из-за того, что запускать её пришлось в ОС...

VS Win32 APi and HTMLayout.dll
Здравствуйте начал изучать htmlayout для создания GUi Не подскажете как при запуске приложения...

15
Ушел с форума
Эксперт С++
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
07.02.2016, 15:10 2
Цитата Сообщение от DCNick3 Посмотреть сообщение
Но не совсем понятны некоторые параметры.
OBJECT_ATTRIBUTES, CLIENT_ID - это уже не Win32 API, это так называемый Native API.
Нужные объявления можно найти в заголовках из Windows Driver Kits (WDK), а также
(частично) в заголовке <winternl.h>. Для функций и структур, которые документированны, в
MSDN есть описание.

Цитата Сообщение от DCNick3 Посмотреть сообщение
Так как оно работает? Где находится весь код?
Код 99% функций, начинающихся на Nt или Zw, находится в ядре.
ntdll.dll - это лишь переходник, который загружает в eax номер соответствующего
системного сервиса и делает вызов в ядро (sysenter/syscall).

Цитата Сообщение от DCNick3 Посмотреть сообщение
Немного оффтоп, но объясните мне, пожалуйста, какая из функций (Zw или Nt) выполняет валидацию параметров, а какая нет. А то я запутался.
Если ты вызываешь Nt/Zw-функции из режима пользователя, то валидация
параметров и проверки безопасности выполняются всегда. Более того, Nt и Zw в
режиме пользователя - одно и то же, у них адреса в ntdll.dll совпадают.
1
232 / 135 / 19
Регистрация: 10.11.2015
Сообщений: 305
07.02.2016, 15:29 3
Цитата Сообщение от DCNick3 Посмотреть сообщение
Где находится весь код?
А в чем проблема, поставте бряк прямо на NtCreateThread и все (имейте ввиду что на Vista и выше NtCreateUserProcess будет вызваться, если вы при создании процесса ловите).

PS: У Неббета кстати есть её описание.
0
4 / 4 / 6
Регистрация: 03.05.2014
Сообщений: 101
07.02.2016, 22:56  [ТС] 4
Убеждённый,
К сожалению всё что вы рассказали, я уже знал. Но спасибо. Я не понимал как эти параметры создать. Для OBJECT_ATTRIBUTES нашёл InitializeObjectAttributes, понел, что там указываются параметры nt объекта (как банально). Не было найдено масок для Desired Access. Так же не знаю как создать THREAD_CONTEX и INITIAL_TEB. Наверняка есть какие-нибудь функции, ткните носом пожалуйста.

Цитата Сообщение от Убежденный Посмотреть сообщение
Если ты вызываешь Nt/Zw-функции из режима пользователя, то валидация
параметров и проверки безопасности выполняются всегда. Более того, Nt и Zw в
режиме пользователя - одно и то же, у них адреса в ntdll.dll совпадают.
Вот этого не ожидал. Но нашёл, что в ядре Nt* параметры проверяет, вызываю их. Надо ведь что-то выбрать.

Цитата Сообщение от jupman Посмотреть сообщение
PS: У Неббета кстати есть её описание.
Тут тоже надо ткнуть носом. Я программистских книжек читал мало, видимо придётся начинать. В поисковиках не нашёл, можно хотя бы название.

И всё-таки. Каким лесом вызываются эти функции? Там же одни заглушки.
0
Ушел с форума
Эксперт С++
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
08.02.2016, 10:52 5
Цитата Сообщение от DCNick3 Посмотреть сообщение
OBJECT_ATTRIBUTES нашёл InitializeObjectAttributes, понел, что там указываются параметры nt объекта (как банально). Не было найдено масок для Desired Access. Так же не знаю как создать THREAD_CONTEX и INITIAL_TEB. Наверняка есть какие-нибудь функции, ткните носом пожалуйста.
OBJECT_ATTRIBUTES можно заполнить вручную: все поля по нулям,
Length - размер структуры, ObjectName - указатель на UNICODE_STRING с
именем объекта, в Attributes - атрибуты, обычно OBJ_CASE_INSENSITIVE
(в ядре еще OBJ_KERNEL_HANDLE). Все.

Остальное undocumented.
Примеры работы с этими структурами можно увидеть только в исходниках Windows
(NT4/W2K/WRK), но никаких гарантий, разумеется, никто не даст.

Цитата Сообщение от DCNick3 Посмотреть сообщение
Вот этого не ожидал. Но нашёл, что в ядре Nt* параметры проверяет, вызываю их. Надо ведь что-то выбрать.
Повторюсь: в режиме пользователя не имеет абсолютно никакого значения,
вызываешь ли ты Nt-функцию или Zw-функцию, т.к. у них одна и та же
точка входа в ntdll.dll. Так что разницы никакой.
1
232 / 135 / 19
Регистрация: 10.11.2015
Сообщений: 305
08.02.2016, 19:12 6
Цитата Сообщение от DCNick3 Посмотреть сообщение
Тут тоже надо ткнуть носом. Я программистских книжек читал мало, видимо придётся начинать. В поисковиках не нашёл, можно хотя бы название.
Gary Nebbett Windows NT, 2000 Native API Reference
1
4 / 4 / 6
Регистрация: 03.05.2014
Сообщений: 101
10.02.2016, 10:23  [ТС] 7
Цитата Сообщение от Убежденный Посмотреть сообщение
Остальное undocumented.
Но ведь есть ReactOS, undocumented.ntinternals.net, и в конце концов реверс-инжиниринг. Хотя, конечно, да. Native API и так не гарантирует обратную совместимость, а тут еще недокументированный... Вот например функции Csr*, функции обмена дынными с CSRSS.EXE. Пакеты обмена с ним меняются даже от SP к SP. Ужас. А ведь такая интересная тема, эти ваши недокументированные функции, возможности, части ОС... Романтика.

Добавлено через 10 часов 49 минут
Но всё-таки. Как вызываются WINAPI функции в Windows Vista и старше? Наверное там какой-то код, который над таблицей импорта шаманит...
0
Ушел с форума
Эксперт С++
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
10.02.2016, 10:26 8
На самом деле некоторое из того, что считается undocumented, не меняется годами.
Да, структуры дополняются, но новые поля, как правила, добавляются в конец.
Кое-что можно найти по сигнатурам, если очень нужно. Кстати, это вполне рабочий
метод, при условии, что сигнатура достаточно четкая. Я так ZwProtectVirtualMemory в
ядре искал, к примеру, а также некоторые флаги внутри EPROCESS, которые по-другому
ничем не вытащить. Так что не все потеряно, просто в таких вещах действовать нужно
ну очень осмотрительно и сначала семь раз отмерить и все перепроверить.

Цитата Сообщение от DCNick3 Посмотреть сообщение
Как вызываются WINAPI функции в Windows Vista и старше?
Не понял, в чем "подвох" вопроса?
Вызываются также, как и на других версиях Windows.
1
4 / 4 / 6
Регистрация: 03.05.2014
Сообщений: 101
10.02.2016, 10:45  [ТС] 9
В этих версиях добавили кучу dll подходящх под маску api-ms-win-*
На эти dll и ссылаются все стандартные либы (по крайней мере kernel32.dll, advapi32.dll). По факту код kernel32.dll находится в kernelbase.dll
Но в api-ms-win-* находятся заглушки return 0; Как управление передаётся kernelbase.dll?
0
Ушел с форума
Автор FAQ
16338 / 7659 / 1075
Регистрация: 11.11.2010
Сообщений: 13,696
10.02.2016, 11:04 10
Убежденный,
подвох, наверное, в слове "и старше". Подразумевается скорее всего 64-разрядные Windows 7/Windows 8. Параметры в WinAPI передаются уже не только через стек, а через регистры RCX, RDX, R8, R9, через стек, вещественные через XMM0-XMM3
0
Ушел с форума
Эксперт С++
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
10.02.2016, 11:48 11
Лучший ответ Сообщение было отмечено DCNick3 как решение

Решение

Цитата Сообщение от DCNick3 Посмотреть сообщение
Как управление передаётся kernelbase.dll?
При загрузке исполняемого модуля в память система выполняет отображение
функций-заглушек из api-ms-win-xxx на реальные адреса из реальных dll.
За отображение отвечает специальная dll-ка - apisetschema.dll:

приложение/dll -> kernel32!некая функция -> api-ms-win-abcde[заглушка] -> somedll!реальная функция

Каких именно dll - это пользователей Win32 API вообще не должно волновать.

Ну то есть, API Sets - это вообще внутренний механизм системы для упрощения
поддержки и организации совместимости, нас, программистов, он не касается,
мы по-прежнему юзаем kernel32.dll, advapi32.dll, old32/combase.dll и т.д.
2
4 / 4 / 6
Регистрация: 03.05.2014
Сообщений: 101
10.02.2016, 14:47  [ТС] 12
Цитата Сообщение от Убежденный Посмотреть сообщение
При загрузке исполняемого модуля в память система выполняет отображение
функций-заглушек из api-ms-win-xxx на реальные адреса из реальных dll.
За отображение отвечает специальная dll-ка - apisetschema.dll:
приложение/dll -> kernel32!некая функция -> api-ms-win-abcde[заглушка] -> somedll!реальная функция
Каких именно dll - это пользователей Win32 API вообще не должно волновать.
Ну то есть, API Sets - это вообще внутренний механизм системы для упрощения
поддержки и организации совместимости, нас, программистов, он не касается,
мы по-прежнему юзаем kernel32.dll, advapi32.dll, old32/combase.dll и т.д.
Спасибо большое, надо будет попилить эту dll

Добавлено через 6 минут
Ладно, это оказалась полная пустышка. Может когда-нибудь мне удастся выяснить как оно работает. Это как-то сложно. И мне лень
А, гениально. Там же есть данные. Имена функций...

Добавлено через 8 минут
Сорри за оффтоп, но можно ли где-то найти хотя бы прототипы функций из BOOTVID.DLL? Гугл не помогает по вполне известным "ошибкам в BOTTVID.DLL"
0
Ушел с форума
Эксперт С++
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
10.02.2016, 15:18 13
Цитата Сообщение от DCNick3 Посмотреть сообщение
можно ли где-то найти хотя бы прототипы функций из BOOTVID.DLL?
Можно. Они есть в исходниках Win2K (файл private\ntos\inc\bootvid.h).
1
4 / 4 / 6
Регистрация: 03.05.2014
Сообщений: 101
11.02.2016, 12:34  [ТС] 14
Цитата Сообщение от Убежденный Посмотреть сообщение
Можно. Они есть в исходниках Win2K (файл private\ntos\inc\bootvid.h).
А линковаться как с ним? На C наверно lib файл нужен...
0
Ушел с форума
Эксперт С++
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
11.02.2016, 14:16 15
Ну даже если .lib-файлов нету - это проблема?
Напиши свой драйвер-заглушку с таким же именем и точно такими же
экспортами, как у bootvid.dll - получишь подходящий lib.
2
4 / 4 / 6
Регистрация: 03.05.2014
Сообщений: 101
11.02.2016, 22:08  [ТС] 16
Цитата Сообщение от Убежденный Посмотреть сообщение
Ну даже если .lib-файлов нету - это проблема?
Напиши свой драйвер-заглушку с таким же именем и точно такими же
экспортами, как у bootvid.dll - получишь подходящий lib.
Точно, спасибо большое!
0
11.02.2016, 22:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.02.2016, 22:08
Помогаю со студенческими работами здесь

ntdll.dll и kernel32.dll - Реальные примеры работы на vb6
Копался, копался по стороннему форуму и наткнулся на всевозможные вызовы апифункций из...

Win32 API, MFC, или Windows Forms?
Здравствуйте! У меня очень простая задача на С++, нужно построить графики по точкам (данные из...

Как вызывать функции из DLL?
Здравствуйте. Как вызывать функции из DLL? Вот например, если функция представляет собой что -...

Книга Юрий Щупак Win32 API. Разработка приложений для Windows
Остался ли источник где можно скачать - Win32 API. Разработка приложений для Windows ???


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru