Вопрос по перехвату API записью в код системной функции.

Тема в разделе "WASM.BEGINNERS", создана пользователем _sheva740, 10 мар 2009.

  1. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Разбираю тему - "Перехват API непосредственной записью в код системной функции".
    Масса исходников в сети иллюстрирует этот метод.
    Вот читая их, хотел задать несколько вопросов.

    Общая структура dll-перехватчика следующая:

    Код (Text):
    1. ;=1===========================================================1==
    2. DllEntry proc hInstance:HINSTANCE, reason:DWORD, reserved1:DWORD
    3. ...
    4.     .if reason==DLL_PROCESS_ATTACH
    5.         invoke  SetGlobalHook
    6.         invoke  SetHook
    7.     .endif
    8. ...
    9.     ret
    10. DllEntry endp
    11.  
    12. ;=2===========================================================2==
    13. SetGlobalHook proc
    14. ...
    15.     invoke  CreateMutex, 0,0,0
    16.     invoke  CreateThread,0,0, addr SetGlobalHookProc,...
    17.     invoke  CloseHandle, hMutex
    18. ...
    19.     ret
    20. SetGlobalHook endp
    21.  
    22.  
    23. ;=3===========================================================3==
    24. SetGlobalHookProc proc
    25.     invoke  SetWindowsHookEx, WH_GETMESSAGE, addr MessageProc,...
    26.     invoke  Sleep, INFINITE
    27.     ret
    28. SetGlobalHookProc endp
    29.  
    30.  
    31. ;=4===========================================================4==
    32. MessageProc proc nCode:DWORD,wparam:DWORD,lparam:DWORD
    33.     invoke  CallNextHookEx, 0, nCode, wparam, lparam
    34.     xor eax, eax
    35.     ret
    36. MessageProc endp
    37.  
    38.  
    39. ;=5===========================================================5==
    40. SetHook proc
    41. ...
    42.     invoke  GetModuleHandle,addr lib
    43.     invoke  GetProcAddress,hUser32,addr funcname ; Func
    44.     invoke  ReadProcessMemory,...
    45.     mov Jump.PuhsOp,    0068h
    46.     mov Jump.PushArg,   offset newMyf
    47.     mov Jump.RetOp, 00C3h
    48.     invoke  WriteProcessMemory, ...
    49.     ret
    50. SetHook endp
    51.  
    52.  
    53. ;=6===========================================================6==
    54. newMyf proc s: DWORD, b:DWORD, lb:DWORD, h:DWORD
    55. ...
    56.     invoke  TrueFunc,a,b,c,d
    57.     ret
    58. newMyf endp
    59.  
    60. ;=7===========================================================7==
    61. TrueFunc proc s: DWORD, b:DWORD, lb:DWORD, h:DWORD
    62.     invoke  WriteProcessMemory, ...
    63.     invoke  Func,a,b,c,d
    64.     invoke  WriteProcessMemory, ...
    65.     ret
    66. TrueFunc endp
    67. ;=8===========================================================8==
    Вопросы:
    1. В блоке =2= Зачем в SetGlobalHook() вызывается CreateMutex() ?
    2. В блоке =2= Почему SetGlobalHookProc() вызывается по CreateThread()?
    3. В блоке =1= Функции SetGlobalHook()и SetHook() явно друг с другом не взаимосвязаны.
    но связь должна быть ведь. Не могу понять какая. Не подскажите?

    Наверное все связанно с тем что данная dll будет цепляться к каждому процессу в системе, который импортирует dll с перехватываемой функцией. Поэтому, наверное, Mutex нужен для того чтобы ограничивать запуски SetGlobalHookProc()? Я прав?
     
  2. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    _sheva740
    Что-то тут шляпа какая-то намучена. Почитай сатьи Рема на васме, там все досконально разжевано.
    По поводу вышеприведенного кода - мало что понял, в частности, зачем там ВиндовсХук.
    По поводу того, что понял, скажу, что перезапись кода при вызове тру-функции - не есть гуд.
    Для глобализации перехвата всегда юзался перехват CreateThread.
     
  3. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Aspire
    >перезапись кода при вызове тру-функции - не есть гуд.
    да вот как раз этот метод в статье "Перехват API-функций в Windows NT/2000/XP" и рассматривается. С него и начал.

    >Для глобализации перехвата всегда юзался перехват CreateThread.
    А каким методом ее (CreateThread) правильно перехватывать?
    Я пока только два нашел :
    - Перехват API непосредственной записью в код системной функции.
    - Перехват API через таблицу импорта.

    > Почитай сатьи Рема на васме
    Какую именно. Я смотрел и вроде как не нашел у Рема описания этого - "Перехват API непосредственной записью в код системной функции". Может пропустил нечаянно. Ткните носом :)


    Ниже найденный в сети пример "записью в код сист. функции"
     
  4. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    _sheva740
    http://www.wasm.ru/article.php?article=apihook_1 и далее 2,3.
     
  5. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Aspire
    Этот метод (непосредственной записью в код системной функции) иначе называется - "Сплайсинг функции"?
    Я правильно понял ? Спасибо.
     
  6. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    И типа того..
     
  7. bendme

    bendme New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2009
    Сообщения:
    179
    >По поводу вышеприведенного кода - мало что понял, в частности, зачем там ВиндовсХук
    С помощью ВиндовсХука внедряется ДЛЛ в чужой процесс. Это один из способов внедрения.

    >Функции SetGlobalHook()и SetHook() явно друг с другом не взаимосвязаны.
    Функция SetGlobalHook() служит для внедрения твоей ДЛЛ в чужой процесс и должна вызываться не из dllentry.
    Функция SetHook() служит для перехвата АPI функции в чужом адресном пространстве.

    >Зачем в SetGlobalHook() вызывается CreateMutex() ?
    низачем. Если б был выложен полный исходник, то было бы понятно.

    > Почему SetGlobalHookProc() вызывается по CreateThread()?
    Так автору для чего-то было нужно.

    -------------------------
    Ты неудачный пример взял для изучения. Изучай по ссылкам, которые тебе дали. От себя могу порекомендовать Джефри Рихтера 22 главу.
     
  8. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    bendme
    Спасибо за участие.

    Этот исходник, который я где-то взял, очень типичен (как я понял) для этого вида внедрения.
    В посте номер #3 я его прикрепил.

    да, именно тут все есть. Спасибо.
     
  9. integer

    integer New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2007
    Сообщения:
    62
    Твой исходник похож на этот http://www.hackzona.ru/hz.php?name=News&file=article&sid=6112
    Наверно из той статьи и взят.
     
  10. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    integer
    да именно этот