Разбираю тему - "Перехват API непосредственной записью в код системной функции". Масса исходников в сети иллюстрирует этот метод. Вот читая их, хотел задать несколько вопросов. Общая структура dll-перехватчика следующая: Код (Text): ;=1===========================================================1== DllEntry proc hInstance:HINSTANCE, reason:DWORD, reserved1:DWORD ... .if reason==DLL_PROCESS_ATTACH invoke SetGlobalHook invoke SetHook .endif ... ret DllEntry endp ;=2===========================================================2== SetGlobalHook proc ... invoke CreateMutex, 0,0,0 invoke CreateThread,0,0, addr SetGlobalHookProc,... invoke CloseHandle, hMutex ... ret SetGlobalHook endp ;=3===========================================================3== SetGlobalHookProc proc invoke SetWindowsHookEx, WH_GETMESSAGE, addr MessageProc,... invoke Sleep, INFINITE ret SetGlobalHookProc endp ;=4===========================================================4== MessageProc proc nCode:DWORD,wparam:DWORD,lparam:DWORD invoke CallNextHookEx, 0, nCode, wparam, lparam xor eax, eax ret MessageProc endp ;=5===========================================================5== SetHook proc ... invoke GetModuleHandle,addr lib invoke GetProcAddress,hUser32,addr funcname ; Func invoke ReadProcessMemory,... mov Jump.PuhsOp, 0068h mov Jump.PushArg, offset newMyf mov Jump.RetOp, 00C3h invoke WriteProcessMemory, ... ret SetHook endp ;=6===========================================================6== newMyf proc s: DWORD, b:DWORD, lb:DWORD, h:DWORD ... invoke TrueFunc,a,b,c,d ret newMyf endp ;=7===========================================================7== TrueFunc proc s: DWORD, b:DWORD, lb:DWORD, h:DWORD invoke WriteProcessMemory, ... invoke Func,a,b,c,d invoke WriteProcessMemory, ... ret TrueFunc endp ;=8===========================================================8== Вопросы: 1. В блоке =2= Зачем в SetGlobalHook() вызывается CreateMutex() ? 2. В блоке =2= Почему SetGlobalHookProc() вызывается по CreateThread()? 3. В блоке =1= Функции SetGlobalHook()и SetHook() явно друг с другом не взаимосвязаны. но связь должна быть ведь. Не могу понять какая. Не подскажите? Наверное все связанно с тем что данная dll будет цепляться к каждому процессу в системе, который импортирует dll с перехватываемой функцией. Поэтому, наверное, Mutex нужен для того чтобы ограничивать запуски SetGlobalHookProc()? Я прав?
_sheva740 Что-то тут шляпа какая-то намучена. Почитай сатьи Рема на васме, там все досконально разжевано. По поводу вышеприведенного кода - мало что понял, в частности, зачем там ВиндовсХук. По поводу того, что понял, скажу, что перезапись кода при вызове тру-функции - не есть гуд. Для глобализации перехвата всегда юзался перехват CreateThread.
Aspire >перезапись кода при вызове тру-функции - не есть гуд. да вот как раз этот метод в статье "Перехват API-функций в Windows NT/2000/XP" и рассматривается. С него и начал. >Для глобализации перехвата всегда юзался перехват CreateThread. А каким методом ее (CreateThread) правильно перехватывать? Я пока только два нашел : - Перехват API непосредственной записью в код системной функции. - Перехват API через таблицу импорта. > Почитай сатьи Рема на васме Какую именно. Я смотрел и вроде как не нашел у Рема описания этого - "Перехват API непосредственной записью в код системной функции". Может пропустил нечаянно. Ткните носом Ниже найденный в сети пример "записью в код сист. функции"
Aspire Этот метод (непосредственной записью в код системной функции) иначе называется - "Сплайсинг функции"? Я правильно понял ? Спасибо.
>По поводу вышеприведенного кода - мало что понял, в частности, зачем там ВиндовсХук С помощью ВиндовсХука внедряется ДЛЛ в чужой процесс. Это один из способов внедрения. >Функции SetGlobalHook()и SetHook() явно друг с другом не взаимосвязаны. Функция SetGlobalHook() служит для внедрения твоей ДЛЛ в чужой процесс и должна вызываться не из dllentry. Функция SetHook() служит для перехвата АPI функции в чужом адресном пространстве. >Зачем в SetGlobalHook() вызывается CreateMutex() ? низачем. Если б был выложен полный исходник, то было бы понятно. > Почему SetGlobalHookProc() вызывается по CreateThread()? Так автору для чего-то было нужно. ------------------------- Ты неудачный пример взял для изучения. Изучай по ссылкам, которые тебе дали. От себя могу порекомендовать Джефри Рихтера 22 главу.
bendme Спасибо за участие. Этот исходник, который я где-то взял, очень типичен (как я понял) для этого вида внедрения. В посте номер #3 я его прикрепил. да, именно тут все есть. Спасибо.
Твой исходник похож на этот http://www.hackzona.ru/hz.php?name=News&file=article&sid=6112 Наверно из той статьи и взят.