Нужна вставка в EP: Вопрос, возникший из-за собственного неимения базы по ассемблеру. Сейчас смотрю умные книги... так что просьбя не отсылать учить мат. часть т.к. уже это делаю... ------------------------------- Суть вопроса: Есть некоторая .NET сборка с AddressOfEntrypoint = 004056EE Есть свободный блок в секции [.text] размером 64 байт и он есть всегда, ибо это - функция пустышка в сегменте метаданных .NET которая мною добавляется всегда. [.text ] -> #~ -> методы -> 1 -> 2 -> Метод-пустышка [64 байт] /*свободный блок*/ -> ... [.rsrc ] [.reloc] [...] Поменял точку входа на него. Стало так: AddressOfEntrypoint = 00403284 и скопировал туда всё из старой точки входа. Стало так: Так работает. Далее, нужно перед прыжком на _CorExeMain вставить несколько инструкций /должны меняться два значения местами, пусть одно из которых RVA на директорию метаданных/. Но для проверки хотя бы просто забить 1 (один) nop... Стало так: Так НЕ работает. ПОЧЕМУ ОНО НЕ ХОЧЕТ РАБОТАТЬ?
Только что попробовал на других системах /WinXP64 и WinServer2008/... Там всё работает на OK. Сборка ориентирована на кроссплатформенность 32 / 64 bit ------- не понимаю этого ;((
yaroved Если есть COM-дескриптор(директория #14), то загрузчик заменяет в контексте ссылку на стартап код на _CorExeMain() в LdrpCorReplaceStartContext(). В связи с этим не понятно зачем вобще трогать [AddressOfEntryPoint].
Спасибо [Clerk],суть кажется уловил... [1] что для х86 загрузчик (при необходимости подгружать MSCorEE.dll) сам подправляет команду JMP на _CorXXXMain исходя из его реального адреса. [2] что на на х64 если размер директории 14>0 EP _CorXXXMain вообще игнорируются. Печально это, т.к. нада модифицировать сборку именно до разбора метаданных. Хотя и интересно будет ли загрузчик х64 вести себя по старому, если эту самую директорию обнулить /типа смешанная сборка/, а восстанавливать её уже опять таки из вставки... /если бы она была возможна/ что то я запутался... попробую посмотреть как стартует сборка после обработки MS::NGen`ом. Но так или иначе вопрос наверное можно считать закрытым. Ещё раз спасибо за ответ.