首页
社区
课程
招聘
[原创]DLL生成头文件以及lib,开源
发表于: 2013-7-26 09:29 51555

[原创]DLL生成头文件以及lib,开源

2013-7-26 09:29
51555

要使用一个没有头文件以及lib库的dll,十分麻烦 ,你得去取得导出函数的地址,
如果是C导出还好说,但如果是C++导出,就麻烦了,因为有类指针的存在,去取得导出类的所有函数地址,以及类的结构,那是相当地麻烦,所以我就写了这么一个工具来解决这个问题,
目前此工具不是十分完美,只能跟据导出表信息,生成相应的头文件,以及lib导入库,
在生成C++头文件时,对虚函数表没有处理,
还有,生成的C++类,不可能有类成员变量,所以C++类的大小就不确定 了,你需要自己去逆向,解决类大小 的问题。
注意C语言导出时,没有类型说明 ,只有函数名字,你需要自己去解决这个问题。

关键性技术说明

要想生成lib,至少需要有一个def文件,然后使用link.exe来让def生成lib,link.exe必须要能访问,如果不能访问,请增加到path环境变量中来,如果是安装vs系列,直接就能访问,测试方法,打开cmd,输入 link.exe 如果能运行,就ok啦。
link /LIB /DEF:C:\a.def /OUT:C:\b.lib

另一个生成lib的思路,就是你必须要有头文件,然后实现所有函数,建一个dll工程,取一个和原dll相同的名字,然后生成,就生成了lib啦。但是这个方法比较麻烦 。
本系统采用上一种方案

至于生成头文件嘛,这个就算个人算法问题啦,代码比较乱,这部分代码就不贴出来啦。自己看源代码吧。

生成的头文件以及lib放在dll同目录下面







生成后的头文件以及lib.rar

makeexport.rar

makeexport_src.rar


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 10
支持
分享
最新回复 (62)
雪    币: 137
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
我和我的小伙伴们都惊呆了
2013-7-26 10:07
0
雪    币: 297
活跃值: (265)
能力值: ( LV4,RANK:55 )
在线值:
发帖
回帖
粉丝
3
说不定哪天就用到了 mark一下
2013-7-26 10:19
0
雪    币: 33
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
学习了,下下来研究一下
2013-7-26 10:30
0
雪    币: 291
活跃值: (169)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
不错的东东
2013-7-26 10:34
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
6
我和我的小伙伴惊呆了~~
2013-7-26 10:40
0
雪    币: 627
活跃值: (663)
能力值: ( LV9,RANK:270 )
在线值:
发帖
回帖
粉丝
7
不好意思,泼冷水了:还是没有解决关键问题

要成功调用第三方DLL里的导出函数,需要自己构建一个头文件(.h)和一个导入库文件(.lib)。

(A) 头文件
这个貌视没什么捷径,需要自己手工写。
分析dll各导出函数的输入参数和返回数据类型。视dll是由何种编程语言生成的,选择相应的分析工具效果较好,比如Delphi的用IDR。
通常利用IDA+Hex-Rays可生成C源码,再对比反汇编代码进行确认,那些不能确定的最好实际跟一下。
基本上IDA会猜错数据类型,特别是其为结构或类指针时。

(B) 导入库文件
有两个关键问题:导出符号(symbols,包括函数和数据)和调用约定(calling convention)。分两种情况来处理。

(a) 调用程序和dll使用相同的调用约定。
通常是两者都用同一编程语言和缺省调用约定时。
比如调用程序使用"__declspec(dllimport)"原形(prototype)和声明(declaration),dll使用"__declspec(dllexport)时,很简单。
在VC环境下,需要用到DUMPBIN.EXELIB.EXE
写一个命令行批处理脚本,由DLL自动生成.def文件和.lib文件。forgot有个帖子dll2lib,我没法直接用,修改了一下(Dll2Lib.cmd)。.def文件很重要,情况(b)还会用到。
批处理脚本里生成.lib文件是这样的:
    LIB /DEF:DllFile.def /MACHINE:IX86 /NOLOGO


(b) 调用程序和dll使用不同的调用约定。
比如用C来写调用程序,而dll是用Delphi写的,我们知道Windef.h是将PASCAL定义为__stdcall的。直接用(a)的.lib就有问题,首先要解决符号问题,其次压栈参数不能得到清理(stack clean up),调用者必然崩溃。
解决办法说穿了很简单:根据(A)的头文件写一个同名Dummy DLL(DllFile.c)。
其函数声明部分用"__declspec(dllexport) return_type __stdcall funcname(...);"的形式;
为每一个导出函数写一个对应的Dummy Function,这些函数什么都不用做,只要保证传入参数的个数和类型、返回参数类型与.h头文件一致即可。
用以下命令:
    CL /O2 /MD /LD /FeDllFile /FoDllFile DllFile.c /link /DEF:DLLFile.def


即可创建DllFile.dll和DllFile.lib。使用命令之前,请注意备份或重命名你的原dll,如果同名存在会被覆盖!
新生成的Dummy DLL(DllFile.dll)是没用的,删掉。DllFile.lib才是我们需要的,它保证了导出符号和调用约定的正确。这里.def文件保证了.lib文件的ordinal与原dll一致,非常重要。

总之,楼主只解决了(B)(a)的问题,makeexport用批处理就搞定了。艰苦的工作在(A)
谬误之处请指正
2013-7-26 10:47
0
雪    币: 90
活跃值: (91)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
前排啊, 膜拜一下
2013-7-26 10:53
0
雪    币: 1283
活跃值: (46)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
9
连参数信息都可以获取?碉堡了!
2013-7-26 10:58
0
雪    币: 1234
活跃值: (302)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
感动啊。谢谢。
2013-7-26 11:09
0
雪    币: 382
活跃值: (352)
能力值: ( LV2,RANK:140 )
在线值:
发帖
回帖
粉丝
11
我是用脚本写的.无非就是用dumpbin /exports 然后用处理下输出生成def 然后使用link /lib /def来生成lib
当时我是用来生成ntdll的.使用的是vc6里面的dumpbin. 没有参数信息.链接不成功.然后使用vc2008以后的dumpbin就好了,这个会自动下载符号,会获取参数信息.然后再生成lib就可以链接成功了.
2013-7-26 11:33
0
雪    币: 496
活跃值: (286)
能力值: ( LV13,RANK:400 )
在线值:
发帖
回帖
粉丝
12
有没有大神来个dll生成静态lib的工具?
2013-7-26 12:17
0
雪    币: 627
活跃值: (663)
能力值: ( LV9,RANK:270 )
在线值:
发帖
回帖
粉丝
13
DLL to Lib 3.00

没用过,不知效果如何?

DLL to Lib - Convert DLLs into static libraries
2013-7-26 12:38
0
雪    币: 69
活跃值: (30)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
14
DLL to Lib 3.00
用过,失败了。
2013-7-26 12:42
0
雪    币: 2821
活跃值: (2836)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
看了截图,很牛x。
2013-7-26 13:46
0
雪    币: 6533
活跃值: (4331)
能力值: ( LV10,RANK:163 )
在线值:
发帖
回帖
粉丝
16
一直用dll2lib的撸过.
2013-7-26 13:50
0
雪    币: 627
活跃值: (663)
能力值: ( LV9,RANK:270 )
在线值:
发帖
回帖
粉丝
17
多一个成功的例子,ArmaGeddon的作者CondZero曾在"ArmaGeddon v1.0 – Conceptual overview on tool for unpacking Armadillo"里提到过。

附件:ArmaGeddon技术内幕
上传的附件:
2013-7-26 14:04
0
雪    币: 73
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
果然很牛~~
2013-7-26 16:34
0
雪    币: 47
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
mark
2013-7-26 17:59
0
雪    币: 3542
活跃值: (1867)
能力值: ( LV6,RANK:93 )
在线值:
发帖
回帖
粉丝
20
类似工具早有了,CppDLLv1.1 by rrrfff,http://download.csdn.net/download/rrrfff/4346146
其实原理也简单,有个API专门解密c++导出符号的

作者也在看雪发过这个工具,不过当时没什么人注意,代码也开源在google code,看雪也不加精,人家后来就删除code了,不过细心点也可以找到源码,毕竟是SVN的,呵呵。
2013-7-26 18:40
0
雪    币: 219
活跃值: (783)
能力值: (RANK:290 )
在线值:
发帖
回帖
粉丝
21
我和我的小伙伴们都惊呆了
2013-7-26 19:20
0
雪    币: 680
活跃值: (68)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
22
以后估计会用到 mark
2013-7-26 22:00
0
雪    币: 7345
活跃值: (4547)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
不错,这才是精华啊
2013-7-26 22:24
0
雪    币: 9695
活跃值: (2501)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
说不定哪天就用到了 mark一下
2013-7-26 23:13
0
雪    币: 24
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
刚好在找这方面的东西..
2013-7-26 23:43
0
游客
登录 | 注册 方可回帖
返回
//