Перехват Native API через таблицу импорта

Тема в разделе "WASM.RESEARCH", создана пользователем Pinkbyte, 3 сен 2006.

  1. Pinkbyte

    Pinkbyte Member

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    106
    Вот почитал статьи на сайте... Честно говоря в дельфи я не шарю(а самая полная статья на эту тему была с вставками на дельфи), но кое что я понял. Винда у меня XP, так что, если я не ошибаюсь сплайсинг пролетает как фанера над Парижем(если я конечно не в Ring-0). Пробовал через таблицу импорта - но вот беда: ntdll.dll то напрямую не импортируется(в MASM 6.0, в котором я кодю даже нельзя подключить эту библиотеку, что затрудняет исследование ее ф-ций напрямую!), как быть? Пробовал используя VirtualProtect менять адреса ф-ций в таблице импорта библиотеки kernel32.dll. Ф-ция вроде возвращает 1(значит успешно), но при попытке записи я получаю GPF. Подскажите как быть?(если можно приведите пожалуйста пример кода)
     
  2. Stub

    Stub New Member

    Публикаций:
    0
    Регистрация:
    11 май 2004
    Сообщения:
    311
    Адрес:
    Siberia
    Видимо ты плохо читал данные статьи, да и вообще статьи по данной тематике.
    В статьях Ms-Rem'а (на сколько я могу догадаться) все примеры с использованием WinAPI, так что проблем с переводом на другой "более понятный" язык возникнуть не должно.
    Для того, чтобы использовать ntdll.dll в MASM'е, достаточно, например, скачать KMDKit с данного сайта.
     
  3. Pinkbyte

    Pinkbyte Member

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    106
    Перечитываю... Все равно нифига... Даже тупое копирование кода в Delphi все равно рушит программу с GPF!
     
  4. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Для начала нужно почитать Рихтера
    Потом что-нибудь попробовать написать, привести написанный код,
    после этого вам укажут на ошибки

    ошибаетесь
     
  5. Pinkbyte

    Pinkbyte Member

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    106
    В электронном виде Рихтер где нить лежит? А то на Динамо я попаду аж через неделю, а ждать чо-то ломает. В Инете искал материал - голой теории завались, а вот с практикой напряги.

    P. S. Я понял, что сплайсинг - это правка кода ф-ции библиотеки в памяти. Но в XP то библиотека защищена(virtualprotect не помогает, как в случаях с таблицей импорта), вот поэтому я и думал что под Ring-3 нифига нельзя сделать
     
  6. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    Почему не помогает. Нормально VirtualProtect работает.
    Код (Text):
    1. .data
    2. asdf    dd  0
    3. LibName db  'kernel32.dll',0
    4. FuncName    db  'CreateProcessA',0
    5. .code
    6. start:
    7.     invoke GetModuleHandle,addr LibName
    8.     invoke GetProcAddress,eax,addr FuncName
    9.     push eax
    10.     invoke VirtualProtect,eax,10,PAGE_EXECUTE_READWRITE,addr asdf
    11.     pop edi
    12.     push offset exit
    13.  
    14.     push edi
    15.     mov al,0c3h
    16.     stosb
    17.     ret
    18. exit:
    19.     invoke MessageBox,0,0,0,0
    20.     invoke ExitProcess,0
    21. end start
     
  7. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    asd

    а коррекция стека?
    а вернуть родные атрибуты памяти?
     
  8. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    Так всё же нормально
    push offset exit;куда вернёмся из СreateProcessA

    push edi;начало СreateProcessA
    mov al,0c3h;пишем рет в СreateProcessA
    stosb
    ret;прыгаем в СreateProcessA
    ->сюда вернёмся из СreateProcessA

    Да ну их :)
     
  9. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    сколько параметров принимает на вход CreateProcess ?

    а ты ставишь простой ret в начало
     
  10. Pinkbyte

    Pinkbyte Member

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    106
    короче у меня на XP VirtualProtect возвращает 1(не ноль, то есть все ок). Однако попытка записи в указанное место ведет к GPF, причем я проверял отладчиком ТУДА ли я пишу и ВСЕ оказалось правильно. Но это не самое главное. Я надыбал книгу Рихтера и прочитал все, связанное с API Hooking, так вот... ТАМ НЕТ АБСОЛЮТНО НИЧЕГО про перехват Native API. А т.к и при сплайсинге и при смене таблицы импорта kernel32.dll я получаю GPF, то рискну предположить, что я не знаю как это делать. Подмена dll - не слишком хороший вариант, но других я что-то не вижу... Если у кого есть мысли - прошу поделится

    P. S. Насчет ret это действительно косяк. У CreateProcess просто ДО ЖОПЫ параметров... да и писать лучше не в опкодах, а через процедуру на которую указать ссылку(так удобнее!) а потом mov ecx,proc_size | rep stosb и вперед...
     
  11. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    пиши пример, будем смотреть и выпрямлять .. =)
     
  12. Cigan

    Cigan New Member

    Публикаций:
    0
    Регистрация:
    13 окт 2003
    Сообщения:
    54
    Адрес:
    Моск.обл
    invoke VirtualProtect,eax,10,PAGE_EXECUTE_READWRITE,addr asdf<-- в место этого
    invoke VirtualProtect,-1,10,PAGE_EXECUTE_READWRITE,addr asdf--> вот это
     
  13. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    Это не у меня проблемы с записью. Мой пример рабочий, хоть и со стеком действительно косяк.
    А ты, наверное, хотел написать
    invoke VirtualProtectEx,-1,eax,10,PAGE_EXECUTE_READWRITE,addr asdf
     
  14. Pinkbyte

    Pinkbyte Member

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    106
    Так, все понятно... Это уже мои кривые руки... Там я запутался с адресами(делал jump по адресу адреса :)). Так что все там сплайсингом перехватывается... и нииппет :). Другое дело, что сплайсинг - походу единственное решение для Native API, но с другой стороны и самое надежное, ибо в каждом процессе - своя ntdll.dll, а значит грохнуть всю систему слава богу мне пока не грозит. Щаз пишу глобализатор, если кто увидит другие способы перехват API из ntdll.dll - милости прошу.

    P.S. Перечитал Рихтера ещо раз. Ни слова про перехват ИМЕННО Native API, так что можете и не отсылать...
     
  15. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Pinkbyte
    А ты любишь готовое? У рихтера описан перехват в общем, какая разница, native или нет? Или ты легко перехватываешь user32, а kernel32 не в силах?
     
  16. Pinkbyte

    Pinkbyte Member

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    106
    Я не жду готового. Но можно было бы и написать что пытацца перехватить Native API через таблицу импорта кернеля - дело гиблое, даже пытацца не стоит. Одна строчка и весь мой геморр бы убрался. Вдобавок Native API - история отдельная, из-за сплайсинга приходится смотреть в дебаггере каждую конкретную ф-цию и сохранять стока байт, скока занимает целое кол-во команд, но при этом больше или равное шести, а это меня немного геморрит :dntknw:. Но стерпеть можно...
     
  17. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    прикрути дизасм длин и будет тебе счастье.
     
  18. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    :)
     
  19. Pinkbyte

    Pinkbyte Member

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    106
    Писать дизасм специально для сплайсинга изврат. Хотя теперь я уже вижу такие приколы с внедрением сплайсинга в другие процессы. Надо учитывать дельта-смещение, причом я не хочу сильно пинать регистры(поэтому пришлось юзать опкоды). К тому же сплайсинг допустим MessageBoxA - это головная боль(ибо user32.dll может быть не загружена или загружена по другому адресу). Кароче лично для меня имеет смысл юзать сплайсинг для того, о чем эта тема - для Native API. Хотя в принципе он сгодится и для кернеля... И вот еще: так как у меня нет msdn, а хелп по API из С++ даалеко не полный такой вот квесчен - я имею ID(или хэндл, или и то и другое, как получится) процесса, как узнать хэндлы ВСЕХ его тредов? И последнее - где можно надыбать какой-нить хелп по тому, какие параметры нужно передавать Native API, хотя я и знаю что полноценной доки к ним нет, но хоть параметры то должны быть???
     
  20. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    ну можно перехватывать вызов Native API при вызове их из kernel32.dll
    через таблицу импорта, иногда это тоже бывает нужно, а Рихтер описывает
    методику, решать тебе где и что применить или может придумать нечто свое

    http://www.google.com/search?client=opera&rls=en&q=Native+API&sourceid=opera&ie=utf-8&oe=utf-8