什么是 DLL? DLL 是动态链接库。它充当共享对象,多个程序可以多次调用同一个 DLL。
为什么要使用 DLL? 它与 Linux 共享对象和库的概念并没有太大区别。不过在设计上略有不同。简而言之,它节省了空间并允许广泛的代码重用。
关于 DLL 的事实: 编译 DLL 时,其函数通过符号进行引用。这些符号直接关联到函数的名称(符号以可见且可读的字符串表示)、其返回类型和参数。实际上,可以直接通过文本编辑器读取符号,尽管在大型 DLL 中很难找到。这些符号也可以使用 WinAPI 中的函数进行提取。断点:在此处插入屏幕截图或示例。DEF 文件也可用作参考,尽管可以避免使用它们。另外,使用 DLL,存在一个实现。使用 DLL,我们可以生成一个 .lib 文件,前提是您至少拥有该 DLL。现在,使用符号和可能从 DLL 生成的库,您可以创建自己的简单头文件来隐式调用 DLL 中的函数。酷吧?
我为什么要关心? 通常您不会。它经常用于基础黑客攻击。但它也可以作为良好的参考和恢复工具,特别是当您知道 DLL 的设计方式时。假设您有一个以前实现的 DLL。它很简单,有四个或五个函数。但是您不再拥有头文件、库,并且不记得函数名称。使用此方法,您可以轻松恢复所有这些。尽管对于不是您自己的且不打算被第三方调用的 DLL,情况也可能如此。
我根本不在乎!我从来不实现 DLL! 您是这么说的,但从某种意义上说,您确实实现了。DLL 非常类似于 Windows 可执行文件。因此,您实际上可以加载一个可执行文件并像调用 DLL 一样显式调用可执行文件(感谢 Null)。您也可以隐式调用可执行文件,但我们每次创建可执行文件时都会这样做。断点:可执行文件使用符号系统吗?
你说谎! 哦,是吗?每当我尝试通过操作 DLL 来创建 UT2004 反作弊系统时,我都惨败了,而且我注意到很多人认为这是因为您无法使用此方法,因为它根本不起作用。好吧,他们错了!作为对此的回应,我将实现一个基本的 DLL,删除除 DLL 本身之外的所有引用,并在此文章的分步说明中恢复所有内容。断点:我应该使用 C 语言来获得清晰的符号,还是使用 C++ 语言,即使步骤稍微长一些?
过程!
要破解的 DLL:
http://computerquip.com/BasicDLL.dll这个过程很简单。首先,我们需要提取可以被客户端调用的公共函数。请注意,伙计们,符号是复杂的,它们不仅仅是为了导出的函数。因此,我们只需要提取我们想要的函数,而这些函数碰巧 90% 的时候都是公开导出的函数。例如,所有符号
http://img38.imageshack.us/img38/7575/exportedsymbols.png
首先,我们需要创建一个 .DEF 文件。在 MinGW 中,这是使用 pexports 完成的,它甚至以与 DEF 文件兼容的格式提供。我们可以将其放置在一个文件中,使用
pexports BasicDLL.dll
。在 VC++ 控制台中,您可以使用
dumpbin /exports
(我发誓您可以导出 def 文件与 dumpbin)如图所示
http://img682.imageshack.us/img682/5596/symbols.png 这只是我凭着记忆知道的。我花了一个小时昨天设置我的 Windows 环境却没成功。我试图避免 Code::Blocks,但我想那将是不可能的。
尽管我已经在如何破解和利用常见 DLL 方面进行了大量研究,但我对其背景或内部机制了解不多。我目前正在研究这些并发布我的发现。