在阅读有关拆包的内容时,有时会看到“导入重建”步骤。这是什么,为什么有必要?

#1 楼

在典型的非打包Windows PE可执行文件中,标头包含向操作系统描述该可执行文件所依赖的其他库中的符号的元数据。操作系统的加载程序负责将这些库加载到内存中(如果尚未加载),并负责将那些导入符号的地址放入可执行文件的内存映像中的结构(其位置也由元数据指定)中。另一方面,打包程序通常会破坏此元数据,而是自己执行解析阶段(通常由加载程序执行)。拆包的目的是从二进制文件中删除保护,包括缺少的导入信息。因此,分析人员(或解压缩工具)必须确定打包程序为可执行文件加载的导入的集合,并在解压缩的可执行文件映像中重新创建元数据,这将导致操作系统照常正确加载导入。

通常,在这种情况下,分析人员将确定导入信息在可执行文件的内存映像中的位置。特别是,分析人员通常会定位IMAGE_THUNK_DATA数组,这些数组是NULL终止的数组,其中包含导入符号的地址。然后,分析人员将运行一个工具,该工具基本上执行GetProcAddress的反函数:给定指向导入符号的这些指针之一,它将确定该指针驻留在哪个DLL中,以及该指针引用哪个特定的导出条目。因此,例如,我们可以将0x76AE3F3C解析为Kernel32!CreateFileW。现在,我们使用此文本信息来重新创建描述每个导入的DLL的IMAGE_IMPORT_DESCRIPTOR结构,使用IMAGE_THUNK_DATA数组的原始地址,将DLL的名称和导入的符号存储在二进制文件中的某个位置(可能在新的部分中),并指向IMAGE_THUNK_DATA条目这些新名称。

ImpRec是一种流行的工具,可以自动执行此过程的大部分或全部过程,具体取决于打包程序。我刚才描述的内容反映了大约95%的情况。更严重的保护措施,例如视频游戏版权保护和棘手的自定义恶意软件,会使用进一步的手段来阻碍重建过程。