Заставить MASM думать про другой адрес.

Тема в разделе "WASM.ASSEMBLER", создана пользователем Desliner, 6 фев 2009.

  1. Desliner

    Desliner New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2009
    Сообщения:
    23
    Адрес:
    Heaven
    Есть некий кусок кода, который может находиться где угодно. Пусть это будет кусок
    Код (Text):
    1. proc1 Proc
    2. label1:
    3.     mov eax, offset label1
    4.     ret
    5. proc1 EndP
    Если это просто так скомпилить, то будет
    Код (Text):
    1.     mov eax, 0xxxxxxxxh ;реальный адрес метки
    2.     ret
    А нужно, чтобы компилятор думал, что proc1 начинается по некому адресу 0yyyyyyyyh, и при компиляции получалось
    Код (Text):
    1.     mov eax, 0yyyyyyyyh ;нужный мне, ненастоящий адрес метки
    2.     ret
    причем, независимо от того, где эта процедура находится на самом деле. Компилятор MASM.
     
  2. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Классика:
    Код (Text):
    1.   call label1
    2. label1:
    3.   pop eax
     
  3. Desliner

    Desliner New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2009
    Сообщения:
    23
    Адрес:
    Heaven
    Это не совсем то, что нужно, пример не следует воспринимать буквально, предложенный код больше подходит для вирей и тд... Желательно как-то сделать это цивилизованно, тк этот код будет слинкован в новый PE файл, и все смещения заранее известны, хотелось бы без таких извратов...
    Выход впринципе есть - выделить этот кусок кода в отдельный exe/com с нужными VA, где больше ничего не будет, и линкер будет брать его оттуда. Но это будет не очень красиво.
    А все до чего я дорыл в этом направлении - стремная директива org, которая вообще хз что делает, но не то, что нужно... Может, такое возможно в других компиляторах, например FASM?
     
  4. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    а через релоки никак?
     
  5. Desliner

    Desliner New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2009
    Сообщения:
    23
    Адрес:
    Heaven
    А можно поподробнее? Если я правильно понимаю, то для этого нужно знать VA кода в момент компиляции? Вы предлагаете использовать релоки PE файла, или пройтись по нужному коду самому?

    2leo
    Кстати, Ваш пример не подойдет впринципе, в Вашем случае в eax будет реальный адрес метки, а мне нужно чтобы там был мой адрес метки.
     
  6. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Desliner
    Сам понял, что сказал ?! ;) Раз тебе нужен твой адрес, то так и напиши:
    Код (Text):
    1. мой_адрес equ 0yyyyyyyyh
    2. или
    3. мой_адрес dd  0yyyyyyyyh
    4.  
    5. mov eax,мой_адрес
    Причем тут метка ?
     
  7. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Desliner
    Если нужен свой адрес, то и запишите свой. Проблем имхо высосана из пальца.
     
  8. Desliner

    Desliner New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2009
    Сообщения:
    23
    Адрес:
    Heaven
    leo
    Да, я понял, что сказал. Метка взята для примера, описание задачи в 1м посте.

    Booster
    Нет, не высосана. Будет теряться удобство и читабельность этого кода, который, может, состоит не из одного десятка процедур.
     
  9. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Desliner
    В первом посте метка притянута за уши. Раз тебе нужно получить
    то и используй mov eax, 0yyyyyyyyh. Если нет, то сформулируй задачу более внятно
     
  10. Desliner

    Desliner New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2009
    Сообщения:
    23
    Адрес:
    Heaven
    Сколько раз повторять, метка взята для примера.
    Ну вот почему, если стараешься оставить только суть задачи, опустив остальное, тебе, видя только эту суть, предлагают от нее отойти... это так, мысли вслух, не обращайте внимания...
    Ну если это поможет решить четко поставленную в первом посте абстрактную задачу, могу привести более подробное описание моей прикладной задачи.
    Существует некая прога. Которая создает новый PE файл. Вроде, сам себе линкер. И код, который будет записан в новую прогу, уже содержится в линкере. Но при компиляции линкера использовались VA линкера, а следовательно, код, который нужно записать, тоже привязан к ImageBase и виртуальным адресам линкера. Задача - отойти от этой самой привязки, чтобы код можно было спокойно записать в PE файл с заранее известными другими ImageBase и VirtualOffset секции.
     
  11. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Desliner
    Сохроняй в файл объектник деловто и\или с релоками разбирайся.
     
  12. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Ух запутал. Инфицирование штоль?
     
  13. Desliner

    Desliner New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2009
    Сообщения:
    23
    Адрес:
    Heaven
    Pavia
    Да, над отдельным файлом я тоже думал, скорей всего, к этому варианту и вернусь...

    Booster
    Нет, не инфицирование. Просто линкер для некоторых целей, которые выходят за рамки данной задачи.
     
  14. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Desliner
    Нормальные люди используют библиотеки, и модули. А что тебе надо, я так и не понял.
     
  15. Desliner

    Desliner New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2009
    Сообщения:
    23
    Адрес:
    Heaven
    Booster
    А я не понял, что Вы имеете ввиду. Каким образом библиотеки и модули касаются поставленной задачи?
    То, что мне надо я описал в 1м и 10м постах.
     
  16. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Desliner
    Да уж задача поставлена чётче некуда :))
    Ладно попробую угадать - ты хочешь добиться базонезависимости кода за счёт его самомодификации, при этом стандартная таблица релоков тебя не устраивает и ты хочешь слепить свою средствами masm %)) - тогда ставь метки перед всеми командами вида mov eax, 0yyyyyyyyh, бери поправку на опкод команды и получишь список адресов по которым нужно вносить поправку на ImageBase и VirtualOffset.
     
  17. Desliner

    Desliner New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2009
    Сообщения:
    23
    Адрес:
    Heaven
    Y_Mur
    Нет, нет и нет. Базозависимость у кода быть должна, только база у него будет не та, где он реально расположен, а другая, которую задам я. И ни о какой самомодификации речи не идет. А расставлять метки перед всеми такими командами - это жуткий гемор.

    Что касается стандартной таблицы релоков - в моем случае гемора с ней будет не меньше. Потому, что линкер, в котором есть таблица релоков, должен будет либо:
    а) Открыть сам себя на диске, прочитать оттуда нужный кусок кода, прочитать оттуда релоки. Потом адреса, на кот. ссылаются релоки, нужно будет подправить для нужной ImageBase, учитывая свой ImageBase. И, наконец, записать готовый код.
    б) Прочитать в памяти нужный кусок кода, и... обломиться, т.к. релоки уже применены для текущей базы. Тогда все же прочитать откуда-нибудь релоки и снова работать с адресами, на кот. они указывают, учитывая, что образ уже загружен. Потом записать код в файл.

    Как можно видеть, работы здесь не мало. Хотелось бы найти более простое и элегантное решение.
    И релоки, и метки перед каждой такой инструкцией - это по сути одно и то же, только разный способ представления.


    Для всех, еще раз повторю основную суть задачи:
    нужно, чтобы компилятор думал, что proc1 начинается по некому адресу 0yyyyyyyyh
    То есть, все должно решаться на этапе компиляции.
     
  18. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Desliner
    Уж больно абстрактна твоя задача. Не понятно зачем это нужно, а раз не понятно, то и не понятно как это решать.
     
  19. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Desliner
    Продолжаешь плести какую-т ерунду и биться головой об стену ? ;)
    Открывать самого себя на диске ни к чему, т.к. можно читать все из образа в памяти. Никакого облома при чтении из памяти если "релоки уже применены для текущей базы" быть не может. Винда секцию релоков не сбрасывает, да и размещать ее в отдельной секции не обязательно. В таблице релоков указываются относительные RVA, а не абс.адреса. Дельта считается элементарно как нужный ImageBase минус текущий. В чем проблема-то ?
    Если не хочешь в сам "линкер" все эти пересчеты закладывать, то можно отдельную утилитку написать, которая заменит нужные адреса в "линкере" после его еомпиляции. Но тогда останется червячок сомнения - а вдруг винда сойдет с ума и при загрузке "линкера" изменит его ImageBase и все твои труды улетят коту под хвост ;)

    Если задача ставится в общем, то про "все должно решаться на этапе компиляции" можешь забыть - если только создать готовый экзешник и запихать его в ресурсы аль ишо куда, тогда уж точно твои 0yyyyyyyyh останутся в целости и сохранности ;)
     
  20. Desliner

    Desliner New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2009
    Сообщения:
    23
    Адрес:
    Heaven
    Booster
    Не понятно - не решайте. Я объяснил как мог.

    leo
    Я не отрицаю, что метод с релоками имеет право на жизнь, - да, здесь можно применить релоки. А целесообразно ли? Еще и отдельная утилитка... тогда уж лучше код, подлежащий записи, вынести в отдельный файл.
    Насчет "запихать его в ресурсы аль ишо куда" - екзешник не должен быть готовым, заранее известны только код и смещения.


    В связи с тем, что решение проблемы не предвидится, я начал выносить код в отдельный файл, сейчас это com файл.
    И возник вопрос: есть ли в MASMе аналог FASMовсокго use32?