Автоматизировать создание inc- и lib-файлов

Тема в разделе "WASM.BEGINNERS", создана пользователем Mikl___, 10 июл 2017.

  1. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709
    1. Для получения содержимого системной dll использую bat-файл
      Код (Text):
      1. ::стираю с экрана
      2. cls
      3. ::устанавливаю путь и имя файла
      4. set masm64_path=\masm64\
      5. set filename=user32
      6. %masm64_path%bin\dumpbin.exe /EXPORTS %windir%\System32\%filename%.dll /OUT:%filename%.txt
      7.  
    2. содержимое user32.txt
      Код (Text):
      1. Dump of file C:\Windows\System32\user32.dll
      2. File Type: DLL
      3.   Section contains the following exports for USER32.dll
      4.     00000000 characteristics
      5.     4CE799CD time date stamp Sat Nov 20 17:50:05 2010
      6.         0.00 version
      7.         1500 ordinal base
      8.         1003 number of functions
      9.          830 number of names
      10.     ordinal hint RVA      name
      11.        1502    0 000083C0 ActivateKeyboardLayout
      12.        1503    1 0002AD40 AddClipboardFormatListener
      13.        1504    2 000235B8 AdjustWindowRect
      14.        1505    3 00017CE4 AdjustWindowRectEx
      15.  ....
      16.        2341  33C 0007B430 wvsprintfA
      17.        2342  33D 00020BFC wvsprintfW
      18.        1500      0002B260 [NONAME]
      19.        1501      0002AE80 [NONAME]
      20. ....
      21.   Summary
      22.         2000 .data
      23.         A000 .pdata
      24.        10000 .rdata
      25.         1000 .reloc
      26.        5B000 .rsrc
      27.        81000 .text
      Далее вручную создаю из user32.txt файлы user32.def и user32.inc
    3. содержимое user32.inc
      Код (Text):
      1. extern __imp_user32_ordinal1500:qword
      2. user32_ordinal1500 TEXTEQU <__imp_user32_ordinal1500>
      3. extern __imp_user32_ordinal1501:qword
      4. user32_ordinal1501 TEXTEQU <__imp_user32_ordinal1501>
      5. extern __imp_ActivateKeyboardLayout:qword
      6. ActivateKeyboardLayout TEXTEQU <__imp_ActivateKeyboardLayout>
      7. extern __imp_AddClipboardFormatListener:qword
      8. AddClipboardFormatListener TEXTEQU <__imp_AddClipboardFormatListener>
      9. extern __imp_AdjustWindowRect:qword
      10. AdjustWindowRect TEXTEQU <__imp_AdjustWindowRect>
      11. extern __imp_AdjustWindowRectEx:qword
      12. AdjustWindowRectEx TEXTEQU <__imp_AdjustWindowRectEx>
      13. extern __imp_AlignRects:qword
      14. ...
    4. содержимое user32.def
      Код (Text):
      1. EXPORTS
      2. user32_ordinal1500=ordinal1500 @1500 NONAME
      3. user32_ordinal1501=ordinal1501 @1501 NONAME
      4. ActivateKeyboardLayout=__imp_ActivateKeyboardLayout
      5. AddClipboardFormatListener=__imp_AddClipboardFormatListener
      6. AdjustWindowRect=__imp_AdjustWindowRect
      7. AdjustWindowRectEx=__imp_AdjustWindowRectEx
      8. ....
    5. далее при помощи bat
      Код (Text):
      1. set masm64_path=\masm64
      2. set filename=user32
      3. %masm64_path%\bin\link -lib /DEF:%filename%.def /OUT:%filename%.lib /MACHINE:X64
      получаю user32.lib файл.
    Как автоматизировать ручную работу и всю рутину переложить на bat-файл?

    P.S.
    С удивлением обнаружил, что в kernel32.dll нет ExitProcess, а в user32.dll нет DefWindowProcA, обе функции портируются из ntdll.dll (RtlExitUserProcess и NtdllDefWindowProc_A соответственно) :)
     
    horpis_real нравится это.
  2. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709
    bat-файл для создания user32.inc из user32.txt
    Код (Text):
    1. set FileName=user32
    2. for /f "skip=16 tokens=1-4" %%a in (%FileName%.txt) do (
    3. @echo extern __imp_%%d:qword >> %FileName%.inc
    4. @echo %%d TEXTEQU ^<__imp_%%d^> >> %FileName%.inc
    5. )
    bat-файл для создания user32.def из user32.txt
    Код (Text):
    1. set FileName=user32
    2. @echo EXPORTS >> %FileName%.def
    3. for /f "skip=16 tokens=1-4" %%a in (%FileName%.txt) do @echo %%d=__imp_%%d >> %FileName%.def
    skip=16 пропускаю первые 16 строк в user32.txt
    Код (Text):
    1. Dump of file C:\Windows\System32\user32.dll
    2. File Type: DLL
    3.   Section contains the following exports for USER32.dll
    4.     00000000 characteristics
    5.     4CE799CD time date stamp Sat Nov 20 17:50:05 2010
    6.         0.00 version
    7.         1500 ordinal base
    8.         1003 number of functions
    9.          830 number of names
    10.     ordinal hint RVA      name
    11.        1502    0 000083C0 ActivateKeyboardLayout <-- полезная информация начинается здесь
    ^<__imp_%%d^> экранирую управляющие символы "<" и ">" чтобы bat-файл воспринимал их, как обычные символы.
    Правда, пока не получается из строк
    Код (Text):
    1. 1500      0002B260 [NONAME]
    создать строки в user32.def
    Код (Text):
    1. user32_ordinal1500=ordinal1500 @1500 NONAME
    и user32.inc
    Код (Text):
    1. extern __imp_user32_ordinal1500:qword
    2. user32_ordinal1500 TEXTEQU <__imp_user32_ordinal1500>
     
    Последнее редактирование: 22 июл 2017
  3. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709
    и, наконец, [​IMG] (барабанная дробь) inc_def.bat
    Код (Text):
    1. @echo off
    2. cls
    3. set masm64_path=\masm55\
    4. set FileName=user32
    5. %masm64_path%bin\dumpbin.exe /EXPORTS %windir%\System32\%FileName%.dll /OUT:%FileName%.txt
    6. @echo EXPORTS >> %FileName%.def
    7. for /f "skip=16 tokens=1-4" %%a in (%FileName%.txt) do (
    8. if "%%a"=="Summary" exit
    9. if "%%d"=="" @echo extern __imp_%FileName%_ordinal%%a:qword >> %FileName%.inc
    10. if "%%d"=="" @echo %FileName%_ordinal%%a TEXTEQU ^<__imp_%FileName%_ordinal%%a^> >> %FileName%.inc
    11. if "%%d"=="" @echo %FileName%_ordinal%%a=ordinal%%a @%%a NONAME >> %FileName%.def
    12. if not "%%d"=="" @echo extern __imp_%%d:qword >> %FileName%.inc
    13. if not "%%d"=="" @echo %%d TEXTEQU ^<__imp_%%d^> >> %FileName%.inc
    14. if not "%%d"=="" @echo %%d=__imp_%%d >> %FileName%.def
    15. )
     
  4. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709
    Код (Text):
    1. @echo off
    2. cls
    3. set masm64_path=\masm55\
    4. set FileName=user32
    5. if exist %FileName%.inc del %FileName%.inc
    6. if exist %FileName%.def del %FileName%.def
    7. %masm64_path%bin\dumpbin.exe /EXPORTS %windir%\System32\%FileName%.dll /OUT:%FileName%.txt
    8. @echo EXPORTS >> %FileName%.def
    9. for /f "skip=16 tokens=1-4" %%a in (%FileName%.txt) do ( if "%%a"=="Summary" goto :exit
    10. if "%%d"=="" ( @echo extern __imp_%FileName%_ordinal%%a:qword >> %FileName%.inc
    11. @echo %FileName%_ordinal%%a TEXTEQU ^<__imp_%FileName%_ordinal%%a^> >> %FileName%.inc
    12. @echo %FileName%_ordinal%%a=ordinal%%a @%%a NONAME >> %FileName%.def
    13. ) else ( if not "%%d"=="(forwarded" ( @echo extern __imp_%%d:qword >> %FileName%.inc
    14. @echo %%d TEXTEQU ^<__imp_%%d^> >> %FileName%.inc
    15. @echo %%d=__imp_%%d >> %FileName%.def )))
    16. :exit
    17. %masm64_path%bin\link -lib /DEF:%FileName%.def /OUT:%FileName%.lib /MACHINE:X64
     
  5. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.548
    Адрес:
    Russia
    ну, для вашего счастья )
    Код (C):
    1.  
    2. import sys
    3. import os
    4. import argparse
    5. import pefile
    6.  
    7. parser = argparse.ArgumentParser(description='INC to DEF script')
    8. parser.add_argument('-f', '--filename', type=str, help='file for analyze', required=True)
    9. parser.add_argument('-p', '--path', type=str, help='path to link', default="C:\\asm\\masm64\\bin")
    10. args = parser.parse_args()
    11.  
    12. pathToLink = args.path
    13. fileName = args.filename
    14.  
    15. cwd = os.getcwd()  #current dir
    16.  
    17. windir = os.environ["WINDIR"]
    18. dllFilePath = windir + "\\System32\\" + fileName + ".dll"
    19.  
    20. pe = pefile.PE(dllFilePath)
    21.  
    22. export_fn = []
    23.  
    24. for exp in pe.DIRECTORY_ENTRY_EXPORT.symbols:
    25.     if exp.name:
    26.         if not exp.forwarder:
    27.             export_fn.append([exp.ordinal, hex(exp.address), exp.name])
    28.     else:
    29.         export_fn.append([exp.ordinal, hex(exp.address), "NONE"])
    30.  
    31. fileDef = open(cwd + '\\' + fileName + ".def", 'w')
    32. fileInc = open(cwd + '\\' + fileName + ".inc", 'w')
    33.  
    34. fileDef.write("EXPORTS\n")
    35.  
    36. for fn in export_fn:
    37.     if fn[2] != "NONE":
    38.         fileInc.write("extern __imp_"+fn[2]+":qword\n")
    39.         fileInc.write(fn[2]+" TEXTEQU <__imp_"+fn[2]+">\n")
    40.         fileDef.write(fn[2]+"=__imp_"+fn[2]+"\n")
    41.     else:
    42.         fileInc.write("extern __imp_"+fileName+"_ordinal"+str(fn[0])+":qword\n")
    43.         fileInc.write(fileName+"_ordinal"+str(fn[0])+" TEXTEQU <__imp_"+fileName+"_ordinal"+str(fn[0])+">\n")
    44.         fileDef.write(fileName+"_ordinal"+str(fn[0])+"=ordinal"+str(fn[0])+" @"+str(fn[0])+" NONAME\n")
    45.  
    46. fileDef.close()
    47. fileInc.close()
    48.  
    49. command = pathToLink+"\\link -lib /DEF:"+ fileName + ".def /OUT:" + fileName + ".lib /MACHINE:X64"
    50. os.system(command)
    51.  
    52. exit(0)
    53.  
    Пример вызова:
     
    yashechka, ol. и Mikl___ нравится это.
  6. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.548
    Адрес:
    Russia
    Ах, да, я забыл - путь к dumpbin уже не нужен в моем скрипте. Забыл убрать . Поправил - заменил на путь к link модулю. И добавил вызов создания lib файла.
     
    yashechka и Mikl___ нравится это.
  7. ol.

    ol. Active Member

    Публикаций:
    0
    Регистрация:
    21 фев 2017
    Сообщения:
    118
    Я тоже поиграться захотел. Вот:

    Код (Bash):
    1. #!/bin/bash
    2.  
    3. tee >(
    4. echo "; $1" > $1.inc
    5. awk "$(cat <<-END
    6. NR>16 {
    7.   if (match(\$3, /[NONAME]/,m)) {
    8.      print "extern __imp_$1_ordinal" \$1 ":qword"
    9.      print "$1_ordinal" \$1 " TEXTEQU <__imp_$1_ordinal" \$1 ">"
    10.   }
    11.   else {
    12.      print "extern __imp_" \$4 ":qword"
    13.      print \$4 " TEXTEQU <__imp_" \$4 ">"
    14.   }
    15. }
    16. END
    17. )" >> $1.inc) >(
    18. echo EXPORTS > $1.def
    19. awk "$(cat <<-END
    20. NR>16 {
    21.   if (match(\$3, /[NONAME]/,m)) {
    22.      print "$1_ordinal" \$1 "=ordinal" \$1 " @" \$1 " NONAME"
    23.   }
    24.   else {
    25.      print \$4 "=__imp_" \$4
    26.   }
    27. }
    28. END
    29. )" >> $1.def) > /dev/null
    30.  
    Использовать:
    Код (Text):
    1.  
    2. %masm64_path%bin\dumpbin.exe /EXPORTS %windir%\System32\%filename%.dll | ^
    3. bash скриптвыше %filename%
    4.  
    p.s. Все нужные тулзы идут сразу с гитом, так что
     
    yashechka, TermoSINteZ и Mikl___ нравится это.
  8. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.548
    Адрес:
    Russia
    Че у нас осталось ?) Луа наверно, vbs и Perl ))) Из широко применяемых скриптов
     
    Mikl___ нравится это.
  9. ol.

    ol. Active Member

    Публикаций:
    0
    Регистрация:
    21 фев 2017
    Сообщения:
    118
    sed еще остался.