我有一个Windows DLL很有可能是用Visual C ++制作的。它是在1998年开发的,并附带了Mfc42.dll(4.21.7022)和mfc42u.dll和msvcirt.dll(5.00.7022)。
我设法看到了DLL导出的函数名。 (很简单),但不是课程的参数。这些函数不会被任何应用程序直接调用,但是我知道它们是间接调用的。我认为它们正在被其他一些API调用,但是链对我来说是未知的。
我的问题是:是否可以提取函数签名(函数参数和返回值),编写一些绑定的类型(应该是可能的),最后我自己称呼它们?
最后一个补充是该DLL具有DllRegisterServer和DllUnregisterServer函数。
我正在谈论的DLL来自旧的语音合成器L&H TTS3000。我想对它进行更多的研究而不是去研究真实的东西,并且它已经非常古老并且已经退休,应该不会遇到任何麻烦。 br />http://www.v3mail.com/download/ttsengines.htm
并下载任何其他声音。它们不可用(文件已删除),但是可以使用web.archive.org下载。
因此,这是英语语音DLL之一的转储示例。
dumpbin Engvf160.dll /exports
...
File Type: DLL
Section contains the following exports for ENGVF160.dl
0 characteristics
373160B4 time date stamp Thu May 06 13:28:20 1999
0.00 version
1 ordinal base
99 number of functions
18 number of names
ordinal hint RVA name
97 0 0000E23A DllRegisterServer
98 1 0000E25B DllUnregisterServer
99 2 000099A0 TtsEgGetCodeInfo
1 3 0000E280 vfClose
2 4 0000E308 vfGenPcm
3 5 0000E389 vfGetCaps
4 6 0000EE61 vfGetSil
5 7 0000EEA3 vfGetSpkr
6 8 0000EF11 vfGetVersion
7 9 0000F63D vfGetVol
8 A 0000EF4E vfOpen
9 B 0000F16D vfP2Tic
10 C 0000F479 vfSetSegDb
11 D 0000F482 vfSetSil
12 E 0000F4D6 vfSetSpkr
13 F 0000F550 vfSetSynthRange
14 10 0000F67F vfSetVol
15 11 0000F6D3 vfTuneSpkr
Summary
7000 .data
7B000 .rdata
3000 .reloc
1000 .rsrc
F000 .text
进口:
... Section contains the following imports:
KERNEL32.dll
63470020 Import Address Table
634EA1C0 Import Name Table
0 time date stamp
0 Index of first forwarder reference
308 lstrlenA
1F5 OutputDebugStringA
2FF lstrcmpiA
17D GetWindowsDirectoryA
2F9 lstrcatA
302 lstrcpyA
5D DisableThreadLibraryCalls
ADVAPI32.dll
63470000 Import Address Table
634EA1A0 Import Name Table
0 time date stamp
0 Index of first forwarder reference
176 RegQueryInfoKeyA
162 RegDeleteKeyA
15B RegCloseKey
172 RegOpenKeyExA
15F RegCreateKeyExA
186 RegSetValueExA
164 RegDeleteValueA
MSVCRT.dll
63470040 Import Address Table
634EA1E0 Import Name Table
0 time date stamp
0 Index of first forwarder reference
291 malloc
F1 _ftol
2B3 sqrt
18E _pctype
115 _isctype
61 __mb_cur_max
2C1 strncpy
2B0 sin
258 fprintf
113 _iob
2B2 sprintf
2BA strcpy
25E free
299 memset
10F _initterm
9D _adjust_fdiv
297 memcpy
#1 楼
坏消息DllRegisterServer
和DllUnregisterServer
是将COM服务器DLL注册到系统中涉及的两个功能。因此,它们的导出很好地表明您正在处理COM服务器DLL。 COM服务器的许多间接调用是臭名昭著的,主要是因为DLL服务器从其自身公开旨在供其他可执行文件和DLL使用的对象。您可能不得不处理不同可执行文件之间的许多间接调用。好消息
现在,好消息是,由于COM以这种自由样式的方式定义了和对象的功能,因此它也鼓励了创建类型库文件(* .tlb)。这些文件具有机器可读的格式,该格式详细定义了类,方法和接口。如果可以找到DLL的类型库文件,则可以直接从这些文件中提取所有函数参数(包括名称!),函数返回类型等。
类型库文件可能位于应用程序的目录,其他应用程序资源或作为PE文件本身的一部分。有几种类型库文件读取器,以及python实现(来自win32软件包的
pythoncom.LoadTypeLib
)。文档资料很少,但是拥有类型库将使整个逆向工程更加容易。否则失败
在不幸的情况下,您找不到类型库文件,则必须对感兴趣的拦截函数进行反向工程,并从中提取参数的含义(以及类型和大小)功能本身。与同时拥有主叫方和被叫方相比,这通常比较棘手,但确实可行。就进程内COM服务器而言,您甚至可以非常轻松地调试对COM服务器的调用(通过调试加载DLL / com服务器,COM客户端的可执行文件,并在COM服务器的方法上放置断点)。 。
最后一件事,有一些自动工具会尝试自动生成DLL代理,这是一个。
评论
大多数COM DLL都内置有类型库。您可以使用OLEView(msdn.microsoft.com/zh-cn/library/d0kh9f4c.aspx)进行查看。
– NathanL
17年4月27日在23:28
@Nathan是的,我提到过...
– NirIzr
17年4月27日在23:30
啊,你做到了。 :)
– NathanL
17年4月27日在23:36
评论
因此,您似乎正在处理某种COM服务器。当然,您可以尝试查找签名。如果幸运的话,资源库中已包含类型库。它导出的功能是否比您命名的两个功能更多?如果您提供dumpbin的输出或使用CFF Explorer的屏幕截图或类似的东西,可能会有所帮助。是的,它的功能确实比我列出的要多,并且它们的名称对于使用库的目的而言是有意义的。我可以提供dumpbin输出,我应该包括哪些键(例如,导出或其他任何键)?
出口和进口都很有帮助。您还可以通过检查函数来了解有关参数和返回值的信息-调用约定可能使识别函数正在使用哪些外部值成为可能。
我已经编辑了我的帖子。