使用上面输入表的实例 --------------------
针对上面输入表的例子,我将说明如何修复第一个输入 DLL 的第一个输入函数。
1. 我们来看第一个 IMAGE_IMPORT_DESCRIPTOR 结构部分(C1E8h),.Name 部分(C1E4h,指向 C1BAh)指出了 DLL 名。我们看到,那是 USER32.dll。
2. 我们来看 .FirstThunk 部分,它们指向 IAT 部分;每个对应一个这个 DLL(user32.dll)的 输入函数。在这里是 C1F8h,指向 C238h。所以,在 C238h,我们可以修复被破坏的 IATs。(你 会注意到,这个 IAT 部分包含二个 DWords,所以,这个 DLL 有二个函数输入)
3. 我们得到了第一个被破坏的 IAT。它的值是 77E7897Fh。这是函数在内存中的地址。
4. 对每一个输入表第三部分中的函数,我们调用 GetProcAddress API。当该 API 返回 7E7897Fh 时就意味着,我们到达了正确的函数。所以我们让被破坏的 IAT 指向正确函数名(在本例中为 ’wsprintfA’)。
5. 现在我们只需要将 IAT 指向:偏移量(函数名字符串)-2。为什么是 -2 ?因为有时候使用了 函数序列。 所以在本例中,我们改变地址 C238h,让它指向 C26Ah(以代替 77E7897Fh)。
6. 就这样,这个函数被修复了,下面你只需要对所有的 IATs 重复这个过程就可以了。
后记 ----
我描述的是一般的操作过程。当然只有在 DLLs 被正常调入内存后才能够这样做。对于其他情 况,你需要将它们调入,或者你需要仔细研究它们的输出表才能找到正确的函数地址。 上一页 1 2 3 |