"Безопасная" DLL инъекция
Не очень хороший вопрос, извините.
У меня есть программа, которая должна быть предупреждена, когда файл открывается из проводника (т.е. вызывается ShellExecute(A/W)).
К сожалению, Microsoft удалила интерфейс COM (IShellExecuteHook), который позволяет вам перехватывать эти события в Vista и выше, предположительно, потому что старый код может вызвать сбой из-за изменений. Был способ обойти эту функцию, но она больше не работает.
Я провел некоторое исследование, и похоже, что единственный способ перехватить вызовы в ShellExecute - это перенаправить вызов в shell32.dll. В данный момент я смотрю на внедрение своей собственной DLL в процесс проводника, затем копирую запись IAT для ShellExecute для некоторого распределения адресов в моей DLL и, наконец, изменяю запись IAT для ShellExecute, чтобы она указала на мою функцию, которая уведомит об этом Программа, в которой был открыт файл, и переход к исходной функции ShellExecute, адрес которой мы сохранили ранее.
Моя самая большая проблема здесь - антивирусы. Они будут заботиться о том, что я делаю это в проводнике? Будут ли они заботиться о том, чтобы я модифицировал IAT?
Другая проблема заключается в том, безопасно ли это; Возможно ли (или, скорее всего, возможно), что привилегии безопасности исследователя не разрешают инъекцию через CreateRemoteThread? Если так, есть ли лучший способ сделать эту инъекцию?
Есть ли лучший способ сделать это в целом?
РЕДАКТИРОВАТЬ: Для тех, кто сталкивается с этим в будущем, explorer.exe не имеет IAT для shell32.dll; у него есть заголовок, но в блоке полно ненужных значений, поэтому нет способа (насколько я могу судить) получить запись для любых импортированных функций.
Похоже, туннелирование кода - единственный способ перехватить это.
4 ответа
Большинство хороших эвристических антивирусных программ следует использовать для исправления таблицы импорта как красный флаг для трояна.
Онлайновая документация для madcodehook содержит несколько расширенных статей о различных методах внедрения кода, их преимуществах и недостатках, а API предоставляет некоторые опции для определения "безопасного" перехвата: http://www.madshi.net/madCodeHookDescription.htm
Еще несколько ресурсов по перехвату API:
Легкий зацеп: http://www.codeplex.com/easyhook
Deviare: http://www.nektra.com/products/deviare-api-hook-windows/
Интересный пост: http://www.codeproject.com/KB/system/hooksys.aspx
При выполнении перехвата API очень важно оценить, в каких средах вам нужно работать. Например, не все библиотеки поддерживают x86/x64.
Detours поддерживает только x64 в лицензионной (платной) версии. Easy hook поддерживает x86 и x64.
Библиотека Detours:
http://research.microsoft.com/en-us/projects/detours/
Из Microsoft Research можно произвольно перехватывать функции. Вы могли бы дать этому шанс.
Проводник Windows в Windows Vista и Windows 7 даже не вызывает ShellExecuteA или ShellExecuteW.
Нет смысла беспокоиться. Лол:-)
И, если я могу добавить, я проверил, перехватив обе функции с 32-битными и 64-битными встроенными хуками.
Сожалею. Лол:-)