1

我正在测试一个由flatassembler编译的汇编程序,它需要修改导入表,所以当我运行时objdump我可以看到程序试图调用哪些外部函数。

所以,我开始:

format PE GUI
section '.flat' readable writeable executable

它正在调用 MS dll 中的一些函数,但导入表是错误的。

这是一个简单的部分,展示了我如何包含两个 dll 和一个函数:

;user32

    _MessageBoxA           dw $0

                   db 'MessageBoxA', $0

    kernel32_name db 'kernel32.dll', $0

    user32_name   db 'user32.dll', $0

在汇编程序中必须做什么才能使外部函数显示在导入表中?

4

1 回答 1

1

导入表是一个以 0 结尾的导入描述符数组,标头的 Data Directories 中的 Import Directory 字段指向第一项。

struct ImportDescriptor   // size = 20 bytes
{
    dword ILTRVA;         // RVA to Import Lookup Table
    dword Timestamp;      // you can usually ignore
    dword ForwarderChain; // these two
    dword DllNameRVA;     // RVA to 0-terminated dll name
    dword IATRVA          // RVA to Import Address Table
}

ILT 和 IAT 应该是不同的位置,但应该是彼此的副本(不一定,但这是正常的做法)。IAT 将保存指向导入函数的指针。它们都是以 0 结尾的 RVA 到函数名称的数组。函数名称由一个“提示”字和一个以 0 结尾的 ascii 字符串组成。提示词可以是零,或者是该函数在它所在的 DLL 的导出表中的实际索引,或者是某个随机值,这只是一个提示。

于 2013-03-19T18:32:15.900 回答