Как узнать Imagebase процесса

Тема в разделе "WASM.WIN32", создана пользователем SomeOne_TT, 1 мар 2005.

  1. SomeOne_TT

    SomeOne_TT New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2005
    Сообщения:
    39
    Создаем процесс с CREATE_SUSPENDED флагом.



    теперь мы должны , не запуская его, определить его ImageBase.



    Плтаформа - W_95/W_ME/W_2000/W_XP



    через toolhelp функции не получается - код,который прекрасно работал с работающим процессом, на процессе с CREATE_SUSPEND не работает. PsInfo от Рихтера ведет себя весьма странно - при первом проходе на процессе выдает ошибку, на втором проходе показывает все его потроха, но... запускает его.



    Вопрос: каким способом найти imagebase этого самого процесса,если учесть,что процесс,скомпилированный c ImageBase=100000 наверняка будет релоцирован на другой адрес при запуске его в w95. Т.е. чтение imagebase Из файла - не панацея
     
  2. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Прочитать из заголовка файла, и если ось NT то считать его верным, если 9x то при ImageBase < 0x400000 считать его равным 0x400000

    другого выхода нет, имхо
     
  3. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    А есди самому залезть в PEB процесса и посмотреть на ImageBase?
     
  4. SomeOne_TT

    SomeOne_TT New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2005
    Сообщения:
    39
    PEB - это больно долго )



    Вариант Астерикса наиболее оптимален. Спасибо.
     
  5. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Я не пробовал исследовать что там в этот момент есть в PEB,

    и кста структура PEB слабо или вообще не документирована
     
  6. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    интересно, а если ImageBase < 0x400000 и нет релоков, то мастдай сможет загрузить такой файл ?
     
  7. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    нет, конечно
     
  8. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    значит, можно просто брать из заголовка (в смясле, нес необходимости проверять)
     
  9. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    есть необходимость! Т.к. у проги могут быть релоки и она будет загружена. Был у мя такой файл, IB = 0x100000, запакован UPX'ом и ещё каким-то скрамблером, или вручную попорчен, а 98-й у меня как-раз не было, и нужно было как-нить его грузануть на 0x400000 чтоб нормально распаковать, я так и не нашел способ %)
     
  10. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Я просто почти не встречал экзешников с релоками, это вроде бы нужно было только для win32s
     
  11. CARDINAL

    CARDINAL Member

    Публикаций:
    0
    Регистрация:
    23 янв 2004
    Сообщения:
    551
    Адрес:
    Moscow
    не вижу проблем. Можно взять из Peb. для 9х он хорошо рекламирован у Мэта. Для NT, не так подробно у Шрайбера. Только вот, есть там структурка типа ListEntry, на неё на днях случайно наткнулся, вот в её полях прописан и Ib, и имя модуля и его oep, так же много чего ещё. В общем, ещё глянь исходники винды. Там эта структура где то была вроде описана. Порой функцию GetModuleHandle. А вообще, скоро статью зашлю, где вся эта хрень будет во всей красе :))
     
  12. s0rg

    s0rg New Member

    Публикаций:
    0
    Регистрация:
    7 апр 2004
    Сообщения:
    6
    Адрес:
    Russia
    Вот это подойдет?



    ModuleFromAddress PROC pid:lol: WORD

    LOCAL mbi:MEMORY_BASIC_INFORMATION



    invoke VirtualQuery,pid,ADDR mbi,SIZEOF mbi

    test eax,eax

    jz @F

    mov eax,mbi.AllocationBase

    @@:

    ret

    ModuleFromAddress ENDP
     
  13. ssx

    ssx Member

    Публикаций:
    0
    Регистрация:
    19 авг 2003
    Сообщения:
    336
    GetThreadContext и посмотреть eax - это будет entry point. оттуда вниз до 'MZ' :)
     
  14. SomeOne_TT

    SomeOne_TT New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2005
    Сообщения:
    39
    s0rg: я не понял твоего примера )



    ssx: в eax оказался 0,хотя многие регистры заполнены верно

    а до fs:[0] доступа вроде бы нет
     
  15. ssx

    ssx Member

    Публикаций:
    0
    Регистрация:
    19 авг 2003
    Сообщения:
    336
    Хм. вроде как eax должен указывать на EP - у меня на 98/XP по крайней мере так было. Может это из-за CREATE_SUSPENDED ?
     
  16. SomeOne_TT

    SomeOne_TT New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2005
    Сообщения:
    39
    Кто знает )



    Впрочем,проект я сдал.