при запуске драйвера выдаётся такая ошибка Код (Text): error 127 "The specified procedure could not be found" выползает она на ZwProtectVirtualMemory - функция в хирдерах описана и подключена ntdll.lib к драйверу...без неё всё отлично... кто что может сказать (по делу ).
подключать ntdll к драйверу это пять баллов =) можно только ntoskrnl, hal и драйвера импортировать. никаких юзермодных либ! )
тогда другой вопрос - а как использовать неэкспортируемые функции?) кроме использования прямой передачи параметров и вызов сервиса напрямую...хоть бы экзампл найти драйвер+неэксп функция)
Great ваще никаких? :P Например dll'ka с мат функциями прекрасно доключается к драйверу, правда там импорта нет, только экспорт %) если функция есть в SDT то считываешь оттуда адрес и все.
ну как бы ты же не пытаешься, надеюсь, использовать экспорт скажем user32.dll чтобы окошечки выводить.
n0name придираешься к словам))) я имел в виду что незя подключать юзермодные либы, которые именно привязаны к юзермоду по апи и проч. loginrl_103 А тут все не так сложно с неэкспортируемыми функциями Ты берешь, читаешь в память ntdll.dll динамически во время работы драйвера в память (точнее, можешь не читать - она промаплена в юзермодное адресное пространство любого процесса, в том числе и System), ищешь там в экспорте твою функцию, выдираешь 4 байта по смещению 1 от ее начала - это будет ее номер. А все потому, что в ntdll сервисы содержат код вида NtXXXXXService: mov eax, SERVICE_NUMBER lea ... call ... вот тебе и нужен SERVICE_NUMBER, который от начала mov лежит по смещению 1. Потом в ssdt ищешь адрес и вызываешь. Только зачем тебе все это нужно? скажи, зачем тебе эта функция и я скажу, как, вероятно, сделать проще (и правильнее, если у тебя идея неверная вдруг)
хочу вызвать zwcreatethread из процесса, прежде приаттачившись к нему. одним словом - изучаю) адреса из ssdt я получаю...в ассемблере (синтаксис в mvs) не очень силён - чешу репу, пытаюсь правильно заталкать параметры)).
узнать какие параметры в какие регистры запихиваются в неэспортируемых функ-циях - только через дизасм этих функций можно?
может туплю (спать хосется) )) описание функции Код (Text): NTSYSAPI NTSTATUS NTAPI ZwCreateThread( OUT PHANDLE ThreadHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, IN HANDLE ProcessHandle, OUT PCLIENT_ID ClientId, IN PCONTEXT ThreadContext, IN PUSER_STACK UserStack, IN BOOLEAN CreateSuspended ); дизасм Код (Text): push dword ptr [ebp+10h] .text:7C933FF0 lea eax, [ebp-334h] .text:7C933FF6 push eax .text:7C933FF7 lea eax, [ebp-2E8h] .text:7C933FFD push eax .text:7C933FFE lea eax, [ebp-308h] .text:7C934004 push eax .text:7C934005 push esi .text:7C934006 lea eax, [ebp-320h] .text:7C93400C push eax .text:7C93400D push 1F03FFh .text:7C934012 lea eax, [ebp-2ECh] .text:7C934018 push eax .text:7C934019 call ZwCreateThread (из ntdll.lib) вот что я навоял Код (Text): __asm { push 0; //false lea eax, [Stack]; push eax; //Stack lea eax, [Context]; push eax; //Context push Cid; //Cid push hProcess; //hProcess push 0; //NULL push THREAD_ALL_ACCESS; //THREAD_ALL_ACCESS lea eax, [hThread]; push eax; //hThread jmp 0x8057F262; //хардконстанта } правильно ли, и как будет правильно в синтаксисе mvs?
а почему jmp? и чт по этому адресу? лень смотреть и у тебя может быть другая версия ядра. ну а так.. хз вроде правильно остальное
при запуске летит в бсод...арг-ты для функции должны же быть в userspace? у меня они определены до подключения к процессу. так понимаю их надо определить в приаттаченом процессе?...может кто подсобит правильным примерчиком?)