Уважаемый Володя! Хочу задать тебе вопросы в коих ты знаешь, по моему мнению ответы. Насколько я правильно прочитал в статье Питрека, то выполнение про- ги начнется со значения которое даст сумма двух других: 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`а показывает верно. Научи уму разуму, горе колупальщика и избавь от дурных манер по исследо- ванию файлов!
Всё правильно, в начале секции кода лежит таблица импорта и там 77DC22EA - адрес API функции какой-то, это вообще-то данные. А на Entry point действительно 6A 70, так в чём проблема?
Можешь по подробней про эту вещь, если конечно есть время. А то я обложился Питреком, гляжу в упаковщики володины, даже виры под вин32 от billy bolceby читаю, а все равно темный лес. Не врубаюсь, не шиша.
насчет применения "поправок": они называются "relocation", применяются, если модуль не может быть загружен по ImageBase(чаще всего это DLL, но и .exe тоже, если его грузят по LoadLibrary)
Так. Проясняться стало, заглянул в Гумерова на рсдн.ру. Токо как импорт происходит так до сих пор темный лес
Касательно импорта - опять читай Питрека. Здесь сложнее. В нормальном файле (там, где НЕТ привязки - 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 делать уже ничего не надо. А так - любите книгу, источник знаний.
И все же Володя я много не понимаю, логичней под jmp dwordы, а они стабильно имеют коды 0ffh 25h ....! Было зарезервиро- вать место при загрузке в память, а не писать их в файл и кушать место. Дай толчок по импорту, я понял что когда вызывается MessageBox, то call передает управление jmp а тот уже по АДРЕССУ кидает управление в dll, где и находится сама функция(кстати можно ли ее соглассно терминологии Таненбаума назвать демоном?). Но вот как этот адрес туда настраивается, я так и не понял, рисунок Питрека токо запутывает, а Гумеров не ясно разъясняет. Если времени нет можешь дашь ссылку на нормальную по этому по- воду литературу? С уважением Злое Прерывание.
Было зарезервиро- вать место при загрузке в память, а не писать их в файл и кушать место. И сколько, по твоему, его скушается? А как дизассемблеры работать будут? Ты бы не умничал Но вот как этот адрес туда настраивается, я так и не понял ntdll.dll записывает его туда. После проецирования файла с диска в адресное пространство, лоадер меняет атрибуты страницы и пишет нужные адреса. А общая схема показана в моих несчастных упаковщиках. Все там.
Извини за умность, но после Таненбаума, че то на тоноксти пробивает А как бывает с _declspec(dllimport), что каждый call dword настраивается?
А как бывает с _declspec(dllimport), что каждый call dword настраивается? Я не понимаю смысла фразы "каждый call dword настраивается"? После этой директивы получается самая обычная таблица импорта.