2009-09-01 2 views
1

Я создал дочерний процесс из моего процесса с помощью CreateProcess() (на C++). Затем я продолжаю использовать ReadProcessMemory для чтения памяти и поиска чего-то определенного.Как получить точку входа дочернего процесса?

Я хотел бы начать поиск с точки входа этого процесса, так как процесс загружается в его собственное виртуальное пространство. Я понятия не имею, как узнать точку входа для самого кода (I dont заботиться о других разделах PE-файла), Мне известно о поле «AddressOfEntryPoint» в формате PE, и у меня его уже есть, но поскольку я понятия не имею, на каком адресе этот процесс будет загружен, как я могу вычислить точку входа сам?

, чтобы продемонстрировать то, что я хочу, если открыть процесс с OllyDbg, например, вы сразу достигнете точки входа для кода, я хочу, чтобы этот адрес

помнить, что это дочерний процесс, который я создал, если это помогает

позвольте мне сказать, что я не хочу, чтобы ввести любой код или DLL в этой заявке узнать, что адрес

ответ

0

Я не знаю точно, но ... насколько я знаю, вы можете Finde адрес EntryPoint в заголовке PE .exe/.dll

или .... это фиксированный один

, что все я remenber

0

AddressOfEntryPoint является относительно базового адреса изображения (член ImageBase того же IMAGE_OPTIONAL_HEADER структуры). Для исполняемых файлов основная база изображений почти всегда установлена ​​в заголовке PE, так как каждый исполняемый файл имеет свое виртуальное адресное пространство.

Фактически exes с разделенными секциями перемещения может быть загружен только на базе, которая находится в PE.

Я не уверен, если есть исключения, и если это возможно, чтобы получить базу изображения запущенного процесса ...

+0

Я знал об этом факте, но я испытал против некоторых процессов, в основном, один я пытаюсь работать в качестве базового изображения: и точка входа в: 0000311D Я бы ожидать, что это be at 0040311D , но когда я использую ollydbg для просмотра реальной точки входа кода, я получаю: 010E311D Как это было сделано? – user112771

+0

Хм, проверен на случайный исполняемый файл в ollydbg, и он работает. Может быть, только для некоторых exes, хотя ... – Eugene

+0

Говорит ли ollydbg, что база изображений - 00400000? – Eugene

1

Использование PSAPI'S GetModuleInformation с HMODULE от NULL. Это даст вам точку входа исполняемого файла, а также общий размер в памяти (к сожалению, базовый адрес не задан.)

Обратите внимание, что точкой входа необязательно является функция main() - это, вероятно, CRT точка входа, которая, в свою очередь, вызывает ваш основной().

Вы также можете использовать EnumProcessModules, чтобы получить все модули в процессе и их базовые адреса.

+1

+1. Обратите внимание, однако, что 'GetModuleInformation' не вернет базовый адрес модуля (я даже не нашел документацию о том, что вы можете передать 0 как HMODULE. Гарантируется ли работа?). Вероятно, вам придется называть 'EnumProcessModules'. – avakar

+0

@avakar - Кажется, работает, по крайней мере, на моей машине и версии Windows. Сначала EnumProcessModules поможет гарантировать, что он работает. – Michael

+0

Я пробовал как GetModuleInformation, так и EnumProcessModules, оба не работали, EnumProcessModules возвращаются как ошибка без какой-либо конкретной информации, что-то, что не похоже на функцию, , когда я использовал GetModuleInformation с HMODULE как NULL. Я получил структуру, которая была заполнена с значениями 0xccccccc, которые не очень полезны – user112771