Есть ли ссылки на русскоязычную документацию по PE формату, в которой бы ЯСНО и ДОХОДЧИВО объяснялось как происходит импорт АПИ функций? 4 Раза прочитал в "туториалах Iczelion'а" раздел, посвященный PE формату, но там лишь описание устройства секции импорта и слишком мало о том, как это все работает. Все документы, ссылки на которые выдал яндекс - полная профанация. Пытался даже искать все страницы на которых упоминаются структуры такие как IMAGE_IMPORT_BY_NAME, все равно бестолку. У Криса Касперски в книге "Техника отладки программ без исходных текстов" - вообще полупублицистика. Если конкретно - интересует как происходит вызов API от начала и до конца, как определяются адреса в DLL и т.п. Желательно с визуальными схемами, иллюстрациями и примерами )))
CT ^))) Я не буду тебе говорить, но твоя тема уже не раз подниалась! Мэтт Питрек на rsdn.ru Просто обязан быть прочитан!!! Прочитаешь, далее упаковщики со статей этого сайта, а после сам найдешь че тебе надо!
EvilsInterrupt Попробую, спасибо. А то я нашел то, что меня частично устраивает только на английском языке (в документации wasm.ru) и если что - придется переводить.
рекомендую взять фасм и попрактиковаться в "ручном" создании exe, пока заставишь exe'шник работать точно разберешься в формате и импорте в том числе
У К.Касперски в одной из книг написано, что секции загруженного PE файла не могут перекрываться и образовывать дыры в виртуальном адресном пространстве. В то же время в документации от Yinrong Huang в первой же главе обращается внимание на то, что пробелы в адресном пространстве между секциями могут быть. Так кто же из них прав?
Это личное дело загрузчика. Если секции будут маппиться с разрывами, то он должен будет пересчитывать релоки, так как таблица релоков предполагает, что никаких разрывов не будет, и все секции выравнены на значение NTHeaders->OptionalHeader.SectionAlignment.
Хм... причем тут загрузчик и релоки? Я имею ввиду - могут ли виртуальные адреса секций задаваться В САМОМ ФАЙЛЕ так, чтоб располагаться в памяти с разрывами? Будет ли такой файл корректным?
Уважаемй СТ , загляните ещё вот сюда : http://www.smidgeonsoft.prohosting.com/pebrowse-pro-file-viewer.html юрл для скачки http://www.smidgeonsoft.prohosting.com/download/PEBrowse.zip вес 1,5 мегабайт . может эта прога поможет вам .. ) Ведь изучать что-то лучше глядя в программу , которая предназначена для операций с тем что изучаешь .... желаю удачи !!!
ksacvet777 мне не нужны "проги" выдирающие импорт из файлов. Я его и сам выдрать могу. Уже ) Всем спасибо )
Читаю (как посоветовали) статью "От зеленого к красному", так возник такой вопрос: Код (Text): call delta delta: pop EBP sub EBP,offset delta Будет ли (и если да, то как) работать такой способ получения дельта смещения, если образ будет загружен не по предпочтительному адресу.
Asterix Не зависит? ~8-0 А что тогда представляет собой "offset delta"? Тут же плоский режим и, как я понимаю, все смещения представляют собой абсолютные адреса и должны корректироваться через таблицу релоков при загрузке, потому как процессору понятие RVA не известно... Если я не правильно понимаю адрессацию - скажите плз. где я ошибаюсь.
CT если у файла есть релоки то будет корректироваться, иначе такой файл не запустится если предпочтительный адрес занят но это на механизм не влияет, чтобы убедиться используй отладчик
Asterix Я что то не понимаю, кто в зараженном файле пропишет релоки вирусному коду? Если сам вирус, то почему об этом не сказано сразу в статье? Проанализировал под отладчиком sub EBP,offset delta ==> sub EBP,00401005, в машинных кодах 81ED 05104000 ------> Это АБСОЛЮТНЫЙ адрес, на который рассчитывал линкер. В таблице релоков оригинального файла есть ссылка на это значение, оно корректируется, если имидж загружен не по предпочтительному адресу.
CT проведи опыт Код (Text): lea edi,some_addr lea esi,start_block mov ecx,offset end_block- offset start block push edi rep movsb ret start_block: call get_delta2 get_delta: var1 dd 55h get_delta2: pop ebx sub ebx,offset get_delta mov eax,var1[ebx] ;посмотри, куда обращается эта инструкция в перемещённом коде ret end_block: .... some_addr: