Читаю третью статью Ms Remа, пытаюсь написать аналогичный драйвер на ассемблере, который перехватывает функцию NtOpenProcess, не могу понять как правильно на асме высчитать адрес ф-и. Вот у автора вычисляется таким образом Код (Text): POldCode Func = (POldCode)NtOpenProcess; pfar_jmp Fnjp = (pfar_jmp)NtOpenProcess; как вычислить на асме?
Если пишешь на фасме, то mov eax, [NtOpenProcess] P.S. способ с постоянной установкой/снятием хука юзать в ядре нельзя, очень нестабильно. Юзай лучше сплайсинг с дизасмом длин или хуки через SDT.
Более того провел небольшое исследование, вот как компилятор C++ переводит этот код POldCode Func = (POldCode)NtOpenProcess; Код (Text): .idata:00010508 extrn NtOpenProcess:dword .text:0001045E mov eax, ds:NtOpenProcess вот что получается у меня средствами масма Код (Text): .idata:000103B0 extrn NtOpenProcess:dword .text:0001038A jmp ds:NtOpenProcess .text:00010264 lea esi, loc_1038A вот строка Код (Text): lea esi,NtOpenProcess получается что масм ставит заглушку, тоесть перхват я так понимаю не получится?
нет на масм32 Синий экран вылетает чтоли? Про это где почитать? Я об дизасме длин и понятия не имею 1. сам же в статьях ты писал что это метод плохой, изменения в таблице обнаруживается 2. это ж надо под каждую винду НТ знать номер ф-и в ядре? меняется номер ф-и в различных сервиспаках, или только в разных версия винды (2к,ХР,2к3 ?)
Вторая статья про апихуки. Ну, их можно скрыть. Нет, можно извлечь номер из соответствующей функции ntdll.
А каким образом тот же каспер или аутпост хуки ставят? Или они какой то новый метод изобрели? Что если поставить перехват на одну и ту же функцию, допустим обычным сплайсингом, может быть синий экран? (при устовии что допустим перехват в разных местах) (Как показала практика др. веб и нортон несовместимы. Синий экран сразу после илициализации сервисов)
Хукают SDT. Зависит от того, правильно ли реализован перехват (обрабатываются ли rel32 команды при переносе куска кода).
В общем наверное тоже остановлюсь на SDT. Видел твою утилиту, которая достает номера системных вызовов. Напишу такую же только для асма, чтото типа этого get_ntdll_func_number proc lpszFuncName:dword кому надо потом выложу
Код (Text): ULONG GetSdtEntryNumber(IN PCSTR lpProcName) { PUCHAR pProc = GetProcAddress(GetModuleHandle("ntdll.dll"), lpProcName); if (pProc) return *(PULONG)(pProc + 1); return 0; }
мда... а я уже до экспорта из ntdll добрался ч-з PE заголовок... а все проще оказывается Это ж надо до такого дожится =). Спасибо МС Рему p.s. Вот перевел на асм может кому надо Код (Text): get_sdt_entry_number proc uses ebx lpszProcName:dword xor ebx,ebx lea eax,szNtDll invoke GetModuleHandle,eax .if eax invoke GetProcAddress,eax,lpszProcName .if eax mov ebx,eax inc ebx mov ebx,[ebx] .endif .endif mov eax,ebx ret szNtDll db "ntdll.dll",0 get_sdt_entry_number endp
Если этот код предполагается юзать из ядра, то нужна своя реализация GetModuleHandle и GetProcAddress. Куски моего пелоадера гдето на форуме проскакивали, так что ищите кому надо.
Я ошибаюсь или этот код: Код (Text): inc ebx не равен этому: Код (Text): *(PULONG)(pProc + 1); Ведь согласно арифметике указателей, в Си-коде возвращается значение+4?