Сейчас на форуме: (+7 невидимых) |
![]() |
eXeL@B —› Вопросы новичков —› SuspendThread на EP |
Посл.ответ | Сообщение |
|
Создано: 27 марта 2014 23:47 · Личное сообщение · #1 |
|
Создано: 28 марта 2014 05:10 · Личное сообщение · #2 Самое ближнее место, на котором можно остановиться, немного за EntryPoint. Первым модулем в *.dpr файле (uses) прописать этот модуль: Code:
Выполнение остановится ещё до выполнения Begin-кода в недрах CALL @InitExe ![]() |
|
Создано: 28 марта 2014 08:54 · Личное сообщение · #3 |
|
Создано: 28 марта 2014 09:43 · Личное сообщение · #4 zds пишет: чтобы быть полностью уверенным что все нужные dll подгрузились Поскольку динамическую "подгрузку" длл никто не отменял, то остановка на ЕР не даст полную уверенность, так же как и остановка в любом другом месте, потому что сразу за этим местом может быть LoadLibraryA. Поэтому думаю нужно руками сначала определить где стопиться. Если же ты свой процесс хочешь остановить после загрузки статично прописанных библиотек, то примерно так. Code:
Не совсем ясно, для чего это нужно, если честно ![]() ![]() |
|
Создано: 28 марта 2014 10:49 · Личное сообщение · #5 |
|
Создано: 28 марта 2014 11:38 · Поправил: deniskore · Личное сообщение · #6 Если хотите остановить чужое приложение на EP или TLS, то необходимо: 1) замэпить исполняемый файл, вытащить смещение TLS или адрес EP (OptionalHeader.AddressOfEntryPoint) 2) создать процесс с DEBUG_PROCESS | DEBUG_ONLY_THIS_PROCESS 3) получить базовый адрес процесса (адрес по которому он загрузился) и прописать бп в памяти на ЕP или TLS в соответствии со смещениями которые вы получили ранее. 4) использовать WaitForDebugEvent и отловить свой брейкпоинт, далее делать необходимые действия и убрать брейкпоинт восстановив оригинальный байт. Если приложение свое, то вставить бряк(int3) и обработать исключение так как вам это нужно. ![]() |
|
Создано: 28 марта 2014 13:47 · Поправил: zds · Личное сообщение · #7 вчера поздно писал, поэтому не полностью описал суть проблемы... нужно остановить именно чужой процесс. делаю универсальный лоадер для комплекта программ - примерно 50 штук. сначала в памяти в секциях .data ищу адрес текста по шаблону. затем в секции .code ищу упоминание найденного адреса, где происходит загрузка в регистр этого текста. затем ищу ближайший условный переход JA, который идет перед загрузкой текста. занупливаю переход и собственно все. сначала использовал CreateProcess - CREATE_SUSPENDED - все работало, пока не обнаружил, что в части программ этот код вынесен в подгружаемые dll. при этом CreateProcess - CREATE_SUSPENDED останавливает процесс до подрузки dll. на EP же в 100% случаях с моими прогами уже все нужные dll подгружены. соответственно встал вопрос как остановить чужой процесс на EP ну или где-нибудь после EP, пусть даже после полной загрузки... sleep использовать не хочется, т.к. остановка в данном случае будет рандомная, в зависимости от загруженности, мощности ПК...а делать большой sleep тоже не хочется, т.к. визуально может быть вообще не понятно что сейчас происходит... сейчас конечно обошел данный момент добавлением еще одной кнопки при нажатии которой после загрузки программы уже происходит поиск в памяти, но хотелось бы для общего развития решить для себя данный момент спасибо, deniskore. буду пробовать. конечно пока большая часть не понятна, но буду разбираться ![]() |
|
Создано: 28 марта 2014 13:55 · Личное сообщение · #8 Artem_N "вы просто не умеете их готовить" ![]() zds сырки не даю намеренно. писалось минут за 15 ----- От многой мудрости много скорби, и умножающий знание умножает печаль ![]() |
|
Создано: 28 марта 2014 14:21 · Поправил: TryAga1n · Личное сообщение · #9 zds пишет: EP же в 100% случаях с моими прогами уже все нужные dll подгружены. соответственно встал вопрос как остановить чужой процесс на EP Именно это нужно было написать в первом посте ![]() 1) Получаем адрес EP (надеюсь не возникнет вопросов как) 2) Считываем 2 байта на ЕР(если делфипроги, то 99,9% что будет 55 8B) 3) Пишем по адресу EP предложенные мной выше EB FE, тем самым зацикливая прогу на ЕР при запуске. 4) Запускаем процесс 5) Делаем свое черное дело 6) Возвращаем нужные 2 байта из пункта 2 на EP(например через WriteProcessMemory) Алгоритм очень простой и не сложный в реализации ![]() |
![]() |
eXeL@B —› Вопросы новичков —› SuspendThread на EP |