博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
为Dll重新构造Lib
阅读量:6153 次
发布时间:2019-06-21

本文共 6539 字,大约阅读时间需要 21 分钟。

hot3.png

分类: Windows Repository 2010-06-12 12:56 1151人阅读 评论(0) 收藏 举报 dllmicrosoft正则表达式variables工具文本编辑 有些时候, 我们手头只有*.dll和*.h文件, 没有*.lib. 而VC链接必须要提供*.lib. 我们可以通过本文描述方法快速生成*.lib文件.

我们需要以下三步来为任意dll生成lib: (1) 工具dumpbin.exe生成*.def文件 (2) 编辑*.def文件以满足工具lib.exe的需要 (3) 工具lib.exe生成*.lib

我们先对所涉及的工具程序dumpbin.exe和lib.exe做一简单描述: dumpbin.exe和lib.exe随微软集成开发平台发布, 编译环境安装后在如下路径查找: (A) VS2010: 位于安装目录下的VC/bin中. 同时需要mspdb100.dll, 该dll位于安装目录下的Common7/IDE文件夹. 例如, 我安装VS2010在D:/Program Files/Microsoft Visual Studio 10.0下, 则两者目录分别如下: D:/Program Files/Microsoft Visual Studio 10.0/VC/bin D:/Program Files/Microsoft Visual Studio 10.0/Common7/IDE (B) VC++6.0: 位于安装目录下的VC98/Bin中. 同时需要mspdb60.dll, 该dll位于安装目录下的Common/MSDev98/Bin文件夹. 例如, 我安装VC++6.0在D:/Program Files/Microsoft Visual Studio下, 则两者目录分别如下: D:/Program Files/Microsoft Visual Studio/VC98/Bin D:/Program Files/Microsoft Visual Studio/Common/MSDev98/Bin 为了方便在路径下不带工具程序全路径, 我们需要设置环境变量. 如下: XP-EN-SP3版本下选择MyComputer-->Properties-->Advanced-->Enviroment Variables. 如果只想对当前用户生效, 则添加在 User Variables for username. 想对全部用户生效, 则添加在System Variables项. 使用逗号分隔每一项. 例如, 我设置只对当前用户有效, 针对VS2010的更改: D:/Program Files/IDM Computer Solutions/UltraEdit/;D:/Program Files/Microsoft Visual Studio 10.0/Common7/IDE/;D:/Program Files/Microsoft Visual Studio 10.0/VC/bin/ 对于中文XP, 应该是: 我的电脑-->属性-->高级-->环境变量. 然后更改用户变量或者系统变量. 方式同英文版.

现在, 我们可以在任意目录下执行它们了, 请直接选择Start-->Run(中文为开始-->运行), 输入cmd进入命令行环境, 输入dumpbin或者lib. 如果输出找不到, 则表示上述设置有问题, 请详细检查. 如果正常, 则输出为两者的帮助信息.

我们以gdi32.dll(位于C:/WINDOWS/system32目录下)为例来说明. 选择Start-->Run, 输入cmd进入命令行环境.

  1. 用工具软件dumpbin.exe生成gdi32.def 执行: dumpbin /exports C:/WINDOWS/system32/gdi32.dll > E:/gdi32.def 进入E:盘查看, 应该有gdi32.def文件. 内容大致如下(开始和结尾部分):

[c-sharp] view plaincopy Microsoft (R) COFF/PE Dumper Version 10.00.30319.01

Copyright (C) Microsoft Corporation. All rights reserved.
Dump of file C:/WINDOWS/system32/gdi32.dll
File Type: DLL
Section contains the following exports for GDI32.dll
00000000 characteristics
48025C4E time date stamp Mon Apr 14 03:17:34 2008
0.00 version
1 ordinal base
610 number of functions
610 number of names
ordinal hint RVA name
1 0 00034A05 AbortDoc
2 1 00035D39 AbortPath
3 2 0002F4DF AddFontMemResourceEx
4 3 0001A005 AddFontResourceA
5 4 0001A01F AddFontResourceExA
6 5 0002FCCF AddFontResourceExW
7 6 0002FB82 AddFontResourceTracking
8 7 0002FCB5 AddFontResourceW
9 8 00034D9C AngleArc
10 9 0002CECE AnimatePalette
11 A 00041AE7 AnyLinkedFonts
12 B 00034E4E Arc
13 C 00034F3A ArcTo
// ... escaped content here ...
// ... escaped content here ...
600 257 00035F01 WidenPath
601 258 0001FE43 XFORMOBJ_bApplyXform
602 259 0001CD41 XFORMOBJ_iGetXform
603 25A 000425E7 XLATEOBJ_cGetPalette
604 25B 0004260F XLATEOBJ_hGetColorTransform
605 25C 000425FB XLATEOBJ_iXlate
606 25D 00039929 XLATEOBJ_piVector
607 25E 0000CCB0 bInitSystemAndFontsDirectoriesW
608 25F 0000CC01 bMakePathNameW
609 260 0000CB0A cGetTTFFromFOT
610 261 000348BA gdiPlaySpoolStream
Summary
2000 .data
2000 .reloc
1000 .rsrc
43000 .text

完成. 按照第2步描述修改这个文件.
  1. 修改gdi32.def以满足工具lib的要求 (A) 删除文件头和文件尾(用纯文本编辑器打开, 如notepad或wordpad或Editplus或者UltraEdit均可) 如下为文件头部删除的部分:

[c-sharp] view plaincopy Microsoft (R) COFF/PE Dumper Version 10.00.30319.01

Copyright (C) Microsoft Corporation. All rights reserved.
Dump of file C:/WINDOWS/system32/gdi32.dll
File Type: DLL
Section contains the following exports for GDI32.dll
00000000 characteristics
48025C4E time date stamp Mon Apr 14 03:17:34 2008
0.00 version
1 ordinal base
610 number of functions
610 number of names
ordinal hint RVA name

如下为文件尾部删除的部分:

[c-sharp] view plaincopy Summary

2000 .data
2000 .reloc
1000 .rsrc
43000 .text

如下为剩余部分(只包括剩余部分的开始和结尾部分内容):

[c-sharp] view plaincopy 1 0 00034A05 AbortDoc

2 1 00035D39 AbortPath
3 2 0002F4DF AddFontMemResourceEx
4 3 0001A005 AddFontResourceA
5 4 0001A01F AddFontResourceExA
6 5 0002FCCF AddFontResourceExW
7 6 0002FB82 AddFontResourceTracking
8 7 0002FCB5 AddFontResourceW
9 8 00034D9C AngleArc
10 9 0002CECE AnimatePalette
11 A 00041AE7 AnyLinkedFonts
12 B 00034E4E Arc
13 C 00034F3A ArcTo
// ... escaped content here ...
// ... escaped content here ...
600 257 00035F01 WidenPath
601 258 0001FE43 XFORMOBJ_bApplyXform
602 259 0001CD41 XFORMOBJ_iGetXform
603 25A 000425E7 XLATEOBJ_cGetPalette
604 25B 0004260F XLATEOBJ_hGetColorTransform
605 25C 000425FB XLATEOBJ_iXlate
606 25D 00039929 XLATEOBJ_piVector
607 25E 0000CCB0 bInitSystemAndFontsDirectoriesW
608 25F 0000CC01 bMakePathNameW
609 260 0000CB0A cGetTTFFromFOT
610 261 000348BA gdiPlaySpoolStream

保存更改后的文件. (B) 函数行更改. 对于每行函数, 只保留第四列(name列).    如果只有三五行导出函数, 可能手工更改是最快的. 当导出函数数量较多时(例如gdi32.dll中有610个), 手工更改每行有些没效率, 也有些乏味. 当然, 如果工资是以小时计算的, 在心情不爽时按行删除也是一个消遣.    此处我们使用正则表达式处理, windows下本身没有支持正则的纯文本编辑器或者程序. 我们使用Editplus来完成. 如下:    Editplus官方网站是:           http://www.editplus.com/download.html    或者直接从链接下载Editplus3.12 trial:           http://www.editplus.com/ep2setup-en.cgi    如果想长期使用, 可以按照csdn资源所说进行破解, 该资源由resource_shared 发布(我们表示感谢), 链接地址为:           http://download.csdn.net/source/2435679    用Editplus打开E:/gdi32.def文件, 选择Ctrl+H或者Search-->Replace, 进行替换. 替换对话框Regular Expression前打钩(选中),           FindWhat内输入下行中括号内内部分(不含中括号), 注意, 前后均有一个空格.                           [ *[0-9]+ +[0-F]+ +[0-F]* ]           Replace With输入四个空格.           选择Replace All.           我们抽点时间描述下上述正则表达式含义: 上述正则表达式匹配符合如下要求的行:              以任意空格分隔的三列.              第一列是任意个十进制数字              第二列和第三列是任意个十六进制数字              第一列前空格可以为0个或者多个              第一列和第二列之间, 第二列和第三列之间, 有1个或者多个空格           而 dumpbin 生成的.def文件内, 每个导出函数, 均由空格分隔的如下四部分构成:              [    ordinal  hint  RVA      name ]           其中,                   ordinal 是序号, 依次递加(从0开始,10进制表示)                   hint 是其在Name表中的位置,依次递加(0开始,16进制表示)                   RVA 是相对虚拟地址                   name 是函数名称.           可见, 我们的替换操作将匹配每行的前三列, 将替换前三列为四个空格.           此时文件内容大致如下:

[c-sharp] view plaincopy AbortDoc

AbortPath
AddFontMemResourceEx
AddFontResourceA
AddFontResourceExA
AddFontResourceExW
AddFontResourceTracking
AddFontResourceW
AngleArc
AnimatePalette
AnyLinkedFonts
Arc
ArcTo
// ... escaped content here ...
// ... escaped content here ...
WidenPath
XFORMOBJ_bApplyXform
XFORMOBJ_iGetXform
XLATEOBJ_cGetPalette
XLATEOBJ_hGetColorTransform
XLATEOBJ_iXlate
XLATEOBJ_piVector
bInitSystemAndFontsDirectoriesW
bMakePathNameW
cGetTTFFromFOT
gdiPlaySpoolStream

在文件头添加如下两行:

[c-sharp] view plaincopy LIBRARY "gdi32.dll"

EXPORTS

保存文件, 我们进入第3步
  1. 用工具软件lib.exe生成gdi32.lib 执行: lib /machine:x86 /def:E:/gdi32.def /out:E:/gdi32.lib 进入E:盘查看, 应该已经有gdi32.lib文件. 同时有gdi32.exp文件.

OK, 现在, 我们可以用lib和exp执行链接了.

转载于:https://my.oschina.net/yangxiaoguang/blog/114114

你可能感兴趣的文章
MWeb 1.4 新功能介绍二:静态博客功能增强
查看>>
预处理、const与sizeof相关面试题
查看>>
爬虫豆瓣top250项目-开发文档
查看>>
有趣的数学书籍
查看>>
teamviewer 卸载干净
查看>>
多线程设计模式
查看>>
解读自定义UICollectionViewLayout--感动了我自己
查看>>
SqlServer作业指定目标服务器
查看>>
User implements HttpSessionBindingListener
查看>>
eclipse的maven、Scala环境搭建
查看>>
架构师之路(一)- 什么是软件架构
查看>>
USACO 土地购买
查看>>
【原创】远景能源面试--一面
查看>>
B1010.一元多项式求导(25)
查看>>
10、程序员和编译器之间的关系
查看>>
配置 RAILS FOR JRUBY1.7.4
查看>>
AndroidStudio中导入SlidingMenu报错解决方案
查看>>
修改GRUB2背景图片
查看>>
Ajax异步
查看>>
好记性不如烂笔杆-android学习笔记<十六> switcher和gallery
查看>>