Сейчас на форуме: Rio, YDS (+10 невидимых)

 eXeL@B —› Основной форум —› Загрузчик для NsPack / WinUpack?
Посл.ответ Сообщение

Ранг: 4.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 20 апреля 2006 23:24
· Личное сообщение · #1

Вопрос такой:
как ОС Windows загружает файлы упакованные этими упаковщиками в память?
Любой дизассемблер интерпритирует команду по OEP (согласно первой секции),
а если загрузить в отладчик, то по адреса первой секции располагаются все заголовки файла и
т.п.

Почему после загрузки меняется содержимое первой секции на содержимое заголовков, короче что по адресам 0x400000 - 0x401000?



Ранг: 210.5 (наставник), 2thx
Активность: 0.140
Статус: Участник

Создано: 20 апреля 2006 23:30
· Личное сообщение · #2

Мда, а причём тут Winupack и NsPack?

mag3d пишет:
Любой дизассемблер интерпритирует команду по OEP (согласно первой секции),
а если загрузить в отладчик, то по адреса первой секции располагаются все заголовки файла и
т.п.


Ничего не понял....


mag3d пишет:
Почему после загрузки меняется содержимое первой секции на содержимое заголовков, короче что по адресам 0x400000 - 0x401000?


Содержимое первой секции меняется??? Заголовок загружается там где ImageBase, а секция загружается в ImageBase + Virtual Offset этой секции




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 20 апреля 2006 23:31 · Поправил: Hellspawn
· Личное сообщение · #3

догадался интуитивно, что хочет чел...

тут в одной тема промелькнуло вот что, цитата (PE_Kill):

Он (WinUpack) как то заставляет лоадер грузить секцию не с офсета 10, а с 0. Т.е. прямо с начала файла. Это легко проверить, если прокрутить секцию в отладчике вверх, то увидим сигнатуру "MZ", тогда, как в хекс редакторе там "PE".

Походу это из-за File Aligment =200, т.е. минимальный RAW Offset =200, а первая секция = 10. И лоадер грузит её с ближайшего, выравненого на 200h байт офсета

надеюсь тебе поможет...

-----
[nice coder and reverser]




Ранг: 4.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 20 апреля 2006 23:40
· Личное сообщение · #4

Походу это из-за File Aligment =200, т.е. минимальный RAW Offset =200, а первая секция = 10. И лоадер грузит её с ближайшего, выравненого на 200h байт офсета

Не совсем так: он грузит правильно заголовки, а затем в первую секцию грузит опять полностью
все заголовки заголовки, а не с 200h. Или я не понял твоего ответа?



Ранг: 210.5 (наставник), 2thx
Активность: 0.140
Статус: Участник

Создано: 20 апреля 2006 23:50 · Поправил: arnix
· Личное сообщение · #5

А, теперь понял твой вопрос, щас обясню, посмотри на значение Real Offset первой секции. Видишь, очень маленькое число (< 200), а так как File Alignment = 200 то это число принимается как 0, вот и первая секция и есть заголовок. Тойть заголовок грузится как заголовок в 400000 (ImageBase) и как первая секция в 401000. (ImageBase + Virtual Offset)




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 20 апреля 2006 23:55 · Поправил: Hellspawn
· Личное сообщение · #6

я так и думал... а вот до каких пор число будет приравниваться к 0?
т.е. какой мин. Real Offset меньше, которого он будет ранятся 0
просто много утилиты входят в ступор, когда видят такой файл

-----
[nice coder and reverser]




Ранг: 210.5 (наставник), 2thx
Активность: 0.140
Статус: Участник

Создано: 20 апреля 2006 23:59 · Поправил: arnix
· Личное сообщение · #7

[ удалено автором, правильный пост - следующий ]



Ранг: 4.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 21 апреля 2006 00:06
· Личное сообщение · #8

Большое спасибо за помощь, тем не менее что я не до понимаю:

В этих файлах некорректно поле PointerToRawData - оно меньше File Alignment
а в документации по PE написано,
если такая ситуация, то округлять в большую сторону.
По-моему и Крис Касперски, это тоже подтверждает в книге "Техника отладки ..." стр. 711

Где косяк то? Но твоя идея скорее всего правильная !



Ранг: 210.5 (наставник), 2thx
Активность: 0.140
Статус: Участник

Создано: 21 апреля 2006 00:10 · Поправил: arnix
· Личное сообщение · #9

Блин я всё перепутал Всё, кажется так:
Проверил, оказалось зависит не от Section Alignment а от File Alignment, так что то что написано сверху можно переформулировать вот так:

число округляется до File Alignment. Тойсть если File Alignment равно 200 то любое число меньше 200 примется как 0, а от 200 до 399 - как 200, и так далее.



Ранг: 4.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 21 апреля 2006 00:10
· Личное сообщение · #10

Я сейчас открыл файл упакованный NsPack-ом, там
некорректно поле PointerToRawData - оно меньше File Alignment

цитата (PE_Kill): Походу это из-за File Aligment =200, т.е. минимальный RAW Offset =200, а первая секция = 10. И лоадер грузит её с ближайшего, выравненого на 200h байт офсета.

Может ошибается все же Касперский, тем не менее в книге он приводит макросы из winnt.h



Ранг: 4.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 21 апреля 2006 00:17
· Личное сообщение · #11

Будем считать, что округление происходит вниз, а не вверх,
тогда все сходится,
а документалистам из микрософта руки нужно оторать по самые гланды

Спасибо !!!




Ранг: 1288.1 (!!!!), 273thx
Активность: 1.290
Статус: Участник

Создано: 21 апреля 2006 00:23
· Личное сообщение · #12

mag3d пишет:
а документалистам из микрософта руки нужно оторать по самые гланды

Или Крису и переводчикам


 eXeL@B —› Основной форум —› Загрузчик для NsPack / WinUpack?
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати