Сейчас на форуме: jinoweb (+6 невидимых) |
eXeL@B —› Программирование —› Библиотека импорта из DEF-файла |
. 1 . 2 . >> |
Посл.ответ | Сообщение |
|
Создано: 14 августа 2017 12:49 · Поправил: FalseMaster · Личное сообщение · #1 Дело в следующем. Пытаюсь перелинковать msvcrt.lib. Порядок действий был таков: выковырял из оригинальной либы объектники, и состряпал из выхлопа DumpBin DEF-файл, на основе которого собрал свою либу и скомпоновал её с выдранными объектниками. Процесс проходит без ошибок и ворнингов, при подключении созданной либы к проекту (DLL) тоже всё нормуль, но трабла в том, что в секцию импорта DLL'ки попадает имя _CxxThrowException@8, тогда как msvcrt.dll экспортирует _CxxThrowException. Вот Code:
|
|
Создано: 14 августа 2017 13:36 · Личное сообщение · #2 |
|
Создано: 14 августа 2017 14:02 · Личное сообщение · #3 |
|
Создано: 14 августа 2017 14:27 · Поправил: Vamit · Личное сообщение · #4 Я делал вот так и проблем не было: def Code:
.h Code:
Всё зависит от calling convention, если правильно задать, то не нужно никаких алиасов Добавлено спустя 37 минут Имена в .lib Code:
а в .dll как и в .def ----- Everything is relative... |
|
Создано: 14 августа 2017 15:06 · Личное сообщение · #5 |
|
Создано: 14 августа 2017 15:20 · Поправил: Vamit · Личное сообщение · #6 |
|
Создано: 14 августа 2017 15:36 · Личное сообщение · #7 |
|
Создано: 14 августа 2017 16:34 · Поправил: Vamit · Личное сообщение · #8 def к lib почти отношения не имеет (для lib он может только задать алиасы), def для dll задает импортируемое имя при линковке оной. А имя в lib создает компилятор из декларации. Ты lib как получаешь? FalseMaster пишет: Я не знаю способа получить _CxxThrowException@8 в LIB Дак это имя там и есть. FalseMaster пишет: что в секцию импорта DLL'ки попадает имя _CxxThrowException@8 А попадает оно откуда? Конечно же из либ. Def подключают при линковке dll, a не lib. ----- Everything is relative... |
|
Создано: 14 августа 2017 16:43 · Поправил: mysterio · Личное сообщение · #9 мысли в слух: А если так ? Code:
или Code:
Code:
где 578 - номер твоей функции в "blabla.dll" Смысл? Когда я пишу в DEF: EXPORTS __CxxThrowException@8 Смысл в том что при такой записи твой экспорт "указывает" в никуда - "потому как в msvcrt.dll такой функции нет"! и возможно имеет смысл записать это все так (учитывая подчеркивания и вариации имени конечно - на вкус и цвет): Code:
----- Don_t hate the cracker - hate the code. |
|
Создано: 14 августа 2017 17:01 · Поправил: FalseMaster · Личное сообщение · #10 Vamit >def к lib почти отношения не имеет Вообще-то DEF-файл – это самый оптимальный (по части писанины) способ создания LIB. >Ты lib как получаешь? Lib.exe /DEF:deffile.def /OUT:libname.lib >Дак это имя там и есть. Да, есть. И в оригинальном файле от MS и в моём, только при включении моего творения в проект, собранная DLL'ка импортирует _CxxThrowException@8 вместо _CxxThrowException. >А попадает оно откуда? Конечно же из либ. Только у меня LIB кривая получается. А почему, ума не приложу. mysterio >мысли в слух: А если так ? >или Смысл? Когда я пишу в DEF: Code:
>и с подчеркиваниями поиграться - одно или оба не нужны Одно нужно (недекорированное имя функции – _CxxThrowException), второе добавляет линкер. >и возможно имеет смысл записать это все так Не понял, в чём прикол? Ну объявил я дважды имя, которое компоновщику не всралось – он-то ищет __CxxThrowException@8 и не находит. |
|
Создано: 14 августа 2017 17:31 · Поправил: Vamit · Личное сообщение · #11 Давай сначала, при линковке dll создаются 2 файла lib и dll (остальные побоку), либ нужна для статического подключения длл в свой проект, а длл ну понятно для чего. либ может быть вообще пустой и содержать только декларации (этого достаточно чтобы проект понял что ему нужно импортировать). длл же содержит весь код obj файлов. Имена в obj файле и lib одинаковые, а в dll могут отличаться в пределах декорации или вообще отсутствовать (экспорт по ординалу). либ может содержать сколь угодно алиасов имен (в длл же только одно экспортиремое имя на единицу трансляции), проект берет любой из алиасов в либе попадающий под свою декларацию. Поэтому чтоб всё состыковать нужно знать что хочешь, т.к. можно оставить в dll _CxxThrowException@8 и задекларировать её в проекте под это определение или линковать длл сразу с нужным именем. Теперь как ты получаешь длл? Или длл ты используешь оригинальную? FalseMaster пишет: Только у меня LIB кривая получается. У тебя не либ кривая, а длл кривая. Добавлено спустя 8 минут А вообще-то цель всего этого какая? ----- Everything is relative... |
Ранг: 419.0 (мудрец), 647thx Активность: 0.46↗0.51 Статус: Участник "Тибериумный реверсинг" |
Создано: 14 августа 2017 17:45 · Личное сообщение · #12 FalseMaster пишет: а, есть. И в оригинальном файле от MS и в моём, только при включении моего творения в проект, собранная DLL'ка импортирует _CxxThrowException@8 вместо _CxxThrowException. А если crt-шный код выкинуть вообще?? В смысле точку входа на свою поменять и запретить cpp-исключения в опциях. Или это уже сделано было??! |
|
Создано: 14 августа 2017 18:10 · Личное сообщение · #13 Vamit >Давай сначала, при линковке dll создаются 2 файла lib и dll Давай. Но ты почему-то начал с конца. А с начала будет так. При генерации LIB создаются 2 файла: собственно LIB и EXP, который удаляется за ненадобностью. LIB же объединяется с ранее выдранными объектниками. Затем сие детище подрубается к проекту DLL вместо оригинальной msvcrt.lib и получается вышеописанная жопа. >проект берет любой из алиасов в либе попадающий под свою декларацию. Так он и берёт _CxxThrowException@8, но и импортирует в декорированном виде из-за кривизны LIB. >задекларировать её в проекте под это определение Нельзя ничего задекларировать. Эта функция из сишного рантайма и имеет тип вызова stdcall (выход по ret 8). >Теперь как ты получаешь длл? Компилирую из овердохуа сурса, а вот слинковать не получается. >У тебя не либ кривая, а длл кривая. DLL никак не может быть кривой, ибо с родной MS'овоской msvcrt.lib собирается на ура и с импортом всё в порядке. >А вообще-то цель всего этого какая? Забабахать "полноприводную" (со всеми импортами из msvcrt.dll) msvcrt.lib и собрать проект (чужой). ELF_7719116 >А если crt-шный код выкинуть вообще? Невозможно. Проект состоит из нескольких DLL и EXE, и все они плотно завязаны на CRT (задействовано множество API'шек). |
|
Создано: 14 августа 2017 18:28 · Поправил: Vamit · Личное сообщение · #14 Забабахать "полноприводную" (со всеми импортами из msvcrt.dll) msvcrt.lib и собрать проект (чужой). Нихрена не понял, проект после компиляции какую длл будет использовать? Слинкованную тобой, оригинальную или вообще без оной - статическая линковка. А создание либ это не цель, это прослойка) DLL никак не может быть кривой, ибо с родной MS'овоской msvcrt.lib собирается на ура и с импортом всё в порядке. Опять не в ту сторону пошел, понятно что оригинальные либ и длл стыкуются, или тут либ оригинальная а длл твоя. Но чуть выше отвечаешь на вопрос как слинковать длл - а вот слинковать не получается , значит своей длл ты не получил. Добавлено спустя 4 минуты ЗЫ: И ник у тебя под стать написанному, надо было назваться TrueMaster, тогда бы всё получилось Шутка конечно. ----- Everything is relative... |
Ранг: 419.0 (мудрец), 647thx Активность: 0.46↗0.51 Статус: Участник "Тибериумный реверсинг" |
Создано: 14 августа 2017 18:45 · Личное сообщение · #15 FalseMaster пишет: Невозможно. Проект состоит из нескольких DLL и EXE, и все они плотно завязаны на CRT (задействовано множество API'шек). А если все функи сделать как static linked, и выкинуть оригинальную msvcrt. Просто, я тож не совсем понял как и Vamit, если Ваша dll это враппер, который пихается между оригинальной msvcrt - exe'шник, а-ля "мостик", зачем обязательно вязать всё жестко вязать через LIB & MAP & crt, а просто взять и сделать обычный враппер или хуки. В конце концов, можно и таблицу импорта самому поправить :/ |
|
Создано: 14 августа 2017 18:59 · Поправил: FalseMaster · Личное сообщение · #16 Vamit >проект после компиляции какую длл будет использовать? Виндовую, ту что в "System32" проживает. >А создание либ это не цель, это прослойка Так-то да, но необходимая, поэтому можно сказать, часть цели. Да и в будущем бы пригодилась. >или тут либ оригинальная а длл твоя Наоборот же. Я перелинковываю библиотеку импорта, т.к. она неполноценная. Но оно, сцуко, сопротивляетсо. >значит своей длл ты не получил. Той, что является частью проекта, само собой не получил (с валидным импортом), т.к. не могу создать LIB, такой же как у MS. Тут определённо есть какая-то тайна. >надо было назваться TrueMaster Ну, теперь уж поздно пить Боржоми ELF_7719116 >А если все функи сделать как static linked Тогда всё заработает, но это не мой метод, я всегда использую динамичесое связывание. >если Ваша dll это враппер, который пихается между оригинальной msvcrt Моя DLL – это часть большого проекта. Между ней и msvcrt.dll никаких прослоек нет, просто у меня не получается импортировать функцию из msvcrt.dll, потому что по неясным причинам создаётся корявый LIB-файл. >В конце концов, можно и таблицу импорта самому поправить Хм, а это вариант. Костыль конечно, но если не найду решения, то придётся видимо пойти этим путём. |
|
Создано: 14 августа 2017 19:16 · Поправил: difexacaw · Личное сообщение · #17 Рантайм пытаются обычно выпилить, а не использовать. Это делает приложение не стабильным и вообще не рабочим из за отсутствия этих десятков пустых ртл, которые ничего не делают в системе. Быть может вы не правильно понимаете задачу ? При запуске апп с кучей этого дерьма в импорте выводится загрузочный фейл. Иногда есчо нужно это говно регистрировать regsvr. Это хорошо что оно не запускается. Так как такое апп никуда не годится, скорее всего оно вредоносно. ----- vx |
|
Создано: 14 августа 2017 19:46 · Поправил: FalseMaster · Личное сообщение · #18 difexacaw >Рантайм пытаются обычно выпилить, а не использовать. Проект не мой. Он опенсорсный, скачанный c GitHub'а. Написан так, как написан, я ничего с этим поделать не могу, хочу лишь его скомпилить (внеся некоторые поправки). >Иногда есчо нужно это говно регистрировать regsvr. Отвязка от реестра для меня давно уже не представляет сложности. Инжектим DLL'ку, сплайсим NtCreateKey, вызываем DllRegisterServer и всего делов. |
|
Создано: 14 августа 2017 19:52 · Поправил: difexacaw · Личное сообщение · #19 FalseMaster > Инжектим DLL'ку, сплайсим NtCreateKey, вызываем DllRegisterServer и всего делов. И получаем результат блокировку системой/проактивкой/анализером со всеми вытекающими последствиями(залив на ав сканер и ваше апп уже на апп). Но конечно если вы это апп запускаете у себя на машине в дебаг моде, то конечно же это не проблема. Как и весь этот паганый ртл-импорт, ставить 20 гб студию что бы ваши окна запустить.. ----- vx |
|
Создано: 14 августа 2017 19:56 · Личное сообщение · #20 FalseMaster пишет: Виндовую, ту что в "System32" проживает. Тогда вообще непонятно, зачем вам нужна самопальная либа, больше чем есть в экспорте оригинальной длл всё равно через неё не достать, а оригинальный .lib файл есть - вот и используйте его. Самопальные либы нужны только в одном случае, если нужно к своему приложению прицепить чужую длл, для которой отсутствует либ файл. Что-то вы тут темните и не раскрываете цель. ----- Everything is relative... |
|
Создано: 14 августа 2017 20:28 · Поправил: FalseMaster · Личное сообщение · #21 difexacaw >И получаем результат блокировку системой/проактивкой/анализером У меня ничего такого не наблюдается… ну бывает авер изредка ругнётся на инжектируемый бинарь (пара прецедентов на пару сотен ущученных прог). Но я его включаю только при выходе в и-нет, а в это время как правило софт массированно не юзаю. >ставить 20 гб студию что бы ваши окна запустить.. Не знаю, что ты там себе напридумывал… У меня VC весит всего 60 метров вкупе с рантаймом сразу от нескольких версий – по нынешним меркам это совсем немного. Vamit >больше чем есть в экспорте оригинальной длл всё равно через неё не достать Так в том-то и дело, что msvcrt.lib предоставляет не весь экспорт соответствующего бинарника. Я потому и затеял это всё. >Что-то вы тут темните и не раскрываете цель. Мля, я могу выложить LIB и DLL msvcrt, сам сравнишь. Да и на своей машине можешь глянуть: к примеру _resetstkoflw в LIB-файле отсутствует, и она не единственная. |
|
Создано: 14 августа 2017 21:11 · Личное сообщение · #22 FalseMaster пишет: msvcrt.lib предоставляет не весь экспорт соответствующего бинарника Тогда сделай только враппер на недостающие функции, создаешь .h файл с декларациями, .cpp с пустыми телами фунок, .def с экспортом имен из оригинальной dll, компилишь либу, подключаешь в проект, ссылаешься на оригинальную длл и усё. ----- Everything is relative... |
|
Создано: 14 августа 2017 21:28 · Поправил: dosprog · Личное сообщение · #23 |
|
Создано: 15 августа 2017 20:15 · Личное сообщение · #24 FalseMaster Я когда ксед линковал, то заколхозил его сишный импорт. Забил пустые стабы. Иначе пришлось бы руками фиксить компилятор и его модуля. И по дефолту там тоже крэп линкуется, который киляется через /nodefaultlib. Процесс компиляции закрытый и это всё цепочка извратов с не своими модулями. Это врядле можно ровным способом решить. Или собирать целый исходный проект или фиксить вручную конечный бинарь. ----- vx |
|
Создано: 16 августа 2017 13:40 · Поправил: FalseMaster · Личное сообщение · #25 Итак, раз уж народ дёрнул, было бы дурным тоном не отчитаться. В общем, когда я ломал голову над сабжем, из глубин моей дырявой памяти всплыло некое смутное воспоминание. Полез я в дистриб VC и да, оно было там – сурсы рантайма. Заглянул в образец DEF-файла; все три наших барана (_CxxThrowException, __CxxLongjmpUnwind, _seh_longjmp_unwind) объявлены без "собаки" и размера аргументов. Чудеса да и только (в теле либы-то они заманглены). Думал я думал и не придумал ничего лучше, чем подцепить объектник с алиасами к своей кастомной либе. Свершилось! DLL'ка из проекта собралась с валидным импортом. Что в итоге: |
|
Создано: 16 августа 2017 15:38 · Личное сообщение · #26 |
|
Создано: 16 августа 2017 21:24 · Поправил: dosprog · Личное сообщение · #27 |
|
Создано: 17 августа 2017 06:15 · Личное сообщение · #28 Vamit >Я тебе дал решение, которое 100% рабочее Возможно, хотя есть сомнения, т.к. я пробовал оформлять экспорт через директиву /EXPORT (а компиль сишный именно это и делает, преобразуя __declspec(dllexport) в опцию линкера) – результат был такой же как и через DEF-файл, т.е. никакой. В любом случае, моё-то чем хуже? Сработало ведь. dosprog >Приходится делать объявления в asm-файле А вот кренделям из мелкософта не приходится. И мне бы хотелось знать их секрет. >Vamit, кстати, писал о том же самом. Не совсем. |
|
Создано: 10 января 2018 13:10 · Поправил: dosprog · Личное сообщение · #29 FalseMaster пишет: А вот кренделям из мелкософта не приходится. И мне бы хотелось знать их секрет. Так у них не фиктивные LIB'ы, а реальные, от линковки реальных библиотек. Ото и весь секрет. Те PROTO нужны для получения нормального "фиктивного" LIB-файла. В реальных, у микрософтовцев, тоже всё так же само. |
|
Создано: 10 января 2018 19:46 · Поправил: BlackCode · Личное сообщение · #30 С подобным я сталкивался когда компилил статическую sqlite3.lib для своего проекта. Так вот запарился я с тем, что собираю статику и в импорт попадает вместо msvcrt.dll - msvcrt120.dll Т.е. совместимость вниз ровно до msvcrt120. Плюс ко всему студия лепила .СRT секцию в которой ничего не было. С матами решил проблему скомпилив статику sqlite3 в VC6 под ХР.. Все За то у меня щас есть адекватная sqlite3.lib, которую могу ликовать к любому проекту.. правда только х86 P.S. Подобная трабла не только с либами. К примеру, если я в свой проект воткну сейчас функу из msvcrt, так МАСМ втыкает msvcrt120. Как с этим бороться хз по сей день |
. 1 . 2 . >> |
eXeL@B —› Программирование —› Библиотека импорта из DEF-файла |