Сейчас на форуме: zds (+6 невидимых)

 eXeL@B —› Программирование —› База модуля в остановленном процессе
Посл.ответ Сообщение

Ранг: 65.3 (постоянный), 10thx
Активность: 0.020
Статус: Участник

Создано: 09 сентября 2012 18:28 · Поправил: tomac
· Личное сообщение · #1

Здравствуйте, уважаемые форумчане!
Прошу прощения, если такой вопрос уже был, и я недостаточно качественно воспользовался поиском.

Стоит задача узнать базовый адрес главного модуля остановленного процесса.
Зачем: надо исправить код на точке входа процесса до старта, для этого надо узнать, куда точка входа попала. RVA знаю, базу не знаю в силу ASLR. Процесс запускаю с CREATE_SUSPENDED. Если попробовать перечислить модули процесса через CreateToolhelp32Snapshot, данные я не получаю. Только для процессов с живым потоком работает. Могу получить список модулей изнутри процесса (CreateRemoteThread), но тогда первым потоком процесса оказывается не главный поток, а мой созданный удаленно. В результате, подгрузка статически прилинкованных библиотек идет из этого потока, и в результате common controls в процессе перестает работать. Возможно, что-то еще, чья инициализация зависит от потока (или activation context'a).

Собственно, решение вижу несколькими способами:
1. Найти базу главного модуля до старта потоков (есть одно решение в инете, но оно мне кажется крайне кривым - перечисление всех выделенных для процесса регионов памяти с проверкой флагов). Когда база найдена, на EP сделать jmp eip; внедрить поток.
2. Внедрить поток до старта основного потока, потвикать activation context, или перехватить все isolation-aware функции и перевызвать все DllMain всех библиотек (comctl32.dll, в основном). Почему-то, кстати, у меня не получилось это сделать с CreateWindowEx, он всё равно ругается на отсутствие класса окна.

Главный вопрос - можно ли узнать базу главного модуля остановленного процесса?
Альтернативно - остановить процесс ровно на EP, не до инициализации библиотек.

Спасибо!

Vovan666 Спасибо, то, что надо!



Ранг: 617.3 (!), 677thx
Активность: 0.540
Статус: Участник

Создано: 09 сентября 2012 18:46 · Поправил: Vovan666
· Личное сообщение · #2

Ebx+8
т.е. Создаешь CREATE_SUSPENDED-процесс, через GetThreadContext получаешь что лежит в ebx, прибавляешь 8 и через ReadProcessMemory читаешь 4 байта кои и будут ImageBase

| Сообщение посчитали полезным: tomac, Veliant, Maximus, SReg


Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 09 сентября 2012 19:05 · Поправил: ARCHANGEL
· Личное сообщение · #3

Debug API. При остановке на System breakpoint, она же DbgBreakPoint, делаем вышеописанные манипуляции с CreateToolhelp32Snapshot, определяем базу загрузки, правим ЕР, и вызываем DebugActiveProcessStop.

-----
Stuck to the plan, always think that we would stand up, never ran.





Ранг: 337.6 (мудрец), 224thx
Активность: 0.210.1
Статус: Участник
born to be evil

Создано: 10 сентября 2012 14:22
· Личное сообщение · #4

(eax/rax) - (entry point delta)

-----
От многой мудрости много скорби, и умножающий знание умножает печаль





Ранг: 568.2 (!), 465thx
Активность: 0.550.57
Статус: Участник
оптимист

Создано: 10 сентября 2012 14:43
· Личное сообщение · #5

--> EnumProcessModules <--

-----
Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли.





Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 10 сентября 2012 15:28
· Личное сообщение · #6

ClockMan
If the module list in the target process is corrupted or not yet initialized, ... EnumProcessModules may fail or return incorrect information.

Судя по исправленному первому посту, вопрос решён, закрою тогда.

| Сообщение посчитали полезным: ClockMan
 eXeL@B —› Программирование —› База модуля в остановленном процессе
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати