Сейчас на форуме: zombi-vadim, zds (+4 невидимых)

 eXeL@B —› Программирование —› Компиляция cl.exe -c /FAs /EHa
Посл.ответ Сообщение

Ранг: 4.7 (гость)
Активность: 0.010
Статус: Участник

Создано: 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:
  1. xdata$x    SEGMENT
  2.  ; В котором есть вот такая строчка:
  3.     DD FLAT:__catch$?put@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV12@D@Z$0
  4. __tryblocktable$?put@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV12@D@Z DD 01H
  5.  ;....
  6. xdata$x    ENDS


Насколько я правильно понимаю это генерация адреса метки в секции 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:
  1. INCLUDELIB LIBCMT
  2. INCLUDELIB OLDNAMES


Путем поиска недостающих символов прямо в lib файлах я пришел вот к такому набору:
Code:
  1. INCLUDELIB msvcrt
  2. INCLUDELIB msvcprt
  3. INCLUDELIB kernel32        


Но всеравно это забороть не могу:
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
То будет ругаться на дубликаты.
На всякий случай прилагаю файлы которые пытаюсь собрать:


70a7_10.12.2013_EXELAB.rU.tgz - main.asm




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 10 декабря 2013 22:40
· Личное сообщение · #2

разработчиков защит здесь не жалуют
вы спросите у своих на ктыве? может помогут

| Сообщение посчитали полезным: ARCHANGEL


Ранг: 164.6 (ветеран), 65thx
Активность: 0.120
Статус: Участник
Волшебник

Создано: 10 декабря 2013 23:40
· Личное сообщение · #3

Вопрос в зачем?
Ну уж если так хочется, можно посмотреть командные строки компилятора и линкера в настройках проекта.

-----
Следуй за белым кроликом




Ранг: 4.7 (гость)
Активность: 0.010
Статус: Участник

Создано: 11 декабря 2013 01:10 · Поправил: nen777w
· Личное сообщение · #4

reversecode пишет:
разработчиков защит здесь не жалуют
вы спросите у своих на ктыве? может помогут

Я не разработчик защит, точнее я разработчик своей персональной защиты (для совего приложения) основаной на наномитах. Начальная тема c исходниками того что я делаю доступна на RSDN, в том виде в котором она сейчас есть защитой ее назвать ИМХО трудно.
На RSDN я задал примерно тот же вопрос, выждал, но ответа нет, наверно потому что очень мало людей посещают форум "Низкоуровневое программирование", тут на exelab-е людей в этой теме значительно больше.

neomant пишет:
Вопрос в зачем?
Ну уж если так хочется, можно посмотреть командные строки компилятора и линкера в настройках проекта.


Смотрел, пробовал делать объектник ml.exe /coff /c main.asm а потом линковать его в бинарь link.exe
с теми же ключами которые студия генерирует для простого консольного приложения - Не линкует

В конеце концов, это может стать полезным вот в такой задаче: Как известно, начиная кажется с cl 9.0 64-bit в функции нельзя вставлять ассемблерные вставки (__asm - директиву запретили) в отличие от 32-битного cl.



Ранг: 6.0 (гость), 2thx
Активность: 0.010
Статус: Участник

Создано: 11 декабря 2013 01:45
· Личное сообщение · #5

Залейте обьектник ибо в нём как мне кажется чегото не хватает, попробуйте собрать менее весомый исходник, так наверно проще будет




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 11 декабря 2013 02:32
· Личное сообщение · #6

nen777w пишет:
Пытаюсь решить непосильную задачу, но надежды не оставляю - скомпилировать ассемблерный output того что нагенерировал cl.exe

все таки озвучте зачем вы ее пытаетесь решить, что бы все поняли что это будущая защита методом наномитов по асм файлу который потом будет компилится обратно




Ранг: 1131.7 (!!!!), 447thx
Активность: 0.670.2
Статус: Участник

Создано: 11 декабря 2013 03:50 · Поправил: Gideon Vi
· Личное сообщение · #7

nen777w пишет:
На RSDN я задал примерно тот же вопрос, выждал, но ответа нет


тебе ответили, не?

Хм, вместо модификации ассемблерного листинга можно ведь править бинарник? В статье конечно говорится про преимущество листинга в виде однобайтовой мины для перехода любого размера, и соответствующие сложности с восстановлением, но ведь и в случае работы с бинарником можно сдвинуть весь код и пофиксить все джампы\коллы, условные переходы и смещения. Сложность в виде неоднозначности в определении предназначения операнда (смещение или похожая на смещение константа) отпадает благодаря релокам.
армадилла с бинарником и работала. Достаточно map файла и простенького дизасма длин, дальше просто забиваешь все найденные 7x на cc в коде и генеришь таблицу. Все, больше ничего не надо.

Хочешь сношаться с кактусом во имя мифических плюшек - do it self.

зы. И да... времени на разработку очередной убер-вафли на наномитах уйдет больше, чем на её разбор.

| Сообщение посчитали полезным: ClockMan


Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 11 декабря 2013 09:55
· Личное сообщение · #8

Ошиблись форумом, это не форум по защите софта, если что. И про метод уже достаточно сказали, что сделан через одно место, или ещё раз стоит намекнуть?


 eXeL@B —› Программирование —› Компиляция cl.exe -c /FAs /EHa
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати