Вопрос по перехвату апи

Тема в разделе "WASM.WIN32", создана пользователем Android, 8 мар 2006.

  1. Android

    Android New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2003
    Сообщения:
    183
    Адрес:
    Ukraine
    В статьях Ms Rem по перехвату апи говорится, что надо остановить все потоки перед установкой перехвата, нельзя ли создать критическую секцию и вней установить перехват?
     
  2. Android

    Android New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2003
    Сообщения:
    183
    Адрес:
    Ukraine
    Хочу уточнить, т.к. я не найду причин останавливать все потоки, кроме как если следить что бы eip потока не стал на первых 5-6 байтах процедуры. Если не делать эту проверку, то можно ведь реализовать через критическую секцию, быстрее будет работать и проще алгоритм?
     
  3. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"


    Чето я нифига не понял суть этой идеи. Как можно синхронизироваться с помощью критической секции с чужим потоком, который про нее знать не знает, и тем более не думает ее захватывать.



    А при практическом применении перехвата апи лучше либо делать это еще до запуска процесса, что снимает необходимость в таких предосторожностях, либо вобще не делать никаких перехватов в зермоде (имхо лучший вариант).
     
  4. Android

    Android New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2003
    Сообщения:
    183
    Адрес:
    Ukraine
    Я имел в виду процедуру StopThreads, она останавливает все потоки в текущем процессе. Что если сделать так EnterCriticalSection->Установка перехвата ->LeaveCriticalSection.



    И еще один вопрос: как отловить момент, когда в адресном пространстве процесса загружена только ntdll.dll, что бы изменить у нее таблицу экспорта, таким образом установить перехват?

    Сейчас изучаю создание процесса

    ZwCreateProcess

    ZwCreateThread

    CsrClientCallServer

    в этот момент загружена ntdll.dll?

    ZwResumeThread
     
  5. Android

    Android New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2003
    Сообщения:
    183
    Адрес:
    Ukraine
    По поводу критической секции я прогнал немного:)) вопрос снимается, а второй еще остается в силе
     
  6. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"


    Да, но я пользовался немного другим методом. Хукаю ZwCreateThread, при ее вызове записываю код в новый процесс и меняю стартовый адрес первого потока на свой код. Потом в этом коде делаю спайсинг всего что мне нужно и вызываю оригинальную точку входа потока.
     
  7. Android

    Android New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2003
    Сообщения:
    183
    Адрес:
    Ukraine
    ZwCreateProcess

    ZwCreateThread

    CsrClientCallServer

    пусто в этот момент в процессе

    ZwResumeThread
     
  8. Android

    Android New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2003
    Сообщения:
    183
    Адрес:
    Ukraine
    Ms Rem

    Ставлю MessageBox перед ZwResumeThread и смотрю через ProcessExplorer, показывает что в этот момент нет длл в целевом процессе. Так же пробовал сам перебирать все модули
    Код (Text):
    1.  
    2. EnumModule proc uses ebx edi esi dwProcId:dword
    3. LOCAL   me32:MODULEENTRY32
    4.     invoke  CreateToolhelp32Snapshot,TH32CS_SNAPMODULE,dwProcId
    5.     .if eax
    6.         mov ebx,eax
    7.         int 3
    8.         invoke  Module32First,ebx,addr me32
    9.         .while  eax
    10.             mov eax,dwProcId
    11.             .if eax==me32.th32ProcessID
    12.                 sstr_   me32.szModule
    13.             .endif
    14.             invoke  Module32Next,ebx,addr me32
    15.         .endw
    16.         invoke  CloseHandle,ebx
    17.     .endif
    18.    
    19.     ret
    20. EnumModule endp
    21.  


    результат тот же.



    „в этот момент загружена ntdll.dll?“

    Да, но я пользовался немного другим методом



    Поясни, плз, загружена ли в этот момент ntdll.dll
     
  9. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"




    А ты попробуй не перебирать модули, а прочитать то место где должна быть ntdll. И там она есть.
     
  10. Android

    Android New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2003
    Сообщения:
    183
    Адрес:
    Ukraine
    Я со сплайсингом разобрался по твоим статьям, спасибо. Хочу уточнить, что если кто-то еще установит перехват при помощи сплайсинга, только я пропишу jmp XXXX, а второй перехват push XXXX ret - ведь возникнет ошибка, не известно может после Jmp следует обрывок опкода, а второй перехватчик воспримит его как команду...
     
  11. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    Хм, чето я тебя опять не понял.

    Какой обрывок опкода? То что следует после jmp это безразлично, так как все опкоды которые jmp перекрывает копируются и исполняются в отдельном буфере. Если перехватчики сделаны корректно (сделан пересчет смещений в командах содержащих rel32), то их можно друг на друга ставить любое число.
     
  12. Android

    Android New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2003
    Сообщения:
    183
    Адрес:
    Ukraine
    Если второй перехватчик пишет push XXXX ret и просто дизасемблирует длины команд, не анализируя содержимого, т.е. сохраняет первые 6 байт

    Jmp XXXX - 5байт

    db 123 ;например

    он воспримит db 123 как какую-то команду, и при вызове целевой апи - выполнит ее, что приведет к завершению процесса

    Я имею в виду если второй перехватчик использует другой алгоритм перехвата, то возможны ошибки.



    Еще идея у меня, что если перехватывать ZwWriteVirtualMemory ZwProtectVirtualMemory и блокировать доступ к перехваченным тобой апи.
     
  13. Android

    Android New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2003
    Сообщения:
    183
    Адрес:
    Ukraine
    Еще один вопрос на который не могу ответить

    Создаю процесс средствами ntdll.dll в XP (пример из Неббета) и CsrClientCallServer возвращает invalid_handle. Скажи в чем может быть дело? Может в 2k и в XP разные константы передаются в эту процедуру, т.к. я в kernel32.dll смотрел, там совсем другие числа. И не совпадает определение структуры(csr, первый параметр в CsrClientCallServer) в неббете и в kernel32(может опечатка в книге?) разница в 4 байта. Можешь глянуть
     
  14. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"


    Ошибки от кривых рук всегда возможны.





    Ты там создаешь поток а не процесс, а csrss при этом информируется по разному. По части информирования о создании процесса, константы и структуры одинаковы по крайней мере в 2000 и XP, а вот с потоками они различаются. Все зависит от того, для чего тебе нужен поток. Если просто исполнять код, то csrss информировать не нужно, а если нужен полноценный win32 поток, то лучше пользуйся функциями kernel32 а не занимайся ерундой. Если нужно запустить юзермодный код из ядра, то используй APC.
     
  15. Android

    Android New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2003
    Сообщения:
    183
    Адрес:
    Ukraine
    "Ты там создаешь поток а не процесс"

    да, просто ошибки именно в создании потока.

    Спасибо за консультацию

    Заказал книгу Соломон, Русинович "Внутреннее устройство 2003 XP 2k" там все это почитаю
     
  16. ruslan540

    ruslan540 New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2006
    Сообщения:
    1
    Адрес:
    Azerbaijan
  17. Android

    Android New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2003
    Сообщения:
    183
    Адрес:
    Ukraine
    ruslan540

    "bp"

    поясни, не понял
     
  18. Guest

    Guest Guest

    Публикаций:
    0


    Мда... Краткость сетра таланта =) Может он имел ввиду Borland Paskal ? =)
     
  19. Android

    Android New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2003
    Сообщения:
    183
    Адрес:
    Ukraine
    Ms Rem

    "...сделан пересчет смещений в командах содержащих rel32..."

    Я с твоего сайта качал калькулятор длин команд, там видел флаг OP_REL32, кажется это то что мне надо, как его использовать?
     
  20. doctor_Ice

    doctor_Ice New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2005
    Сообщения:
    845
    Адрес:
    Russia
    bp = break point... или я неправ?