Вопрос к Володе и не только.

Тема в разделе "WASM.WIN32", создана пользователем EvilsInterrupt, 20 сен 2004.

  1. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Уважаемый Володя!



    Хочу задать тебе вопросы в коих ты знаешь, по моему мнению ответы.

    Насколько я правильно прочитал в статье Питрека, то выполнение про-

    ги начнется со значения которое даст сумма двух других: ImageBase и

    AdressOfEntryPointer, но там же сказана оговорка, что это не всегда

    так, бывает случай когда ImageBase не нравится винде и она делает

    поправки.

    1) Какие и как она их осуществляет, и в какую сторону?(старшие, млад-

    шие адреса) Не обесудь и ответь, если позволяет время, и настроение

    :), т.к. исследовать винду и находить ответы сам я еще не научился.

    Но учусь, честное ассемблерное слово! :) ;)



    Дальше взяв татал командер нахожу calc.exe (winXPsp1) если что, жму

    на нем f3 и 3ку. Появляются куча шестнадцаетеричных чисел, тама на-

    хожу AdressOfEntryPointer - 00 01 24 75(по смещению 118h, от начала

    файла) и ImageBase - 01 00 00 00(смещение 124h) получаю 01012475,т.е.

    отсюда начнет выполнение прога когда весь процесс для ее выполнения

    будет пройден и если конечно винда с базой образа не намудит :) Гружу

    calc.exe в olly. Все верно 6a 70.

    Теперь же хочу разобраться как загрузчик проецирует секцию кода в па-

    мять для этого нашел структуру image_section_header из winnt.h в sdk

    гляжу на дамп и нахожу:

    | 2E 74 65 78 74 00 00 00 --------.text---

    0000:01F0 B0 26 01 00 00 10 00 00 | 00 28 01 00 00 04 00 00 °&-----(----

    0000:0200 00 00 00 00 00 00 00 00 | 00 00 00 00 20 00 00 60 ------------ --`



    Колупаю дальше имя, дальше виртуальный размер секции, размер сырых данных(если

    я правильно понял, это размер данных секции в физическом файле, т.е. на диске),

    Вижу PointerToRawData - может это указатель загрузчику где хранится секция кода,

    проверим:

    0000:0400 EA 22 DC 77 D7 23 DC 77 | 9A 18 DC 77 00 00 00 00 к"ЬwЧ#ЬwљЬw----



    Jmp , припоминая заражение com-файлов в досе, становится жутко уж не вирь ли это

    При чем адресс куда указывает этот прыжок hiew показывать отказывается.



    А олли нам показывал 6a 70! Может просто ошиблись, копаю дальше и не хрена

    не нахожу,



    2) где адресс от куда брать секцию в файле?



    3)Как я понял, именно первый байт в секции кода и есть начало этого calc.exe?



    ЗЫ:

    По крайней мере msgbox.exe из туториалов Iczelion`а показывает верно.



    Научи уму разуму, горе колупальщика и избавь от дурных манер по исследо-

    ванию файлов!
     
  2. dragon

    dragon New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2002
    Сообщения:
    84
    Адрес:
    Питер
    Всё правильно, в начале секции кода лежит таблица импорта и там 77DC22EA - адрес API функции какой-то, это вообще-то данные. А на Entry point действительно 6A 70, так в чём проблема?
     
  3. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Можешь по подробней про эту вещь, если конечно есть время. А то я обложился Питреком, гляжу в упаковщики володины, даже виры под вин32 от billy bolceby читаю, а все равно темный лес. Не врубаюсь, не шиша.
     
  4. ssx

    ssx Member

    Публикаций:
    0
    Регистрация:
    19 авг 2003
    Сообщения:
    336
    насчет применения "поправок": они называются "relocation", применяются, если модуль не может быть загружен по ImageBase(чаще всего это DLL, но и .exe тоже, если его грузят по LoadLibrary)
     
  5. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Но в каких случаях он не может быть загружен? И сторону каких адресов правится?
     
  6. dragon

    dragon New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2002
    Сообщения:
    84
    Адрес:
    Питер


    Если уже место занято другим PE файлом. И правится ImageBase в сторону свободных адресов.
     
  7. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Так. Проясняться стало, заглянул в Гумерова на рсдн.ру.

    Токо как импорт происходит так до сих пор темный лес
     
  8. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    Касательно импорта - опять читай Питрека. Здесь сложнее.

    В нормальном файле (там, где НЕТ привязки - BOUND) лоадер винды (ntdll.dll) должен обработать PE-файл, чтоб последовательность



    call some_API_function -> jmp some_API_function -> dll_that_contains_this_API_function



    была валидной. Если лоадер не обработает эту цепочку, то прога упадет в момент выполнения jmp some_API_function.

    Если же импорт привязан (это можно сделать специальными утилитами), то винде делать ничего не надо. все jmp уже перенастроены так, чтобы сразу показывать на нужную API-функцию. Заметь, что jmp сразу прыгает на заранее указаный адрес. Поэтому программа, имеющая привязанный импорт, может запускаться только под одной-единственной версией Windows - под той, на которую настроена. Программа запускается быстрее, т.к. ntdll.dll делать уже ничего не надо. А так - любите книгу, источник знаний.
     
  9. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Спасибо что уделил внимание
     
  10. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    И все же Володя я много не понимаю, логичней под jmp dwordы,

    а они стабильно имеют коды 0ffh 25h ....! Было зарезервиро-

    вать место при загрузке в память, а не писать их в файл и

    кушать место.

    Дай толчок по импорту, я понял что когда вызывается MessageBox,

    то call передает управление jmp а тот уже по АДРЕССУ кидает

    управление в dll, где и находится сама функция(кстати можно ли

    ее соглассно терминологии Таненбаума назвать демоном?). Но вот

    как этот адрес туда настраивается, я так и не понял, рисунок

    Питрека токо запутывает, а Гумеров не ясно разъясняет.

    Если времени нет можешь дашь ссылку на нормальную по этому по-

    воду литературу?



    С уважением Злое Прерывание.
     
  11. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    Было зарезервиро-

    вать место при загрузке в память, а не писать их в файл и

    кушать место.





    И сколько, по твоему, его скушается? А как дизассемблеры работать будут? Ты бы не умничал :)



    Но вот

    как этот адрес туда настраивается, я так и не понял




    ntdll.dll записывает его туда. После проецирования файла с диска в адресное пространство, лоадер меняет атрибуты страницы и пишет нужные адреса.

    А общая схема показана в моих несчастных упаковщиках. Все там.
     
  12. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Извини за умность, но после Таненбаума, че то на тоноксти пробивает :)

    А как бывает с _declspec(dllimport), что каждый call dword настраивается?
     
  13. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    А как бывает с _declspec(dllimport), что каждый call dword настраивается?



    Я не понимаю смысла фразы "каждый call dword настраивается"? После этой директивы получается самая обычная таблица импорта.
     
  14. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Вот теперь я точно в джунглях! :)
     
  15. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    Читай MSDN. Статья:

    "Using _declspec(dllimport) & _declspec(dllexport) in Code"
     
  16. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia