проблемы с перехватом

Тема в разделе "WASM.BEGINNERS", создана пользователем spencer, 28 окт 2006.

  1. spencer

    spencer New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2005
    Сообщения:
    277
    здравствуйте, мой вопрос следующего содержания:
    Играюсь с перехватом winAPI. Делаю инжект в какой либо процесс, заргужаю свою длл, определяю адрес интересующей API, сохраняю там байты и ставлю джамп на свой код. Ставлю бряк на все вызовы перехватываемой функции в прилоении. Ещен раз смотрю на ей код и удостовериваюсь что в начале переход на мой код. Однако потом, когда бряк срабатывает, и я опускаюсь в нутрь функции - её код цел и невредим и никакого перехода нету.
    Следующий класический код я использую для установки своего обработчика:
    Код (Text):
    1.     lea eax, newbytes
    2.     mov [eax+1], offset newcode
    3.     push    Offset SKernel
    4.     call    GetModuleHandleA
    5.     push    offset SCrFile
    6.     push    eax
    7.     call    GetProcAddress
    8.     mov procaddr, eax
    9.     push    offset var1    
    10.     push    6               ;size
    11.     push    offset oldbs            ;to
    12.     push    eax             ;from
    13.     push    currproc
    14.     call    ReadProcessMemory
    15.     push    offset var1
    16.     push    6
    17.     push    offset newbytes
    18.     push    procaddr
    19.     push    currproc
    20.     call    WriteProcessMemory
    когда я его проверяю под отладчиком то все нормально. Но потом код перехватываемой функции становится как и был раньше. Если учесть что мой код запускается в контексте адресного пространства процесса - жертвы, то они должны б использовать одно и тоже отображение кода kernel32.dll. В чём может быть ошибка?
     
  2. Sickle

    Sickle New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2003
    Сообщения:
    181
    а бряк ты ставишь до или после того, как модифицируешь первые 5 байт на джамп?
     
  3. spencer

    spencer New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2005
    Сообщения:
    277
    после. Я смотрю что они точно модифицируются, потом ставлю брейк, спускаю прогу, и прерываюсь на том же бряке, в том же адресе, но млин байты какимто чудом восстановились уже в первоначальное состояние, будто стряхнув с себя заразу которую я пытаюсь туда навесить... Я думал что может адресные пространства разные, дак нет же. В ольке смотрю, что мой код выполняется в потоке который существует в контексте процесса - жертвы. Я в замешательстве если честно.
     
  4. spencer

    spencer New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2005
    Сообщения:
    277
    дабы не создавать новой темы, продолжу тут.
    продолжаю заниматся перехватом но богам, видимо, не угодно чтоб я закончил.
    перехватываю я CreateFileW в notepad.exe
    код моего обработчика:
    Код (Text):
    1.         int     3
    2.         pop     ebx
    3.         sub     esp, 4
    4.         invoke  WriteProcessMemory, currproc, procaddr, addr oldbs, 6, esp
    5.         add     esp, 4
    6.         call        CreateFileW
    7.         pushad
    8.         sub     esp, 4
    9.         invoke  WriteProcessMemory, currproc, procaddr, addr newbytes, 6, esp
    10.         add     esp, 4
    11.         popad
    12.         push        ebx
    13.         ret
    тут я сделал все по минимуму, вызываю старый обработчик после чего восстанавливаю переход на свой...
    он вроде бы нормально отрабатывает. Однако ошибка какаято уж больно хитрая и проявляется гдето в глубинах kernel32.dll гдето после третьего срабатывания перехватчика. Несколько дней продолбался понятия не имею даже что предпринять. Нужно чтоб кто то поопытней глянул, помогите пожалуйста!
     
  5. el-

    el- New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    89
    при записи и востановления хука, треды останавливай ... все кроме своего ...
    ибо есть вероятность, что api вызовет кто нить кроме тебя (:

    а вабще это бред ... лучше диссасмь код ( дабы диссасмов в нете хватает, если сам не понимаешь как работают ), и перекидывай его куда нить в память, а после него лепи джамп ... да и вабще чего я тебе объясняюм, aphex, holy_father и msrem все уже давно описали ... читай (:
     
  6. el-

    el- New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    89
    кстати чють не забыл, попробуй на каком нить старенькой тачке ... я например нашел 900 пень, перехватить во всех процессах CreateFile методом который ты юзаешь ... так прикольно начинает тормозить, ВСЕ (:
     
  7. spencer

    spencer New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2005
    Сообщения:
    277
    что я дизассемблировать должен если мой код и так на ассемблере????
     
  8. el-

    el- New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    89
    эээ ... блин я не так выразился ... тебе надо узнавать длины инструкций по адресу нужной тебе ( т.е. для перехвата ) апи, и копировать их куда нить в память ... скопировать ты должен ровно столько, сколько байт будешь заменять ... .т.е. если для хука юзаешь jmp, то 5 байт ... почитай ms rem'a ...
     
  9. spencer

    spencer New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2005
    Сообщения:
    277
    вах, старик, я уже и сам допёр, если б ты тогда прально выразился сэкономил бы мне ноч трудов ). Щяс иду в этом направлении, кстате есть идеи относительно того как определять длину комманд?
    на худой конец могу юзать таблицы. но у ms_rem'a видел решение поинтерестней (правда в алгоритме не разобрался пока) но интерестно все же какова идея подобных алгоритмов.

    А тачка у меня еще слабей будет даже чем то что ты сказал )
     
  10. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Зачем? Он же знает сколько байт будет писать.
     
  11. el-

    el- New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    89
    >n0name
    чесно сказать не понял, то что он будет писать это и ежу понятно ... он же блин функцию переватывает ... а если например 5 байтовый джам заменить трех байтовым прыжком ... типа

    push eax
    ret

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

    >>есть идеи относительно того как определять длину комманд?
    изучай принципы работы диссасемблера ...
     
  12. spencer

    spencer New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2005
    Сообщения:
    277
    не пришлось, я построил табличку размеров ffh bytes long и написал маленькую процедурку для определения размера по этой табличке... думаю добавить туда определение префиксов ну а более мне для перехвата и не надо...
     
  13. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Хм. Ну инжект подразумевает запись в АП целевого процесса. Как правило через WriteProcessMemory. Один из параметров как раз и есть количество записываемых байт. Если он пишет кусок кода, то обычно после этого кода вставляется метка чтобы можно было просто code_end - code_start.
     
  14. el-

    el- New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    89
    >>n0name
    >>Ну инжект подразумевает запись в АП целевого процесса

    тока проблема отнюдь не в инжекте, инжектится он отлично ... на сабж посмотри ... проблема то с перехватом api ...

    >>Если он пишет кусок кода, то обычно после этого кода вставляется метка чтобы можно
    >>было просто code_end - code_start.
    дык он не кусками кода пишет, а инструкции заменяет ...