здравствуйте, мой вопрос следующего содержания: Играюсь с перехватом winAPI. Делаю инжект в какой либо процесс, заргужаю свою длл, определяю адрес интересующей API, сохраняю там байты и ставлю джамп на свой код. Ставлю бряк на все вызовы перехватываемой функции в прилоении. Ещен раз смотрю на ей код и удостовериваюсь что в начале переход на мой код. Однако потом, когда бряк срабатывает, и я опускаюсь в нутрь функции - её код цел и невредим и никакого перехода нету. Следующий класический код я использую для установки своего обработчика: Код (Text): lea eax, newbytes mov [eax+1], offset newcode push Offset SKernel call GetModuleHandleA push offset SCrFile push eax call GetProcAddress mov procaddr, eax push offset var1 push 6 ;size push offset oldbs ;to push eax ;from push currproc call ReadProcessMemory push offset var1 push 6 push offset newbytes push procaddr push currproc call WriteProcessMemory когда я его проверяю под отладчиком то все нормально. Но потом код перехватываемой функции становится как и был раньше. Если учесть что мой код запускается в контексте адресного пространства процесса - жертвы, то они должны б использовать одно и тоже отображение кода kernel32.dll. В чём может быть ошибка?
после. Я смотрю что они точно модифицируются, потом ставлю брейк, спускаю прогу, и прерываюсь на том же бряке, в том же адресе, но млин байты какимто чудом восстановились уже в первоначальное состояние, будто стряхнув с себя заразу которую я пытаюсь туда навесить... Я думал что может адресные пространства разные, дак нет же. В ольке смотрю, что мой код выполняется в потоке который существует в контексте процесса - жертвы. Я в замешательстве если честно.
дабы не создавать новой темы, продолжу тут. продолжаю заниматся перехватом но богам, видимо, не угодно чтоб я закончил. перехватываю я CreateFileW в notepad.exe код моего обработчика: Код (Text): int 3 pop ebx sub esp, 4 invoke WriteProcessMemory, currproc, procaddr, addr oldbs, 6, esp add esp, 4 call CreateFileW pushad sub esp, 4 invoke WriteProcessMemory, currproc, procaddr, addr newbytes, 6, esp add esp, 4 popad push ebx ret тут я сделал все по минимуму, вызываю старый обработчик после чего восстанавливаю переход на свой... он вроде бы нормально отрабатывает. Однако ошибка какаято уж больно хитрая и проявляется гдето в глубинах kernel32.dll гдето после третьего срабатывания перехватчика. Несколько дней продолбался понятия не имею даже что предпринять. Нужно чтоб кто то поопытней глянул, помогите пожалуйста!
при записи и востановления хука, треды останавливай ... все кроме своего ... ибо есть вероятность, что api вызовет кто нить кроме тебя (: а вабще это бред ... лучше диссасмь код ( дабы диссасмов в нете хватает, если сам не понимаешь как работают ), и перекидывай его куда нить в память, а после него лепи джамп ... да и вабще чего я тебе объясняюм, aphex, holy_father и msrem все уже давно описали ... читай (:
кстати чють не забыл, попробуй на каком нить старенькой тачке ... я например нашел 900 пень, перехватить во всех процессах CreateFile методом который ты юзаешь ... так прикольно начинает тормозить, ВСЕ (:
эээ ... блин я не так выразился ... тебе надо узнавать длины инструкций по адресу нужной тебе ( т.е. для перехвата ) апи, и копировать их куда нить в память ... скопировать ты должен ровно столько, сколько байт будешь заменять ... .т.е. если для хука юзаешь jmp, то 5 байт ... почитай ms rem'a ...
вах, старик, я уже и сам допёр, если б ты тогда прально выразился сэкономил бы мне ноч трудов ). Щяс иду в этом направлении, кстате есть идеи относительно того как определять длину комманд? на худой конец могу юзать таблицы. но у ms_rem'a видел решение поинтерестней (правда в алгоритме не разобрался пока) но интерестно все же какова идея подобных алгоритмов. А тачка у меня еще слабей будет даже чем то что ты сказал )
>n0name чесно сказать не понял, то что он будет писать это и ежу понятно ... он же блин функцию переватывает ... а если например 5 байтовый джам заменить трех байтовым прыжком ... типа push eax ret то не понятно, как это будет расцениватся ведь два байта от старой команды остается ... а то узнал длинну, скопировал пару полных команд, поставил после них джамп, ивперед юзать мост ... >>есть идеи относительно того как определять длину комманд? изучай принципы работы диссасемблера ...
не пришлось, я построил табличку размеров ffh bytes long и написал маленькую процедурку для определения размера по этой табличке... думаю добавить туда определение префиксов ну а более мне для перехвата и не надо...
Хм. Ну инжект подразумевает запись в АП целевого процесса. Как правило через WriteProcessMemory. Один из параметров как раз и есть количество записываемых байт. Если он пишет кусок кода, то обычно после этого кода вставляется метка чтобы можно было просто code_end - code_start.
>>n0name >>Ну инжект подразумевает запись в АП целевого процесса тока проблема отнюдь не в инжекте, инжектится он отлично ... на сабж посмотри ... проблема то с перехватом api ... >>Если он пишет кусок кода, то обычно после этого кода вставляется метка чтобы можно >>было просто code_end - code_start. дык он не кусками кода пишет, а инструкции заменяет ...