加密与解密第三版中,修复重定位表大概用以下方法:
第一步:
首先需要获取需要重定位的各个RVA地址,保存在一个连续的数据块(bin文件)中。以DWORD的0作为结束。可以通过对外壳加补丁做到这点,参见351页。(感觉纯用OD脚本更方便)
第二步:
然后利用ReloREC工具,将BIN文件拖入界面,然后点击Fix Dump按钮选择DLL文件来修复定位表。

在第一步中,需要跟踪外壳代码中对定位表的处理。因此可能要面对许多讨厌的杂乱的ANTI-DEBUG。
于是我想出个新办法,不必跟踪外壳代码。可一步算出需要重定位的RVA地址。

我们知道,DLL每次加载的地址可能是不同的。我们设法让DLL加载在2个不同的虚拟地址中,然后分别DUMP出2份DLL文件。只要比较这2份DLL文件的不同,就可以得出需重定位的RVA地址了。
那么如何让DLL加载在不同的地址呢?可以修改PE文件头中默认的加载基址。
如果外壳有自校验的话,也可以在不同的虚拟机中加载。