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

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

2013-7-26 09:29
50168
要使用一个没有头文件以及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

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

上传的附件:
收藏
点赞6
打赏
分享
最新回复 (62)
雪    币: 137
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
小林先生 2013-7-26 10:07
2
0
我和我的小伙伴们都惊呆了
雪    币: 297
活跃值: (225)
能力值: ( LV4,RANK:55 )
在线值:
发帖
回帖
粉丝
evilor 2013-7-26 10:19
3
0
说不定哪天就用到了 mark一下
雪    币: 33
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
信念随心 2013-7-26 10:30
4
0
学习了,下下来研究一下
雪    币: 291
活跃值: (144)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yzwyq 2013-7-26 10:34
5
0
不错的东东
雪    币: 8861
活跃值: (2369)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
cvcvxk 10 2013-7-26 10:40
6
0
我和我的小伙伴惊呆了~~
雪    币: 624
活跃值: (668)
能力值: ( LV9,RANK:270 )
在线值:
发帖
回帖
粉丝
MistHill 6 2013-7-26 10:47
7
0
不好意思,泼冷水了:还是没有解决关键问题

要成功调用第三方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)
谬误之处请指正
雪    币: 90
活跃值: (91)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xouou 2013-7-26 10:53
8
0
前排啊, 膜拜一下
雪    币: 1275
活跃值: (41)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
suiyu 2013-7-26 10:58
9
0
连参数信息都可以获取?碉堡了!
雪    币: 1230
活跃值: (202)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xinxinqing 2013-7-26 11:09
10
0
感动啊。谢谢。
雪    币: 402
活跃值: (342)
能力值: ( LV2,RANK:140 )
在线值:
发帖
回帖
粉丝
ProgmBoy 3 2013-7-26 11:33
11
0
我是用脚本写的.无非就是用dumpbin /exports 然后用处理下输出生成def 然后使用link /lib /def来生成lib
当时我是用来生成ntdll的.使用的是vc6里面的dumpbin. 没有参数信息.链接不成功.然后使用vc2008以后的dumpbin就好了,这个会自动下载符号,会获取参数信息.然后再生成lib就可以链接成功了.
雪    币: 496
活跃值: (281)
能力值: ( LV13,RANK:400 )
在线值:
发帖
回帖
粉丝
tishion 9 2013-7-26 12:17
12
0
有没有大神来个dll生成静态lib的工具?
雪    币: 624
活跃值: (668)
能力值: ( LV9,RANK:270 )
在线值:
发帖
回帖
粉丝
MistHill 6 2013-7-26 12:38
13
0
DLL to Lib 3.00

没用过,不知效果如何?

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

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

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