在软件开发中,有时候需要创建一个代理DLL,以便在不同的架构(如32位和64位)下使用相同的DLL。ProxiFy是一个简单而强大的工具,它可以快速地创建这样的代理DLL。本文将介绍ProxiFy的背景、编译方法、使用方法以及一些注意事项。
在ProxiFy之前,曾使用Michael Chourdakis开发的"wrappit"工具来创建代理DLL。然而,发现wrappit不支持64位架构的DLL,并且在创建DLL的过程中步骤较多,特别是需要使用dumpbin来生成DLL的导出,这让觉得有些繁琐。因此,开发了ProxiFy,它使用跳转到导出地址的技术,这一技术受到了wrappit的启发。
要编译ProxiFy,请确保包含以下库:
Imagehlp.lib
和 dbghelp.lib
。
同时,需要将字符集设置为“使用多字节字符集”。
使用ProxiFy非常简单。它的设计理念是减少创建代理DLL所需的步骤。只需要运行ProxiFy.exe,然后系统会提示选择一个DLL文件。
选择DLL文件后,将收到一个消息框,提示选择的DLL是32位文件还是64位文件。这个消息框的唯一目的是让用户知道他们刚刚创建的代理DLL的架构。虽然觉得这有点用,但如果想在源代码中删除它也是可以的,它没有其他用途。
ProxiFy会根据选择的DLL创建3个文件(如果是64位DLL)或2个文件(如果是32位DLL)。下面将介绍如何创建一个代理DLL项目,以Visual Studio 2015为例。
首先创建一个DLL项目,不会详细介绍如何做到这一点,因为有很多优秀的文章已经讨论过这个话题。
创建项目后,将.cpp文件和.def文件添加到项目中。确保进入链接器设置,并将.def文件设置为模块定义文件。可以在属性 -> 链接器 -> 输入下找到这个选项。
如果项目是32位项目,请确保将项目设置为Win32(或x86)。然后就完成了。
如果有一个64位DLL,会创建一个.asm文件,与.cpp和.def文件一起。在将这个文件添加到项目之前,应该右键点击项目 -> 构建依赖项 -> 构建自定义... 然后勾选".masm"。这将允许.asm文件正确工作。
现在将.asm文件也添加到项目中。不确定正确的设置是否会自动设置,所以为了再次检查,右键点击它并转到属性。在"常规 -> 项目类型"下,确保它设置为:Microsoft Macro Assembler。
作为代理DLL,它需要原始DLL在同一个文件夹中。ProxiFy假设将原始DLL的名称后面加上一个下划线。例如,steam_api64.dll将变成steam_api64_.dll。这可以在ProxiFy中更改,或者可以在生成的CPP文件中更改LoadLibrary调用。
该项目不适用于使用序数导出的DLL。这可以做到,但到目前为止,没有遇到不使用序数导出的问题。据所知,通常不鼓励这样做,所以没有包括它,因为还没有需要它。