ку 2 all... Ехешник инжектится во все процессы. далее переберает все модули процесса и правит в них таблицу импорта. т.е. заменяет адреса оригинальных функций на свои. (думаю всем известный сценарий) Проблема в слудующем. Глобальный перехват всех функций (FindNextFile,CreateProccess,...) и т.д. проходит на ура. При перехвате LoadLibraryA (и т.д.) жертва (чаще всего explorer) тут же вылетает сразу после вызова ф-ции. Отследить ошибку ни как не получается. Код обработчика: Код (Text): xLoadLibraryA proc lpLibFileName:DWORD LOCAL retval:DWORD push [lpLibFileName] dcall @LoadLibraryA ;вызов ориг.функции mov [retval],eax .if !(eax==NULL) push eax call xReplIATOneMod ; правка табл.импорта в модуле .endif return [retval] xLoadLibraryA endp Перехват в контексте одного модуля (при отлаживании) выполняется без приколов. Перерыл все доступные статьи но ответа так и не нашел. Где я мог допустить ошибку? не надеюсь что кто нибудь начнет детально изучать мою проблему, дайте хотя бы совет.
в своем модуле вызов происходит по прямым адресам в обход обработчика. а может быть что это связано с частатой вызовов ф-ции во всех модулях? ведь ЛоадЛиб вызывается во всех процессах намного чаще других перехватываемых функций.
Сплайсинг не пробовал? У него вероятность перехвата почти 100%, с таблицей импорта у меня тоже были проблемы, перешел на сплайсинг и проблемы исчезли. Правада это было давно, на новых операционках с новыми антивирями не тестил.
Делал преехват правкой таблиц импорта на делфе. Проблем не было. Эту функцию перехватывал и подправлял в подгружаемоё либе импорты.
у меня как-раз щас ступор на похожей ситуации никак не вовьзму в толк почему... я в делаю вот что: пытаюсь разместить\запустить файл в памяти как написано в недавней статье, сохраняю свой код (дисковый имэйдж файла, и функцию которая его разгребает) в надёжном месте, который гарантированно не будет конфликтовать с адресами новазагруженного файла, но суть не в этом.. Суть в том что когда дело доходит до правки таблици иморта в некоторых ситуациях (редких и непойму от чего зависящих) внутри этой функции (LoadLibraryA, точнее дело доходит аж до LdrLoadDll), происходит виолэйшн: 77F5373B F600 10 TEST BYTE PTR DS:[EAX],10 EAX: 004D0650 вот. адрес, как может показаться, как-то относится к нашему файлу, но не принадлежит ни одной из секций, да и вообще собственно, зачем этой функции смотреть какой-то там адрес ведь ей передаётся всего один параметр - имя? возможно ли что смотрит ещё что-то кроме передаваемого ей агумента? или это просто я уже вторые сутки не сплю плиз если есть хоть какие-то соображения пишите, кстати адрес самой строки с именем - 004402A4 адрес конца последней секции в фале 00473200
EvilCoder Ты подумай что делаешь? Поинтер на поинтер передаёшь? )). lpLibFileName это уже указатель. Надо без квадратных скобочек.
Вот всегда так, найдешь ответ и становится не удобно за вопрос. =) Вся проблема была в регистрах. PUSHAD/POPAD все исправили. Спасибо за внимание. Код (Text): xLoadLibraryA proc lpLibFileName:DWORD LOCAL retval:DWORD push [lpLibFileName] dcall @LoadLibraryA ;вызов ориг.функции mov [retval],eax PUSHAD .if !(eax==NULL) push eax call xReplIATOneMod ; правка табл.импорта в модуле .endif POPAD return [retval] xLoadLibraryA endp