![]() |
eXeL@B —› Программирование —› CreateRemoteThread |
Посл.ответ | Сообщение |
|
Создано: 09 марта 2010 22:16 · Личное сообщение · #1 Всем доброго времени суток! У меня такая проблема пишу инжектор который подгружает длл с помощью функции CreateRemoteThread, но программа использует длл в точке входа которой исполняется код. А моя точка входа в моей длл стартует уже после ее вызова. Как исполнить код в другом процессе чтобы он стартовал раньне него? Code:
![]() |
|
Создано: 09 марта 2010 22:38 · Поправил: HiEndsoft · Личное сообщение · #2 |
|
Создано: 09 марта 2010 22:41 · Личное сообщение · #3 |
|
Создано: 09 марта 2010 22:42 · Поправил: vptrlx · Личное сообщение · #4 |
|
Создано: 09 марта 2010 22:45 · Поправил: HiEndsoft · Личное сообщение · #5 Archer бывает, после праздников ![]() тогда наверное вопрос неясно задан/понят, т.к. такого быть не должно. Очевидно это только случай статический. Единственный (безгеморный) вариант - использовать свой или один из готовых исходников лоадеров, весь гемор будет с совместимостью. ----- продавец резиновых утёнков ![]() |
|
Создано: 09 марта 2010 23:00 · Поправил: DillerInc · Личное сообщение · #6 У меня тоже есть такая проблема.Например,в GeTaOEP - либы, защищённые каким-нибудь протом ловятся обычно без проблем, а простые(незащищённые) - проскакивают мимо, т.е. они подгружаются быстрее, чем мой удалённый поток получит управление.И решения в usermode похоже нет(разве только использовать loader для либы). ----- the Power of Reversing team ![]() |
|
Создано: 10 марта 2010 00:12 · Личное сообщение · #7 |
|
Создано: 10 марта 2010 00:26 · Личное сообщение · #8 |
|
Создано: 10 марта 2010 01:16 · Личное сообщение · #9 |
|
Создано: 10 марта 2010 07:59 · Поправил: Neo32 · Личное сообщение · #10 Clerk Не понятно что вам нужно. ситуация такая же: У меня тоже есть такая проблема.Например,в GeTaOEP - либы, защищённые каким-нибудь протом ловятся обычно без проблем, а простые(незащищённые) - проскакивают мимо, т.е. они подгружаются быстрее, чем мой удалённый поток получит управление.И решения в usermode похоже нет(разве только использовать loader для либы). и тут еще проскакивал пост про отключение иат, думаю стоит попробовать... Создаешь процесс с CREATE_SUSPENDED , обнуляешь директорию импорта, запускаешь CreateRemoteThread,[ProcessInfo.hProcess],0,0,[LoadLibraryA],eax,0,ebx а потом возвращаешь директорию иат и вручную подгружаешь модули... возможно такое? просто CreateRemoteThread подгружает все модули из иат после своего выполнения и причем моя либа отрабатывает не первой ![]() |
|
Создано: 10 марта 2010 08:02 · Личное сообщение · #11 DillerInc Я в блоге описывал это: Запуск пользовательского потока в обход перехвата диспетчера APC(R3). o Восстанавливаем RtlpCalloutEntryList, для исключения глобальных VEH. o Создаём удалённый поток. o Формируем SEH-фрейм. o Взводим TF в контексте. (Без закрытия списка RtlpCalloutEntryList, там не сложно): Code:
![]() |
|
Создано: 10 марта 2010 08:05 · Личное сообщение · #12 |
|
Создано: 10 марта 2010 08:19 · Поправил: Neo32 · Личное сообщение · #13 Clerk Опишите нормально задачу. До перехода потока на пользовательский код он вызывает загрузчик для нотификации модулей, которая последовательно выполняется для модулей из базы данных, так вот точка входа в моей длл которую я внедряю срабатывает уже после исполнения точек входа в остальных длл, а мне надо чтоб сработала раньше них. ![]() |
|
Создано: 10 марта 2010 08:30 · Личное сообщение · #14 |
|
Создано: 10 марта 2010 08:33 · Личное сообщение · #15 |
|
Создано: 10 марта 2010 09:23 · Поправил: __ · Личное сообщение · #16 |
|
Создано: 10 марта 2010 09:58 · Поправил: Twister · Личное сообщение · #17 Neo32 Ну если у тебя есть доступ к памяти целевого процесса, то что мешает сделать следующее (я так понимаю тебе необходимо просто скрыть свое присутствие): 1. Заморозить все потоки процесса. 2. Пробежаться по EP всех библиотек загруженных в него и изменить начальные байты так, чтобы эти DllEntry просто возвращали управление, ничего при этом не делая. 3. Провести инжект и запуск потока. 4. Восстановить оригинальные байты во всех DllMain. 5. Запустить ранее замороженные потоки. ? ![]() |
|
Создано: 10 марта 2010 11:24 · Поправил: Neo32 · Личное сообщение · #18 Twister (я так понимаю тебе необходимо просто скрыть свое присутствие): нет мне не надо скрывать надо запустить раньше любого кода который может выполнить процесс свой код Twister 2. Пробежаться по EP всех библиотек загруженных в него и изменить начальные байты так, чтобы эти DllEntry просто возвращали управление, ничего при этом не делая. они обязательно должны свое дело делать ![]() вообщем то я решил сделать так: 1. пропатчить директорию импорта, 2. запустить процесс с флагом CREATE_SUSPENDED 3. внедрить длл, 4. в своем коде забить таблицу импорта, подгружая длл что бы у них отработали точки входа 5. запустить процесс ![]() |
|
Создано: 10 марта 2010 11:44 · Поправил: HiEndsoft · Личное сообщение · #19 Twister Смысла в предложенном вами алгоритме нет абсолютно. Зачем патчить EP если они уже выполнены, т.к. в п 1. вы предлагаете заморозить рабочие потоки (они создаются уже после подгрузки либ и выполнения загрузчиком винды всех своих ф-ций). Neo32 Как вариант ничего, но патчить файло - не универсальный вариант (хотя процесс можно запустить из промапленного). Надо подождать Clerk'a что-то он не досказал кажись ----- продавец резиновых утёнков ![]() |
|
Создано: 10 марта 2010 11:51 · Поправил: Twister · Личное сообщение · #20 >> Смысла в предложенном вами алгоритме нет абсолютно. Зачем патчить EP если они уже выполнены DllMain == EP. Я предложил их пропатчить для того, чтобы библиотека не была уведомлена об аттаче трида. Впрочем, раз автору не скрыться надо, а именно выполниться раньше, то способ, конечно, не поможет. А триды заморозить на всякий, для пущей надежности. По теме: Вы бы описали конкретную задачу, а не предполагаемый вариант решения. Возможно найдутся другие варианты. ![]() |
|
Создано: 10 марта 2010 12:09 · Поправил: Twister · Личное сообщение · #21 В принципе, можно вот еще какой вариант предложить: Опять же, заморочимся с DllMain всех модулей (их вызов будет происходить в одном потоке), проставим в начале каждого какую-нибудь инструкцию, которая будет генерировать исключение. Дальше перехватим KiUserExceptionDispatcher и запустим наш поток. Начнется нотификация модулей, первый же модуль сгенерит ошибку, мы ее поймаем и "узнаем". Тут и исполним необходимый нам код, где он будет лежать (в нашей DllMain или еще где) уже дело второе. Потом, конечно, все вернем на место. Я тут не учел VEH-обработчики, но это дело наживное. ![]() |
|
Создано: 10 марта 2010 14:35 · Поправил: mak · Личное сообщение · #22 |
|
Создано: 10 марта 2010 15:06 · Личное сообщение · #23 |
|
Создано: 10 марта 2010 16:01 · Поправил: Clerk · Личное сообщение · #24 Neo32 > тогда как исполнить его раньше? Вы не можите выполнить код в модуле раньше чем он будет загружен, а это произойдёт когда поток перейдёт на ваш код. В этом случае нужен стаб. > Заморозить все потоки процесса. Связка NtSuspendProcess/NtResumeThread не обязательна. К примеру ядро знает про критическую секцию LdrpLoaderLock и при завершении треда может её освобождать. Ничего не мешает сделать это удалённо, тогда потоки обратившиеся к загрузчику будут ждать особождения этой кс. > Опять же, заморочимся с DllMain всех модулей (их вызов будет происходить в одном потоке), проставим в начале каждого какую-нибудь инструкцию, которая будет генерировать исключение. Брейк ставить не обязательно, это нужно если вы отладчик. Иначе достаточно манипуляции ссылками - сделать не валидными, что потребует обработки исключений(удалённо VEH поставить нельзя), либо замена ссылки на свой обработчик(выше - стаб). Тут многие смежные вопросы рассмотрены ![]() |
|
Создано: 11 марта 2010 08:01 · Поправил: Neo32 · Личное сообщение · #25 |
![]() |
eXeL@B —› Программирование —› CreateRemoteThread |
Эта тема закрыта. Ответы больше не принимаются. |