侧边栏壁纸
博主头像
七哥的技术博客

You got a dream, you gotta to protect it!

  • 累计撰写 60 篇文章
  • 累计创建 71 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

根据动态库生成对应的lib文件

admin
2024-12-30 / 0 评论 / 0 点赞 / 14 阅读 / 0 字

一个 dll 动态库文件,编译的时候需要链接该库文件,如果没有提供 lib 文件,得先从 dll 生成对应的 lib 文件

这里以 Trojan-Qt5-Core 工程中的 trojan-qt5-core.dll 为参考例子,原工程的处理脚本如下

dumpbin /exports trojan-qt5-core.dll > exports.txt
echo LIBRARY TROJAN-QT5-core > trojan-qt5-core.def
echo EXPORTS >> trojan-qt5-core.def
for /f "skip=19 tokens=4" %%A in (exports.txt) do echo %%A >> trojan-qt5-core.def
lib /def:trojan-qt5-core.def /out:trojan-qt5-core.lib /machine:x86

我需要从 libcrypto.dll 生成对应的 lib 文件,以下操作需要在 vc 环境下运行,可以将路径添加到环境变量 path

如 vc 路径为 "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\”

1、使用 dumpbin 生成 exports 列表

dumpbin.exe /exports libcrypto.dll > exports.txt

dumpbin出来的内容如下

Microsoft (R) COFF/PE Dumper Version 14.00.24247.2
Copyright (C) Microsoft Corporation.  All rights reserved.


Dump of file D:\develop\libcrypto.dll

File Type: DLL

  Section contains the following exports for libcrypto.dll

    00000000 characteristics
    FFFFFFFF time date stamp
        0.00 version
           1 ordinal base
        3477 number of functions
        3477 number of names

    ordinal hint RVA      name

          1    0 000CA5A0 ACCESS_DESCRIPTION_free
          2    1 0013D450 ACCESS_DESCRIPTION_it
          3    2 000CA5B0 ACCESS_DESCRIPTION_new
          4    3 00001000 AES_cbc_encrypt
          5    4 000081E0 AES_cfb128_encrypt
          6    5 00008220 AES_cfb1_encrypt
          7    6 00008260 AES_cfb8_encrypt
          ......

2、准备一个 libcrypto.def 文件(这个名称是和动态库名称一样的),将导出函数抠出来填入,不要序号和地址

文件内容的前两行是固定的,名称改成动态库的名称(参考下面格式)

LIBRARY libcrypto
EXPORTS
	ACCESS_DESCRIPTION_free
	ACCESS_DESCRIPTION_it
	ACCESS_DESCRIPTION_new
	AES_cbc_encrypt
	AES_cfb128_encrypt
	AES_cfb1_encrypt
	AES_cfb8_encrypt
    ......

3、def文件准备好之后,使用下面命令生成动态库对应的 lib 文件

lib.exe /def:libcrypto.def /machine:x86 /out:libcrypto.lib

4、在 dumpbin 生成函数列表的时候,如 go 编译的动态库文件中,像下面这种格式的不需要作导出处理,中间还有一些有 “=” 符号的

ordinal hint RVA      name

          1    0 0079E040 _cgo_4c605886eead_Cfunc__Cmalloc
          2    1 0079E790 _cgo_667f92909735_Cfunc__Cmalloc
          3    2 0079E7D0 _cgo_667f92909735_Cfunc_free
          4    3 007B36B0 _cgo_667f92909735_Cfunc_free_conn_key_arg
          5    4 007B36C0 _cgo_667f92909735_Cfunc_get_conn_key_val
          6    5 007B2FE0 _cgo_667f92909735_Cfunc_input
          7    6 0079E7E0 _cgo_667f92909735_Cfunc_ipaddr_aton = _ipaddr_ntoa_r
          8    7 0079E820 _cgo_667f92909735_Cfunc_ipaddr_ntoa

         ......

         72   47 00461AB0 _cgoexp_667f92909735_tcpRecvFn
         73   48 00461B40 _cgoexp_667f92909735_tcpSentFn
         74   49 00461CD0 _cgoexp_667f92909735_udpRecvFn
         75   4A          bufio.(*ReadWriter).Available (forwarded to bufio.(*ReadWriter).Available)
         76   4B          bufio.(*ReadWriter).Discard (forwarded to bufio.(*ReadWriter).Discard)
         77   4C          bufio.(*ReadWriter).Flush (forwarded to bufio.(*ReadWriter).Flush)
         78   4D          bufio.(*ReadWriter).Peek (forwarded to bufio.(*ReadWriter).Peek)
         79   4E          bufio.(*ReadWriter).Read (forwarded to bufio.(*ReadWriter).Read)
0

评论区