Перехват LoadLibrary. Непонятное поведение

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

  1. EvilCoder

    EvilCoder New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2006
    Сообщения:
    30
    ку 2 all...
    Ехешник инжектится во все процессы. далее переберает все модули процесса и правит в них таблицу импорта. т.е. заменяет адреса оригинальных функций на свои. (думаю всем известный сценарий)

    Проблема в слудующем. Глобальный перехват всех функций (FindNextFile,CreateProccess,...) и т.д. проходит на ура. При перехвате LoadLibraryA (и т.д.) жертва (чаще всего explorer) тут же вылетает сразу после вызова ф-ции. Отследить ошибку ни как не получается.
    Код обработчика:
    Код (Text):
    1. xLoadLibraryA   proc lpLibFileName:DWORD
    2.     LOCAL retval:DWORD
    3.     push [lpLibFileName]
    4.     dcall @LoadLibraryA              ;вызов ориг.функции
    5.     mov [retval],eax
    6.     .if !(eax==NULL)
    7.         push eax
    8.         call xReplIATOneMod  ; правка табл.импорта в модуле  
    9.     .endif
    10.     return [retval]    
    11. xLoadLibraryA endp
    Перехват в контексте одного модуля (при отлаживании) выполняется без приколов.
    Перерыл все доступные статьи но ответа так и не нашел. Где я мог допустить ошибку?
    не надеюсь что кто нибудь начнет детально изучать мою проблему, дайте хотя бы совет.
     
  2. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    Поставь везде где только можно вывод отладочной инфы. Может увидишь чего.
     
  3. wertyman

    wertyman Member

    Публикаций:
    0
    Регистрация:
    13 дек 2006
    Сообщения:
    74
    А ты случайно у себя в модуле не перехватываешь функции ?
     
  4. EvilCoder

    EvilCoder New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2006
    Сообщения:
    30
    в своем модуле вызов происходит по прямым адресам в обход обработчика.
    а может быть что это связано с частатой вызовов ф-ции во всех модулях? ведь ЛоадЛиб вызывается во всех процессах намного чаще других перехватываемых функций.
     
  5. Guest

    Guest Guest

    Публикаций:
    0
    Сплайсинг не пробовал? У него вероятность перехвата почти 100%, с таблицей импорта у меня тоже были проблемы, перешел на сплайсинг и проблемы исчезли. Правада это было давно, на новых операционках с новыми антивирями не тестил.
     
  6. zxm

    zxm New Member

    Публикаций:
    0
    Регистрация:
    20 июл 2006
    Сообщения:
    71
    Делал преехват правкой таблиц импорта на делфе. Проблем не было. Эту функцию перехватывал и подправлял в подгружаемоё либе импорты.
     
  7. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    у меня как-раз щас ступор на похожей ситуации никак не вовьзму в толк почему...
    я в делаю вот что: пытаюсь разместить\запустить файл в памяти как написано в недавней статье, сохраняю свой код (дисковый имэйдж файла, и функцию которая его разгребает) в надёжном месте, который гарантированно не будет конфликтовать с адресами новазагруженного файла, но суть не в этом..
    Суть в том что когда дело доходит до правки таблици иморта в некоторых ситуациях (редких и непойму от чего зависящих) внутри этой функции (LoadLibraryA, точнее дело доходит аж до LdrLoadDll), происходит виолэйшн:

    77F5373B F600 10 TEST BYTE PTR DS:[EAX],10
    EAX: 004D0650

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

    плиз если есть хоть какие-то соображения пишите, кстати адрес самой строки с именем - 004402A4
    адрес конца последней секции в фале 00473200
     
  8. zxm

    zxm New Member

    Публикаций:
    0
    Регистрация:
    20 июл 2006
    Сообщения:
    71
    EvilCoder

    Ты подумай что делаешь? Поинтер на поинтер передаёшь? )). lpLibFileName это уже указатель. Надо без квадратных скобочек.
     
  9. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    в фасме надо с квадратными скобочками.
     
  10. zxm

    zxm New Member

    Публикаций:
    0
    Регистрация:
    20 июл 2006
    Сообщения:
    71
    А....ну тогда извеняюсь. В любом случае странно - у меня проблем не возникало.
     
  11. EvilCoder

    EvilCoder New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2006
    Сообщения:
    30
    Вот всегда так, найдешь ответ и становится не удобно за вопрос. =)
    Вся проблема была в регистрах. PUSHAD/POPAD все исправили.
    Спасибо за внимание.

    Код (Text):
    1. xLoadLibraryA    proc lpLibFileName:DWORD
    2.     LOCAL retval:DWORD
    3.     push [lpLibFileName]
    4.     dcall @LoadLibraryA              ;вызов ориг.функции
    5.     mov [retval],eax
    6. PUSHAD
    7.     .if !(eax==NULL)
    8.         push eax
    9.         call xReplIATOneMod  ; правка табл.импорта в модуле  
    10.     .endif
    11. POPAD
    12.     return [retval]        
    13. xLoadLibraryA endp