Сейчас на форуме: zombi-vadim, zds (+4 невидимых) |
eXeL@B —› Программирование —› Вопрос по лоадеру |
Посл.ответ | Сообщение |
|
Создано: 07 сентября 2013 13:26 · Поправил: figgler · Личное сообщение · #1 Уважаемые коллеги, столкнулся со следующей проблемой, подскажите куда копать и как вообще правильно... Ниже приведен кусок кода который: 1. Создает процесс в SUSPENDED состоянии 2. Запускает процесс на 20 мсек и потом опять останавливает 3. Делает снимок запущеного модуля 4. Находит адрес таблицы импорта 5. В процедуре POKES происходит поиск нужной функции, ее адреса и замена кода Проблема: пункт 2 - в коде коментарий Это делается для того, чтобы нормально отработала функция снимка модуля - если ее делать сразу после создания процесса, снимок не получается. Если поставить время выполнения процесса (между запуском и остановкой) меньше - процесс не успевает "развернуться" и снимок не выходит, если поставить больше (например 300) то успевает сработать функция которую я хочу изменить в целевой программе. Время это разное (как я понял) для разного "железа" - зависит от быстродействия, загруженности и пр. Есть ли какой способ гарантировать развертку процесса и остановку его в момент когда программа еще не начала выполняться... Проблема в том, что код который делает снимок модуля (чтобы узнать базовый адрес) выполняется слишком долго и без остановки процесса всегда приводит к тому, что функция которую я меняю уже выпоняется, если же я укажу базовый адрес вручную - все успевает сработать без остановки... Возможно я изначально пошел не по тому пути, идея такова: 1. В целевой программе используется ДЛЛ с функциями которые легко заблокировать заменой точки входа этих функций на РЕТ (изменять саму ДЛЛ нельзя как и основную программу) 2. Можно найти адреса этих функций (вызовы в программе) и загрузчиком их изменить, но захотелось автоматизма. 3. Загрузчик должен сам найти адреса функций (где они размещены после загрузки ДЛЛ) и заменить код. На текущий момент все реализовано, но хотелось бы гарантированного результата... Буду рад подсказкам, идеям и вообще... Code:
|
|
Создано: 07 сентября 2013 13:48 · Личное сообщение · #2 |
|
Создано: 07 сентября 2013 13:54 · Личное сообщение · #3 попробуй создавать нормальный процесс Code:
А вообще проще дописать чуток кода и стопориться на ОЕП. | Сообщение посчитали полезным: figgler |
|
Создано: 07 сентября 2013 14:11 · Личное сообщение · #4 Vovan666 MSDN >> WaitForInputIdle >> the parent process can use the WaitForInputIdle function to determine when the child's initialization has been completed. For example, the parent process should use the WaitForInputIdle function before trying to find a window associated with the child process ...иначе говоря, вы получаете управление после того, как целевая программа войдёт в цикл ожидания сообщений (если она вообще должна в него войти), а это уже может быть далеко от EP. ----- the Power of Reversing team |
|
Создано: 07 сентября 2013 14:45 · Поправил: figgler · Личное сообщение · #5 DillerInc Я понимаю что Слип это костыль - поэтому и интересуюсь - явно есть способы сделать это правильно... Vovan666 По поводу стопориться на ОЕП - можно поподробнее алгоритм (если код - вообще прекрасно) - или просто какие апи функции(я), я разберусь... Да, как вариант я пробовал менять в точке входа JMP на себя, но опять же чтобы узнать точку входа нужно узнать базовый адрес... |
|
Создано: 07 сентября 2013 14:58 · Личное сообщение · #6 figgler, так я вам предложил один из способов - использовать отладочный цикл. Всё зависит от ваших конкретных условий. Если у вас программа палит отладчик, то такой подход само собой неприемлем. Чую, что сейчас Вован вам предложит писать с помощью WriteProcessMemory два байта на EP - 0xfeeb - и в таком состоянии отпускать поток. Да, вы застопоритесь на EP, но получите ещё один костыль - очередной Sleep на неопределённое время, чтобы init процесса полностью выполнился. ----- the Power of Reversing team |
|
Создано: 07 сентября 2013 15:33 · Поправил: figgler · Личное сообщение · #7 |
|
Создано: 07 сентября 2013 15:46 · Личное сообщение · #8 код не мой но частенько пользуюсь Code:
EP читаешь из файла типа так Code:
ImageBase лучше брать из уже запущенного процесса чтоб на 7 проблем небыло. после создания засуспенженного процесса прочитать EBX+8 |
|
Создано: 07 сентября 2013 15:48 · Личное сообщение · #9 |
|
Создано: 07 сентября 2013 21:10 · Личное сообщение · #10 |
|
Создано: 07 сентября 2013 22:34 · Личное сообщение · #11 |
|
Создано: 07 сентября 2013 22:43 · Личное сообщение · #12 |
|
Создано: 07 сентября 2013 23:03 · Личное сообщение · #13 |
|
Создано: 07 сентября 2013 23:07 · Личное сообщение · #14 |
|
Создано: 07 сентября 2013 23:10 · Личное сообщение · #15 |
|
Создано: 08 сентября 2013 02:06 · Личное сообщение · #16 |
|
Создано: 09 сентября 2013 11:56 · Поправил: figgler · Личное сообщение · #17 Vovan666 еще вопрос, пож-ста, по предложенному алгоритму, если не сложно - где я в коде допустил ошибку? Code:
На выходе szBuff должен содержать базовый адрес запущеного процесса, но там 0 (если читать память как в приведенном коде) Просто заинтересовал способ быстрого получения базового адреса. А так подошел способ с Code:
теперь все нормально... Спасибо. |
|
Создано: 09 сентября 2013 12:30 · Личное сообщение · #18 |
|
Создано: 09 сентября 2013 12:33 · Личное сообщение · #19 Это Code:
Code:
а таймер уже запускает создание процесса... |
|
Создано: 09 сентября 2013 13:10 · Личное сообщение · #20 |
|
Создано: 09 сентября 2013 14:32 · Личное сообщение · #21 |
|
Создано: 10 сентября 2013 11:01 · Личное сообщение · #22 Vovan666 спасибо за помощь... почистил код для проверки этого способа (убрал вообще все лишнее) - действительно работает... Code:
|
|
Создано: 10 сентября 2013 18:46 · Личное сообщение · #23 |
|
Создано: 10 сентября 2013 22:39 · Личное сообщение · #24 |
|
Создано: 11 сентября 2013 00:02 · Личное сообщение · #25 |
|
Создано: 12 сентября 2013 19:46 · Поправил: figgler · Личное сообщение · #26 |
|
Создано: 12 сентября 2013 20:03 · Поправил: hors · Личное сообщение · #27 |
|
Создано: 12 сентября 2013 20:27 · Личное сообщение · #28 figgler, # имеем # ADDR my_var ; my_var локальная # получаем # lea eax, my_var push eax # имеем # ADDR my_var ; my_var глобальная # получаем # push offset my_var ; актуально для x86 У тебя один из параметров передаётся через eax, который затрётся предыдущим ADDR my_var, если my_var локальная. ----- the Power of Reversing team |
|
Создано: 12 сентября 2013 20:36 · Личное сообщение · #29 |
eXeL@B —› Программирование —› Вопрос по лоадеру |
Эта тема закрыта. Ответы больше не принимаются. |