4 / 4 / 6
Регистрация: 03.05.2014
Сообщений: 101
|
|||||||||||||||||||||
1 | |||||||||||||||||||||
WIN32 API в Windows 7: как вызывать функцию NtCreateThread из ntdll.dll07.02.2016, 13:26. Показов 4720. Ответов 15
Метки нет (Все метки)
Значит дело такое, решил я узнать, как вызывать функцию NtCreateThread из ntdll.dll
Прототип был найден
Я с ужасом обнаружил там заглушку на заглушку, отправляющую нас в api-ms-win-core-processthreads-l1-1-0.dll
P.S.: Немного оффтоп, но объясните мне, пожалуйста, какая из функций (Zw или Nt) выполняет валидацию параметров, а какая нет. А то я запутался. Добавлено через 7 минут Нашёл реализацию в kernelbase.dll Но всё-таки: как оно работает?
0
|
07.02.2016, 13:26 | |
Ответы с готовыми решениями:
15
Как исправить ошибку, связанную с atidxx32.dll и ntdll.dll Ошибка в ntdll.dll при игре в Diablo 1 на Windows XP SP2 При запуске своей проги на Windows 7, ругается на ntdll.dll VS Win32 APi and HTMLayout.dll |
Ушел с форума
|
|
07.02.2016, 15:10 | 2 |
OBJECT_ATTRIBUTES, CLIENT_ID - это уже не Win32 API, это так называемый Native API.
Нужные объявления можно найти в заголовках из Windows Driver Kits (WDK), а также (частично) в заголовке <winternl.h>. Для функций и структур, которые документированны, в MSDN есть описание. Код 99% функций, начинающихся на Nt или Zw, находится в ядре. ntdll.dll - это лишь переходник, который загружает в eax номер соответствующего системного сервиса и делает вызов в ядро (sysenter/syscall). Если ты вызываешь Nt/Zw-функции из режима пользователя, то валидация параметров и проверки безопасности выполняются всегда. Более того, Nt и Zw в режиме пользователя - одно и то же, у них адреса в ntdll.dll совпадают.
1
|
232 / 135 / 19
Регистрация: 10.11.2015
Сообщений: 305
|
|
07.02.2016, 15:29 | 3 |
А в чем проблема, поставте бряк прямо на 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* параметры проверяет, вызываю их. Надо ведь что-то выбрать. Тут тоже надо ткнуть носом. Я программистских книжек читал мало, видимо придётся начинать. В поисковиках не нашёл, можно хотя бы название. И всё-таки. Каким лесом вызываются эти функции? Там же одни заглушки.
0
|
Ушел с форума
|
|
08.02.2016, 10:52 | 5 |
OBJECT_ATTRIBUTES можно заполнить вручную: все поля по нулям,
Length - размер структуры, ObjectName - указатель на UNICODE_STRING с именем объекта, в Attributes - атрибуты, обычно OBJ_CASE_INSENSITIVE (в ядре еще OBJ_KERNEL_HANDLE). Все. Остальное undocumented. Примеры работы с этими структурами можно увидеть только в исходниках Windows (NT4/W2K/WRK), но никаких гарантий, разумеется, никто не даст. Повторюсь: в режиме пользователя не имеет абсолютно никакого значения, вызываешь ли ты Nt-функцию или Zw-функцию, т.к. у них одна и та же точка входа в ntdll.dll. Так что разницы никакой.
1
|
232 / 135 / 19
Регистрация: 10.11.2015
Сообщений: 305
|
|
08.02.2016, 19:12 | 6 |
1
|
4 / 4 / 6
Регистрация: 03.05.2014
Сообщений: 101
|
|
10.02.2016, 10:23 [ТС] | 7 |
Но ведь есть ReactOS, undocumented.ntinternals.net, и в конце концов реверс-инжиниринг. Хотя, конечно, да. Native API и так не гарантирует обратную совместимость, а тут еще недокументированный... Вот например функции Csr*, функции обмена дынными с CSRSS.EXE. Пакеты обмена с ним меняются даже от SP к SP. Ужас. А ведь такая интересная тема, эти ваши недокументированные функции, возможности, части ОС... Романтика.
Добавлено через 10 часов 49 минут Но всё-таки. Как вызываются WINAPI функции в Windows Vista и старше? Наверное там какой-то код, который над таблицей импорта шаманит...
0
|
Ушел с форума
|
|
10.02.2016, 10:26 | 8 |
На самом деле некоторое из того, что считается undocumented, не меняется годами.
Да, структуры дополняются, но новые поля, как правила, добавляются в конец. Кое-что можно найти по сигнатурам, если очень нужно. Кстати, это вполне рабочий метод, при условии, что сигнатура достаточно четкая. Я так ZwProtectVirtualMemory в ядре искал, к примеру, а также некоторые флаги внутри EPROCESS, которые по-другому ничем не вытащить. Так что не все потеряно, просто в таких вещах действовать нужно ну очень осмотрительно и сначала семь раз отмерить и все перепроверить. Не понял, в чем "подвох" вопроса? Вызываются также, как и на других версиях 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
|
Ушел с форума
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
|
Ушел с форума
|
|
10.02.2016, 11:48 | 11 |
Сообщение было отмечено DCNick3 как решение
Решение
При загрузке исполняемого модуля в память система выполняет отображение
функций-заглушек из 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 |
Спасибо большое, надо будет попилить эту dll
Добавлено через 6 минут Ладно, это оказалась полная пустышка. Может когда-нибудь мне удастся выяснить как оно работает. Это как-то сложно. А, гениально. Там же есть данные. Имена функций... Добавлено через 8 минут Сорри за оффтоп, но можно ли где-то найти хотя бы прототипы функций из BOOTVID.DLL? Гугл не помогает по вполне известным "ошибкам в BOTTVID.DLL"
0
|
Ушел с форума
|
|
10.02.2016, 15:18 | 13 |
1
|
4 / 4 / 6
Регистрация: 03.05.2014
Сообщений: 101
|
|
11.02.2016, 12:34 [ТС] | 14 |
0
|
Ушел с форума
|
|
11.02.2016, 14:16 | 15 |
Ну даже если .lib-файлов нету - это проблема?
Напиши свой драйвер-заглушку с таким же именем и точно такими же экспортами, как у bootvid.dll - получишь подходящий lib.
2
|
4 / 4 / 6
Регистрация: 03.05.2014
Сообщений: 101
|
|
11.02.2016, 22:08 [ТС] | 16 |
0
|
11.02.2016, 22:08 | |
11.02.2016, 22:08 | |
Помогаю со студенческими работами здесь
16
ntdll.dll и kernel32.dll - Реальные примеры работы на vb6 Win32 API, MFC, или Windows Forms? Как вызывать функции из DLL? Книга Юрий Щупак Win32 API. Разработка приложений для Windows Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |