|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Мар 14, 2004 09:33:08 Народ мне не понятень акой вот момент вынь грузит прогу по адресу 400000h точка входа устанавливается на 401000h. НО ЕСЛИ ПО этим адресам нет возможности загрузить прогу то соответственно надо грузить в другие адреса и патчить все метки и переходы. Так вот и не доходит до меня как присходит это патчинье в коде. Надо ведь определить все jmp call'ы и прочие жз'ы, объясните по русски как происходит сей процесс? Я так понимаю что в сегменте кода надо найти сей калл или джамп определить в какое место он тебя посылает и поправить направление в соответствие с новым адресом. Часто упоминаемый шедевр о вынь 2000 я нашел токо на языке вероятного противника, а в нем я пока не силен :-( . Буду очень признателен за доступное объяснение на языке родных осин ну и усе ссылки на русскоязычные книги и описания только плиз ссылки на мыло grevgeny@pisem.net |
|
|
Дата: Мар 14, 2004 11:08:06 Я еще не слишком хорошо с PE разобрался, но насколько я знаю, все метки и вызовы в коде - это ничто иное как адрес перехода относительно IMAGE_BASE программы, а этот IMAGE_BASE определяет уже загрузчик. Таким образом, патчить загрузчику ничего не надо и все работает быстро и правильно. Если я в чем-то не прав, поправьте. |
|
|
Дата: Мар 14, 2004 12:11:01 [ Grevg: Так вот и не доходит до меня как присходит это патчинье в коде. Надо ведь определить все jmp call'ы и прочие жз'ы, объясните по русски как происходит сей процесс? ] Именно так и происходит, как ты описал. Но только табличка с jmp'ами и call'ами, которые патчить надо составляется линкером на этапе линковки и запихивается в отдельную секцию PE. См любую DLL - там есть секция .reloc - это как раз и есть списочек патчей. Этот список использует загрузчик если DLL не удается загрузить по предопределенному адресу. Для EXE этот список не составляется и секция .reloc не создается, для уменьшения размера файла, т.к. это бессмысленно, ибо EXE всегда можно загрузить по предопределенному адресу - он грузится первым. Если нужно грузить EXE как DLL, то нужно заставить линкер генерить релоки - есть специальные ключи для этого. |
|
|
Дата: Мар 15, 2004 06:48:42 В том и вопрос что по адресу 400000h может находиться уже другая программа. А куда грузиться еще одна? Или менеджер памяти так их надувает что они все уверены что грузятся с адреса 400000h? Если это так то как ето происходит? Вообще господа подскажите где найти книгу Соломона и Руссиновича на языке родных осин, а то гугол тока вражий вариант находит :-) кинтье плииз ссылку на мылу grevgeny@pisem.net |
|
|
Дата: Мар 15, 2004 08:02:57 Grevg У каждого процесса своё адресное пространство, поэтому по виртуальному адресу 400000h находятся различные участки памяти. Реализуется это с помощью механизма страничной трансляции (преобразование линейных адресов, получаемых из виртуальных, в физические). |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.060 |