Создаем процесс с CREATE_SUSPENDED флагом. теперь мы должны , не запуская его, определить его ImageBase. Плтаформа - W_95/W_ME/W_2000/W_XP через toolhelp функции не получается - код,который прекрасно работал с работающим процессом, на процессе с CREATE_SUSPEND не работает. PsInfo от Рихтера ведет себя весьма странно - при первом проходе на процессе выдает ошибку, на втором проходе показывает все его потроха, но... запускает его. Вопрос: каким способом найти imagebase этого самого процесса,если учесть,что процесс,скомпилированный c ImageBase=100000 наверняка будет релоцирован на другой адрес при запуске его в w95. Т.е. чтение imagebase Из файла - не панацея
Прочитать из заголовка файла, и если ось NT то считать его верным, если 9x то при ImageBase < 0x400000 считать его равным 0x400000 другого выхода нет, имхо
Я не пробовал исследовать что там в этот момент есть в PEB, и кста структура PEB слабо или вообще не документирована
есть необходимость! Т.к. у проги могут быть релоки и она будет загружена. Был у мя такой файл, IB = 0x100000, запакован UPX'ом и ещё каким-то скрамблером, или вручную попорчен, а 98-й у меня как-раз не было, и нужно было как-нить его грузануть на 0x400000 чтоб нормально распаковать, я так и не нашел способ %)
не вижу проблем. Можно взять из Peb. для 9х он хорошо рекламирован у Мэта. Для NT, не так подробно у Шрайбера. Только вот, есть там структурка типа ListEntry, на неё на днях случайно наткнулся, вот в её полях прописан и Ib, и имя модуля и его oep, так же много чего ещё. В общем, ещё глянь исходники винды. Там эта структура где то была вроде описана. Порой функцию GetModuleHandle. А вообще, скоро статью зашлю, где вся эта хрень будет во всей красе )
Вот это подойдет? ModuleFromAddress PROC pidWORD LOCAL mbi:MEMORY_BASIC_INFORMATION invoke VirtualQuery,pid,ADDR mbi,SIZEOF mbi test eax,eax jz @F mov eax,mbi.AllocationBase @@: ret ModuleFromAddress ENDP
s0rg: я не понял твоего примера ) ssx: в eax оказался 0,хотя многие регистры заполнены верно а до fs:[0] доступа вроде бы нет
Хм. вроде как eax должен указывать на EP - у меня на 98/XP по крайней мере так было. Может это из-за CREATE_SUSPENDED ?