首先,直到现在我还不太热衷于反转,所以如果我的问题很愚蠢,请原谅我。

我有一个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


评论

因此,您似乎正在处理某种COM服务器。当然,您可以尝试查找签名。如果幸运的话,资源库中已包含类型库。它导出的功能是否比您命名的两个功能更多?如果您提供dumpbin的输出或使用CFF Explorer的屏幕截图或类似的东西,可能会有所帮助。

是的,它的功能确实比我列出的要多,并且它们的名称对于使用库的目的而言是有意义的。我可以提供dumpbin输出,我应该包括哪些键(例如,导出或其他任何键)?

出口和进口都很有帮助。您还可以通过检查函数来了解有关参数和返回值的信息-调用约定可能使识别函数正在使用哪些外部值成为可能。

我已经编辑了我的帖子。

#1 楼

坏消息
DllRegisterServerDllUnregisterServer是将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