能力值:
( LV2,RANK:10 )
|
-
-
2 楼
我和我的小伙伴们都惊呆了
|
能力值:
( LV4,RANK:55 )
|
-
-
3 楼
说不定哪天就用到了 mark一下
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
学习了,下下来研究一下
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
不错的东东
|
能力值:
( LV12,RANK:760 )
|
-
-
6 楼
我和我的小伙伴惊呆了~~
|
能力值:
( 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.EXE和 LIB.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)!
谬误之处请指正 !
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
前排啊, 膜拜一下
|
能力值:
( LV3,RANK:30 )
|
-
-
9 楼
连参数信息都可以获取?碉堡了!
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
感动啊。谢谢。
|
能力值:
( LV2,RANK:140 )
|
-
-
11 楼
我是用脚本写的.无非就是用dumpbin /exports 然后用处理下输出生成def 然后使用link /lib /def来生成lib
当时我是用来生成ntdll的.使用的是vc6里面的dumpbin. 没有参数信息.链接不成功.然后使用vc2008以后的dumpbin就好了,这个会自动下载符号,会获取参数信息.然后再生成lib就可以链接成功了.
|
能力值:
( LV13,RANK:400 )
|
-
-
12 楼
有没有大神来个dll生成静态lib的工具?
|
能力值:
( LV9,RANK:270 )
|
-
-
13 楼
|
能力值:
( LV3,RANK:20 )
|
-
-
14 楼
DLL to Lib 3.00
用过,失败了。
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
看了截图,很牛x。
|
能力值:
( LV10,RANK:163 )
|
-
-
16 楼
一直用dll2lib的撸过.
|
能力值:
( LV9,RANK:270 )
|
-
-
17 楼
多一个成功的例子,ArmaGeddon的作者CondZero曾在" ArmaGeddon v1.0 – Conceptual overview on tool for unpacking Armadillo"里提到过。
附件: ArmaGeddon技术内幕
|
能力值:
( LV2,RANK:10 )
|
-
-
18 楼
果然很牛~~
|
能力值:
( LV2,RANK:10 )
|
-
-
19 楼
mark
|
能力值:
( LV6,RANK:93 )
|
-
-
20 楼
类似工具早有了,CppDLLv1.1 by rrrfff,http://download.csdn.net/download/rrrfff/4346146
其实原理也简单,有个API专门解密c++导出符号的
作者也在看雪发过这个工具,不过当时没什么人注意,代码也开源在google code,看雪也不加精,人家后来就删除code了,不过细心点也可以找到源码,毕竟是SVN的,呵呵。
|
能力值:
(RANK:290 )
|
-
-
21 楼
我和我的小伙伴们都惊呆了
|
能力值:
( LV6,RANK:90 )
|
-
-
22 楼
以后估计会用到 mark
|
能力值:
( LV2,RANK:10 )
|
-
-
23 楼
不错,这才是精华啊
|
能力值:
( LV2,RANK:10 )
|
-
-
24 楼
说不定哪天就用到了 mark一下
|
能力值:
( LV2,RANK:10 )
|
-
-
25 楼
刚好在找这方面的东西..
|
|
|