Скрипт для автоматического создания lib из dll

Тема в разделе "WASM.X64", создана пользователем mantissa, 23 мар 2023.

Метки:
  1. mantissa

    mantissa Мембер Команда форума

    Публикаций:
    0
    Регистрация:
    9 сен 2022
    Сообщения:
    139
    Здравствуйте! Написал скрипт на питончике, который из dll файлов делает .def файлы с экспортируемыми функциями и создает .lib для включения в исходные файлы .asm.
    Вопрос:
    В пакете разработчика link .inc файлы содержат следующую запись:

    Код (Text):
    1. extern __imp_ActivateKeyboardLayout:qword
    2. ActivateKeyboardLayout TEXTEQU <__imp_ActivateKeyboardLayout>
    для того, чтобы использовать условную функцию ActivateKeyboardLayout
    но в моем случае работает и со следующий строкой в файле .inc
    Код (Text):
    1. ActivateKeyboardLayout PROTO
    в чем разница?

    P.S если кому-то нужен мой DllToLib - ссылка на github
     
    Последнее редактирование: 26 мар 2023
  2. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    342
    позвольте пару замечаний вслух
    1) убрать хардкод
    directory = r"C:\Users\bidlo\Desktop\test"
    как вариант -параметр ком. строки?
    2) добавить лицензию в шапку модуля + авторство
    3) добавить try/catch ибо например утилита dumpbin или lib может не найтись
     
  3. mantissa

    mantissa Мембер Команда форума

    Публикаций:
    0
    Регистрация:
    9 сен 2022
    Сообщения:
    139
    Спасибо за замечания, в следующий раз учту. :thank_you: На счет 1, так сделал, чтобы легче отлаживать было, каждый раз не вводить путь заново так как буфер обмена забивался кодом, а при релизе согласен - нужно менять на первоначальную версию.
    --- Сообщение объединено, 24 мар 2023 ---
    Разобрался самостоятельно в вопросе.
    Пример кода:
    Код (ASM):
    1. ; CONSOLE
    2. includelib user32.lib
    3. includelib kernel32.lib
    4. include win64.inc
    5.  
    6. extern __imp_MessageBoxA:qword
    7. ExitProcess PROTO
    8.  
    9. .code
    10.  
    11. main proc
    12. local demmy:qword
    13. sub rsp, 40
    14. mov rcx, 0
    15. mov rdx, offset _str
    16. mov r8, offset _str
    17. mov r9, MB_OK
    18. call __imp_MessageBoxA
    19. mov rcx, 1
    20. call ExitProcess
    21. main endp
    22.  
    23. .data
    24. _str db "Hello World!", 0
    25.  
    26. end
    27.  
    28.  
    Оказывается, когда мы объявляем функцию с помощью директивы PROTO, то компилятор не знает где она находится, поэтому при компиляции в отладчике можно увидеть следующее:
    upload_2023-3-24_13-15-33.png
    Для функции ExitProcess, создается так называемый Thunk (не нашел русской интерпретации), суть которого вызвать некую функцию, состоящую лишь из одного jmp, который перепрыгнет уже на ту функцию, которая нам нужна. Предполагаю, что это сделано потому, что, линкер в процессе сборки понял, что функция ExitProcess на самом деле является импортируемой, поэтому перепрыгнул на указатель в таблице импорта исходного файла (так ли это?).
    В случае же с функцией MessageBoxA, мы говорим компилятору, что она является сторонней (импортируемой) функцией, указывая ключевой слово extern и приставку __imp_ для функции MessageBoxA. В отладчике видно, что вызов функции __imp_MessageBoxA приводит к вызову MessageBoxA напрямую, так как __imp_MessageBoxA - ничто иное как указатель на MessageBoxA в таблице импорта.
    upload_2023-3-24_13-20-6.png
    В целом, разница лишь в оптимизации кода, потому что работает и так и так, но во втором случае процессор выполняет на одну инструкцию меньше.
     
  4. mantissa

    mantissa Мембер Команда форума

    Публикаций:
    0
    Регистрация:
    9 сен 2022
    Сообщения:
    139
    Ну и выкладываю улучшенную версию скрипта DllToLib&Inc, который вызывается с 3 параметрами командой строки:
    1. Директория, где хранятся .dll файлы
    2. Директория, куда сохранить полученные .lib файлы
    3. Директория, куда сохранить полученные .inc файлы
    .inc файлы имеют вид:
    Код (Text):
    1. extern __imp_fun:qword
    2. fun TEXTEQU <__imp_fun>
    В итоге если вызвать - main.py C:\\Windows\System32 C:\\Lib\ C:\\Inc\ (в конце \ обязателен, иначе сохранит просто на диск C) получим готовые к использованию библиотеки для большинства (наверное) дллок системы.
     

    Вложения:

    • main.zip
      Размер файла:
      1,3 КБ
      Просмотров:
      99
    Последнее редактирование: 24 мар 2023
    alex_dz нравится это.
  5. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.088
    mantissa, а чем тебя привлекает масм??? можно gcc использовать - там удобно встраивать асм части в яп а-ля с/с++.
     
  6. mantissa

    mantissa Мембер Команда форума

    Публикаций:
    0
    Регистрация:
    9 сен 2022
    Сообщения:
    139
    Исключительно для образовательных целей и спортивного интереса, понятно, что для практической деятельности я выберу язык более высокого уровня.
     
  7. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.088
    асм далеко не всегда можно обойти - к примеру, играться с векторными регистрами лучше всего асмом, да и тот же 3oE (out-of-order execution) компиль не всегда хорошо оптимазит. но масм.. это зло-2.72..ие костыли. гсс позволяет интегрировать асм вставки в яп без танцев с бубном + получаем однотипный инструмент для разных осей :)
     
  8. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    342
    пару замечаний

    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

    хорошо б подлечить


    Спасибо за ваш труд
     
    mantissa нравится это.
  9. mantissa

    mantissa Мембер Команда форума

    Публикаций:
    0
    Регистрация:
    9 сен 2022
    Сообщения:
    139
    Сделал так, чтобы вывод от lib выводился в nul, чтобы не захламлять консоль, сделал автоматическое добавление / и сделал, чтобы функции вида [noname] не добавлялись в .def файл и в .inc
     

    Вложения:

    • main.zip
      Размер файла:
      1,3 КБ
      Просмотров:
      101
    alex_dz нравится это.
  10. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    342
    Спасибо
    еще трейсбек остался
    я так понимаю он тригериться когда 100 елементов доходит
     
  11. mantissa

    mantissa Мембер Команда форума

    Публикаций:
    0
    Регистрация:
    9 сен 2022
    Сообщения:
    139
    Случайно не на то сообщение сверху ответил :)
    Внес еще изменения:
    • убрал функцию для удаления [, вместо этого внес этот функционал в регулярное выражение
    • поправил подсчет прогресса, теперь считает правильно прогресс из всех dll, до этого был прогресс из всех файлов директории
    • добавил readme для чайников

    Проверьте теперь, пожалуйста, у меня отработало на 100% для всех 3420 dll из System32
     

    Вложения:

    • dllToLib.zip
      Размер файла:
      1,6 КБ
      Просмотров:
      108
    alex_dz нравится это.
  12. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    342
    Супер, хороший прогрес, но..
    трейсбек все еще жив, курилка!

    upload_2023-3-25_17-3-43.png


    подозрение на печать кириликом в консоль

    у меня винда англ, соотв консолька тоже
    а у вас?
     
  13. mantissa

    mantissa Мембер Команда форума

    Публикаций:
    0
    Регистрация:
    9 сен 2022
    Сообщения:
    139
    У меня русскоязычная, поэтому меняю кодовую страницу на 65001 для отображения кириллических символов, попробуйте теперь:

    --- Сообщение объединено, 26 мар 2023 ---
    Залил проект на GitHub - https://github.com/babasuck/dllToLib
    Если найдутся недочеты или будут необходимы улучшения - обновлю там.
     

    Вложения:

    • dllToLib.zip
      Размер файла:
      1,6 КБ
      Просмотров:
      105
    GRAFik и alex_dz нравится это.
  14. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    342
    Порядок! все отработало как надо
    остались (очень) маленькие замечания вида
    1) не указал последний аргумент - не ругается (лучше что руралось)
    upload_2023-3-26_9-40-49.png

    2) для компактности я б не печатал \n в строке прогресса, но сие - дело вкуса..
    3) проверять, что утилитки из VS есть в доступе, иначе будет молотить 1000+ раз на скрин
    upload_2023-3-26_9-44-41.png
     
    mantissa нравится это.
  15. mantissa

    mantissa Мембер Команда форума

    Публикаций:
    0
    Регистрация:
    9 сен 2022
    Сообщения:
    139
    Спасибо, поправил. С сообщениями о прогрессе сделал с возвратом каретки - в консоли показывает, а вот в PyCharm почему-то нет.
     
    alex_dz нравится это.
  16. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    342
    Странно, после детекта присутсвия утилит у меня начало падать на одной длл из папки виндовса

    c:\Windows\System32\api-ms-win-downlevel-advapi32-l1-1-0.dll

    а у вас как?
    добавил ерр код (и печать файлов на последней версии с ГХ), вижу такое -

    upload_2023-3-26_12-5-0.png
     
  17. mantissa

    mantissa Мембер Команда форума

    Публикаций:
    0
    Регистрация:
    9 сен 2022
    Сообщения:
    139
    кажется знаю, в чем дело. если падает на lib.exe - то, скорее всего в этой Dll не было функций, кроме как [noname] и регулярное выражение их стерло, в итоге .def файл получился пустым и выбило ошибку. Был бы отдельный код ошибки, при отсутствии утилиты, но он есть лишь в теории, а на практике выбивает все равно 1, я проверял. Подумаю, как обыграть
    --- Сообщение объединено, 26 мар 2023 ---
    Опытном путем выяснил, что если команда не распознана (в нашем случае если dumpbin или lib не найдены), то выводит код ошибки 1. А при других ошибках, код другой.
    Сделал так - если код ошибки 1, то выходим, а если другая, то она связана с конкретной dll, выводим ошибку и продолжаем со следующей длл.
    Давайте проверим теперь.
     
  18. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    342
    Посмотрел данную дллку, в ней как рас очень много export API:

    upload_2023-3-26_18-27-45.png

    2) прогнав всю папку windows\system32
    в итоге я вижу 193 .inc файла с нулевой длиной - не уверен что их надо вообще создавать, как думаете?

    3) в папке lib кроме самих .lib файлов создаются еще .exp (кол-во 1 к 1)
    насколько я понял ето какой-то темп файл (ибо внутри я вижу пути на моем компе), может ух удалять опосля автоматом? или запускать утилиту lib так, чтоб она их не создавала?

    4) последнее слово Finished наверное лучше печатать в новой строке, иначе оно пишется поверх строки прогресса что чуть конфузит :)
    пример
    upload_2023-3-26_18-35-4.png
     
  19. mantissa

    mantissa Мембер Команда форума

    Публикаций:
    0
    Регистрация:
    9 сен 2022
    Сообщения:
    139
    1. странно, надо посмотреть в инете, что за ошибка такая
    2. сделал проверку на 0
    3. это файлы экспорта, msdn Если честно не разобрался для чего они нужны, но вдруг пригодятся, добавлю возможность выбора их создания попозже
    4. исправил