Здравствуйте! Написал скрипт на питончике, который из dll файлов делает .def файлы с экспортируемыми функциями и создает .lib для включения в исходные файлы .asm. Вопрос: В пакете разработчика link .inc файлы содержат следующую запись: Код (Text): extern __imp_ActivateKeyboardLayout:qword ActivateKeyboardLayout TEXTEQU <__imp_ActivateKeyboardLayout> для того, чтобы использовать условную функцию ActivateKeyboardLayout но в моем случае работает и со следующий строкой в файле .inc Код (Text): ActivateKeyboardLayout PROTO в чем разница? P.S если кому-то нужен мой DllToLib - ссылка на github
позвольте пару замечаний вслух 1) убрать хардкод directory = r"C:\Users\bidlo\Desktop\test" как вариант -параметр ком. строки? 2) добавить лицензию в шапку модуля + авторство 3) добавить try/catch ибо например утилита dumpbin или lib может не найтись
Спасибо за замечания, в следующий раз учту. На счет 1, так сделал, чтобы легче отлаживать было, каждый раз не вводить путь заново так как буфер обмена забивался кодом, а при релизе согласен - нужно менять на первоначальную версию. --- Сообщение объединено, 24 мар 2023 --- Разобрался самостоятельно в вопросе. Пример кода: Код (ASM): ; CONSOLE includelib user32.lib includelib kernel32.lib include win64.inc extern __imp_MessageBoxA:qword ExitProcess PROTO .code main proc local demmy:qword sub rsp, 40 mov rcx, 0 mov rdx, offset _str mov r8, offset _str mov r9, MB_OK call __imp_MessageBoxA mov rcx, 1 call ExitProcess main endp .data _str db "Hello World!", 0 end Оказывается, когда мы объявляем функцию с помощью директивы PROTO, то компилятор не знает где она находится, поэтому при компиляции в отладчике можно увидеть следующее: Для функции ExitProcess, создается так называемый Thunk (не нашел русской интерпретации), суть которого вызвать некую функцию, состоящую лишь из одного jmp, который перепрыгнет уже на ту функцию, которая нам нужна. Предполагаю, что это сделано потому, что, линкер в процессе сборки понял, что функция ExitProcess на самом деле является импортируемой, поэтому перепрыгнул на указатель в таблице импорта исходного файла (так ли это?). В случае же с функцией MessageBoxA, мы говорим компилятору, что она является сторонней (импортируемой) функцией, указывая ключевой слово extern и приставку __imp_ для функции MessageBoxA. В отладчике видно, что вызов функции __imp_MessageBoxA приводит к вызову MessageBoxA напрямую, так как __imp_MessageBoxA - ничто иное как указатель на MessageBoxA в таблице импорта. В целом, разница лишь в оптимизации кода, потому что работает и так и так, но во втором случае процессор выполняет на одну инструкцию меньше.
Ну и выкладываю улучшенную версию скрипта DllToLib&Inc, который вызывается с 3 параметрами командой строки: 1. Директория, где хранятся .dll файлы 2. Директория, куда сохранить полученные .lib файлы 3. Директория, куда сохранить полученные .inc файлы .inc файлы имеют вид: Код (Text): extern __imp_fun:qword fun TEXTEQU <__imp_fun> В итоге если вызвать - main.py C:\\Windows\System32 C:\\Lib\ C:\\Inc\ (в конце \ обязателен, иначе сохранит просто на диск C) получим готовые к использованию библиотеки для большинства (наверное) дллок системы.
mantissa, а чем тебя привлекает масм??? можно gcc использовать - там удобно встраивать асм части в яп а-ля с/с++.
Исключительно для образовательных целей и спортивного интереса, понятно, что для практической деятельности я выберу язык более высокого уровня.
асм далеко не всегда можно обойти - к примеру, играться с векторными регистрами лучше всего асмом, да и тот же 3oE (out-of-order execution) компиль не всегда хорошо оптимазит. но масм.. это зло-2.72..ие костыли. гсс позволяет интегрировать асм вставки в яп без танцев с бубном + получаем однотипный инструмент для разных осей
пару замечаний 1. можно ли автоматом добавлять слеш (ежели юзерь упустил), а то так и случилось у меня.. ведь ожидания явно писать в указанную папку а не уровнем выше 2. можно ли как-то обходить ненужные exports вида c:\tmp\incaaclient.inc Creating library c:\tmp\libaaclient.lib and object c:\tmp\libaaclient.exp c:\tmp\incaccessibilitycpl.inc c:\tmp\libaccessibilitycpl.def : warning LNK4104: export of symbol 'DllCanUnloadNow' should be PRIVATE c:\tmp\libaccessibilitycpl.def : warning LNK4104: export of symbol 'DllGetClassObject' should be PRIVATE c:\tmp\libaccessibilitycpl.def : warning LNK4104: export of symbol 'DllInstall' should be PRIVATE c:\tmp\libaccessibilitycpl.def : warning LNK4104: export of symbol 'DllRegisterServer' should be PRIVATE c:\tmp\libaccessibilitycpl.def : warning LNK4104: export of symbol 'DllUnregisterServer' should be PRIVATE Creating library c:\tmp\libaccessibilitycpl.lib and object c:\tmp\libaccessibilitycpl.exp c:\tmp\incACCTRES.inc 3. трейсбек получился такого вида Creating library c:\tmp\libAppIdPolicyEngineApi.lib and object c:\tmp\libAppIdPolicyEngineApi.exp Traceback (most recent call last): File "main.py", line 88, in <module> main() File "main.py", line 58, in main хорошо б подлечить Спасибо за ваш труд
Сделал так, чтобы вывод от lib выводился в nul, чтобы не захламлять консоль, сделал автоматическое добавление / и сделал, чтобы функции вида [noname] не добавлялись в .def файл и в .inc
Случайно не на то сообщение сверху ответил Внес еще изменения: убрал функцию для удаления [, вместо этого внес этот функционал в регулярное выражение поправил подсчет прогресса, теперь считает правильно прогресс из всех dll, до этого был прогресс из всех файлов директории добавил readme для чайников Проверьте теперь, пожалуйста, у меня отработало на 100% для всех 3420 dll из System32
Супер, хороший прогрес, но.. трейсбек все еще жив, курилка! подозрение на печать кириликом в консоль у меня винда англ, соотв консолька тоже а у вас?
У меня русскоязычная, поэтому меняю кодовую страницу на 65001 для отображения кириллических символов, попробуйте теперь: --- Сообщение объединено, 26 мар 2023 --- Залил проект на GitHub - https://github.com/babasuck/dllToLib Если найдутся недочеты или будут необходимы улучшения - обновлю там.
Порядок! все отработало как надо остались (очень) маленькие замечания вида 1) не указал последний аргумент - не ругается (лучше что руралось) 2) для компактности я б не печатал \n в строке прогресса, но сие - дело вкуса.. 3) проверять, что утилитки из VS есть в доступе, иначе будет молотить 1000+ раз на скрин
Спасибо, поправил. С сообщениями о прогрессе сделал с возвратом каретки - в консоли показывает, а вот в PyCharm почему-то нет.
Странно, после детекта присутсвия утилит у меня начало падать на одной длл из папки виндовса c:\Windows\System32\api-ms-win-downlevel-advapi32-l1-1-0.dll а у вас как? добавил ерр код (и печать файлов на последней версии с ГХ), вижу такое -
кажется знаю, в чем дело. если падает на lib.exe - то, скорее всего в этой Dll не было функций, кроме как [noname] и регулярное выражение их стерло, в итоге .def файл получился пустым и выбило ошибку. Был бы отдельный код ошибки, при отсутствии утилиты, но он есть лишь в теории, а на практике выбивает все равно 1, я проверял. Подумаю, как обыграть --- Сообщение объединено, 26 мар 2023 --- Опытном путем выяснил, что если команда не распознана (в нашем случае если dumpbin или lib не найдены), то выводит код ошибки 1. А при других ошибках, код другой. Сделал так - если код ошибки 1, то выходим, а если другая, то она связана с конкретной dll, выводим ошибку и продолжаем со следующей длл. Давайте проверим теперь.
Посмотрел данную дллку, в ней как рас очень много export API: 2) прогнав всю папку windows\system32 в итоге я вижу 193 .inc файла с нулевой длиной - не уверен что их надо вообще создавать, как думаете? 3) в папке lib кроме самих .lib файлов создаются еще .exp (кол-во 1 к 1) насколько я понял ето какой-то темп файл (ибо внутри я вижу пути на моем компе), может ух удалять опосля автоматом? или запускать утилиту lib так, чтоб она их не создавала? 4) последнее слово Finished наверное лучше печатать в новой строке, иначе оно пишется поверх строки прогресса что чуть конфузит пример
1. странно, надо посмотреть в инете, что за ошибка такая 2. сделал проверку на 0 3. это файлы экспорта, msdn Если честно не разобрался для чего они нужны, но вдруг пригодятся, добавлю возможность выбора их создания попозже 4. исправил