Как получить точку входа дочернего процесса?

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

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

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

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

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


person user112771    schedule 01.09.2009    source источник


Ответы (3)


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

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

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

person Michael    schedule 01.09.2009
comment
+1. Обратите внимание, однако, что GetModuleInformation не вернет базовый адрес модуля (я даже не нашел никакой документации, в которой говорилось бы, что вы можете передать 0 как HMODULE. Гарантируется ли это работа?). Вам, вероятно, придется позвонить EnumProcessModules. - person avakar; 01.09.2009
comment
@avakar - похоже, это работает, по крайней мере, на моей машине и версии Windows. Сначала EnumProcessModules поможет гарантировать, что он работает. - person Michael; 01.09.2009
comment
Я пробовал и GetModuleInformation, и EnumProcessModules, оба не работали, EnumProcessModules возвращались как ошибка без конкретной информации, что-то, что не казалось связанным с функцией, когда я использовал GetModuleInformation с HMODULE как NULL, я получил структуру, которая была заполнена 0xccccccc значения, которые не очень полезны - person user112771; 01.09.2009
comment
@ratata, пожалуйста, опубликуйте свой код, пытающийся использовать GetModuleInformation, это должно сработать. - person Michael; 02.09.2009
comment
‹pre› if (!CreateProcess(NULL,c:\\test.exe,NULL,NULL,TRUE,CREATE_SUSPENDED,NULL,NULL,&si,&pi)){ printf( CreateProcess failed (%d).\n, GetLastError( )); вернуть 0; } HANDLE hProcess = pi.hProcess; МОДУЛЬИНФО ми; GetModuleInformation(hProcess,NULL,&mi,sizeof(mi)); ‹/pre› Я пропустил все материалы, связанные с CreateProcess, процесс создан, я уверен в этом, для моих нужд мне нужно, чтобы он был создан как приостановленный, я пытался создать его, чтобы регулярно открывать, и получил те же результаты, я получаю ошибка 6, которая говорит: Invalid Handle Value, может быть, я что-то неправильно понимаю - person user112771; 02.09.2009
comment
На самом деле, вам может понадобиться, чтобы процесс немного работал, чтобы это работало — GetModuleInformation должен проверить список загруженных модулей, который, вероятно, инициализируется в процессе. - person Michael; 02.09.2009

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

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

это все что я помню

person Community    schedule 01.09.2009

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

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

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

person Eugene    schedule 01.09.2009
comment
Я знал об этом факте, но я тестировал некоторые процессы, в основном тот, над которым я пытаюсь работать, так как база изображения: 00400000, а точка входа: 0000311D. Я ожидаю, что это будет 0040311D, но когда я использую ollydbg для просмотра реальной точки входа кода, я получаю: 010E311D как это было достигнуто? - person user112771; 01.09.2009
comment
Хм, проверено на случайном исполняемом файле в ollydbg, и это работает. Хотя, может быть, только для некоторых бывших... - person Eugene; 02.09.2009
comment
ollydbg говорит, что база изображений равна 00400000? - person Eugene; 02.09.2009
comment
Забавно, что вы упомянули об этом, я только что проверил, поскольку OllyDbg говорит, что ImageBase: 010E0000, в то время как любой другой файл редактирования PE или просто код, который я использую для проверки, укажите ImageBase как: 00400000 Если бы я мог вычислить как Ollydoes, это было бы полезно, но как он узнает что другое программное обеспечение не? Я только что проверил с несколькими другими дизассемблерами, все они начинают EP как 0040311D, что правильно на основе заголовка PE, проблема в том, что когда я пытаюсь прочитать этот адрес с помощью своего кода, я получаю сообщение об ошибке, но когда я читаю 010E311D, который является адресом Олли, я получить байты записи, которые присутствуют в EP. - person user112771; 02.09.2009
comment
Проверьте какой-нибудь другой отладчик (не дизассемблер) и посмотрите, куда он войдет. Интересно, упакован ли exe, а ollydbg достаточно умен, чтобы показать вам точку входа после завершения распаковки? Если другой отладчик входит в 0040311D, проследите немного и посмотрите, не перейдет ли он к 010E311D после того, как что-то сделает... - person Eugene; 02.09.2009
comment
(Хотя я думаю, что это противоположно тому, что вы должны увидеть с упакованными исполняемыми файлами, точка входа должна быть чем-то странным, а затем перейти к чему-то 0400000, хотя я не уверен) - person Eugene; 02.09.2009
comment
Файл не запакован, я проверял. Точка входа указывает на 00400000, что-то еще, что я проверил, я снова использовал LordPE для проверки заголовка PE, когда загружается сам файл EXE, я вижу, что ImageBase равен 00400000, когда я открываю процесс и смотрю в процессе LordPE список ImageBase - 00A40000 (обратите внимание, что адрес изменился, я проверил в Olly, и это также 00A40000), когда я открываю файл EXE, желаемый ImageBase - 00400000, но когда процесс открывается, он размещается по этому адресу, как OllyDbg а у LordPE вот этот адрес, как его узнать? - person user112771; 02.09.2009
comment
Я забыл упомянуть, и я знаю, что это большая деталь, что я использую Vista, я только что вспомнил об ASLR, и, поскольку я подозревал, что мой компилятор компилирует тестовый exe с включенным ASLR, я отключил его, и он каждый раз загружался в 00400000, но когда ASLR был включен, OllyDbg все еще знал настоящий адрес, я хочу узнать адрес, даже если ASLR включен, какие-либо предложения? - person user112771; 02.09.2009
comment
Возможно, вам придется использовать какой-то API отладки, поскольку они, по-видимому, работают. Не уверен, что это сработает для вашей цели. - person Eugene; 03.09.2009