Mel*_*lez 5 windows assembly exe reverse-engineering portable-executable
有"First Thunk"(FT),加载程序在执行后用正确的地址覆盖.
但是当PE使用OFT时?
PE甚至需要吗?
如果导入已绑定但导入的.DLL不匹配,则需要原始的第一个thunk.
在新的未修补版本的Windows上,基本.DLL(ntdll,kernel32,user32等)中所有函数的所有地址都是已知的.以shell32为例,它链接到kernel32!CreateProcess并且真正的地址CreateProcess可以直接存储在shell32中.这称为导入绑定,并允许加载程序跳过查找导入函数的所有地址的步骤.
如果导入的.DLL尚未加载到其首选地址,并且.DLL已更改(安全更新等),则此方法无效.如果发生这种情况,则加载器必须以"正常方式"查找函数,并且必须使用原始的第一个thunk数组,因为这是存储函数名称的RVA的唯一位置.
如果未使用导入绑定,则原始的第一个thunk数组是可选的,可能不存在.
ASLR可能使这种优化无关紧要.
小智 5
我们需要知道,当PE文件加载到内存中时,PE加载器会查看IMAGE_THUNK_DATA和IMAGE_IMPORT_BY_NAME并确定导入函数的地址。然后它用函数的真实地址替换FirstThunk指向的数组中的IMAGE_THUNK_DATA。这样PE文件就可以运行了。OriginalFirstThunk 指向的 RVA 数组保持不变,因此如果需要查找导入函数的名称,PE 加载器仍然可以找到它们。
| 归档时间: |
|
| 查看次数: |
1881 次 |
| 最近记录: |