Ручная прогрузка kernel32 и ntdll

Тема в разделе "WASM.WIN32", создана пользователем Aids, 23 окт 2011.

  1. Aids

    Aids New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2007
    Сообщения:
    275
    Точку входа вызвал и она вернула ошибку.

    Вообщем решил проблему немного подругому. Просто срелоцировал копию на оригинальную dll в которой всё уже проинициализировано. И теперь нет необходимости вызывать DllEntry, таким образом копии kernel32 и ntdll стали работать
     
  2. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    хех... оригинальное решение... молодец!
     
  3. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Не понял, а какой тогда смысл всего этого действа? В чём изначально задача была?
    Использовать "чистую" копию системной библиотеки, загруженную с диска, или что?
     
  4. Aids

    Aids New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2007
    Сообщения:
    275
    x64
    Задача снять хуки с экспортных функций (kernel32 и ntdll), и усложнить анализ файла(при такой прогрузке копии при отладке ни олли ни ida не видят имён экспортных функций).
     
  5. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    Aids
    перехват sysenter все равно перехватит Ваши вызовы.
    и почему бы просто не заюзать эти же системный вызовы?
     
  6. Aids

    Aids New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2007
    Сообщения:
    275
    K10
    ну перехватывать sysenter нужно из ядра. а если напрямую юзать то нужно помнить номера сервисов для всех windows. Хотя имея простенький дизасм, и зная адрес ntdll можно найти номера системных вызовов нужных функций
     
  7. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    Aids
    Можно из юзермода перехватить KiFastSystemCall, номера сервисов тоже определяются несложно.
     
  8. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    есть ли примеры реализации?
     
  9. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    Rel
    Может и есть, я думаю так, в ntdll.dll экспортируемые функции имеют вид стабов на KiFastSystemCall, типа:
    Код (Text):
    1. MOV EAX, ServiceNumber
    2. MOV EDX, 7FFE0300 ; SharedUserData!SystemCallStub
    3. CALL DWORD PTR DS:[EDX]
    4. RETN
    Соответсвенно в 7FFE0300 находится адрес KiFastSystemCall. По указателю на функцию можно узнать номер вызова и заменить адрес в 7FFE0300 на адрес обработчика, старый сохранить.

    А так же патчи никто не отменял.
     
  10. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    да это понятно... мне интересно посмотреть, как это делают грамотно... то есть например, чтобы потокобезопасно подставить свой адрес (установить/убрать подобный хук) надо видимо остановливать все другие потоки... как лучше писать свои обработчики и тд... эти вопросы тянут минимум на статью по тематике, ну или исходники... поэтому и спрашиваю про примеры)
     
  11. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    Rel
    Для модификации "MOV EDX, 7FFE0300 " нет смысла стопорить потоки,
     
  12. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    не, ну в принципе да, но а в случае наличия нескольких процессоров, не может возникнуть каких-либо проблем?
     
  13. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    Rel
    Вроде уже обсуждалось и пришли к выводу, что запись DWORDа атомарна даже при нескольких процессорах.
     
  14. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    вообще, надо канеш мануалы почитать. тк это сложная тема... но я чет не уверен, что запись дворда невыравненного на 4 байтовую границу пройдет атомарно... это канеш потенциально довольно редкий баг, но всякое бывает, я думаю, что лучше уж для верности остановить другие потоки процесса)))
     
  15. karabas_barabas

    karabas_barabas Member

    Публикаций:
    0
    Регистрация:
    9 авг 2009
    Сообщения:
    168
    нет лучше уж запись дворда сделать чем такой ахтунг )