Delphi -> MASM

Тема в разделе "WASM.RESEARCH", создана пользователем Barracuda, 13 дек 2004.

  1. Barracuda

    Barracuda New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2003
    Сообщения:
    19
    Подскажите, как можно использовать функцию из некоторого юнита, написанного на дельфях, в MASM'е?



    Я создал .obj файлы, указав в Project->Options->Linker 'Generate C .obj files'. Но когда пытаюсь слинковать потом этот объектник с моими масмовскими, то получаю:

    My.obj : fatal error LNK1123: failure during conversion to COFF: file invalid or corrupt



    Что можно исправить, чтобы эта ошибка не появлялась? Или может быть можно ещё как-то получить возможность использовать функции юнита?

    Причем хотелось бы именно статический вариант, .dll мне не очень подходит :-/



    Заранее спасибо всем ответившим :)
     
  2. SteelRat

    SteelRat New Member

    Публикаций:
    0
    Регистрация:
    26 авг 2004
    Сообщения:
    409
    Во первых надо придерживаться соглашения передачи параметров :) Там по другому, не через стэк, а через регистры eax, edx если мало параметров

    Во вторых поменять компилятор на TASM, Бормановские компиляторы не понимают .obj созданные MASM поэтому и выскакивает ошибка LNK1123 :dntknw:
     
  3. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    LNK1123 выдаёт MS link.exe при конвертации OMF формата объектника, который использует Borland.

    По крайней мере версии 5.012.8078 и 7.10.3052.



    Можно попробовать наоборот конвертить MASM'овый объектник посредством coff2omf.exe и линковать ilink32.exe

    Или сгенерить ASM файл и его уже компилировать MASM'ом после доработки напильником.



    А вообще SteelRat прав, проще TASM заюзать.
     
  4. Barracuda

    Barracuda New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2003
    Сообщения:
    19
    Спасибо за советы :)



    Проблема в том, что в юните, функции из которого мне нужны , используются юниты System и SysUtils :dntknw: Слишком много лишнего кода получается :-/



    Кстати идея с тасмом - очень хороша :) Он всё сразу схватил, если бы не размер кода, то это было бы лучшим решением.



    А нет ли какого-нибудь способа сделать статическую библиотеку, которую можно было бы использовать потом с масмом? ну или в крайнем случае хотя бы с тасмом? :)
     
  5. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Barracuda

    > Проблема в том, что в юните, функции из которого мне нужны , используются юниты System и SysUtils :dntknw: Слишком много лишнего кода получается :-/



    SysUtils добавляет ~30Kb к размеру exe'шника.

    Про System ничего не скажу, т.к. не пробовал.
     
  6. Barracuda

    Barracuda New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2003
    Сообщения:
    19


    System даже внешне выглядит громоздко. Мне к тому же стало лениво генерить .obj для всех юнитов, которые входят в System и SysUtils :) То есть у меня не получилось настроить Дельфю так, чтобы генерились .obj файлы для всех включенных юнитов, хотя переключатель Project->Options->Linker 'Generate C .obj files' установлен. Почему-то генерит .obj, только если написано UnitXXX in 'unitXXX.pas' и то только в том случае, когда удаляю соотв. .dcu файл. Короче как-то глючно :) А мне в настройках Дельфы копаться не сильно нравится, до этого никогда не пользовался ею :)



    Так что я не стал терзать .obj, а сделал так: создал .dll, в которую включил нужные мне юниты. Потом bin2db и она уже в MASMе :) При запуске просто распаковываю в temp и LoadLibrary+GetProcAddress :lol:



    Кстати, может кто-нибудь знает, как можно убрать лишний хлам из дельфовой .dll, пошаманив в настройках Дельфи? В том числе стандартные ресурсы, которые Дельфя пихает в .dll?
     
  7. SolidCode

    SolidCode New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2002
    Сообщения:
    162
    Адрес:
    Kazakhstan


    По-моему ресурсы можно вырезать любым редактором ресурсов. Другое сложнее.
     
  8. SolidCode

    SolidCode New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2002
    Сообщения:
    162
    Адрес:
    Kazakhstan
    Кстати, а почему бы DLL не запаковать? Это, конечно, не то, что ты спрашивал, но как крайний метод...
     
  9. Barracuda

    Barracuda New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2003
    Сообщения:
    19


    SolidCode, а всё, я уже даволен результатом :)

    К конечному exe-шнику чуть более 20 кил прибавляется (пожат UPXом), даже при оставленных ресурсах. Я посмотрел - они всего пару кб :)



    Главная 'тонкость' - отключить модуль Classes, который дельфя зачем-то по дефолту включает :) Таким образом 40 кб экономим :) (или ~20 по размеру конечного файла).
     
  10. SteelRat

    SteelRat New Member

    Публикаций:
    0
    Регистрация:
    26 авг 2004
    Сообщения:
    409
    Эти вопросы лучше на королевстве делфей задать, я тоже бился над удалением мусора, но без результатов, дельфя по умолчанию даже окно ввода пароля для подключения к БД в ресурсы сует и диалоги InputBox, так, что бы было :dntknw: Кажется и Classes отключал, только после этого чего-то добился...
     
  11. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    А ради чего такие потуги? Не проще ли переписать некоторую функцию на ассемблере?
     
  12. Barracuda

    Barracuda New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2003
    Сообщения:
    19
    Ради того, чтобы получить точно такую же функцию в масме :)

    На асме переписать - это конечно хорошо :) Но реализовывать криптографию на асме для каждого алгоритма - слишком долго :-/ Я вообще смог из этого юнита рипнуть нужный мне код с помощью IDA (правда поправлять пришлось изрядно :-/), но это слишком долго и не очень весело, особенно когда у функций большая вложенность. Плюс к этому IDA любит иногда писать вместо lea xxx, SomeDword[yyy] -> lea xxx, адрес_SomeDword_в_виде_числа[yyy], то есть просто не может отличить метку от числа. А такие команды достаточно часто встречаются в различных реализациях, потому что используется работа с таблицами.

    К тому же придется заменять все эти LStrAddRef, LStrAsgn и пр. на свой код.



    Существует, конечно же, масса уже готовых реализаций, но они не всегда подходят, то есть могут быть небольшие отличия, а могут совершенно менять суть дела. Например, взять тот же самый DES. Существуют несколько стандартов, которые имеют принципиальные отличия. А все готовые реализации гордо называют себя DES'ом и не пытаются указать стандарт, в соответствии с которым всё это было написано :) В такой ситуации найти аналог даже на Си проблематично.



    Просто мне хотелось получить какое-нибудь решение, которое было бы более или менее универсальным :) Чтобы можно было в следующий раз взять и вместо одной .dll подгрузить другую и использовать другой крипто-алгоритм.
     
  13. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    Barracuda

    System даже внешне выглядит громоздко. Мне к тому же стало лениво генерить .obj для всех юнитов, которые входят в System и SysUtils :)



    Попробуй поискать урезанный вариант модуля System, с ним минимальный размер DLL становится 7 килобайт вместо 13-ти. А потом нужные функции других модулей ручками вырезать из исходников Борланда и вставить в текст программы. Только про классы, строковые утилиты и т.п. придется забыть - размер моментально вырастет на десятки Кб. Можно еще решать задачу с другого конца: MASMовские исходники перегнать в формат TASM или сделать из них OBJ и впихнуть в программу на Delphi.
     
  14. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine


    Брать код Delphi для криптоалгоритмов… Лучше уж от VC++.