Сейчас на форуме: jinoweb, bartolomeo (+5 невидимых) |
eXeL@B —› Программирование —› Инжект длл в удаленный процесс фейлится |
Посл.ответ | Сообщение |
|
Создано: 08 ноября 2016 00:18 · Личное сообщение · #1 Изучаю инжект DLL общим способом. По книге Рихтера и паре статей сделал такой код: dll.h: Code:
dll.cpp Code:
ui.h Code:
main.cpp Code:
В main плохая декомпозиция (завтра выделю две отдельных функции для читаемости), но разобраться можно. Инжект не получается. Пробовал сделать инжект в сам инжектор и в эксплорер, но ничего не происходит. Когда под отладчиком делаю инжект в себя, то вижу, что успешно создается и завершается удаленный потом, но DLL-ка не подгружается. Что здесь может быть не так? Пусть к DLL прописывал и как InjDLL.dll, и как C:\InjDLL.dll, и как "C:\InjDLL.dll". Не помогло. Думал, что не хватает терминирующего нуля в конце пути к длл, поэтому добавил дополнительные байты в массиве, но это тоже не помогло. |
|
Создано: 08 ноября 2016 00:33 · Личное сообщение · #2 |
|
Создано: 08 ноября 2016 19:06 · Личное сообщение · #3 |
|
Создано: 08 ноября 2016 23:27 · Личное сообщение · #4 |
|
Создано: 08 ноября 2016 23:32 · Личное сообщение · #5 |
|
Создано: 08 ноября 2016 23:33 · Личное сообщение · #6 https://msdn.microsoft.com/en-us/library/windows/desktop/dn633971(v=vs.85).aspx#general_best_practices Что-то из перечисленного в You should never perform the following tasks from within DllMain:, делать можно, но очень сторожно, конкретное поведение зависит от версии винды и лучше обходиться без этого. ----- IZ.RU |
|
Создано: 09 ноября 2016 01:07 · Поправил: difexacaw · Личное сообщение · #7 DenCoder Захватывается загрузочная блокировка, а вызов гуя это обычно масштабная операция и при попытке подгрузки модуля(а он будет подгружен, да и любое обращение асинхронное к загрузчику или по иным причинам - он слишком наворочен) произойдёт деадлок, конечно есть свои нюансы - критические секции поддерживают рекурсивные входы(спины), но учитывая всё такое практически с абсолютной вероятностью приведёт к зависанию. Есть же dbgprint, зачем гуй трогать, его вообще трогать не следует если кодес не гуй. А отладчик заюзать это конечно же оверхед. Синхронизации важны, могу привести известный пример, это бага в нт - если вы трассируете код и возникнет при этом какое либо исключение, то после рестарта инструкции начнёт трассироваться диспетчер исключений, это будет продолжаться до захвата кс, после чего возникнет деадлок. И таких ситуаций очень много, следует понимать что и когда вызвать. Добавлено спустя 49 минут ZeroMemory > Допустим, у меня есть программа с гуем, которую надо скрыть из процессов. Для этого я хочу сделать ее как DLL и запускать внутри другого процесса. Так нельзя? Гуй(ядро shadow) хранит инфу в огромном числе интернал структур, есть даже механизм пакетной обработки запросов - гуй обрабатывает системные вызовы подобно высокоуровневому фильтру. Учитывая всё сложность этой системы что то там скрыть из юзермода, да и вообще(для работы в шадов ядре нужно переключать сессии етц) - не представляется возможным даже теоретически, более того сейчас концепт скрытия таков - нет скрытых обьектов и нет детекта, тоесть сам факт сокрытия служит детектом и на это весь аверский функционал пилится. Вызов же какой то функции из недр загрузчика - это сложная довольно операция, нужно как то отложить управление до возврата из загрузчика(методы не будем рассматривать ибо не суть важно, так не нужно делать). Можно к примеру создать поток и синхронно обождать, но никак не заюзать какую то подсистему(гуй) да есчо и в первый раз(произойдёт её инициализация, что очень большая обработка). ----- vx |
|
Создано: 09 ноября 2016 14:13 · Личное сообщение · #8 difexacaw пишет: и при попытке подгрузки модуля произойдёт деадлок Есть какие-то условия, при которых MessageBox успешно выполнится из DllMain. Я так думаю, что по меньшей мере для этого требуется наличия инциализированной user32, и может быть, comctl... difexacaw пишет: более того сейчас концепт скрытия таков - нет скрытых обьектов и нет детекта, тоесть сам факт сокрытия служит детектом и на это весь аверский функционал пилится. Смотря какой авер ещё! Аваст, например, просто кладезь для инжектов ----- IZ.RU |
|
Создано: 10 ноября 2016 13:15 · Личное сообщение · #9 DenCoder > наличия инциализированной user32, и может быть, comctl... Это действительно от фазы луны зависит. В любом случае следует как то отложить управление, до возврата из опасного для синхронизаций кода, например использовать механизм сообщений или синхронно это всё делать из другого потока, прежде создать его; хотя если код начинает в первый раз выполняться и в дллмайн, то старт потока нужно есчо как то обождать, так как опять же вновь созданный тред начнёт выполнять загрузчик и ту же дллмайн, ожидание может привести к взаимоблокировке. Тоесть механизм синхронизаций должен быть заранее проработан. Всегда использовались три метода, это посылка APC самому себе и обработка её перед возвратом из загрузчика, изменение в стартап контексте EP и раскрутка стека для поиска в нём адреса возврата. Есть есчо особо не рассмотренная возможность - пока вновь созданный тред не покинет стартап апк, хоть он и будет выполнять какой то код, но для get/set-context ядро будет работать именно со стартап контекстом, вроде так(позволяет скрыть работу потока :s2, но я подробно это не рассматривал. > Смотря какой авер ещё! Смысл был не в кривости авера или как в него залиться, а в динамик детектах, тоесть обычно находится какой то скрытый обьект и только факт его сокрытия говорит об викс активности в системе. Если все обьекты легал, то такой детект не работает. Это не только к обьектам относится, но и к памяти - нет в памяти данных, тогда и найти там сигнатуру невозможно ----- vx | Сообщение посчитали полезным: DenCoder |
|
Создано: 10 ноября 2016 13:42 · Личное сообщение · #10 ZeroMemory пишет: BOOL written = WriteProcessMemory(process, libname, dllName, lstrlen(dllName), NULL); if (FALSE == written) return FALSE; HANDLE thread = CreateRemoteThread(process, NULL, 0, (LPTHREAD_START_ROUTINE)loadlib, libname, 0, NULL); if (NULL == thread) return FALSE; тут вообще можно просто второй раз вызвать CreateRemoteThread(), старт рутина - любая функция. ----- IZ.RU |
|
Создано: 11 ноября 2016 22:25 · Личное сообщение · #11 Меня иногда впечатляют русскоязычные форумы. Это же надо сделать из проблемы, которая отвечена годами назад, активный топик. Начинать с гугла или отсюда: https://stackoverflow.com/questions/8377569/howto-call-messagebox-in-dllmain TL; DR DllMain обычно патчит память процесса, создает поток или что угодно в этом духе, что бы закрепится в процессе. Далее по сигналу должен начать реагировать, например, перехватите вызов ShowWindow, который вам нужен, и начинайте работать оттуда, причем это уже скорее будет в потоке основно приложения. | Сообщение посчитали полезным: neshta |
|
Создано: 12 ноября 2016 02:56 · Личное сообщение · #12 nicknamesarehistory В этом и фишка. Янки не хочет знать механизмы, им надо что бы робило, решить практическую задачу. А вот у нас иначе - решение происходит из знания, причём это разворачивается, что бы понять/обьяснить суть. По этой причине понятия уровня знаний у пиндосов на форумах не существует. И впечатляет вас такое, потому что вы янки : DllMain обычно патчит память процесса" Смысл потерян после трансляции языковой. ----- vx |
eXeL@B —› Программирование —› Инжект длл в удаленный процесс фейлится |