Сейчас на форуме: zombi-vadim, zds (+4 невидимых) |
![]() |
eXeL@B —› Программирование —› Компиляция cl.exe -c /FAs /EHa |
Посл.ответ | Сообщение |
|
Создано: 10 декабря 2013 22:39 · Поправил: nen777w · Личное сообщение · #1 Добрый час! Пытаюсь решить непосильную задачу, но надежды не оставляю - скомпилировать ассемблерный output того что нагенерировал cl.exe Исходная программа: #include <iostream> using namespace std; int main() { std::cout << "Hello world!" << std::endl; return 0; } Этап первый когда с какого то перепугу cl в середине процедуры (перед объявлением секции) генреирует _TEXT ENDS, вроде пофиксил (пока что руками), в дальнейшем планирую написать скрипт. Втрой этап (адреса меток, насколько я понимаю): Объявляется сегмент: Code:
Насколько я правильно понимаю это генерация адреса метки в секции xdata$x ml.exe ругается: main.asm(4009) : error A2006:undefined symbol : __catch$?put@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV12@D@Z$0 Примечательно то что метка такая существует в процедуре: ?put@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV12@D@Z Может он не может ее найти потому что это неправильно сгенерировано синтаксически? Как в таком случае объявить это правильно? Что бы двигаться дальше, пока закоментировал все такие места. Теперь этап третий (линковка): ml.exe /coff main.asm Изначально это весь набор библиотек который сгенерировал сам cl.exe Code:
Путем поиска недостающих символов прямо в lib файлах я пришел вот к такому набору: Code:
Но всеравно это забороть не могу: C:\test>ml.exe /coff main.asm Microsoft (R) Macro Assembler Version 10.00.40219.01 Copyright (C) Microsoft Corporation. All rights reserved. Assembling: main.asm Microsoft (R) Incremental Linker Version 10.00.40219.01 Copyright (C) Microsoft Corporation. All rights reserved. /OUT:main.exe main.obj main.obj : error LNK2019: unresolved external symbol "class std::basic_ostream<char,struct std::char_traits<char> > std::cout" (?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A) referenced in function _main main.obj : error LNK2001: unresolved external symbol "public: virtual void * __thiscall std::runtime_error::`vector deleting destructor'(unsigned int)" (??_Eruntime_error@std@@UAEPAXI@Z) main.obj : error LNK2001: unresolved external symbol "public: virtual void * __thiscall std::ios_base::failure::`vector deleting destructor'(unsigned int)" (??_Efailure@ios_base@std@@UAEPAXI@Z) main.obj : error LNK2001: unresolved external symbol "public: virtual void * __thiscall std::system_error::`vector deleting destructor'(unsigned int)" (??_Esystem_error@std@@UAEPAXI@Z) main.exe : fatal error LNK1120: 4 unresolved externals Если оставить предлагаемый LIBCMT/D То будет ругаться на дубликаты. На всякий случай прилагаю файлы которые пытаюсь собрать: ![]() ![]() |
|
Создано: 10 декабря 2013 22:40 · Личное сообщение · #2 разработчиков защит здесь не жалуют вы спросите у своих на ктыве? может помогут ![]() |
|
Создано: 10 декабря 2013 23:40 · Личное сообщение · #3 |
|
Создано: 11 декабря 2013 01:10 · Поправил: nen777w · Личное сообщение · #4 reversecode пишет: разработчиков защит здесь не жалуют вы спросите у своих на ктыве? может помогут Я не разработчик защит, точнее я разработчик своей персональной защиты (для совего приложения) основаной на наномитах. Начальная тема c исходниками того что я делаю На RSDN я задал примерно тот же вопрос, выждал, но ответа нет, наверно потому что очень мало людей посещают форум "Низкоуровневое программирование", тут на exelab-е людей в этой теме значительно больше. neomant пишет: Вопрос в зачем? Ну уж если так хочется, можно посмотреть командные строки компилятора и линкера в настройках проекта. Смотрел, пробовал делать объектник ml.exe /coff /c main.asm а потом линковать его в бинарь link.exe с теми же ключами которые студия генерирует для простого консольного приложения - Не линкует ![]() В конеце концов, это может стать полезным вот в такой задаче: Как известно, начиная кажется с cl 9.0 64-bit в функции нельзя вставлять ассемблерные вставки (__asm - директиву запретили) в отличие от 32-битного cl. ![]() |
|
Создано: 11 декабря 2013 01:45 · Личное сообщение · #5 |
|
Создано: 11 декабря 2013 02:32 · Личное сообщение · #6 |
|
Создано: 11 декабря 2013 03:50 · Поправил: Gideon Vi · Личное сообщение · #7 nen777w пишет: На RSDN я задал примерно тот же вопрос, выждал, но ответа нет тебе ответили, не? Хм, вместо модификации ассемблерного листинга можно ведь править бинарник? В статье конечно говорится про преимущество листинга в виде однобайтовой мины для перехода любого размера, и соответствующие сложности с восстановлением, но ведь и в случае работы с бинарником можно сдвинуть весь код и пофиксить все джампы\коллы, условные переходы и смещения. Сложность в виде неоднозначности в определении предназначения операнда (смещение или похожая на смещение константа) отпадает благодаря релокам. армадилла с бинарником и работала. Достаточно map файла и простенького дизасма длин, дальше просто забиваешь все найденные 7x на cc в коде и генеришь таблицу. Все, больше ничего не надо. Хочешь сношаться с кактусом во имя мифических плюшек - do it self. зы. И да... времени на разработку очередной убер-вафли на наномитах уйдет больше, чем на её разбор. ![]() |
|
Создано: 11 декабря 2013 09:55 · Личное сообщение · #8 |
![]() |
eXeL@B —› Программирование —› Компиляция cl.exe -c /FAs /EHa |
Эта тема закрыта. Ответы больше не принимаются. |