Вопрос, возникший из-за собственного неимения базы по ассемблеру

Тема в разделе "WASM.BEGINNERS", создана пользователем yaroved, 2 июл 2010.

  1. yaroved

    yaroved DMITRY MENSHOV

    Публикаций:
    0
    Регистрация:
    2 июл 2010
    Сообщения:
    4
    Адрес:
    140070
    Нужна вставка в EP:

    Вопрос, возникший из-за собственного неимения базы по ассемблеру.
    Сейчас смотрю умные книги... так что просьбя не отсылать учить мат. часть т.к. уже это делаю... ;)

    -------------------------------

    Суть вопроса:

    Есть некоторая .NET сборка с

    AddressOfEntrypoint = 004056EE

    [​IMG]

    Есть свободный блок в секции [.text] размером 64 байт
    и он есть всегда, ибо это - функция пустышка в сегменте метаданных .NET
    которая мною добавляется всегда.

    [.text ]
    -> #~
    -> методы
    -> 1
    -> 2
    -> Метод-пустышка [64 байт]
    /*свободный блок*/
    -> ...
    [.rsrc ]
    [.reloc]
    [...]

    Поменял точку входа на него. Стало так:

    AddressOfEntrypoint = 00403284

    и скопировал туда всё из старой точки входа. Стало так:

    [​IMG]

    Так работает.

    Далее, нужно перед прыжком на _CorExeMain вставить несколько инструкций /должны меняться
    два значения местами, пусть одно из которых RVA на директорию метаданных/. Но для проверки
    хотя бы просто забить 1 (один) nop... Стало так:

    [​IMG]

    Так НЕ работает.

    ПОЧЕМУ ОНО НЕ ХОЧЕТ РАБОТАТЬ?
     
  2. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    В дизасме картинку дай.
     
  3. yaroved

    yaroved DMITRY MENSHOV

    Публикаций:
    0
    Регистрация:
    2 июл 2010
    Сообщения:
    4
    Адрес:
    140070
    работающий вариант:

    [​IMG]

    а так вылет:

    [​IMG]

    с ошибкой:

    [​IMG]
     
  4. yaroved

    yaroved DMITRY MENSHOV

    Публикаций:
    0
    Регистрация:
    2 июл 2010
    Сообщения:
    4
    Адрес:
    140070
    Только что попробовал на других системах /WinXP64 и WinServer2008/...
    Там всё работает на OK. Сборка ориентирована на
    кроссплатформенность 32 / 64 bit
    -------
    не понимаю этого ;((
     
  5. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    yaroved
    Если есть COM-дескриптор(директория #14), то загрузчик заменяет в контексте ссылку на стартап код на _CorExeMain() в LdrpCorReplaceStartContext(). В связи с этим не понятно зачем вобще трогать [AddressOfEntryPoint].
     
  6. yaroved

    yaroved DMITRY MENSHOV

    Публикаций:
    0
    Регистрация:
    2 июл 2010
    Сообщения:
    4
    Адрес:
    140070
    Спасибо [Clerk],суть кажется уловил...

    [1] что для х86 загрузчик (при необходимости подгружать MSCorEE.dll) сам подправляет
    команду JMP на _CorXXXMain исходя из его реального адреса.

    [2] что на на х64 если размер директории 14>0 EP _CorXXXMain вообще игнорируются.

    Печально это, т.к. нада модифицировать сборку
    именно до разбора метаданных.

    Хотя и интересно будет ли загрузчик х64 вести себя по старому, если эту
    самую директорию обнулить /типа смешанная сборка/, а восстанавливать
    её уже опять таки из вставки...
    /если бы она была возможна/

    что то я запутался...

    попробую посмотреть как стартует сборка после обработки MS::NGen`ом.

    Но так или иначе вопрос наверное можно считать закрытым.

    Ещё раз спасибо за ответ.