assume edi:ptr IMAGE_IMPORT_DESCRIPTOR
.while !([edi].OriginalFirstThunk==0 && [edi].TimeDateStamp==0 && [edi].ForwarderChain==0 && [edi].Name1==0 && [edi].FirstThunk==0)
edi 现在指向第一个 IMAGE_IMPORT_DESCRIPTOR 结构。接下来我们遍历整个结构数组直到遇上一个全 0 结构,这就是数组末尾了。
invoke AppendText,hDlg,addr ImportDescriptor
invoke RVAToOffset,pMapping, [edi].Name1
mov edx,eax
add edx,pMapping
我们要显示当前 IMAGE_IMPORT_DESCRIPTOR 结构的值。 Name1 不同于其他结构成员,它含有指向相关 dll 名的 RVA 。因此必须先将其转换成虚拟地址。
invoke wsprintf, addr temp, addr IDTemplate, [edi].OriginalFirstThunk,[edi].TimeDateStamp,
[edi].ForwarderChain,edx,[edi].FirstThunk invoke AppendText,hDlg,addr temp
显示当前 IMAGE_IMPORT_DESCRIPTOR 结构的值。
.if [edi].OriginalFirstThunk==0
mov esi,[edi].FirstThunk
.else
mov esi,[edi].OriginalFirstThunk
.endif
接下来准备遍历 IMAGE_THUNK_DATA 数组。通常我们会选择 OriginalFirstThunk 指向的那个数组,不过,如果某些连接器错误地将 OriginalFirstThunk 置 0 ,这可以通过检查 OriginalFirstThunk 值是否为 0 判断。这样的话,只要选择 FirstThunk 指向的数组了。
invoke RVAToOffset,pMapping,esi
add eax,pMapping
mov esi,eax
同样的, OriginalFirstThunk / FirstThunk 值是一个 RVA 。必须将其转换为虚拟地址。
invoke AppendText,hDlg,addr NameHeader
.while dword ptr [esi]!=0
现在我们准备遍历 IMAGE_THUNK_DATAs 数组以查找该 DLL 引入的函数名,直到遇上全 0 项。
test dword ptr [esi],IMAGE_ORDINAL_FLAG32
jnz ImportByOrdinal
第一件事是校验 IMAGE_THUNK_DATA 是否含有 IMAGE_ORDINAL_FLAG32 标记。检查 IMAGE_THUNK_DATA 的 MSB 是否为 1 ,如果是 1 ,则函数是通过序数引出的,所以不需要更进一步处理了。直接从 IMAGE_THUNK_DATA 提取低字节获得序数,然后是下一个 IMAGE_THUNK_DATA 双字。
invoke RVAToOffset,pMapping,dword ptr [esi]
mov edx,eax
add edx,pMapping
assume edx:ptr IMAGE_IMPORT_BY_NAME
如果 IMAGE_THUNK_DATA 的 MSB 是 0 ,那么它包含了 IMAGE_IMPORT_BY_NAME 结构的 RVA 。需要先转换为虚拟地址。
mov cx, [edx].Hint
movzx ecx,cx
invoke wsprintf,addr temp,addr NameTemplate,ecx,addr [edx].Name1
jmp ShowTheText
Hint 是字类型,所以先转换为双字后再传递给 wsprintf ,然后我们将 hint 和函数名都显示到编辑控件中。
ImportByOrdinal:
mov edx,dword ptr [esi]
and edx,0FFFFh
invoke wsprintf,addr temp,addr OrdinalTemplate,edx
在仅用序数引出函数的情况中,先清空高字再显示序数。
ShowTheText:
invoke AppendText,hDlg,addr temp
add esi,4
在编辑控件中插入相应的函数名 / 序数后,跳转到下个 IMAGE_THUNK_DATA 。
.endw
add edi,sizeof IMAGE_IMPORT_DESCRIPTOR
处理完当前 IMAGE_THUNK_DATA 数组里的所有双字,跳转到下个 IMAGE_IMPORT_DESCRIPTOR 开始处理其他 DLLs 的引入函数了。
附录 :
让我们再来讨论一下 bound import 。当 PE 装载器装入 PE 文件时,检查引入表并将相关 DLLs 映射到进程地址空间。然后象我们这样遍历 IMAGE_THUNK_DATA 数组并用引入函数的真实地址替换 IMAGE_THUNK_DATAs 值。这一步需要很多时间。如果程序员能事先正确预测函数地址, PE 装载器就不用每次装入 PE 文件时都去修正 IMAGE_THUNK_DATAs 值了。 Bound import 就是这种思想的产物。
为了方便实现, Microsoft 出品的类似 Visual Studio 的编译器多提供了 bind.exe 这样的工具,由它检查 PE 文件的引入表并用引入函数的真实地址替换 IMAGE_THUNK_DATA 值。当文件装入时, PE 装载器必定检查地址的有效性,如果 DLL 版本不同于 PE 文件存放的相关信息,或则 DLLs 需要重定位,那么装载器认为原先计算的地址是无效的,它必定遍历 OriginalFirstThunk 指向的数组以获取引入函数新地址。
Bound import 在本课中并非很重要,我们确省就是用到了 OriginalFirstThunk 。要了解更多信息可参见 LUEVELSMEYER 的 pe.txt 。
分享到:
相关推荐
### PE文件中脱壳技术的研究 #### 摘要与背景 随着信息技术的快速发展,软件保护成为了一个重要的议题。为了防止软件被非法复制或者逆向工程,开发人员常常采用一种称为“加壳”的技术来保护自己的软件产品。然而...
都会使计算机产生安全隐患或者使软件的核心技术被窃取,所以保护PE文件不被修改是一件很重要的工作,当前通常采用加壳的方法对PE文件进行保护,这其中UPX是具有代表性的压缩类外壳。 本文首先对PE文件格式进行了全面...
UPX是一个着名的压缩壳,主要功能是压缩PE文件(比如exe,dll等文件),有时候也可能被病毒用于免杀。壳upx是一种保护程序。 ........................ UPX是大家熟悉的EXE/Dll资源压缩工具,也称作可执行文件压缩...
PE文件格式是Windows操作系统中用于执行程序的标准格式,包括可执行文件(.exe)、动态链接库(.dll)等。PE脱壳工具能够识别并处理这些文件中的各种壳技术,例如UPX、ASPack、PECompact等。这些壳通常用于压缩程序...
UPX(UPX UnPacker eXtended)是一款广泛使用的可执行文件压缩工具,它能够将PE(Portable Executable,Windows平台上的可执行文件格式)文件进行压缩,从而减小程序的体积,提高分发效率。然而,这也为逆向工程和...
在计算机安全领域,PECompact是一款知名的可执行文件打包和压缩工具,它能够将Windows下的PE(Portable Executable)格式文件进行压缩,从而减小文件体积,提高分发效率。然而,这样的压缩过程也使得一些恶意软件...
总结以上内容,脱壳是逆向工程的重要组成部分,需要掌握PE文件格式、SEH机制、调试工具的使用,以及对各种加密算法和保护技术的理解。只有对这些基础知识和高级技术有了充分的认识,才能在软件安全和逆向工程的道路...
Aspack stripper就是这样的一个工具,它的主要功能是对使用ASPack 2.12版本压缩的可执行文件进行自动脱壳。这个工具的存在,使得安全分析人员能够揭示被压缩和混淆的原始代码,从而更好地理解软件的工作原理,检查...
2. **脱壳机制**:脱壳工具的核心在于正确地解压UPX壳并恢复原始的未压缩PE文件。源码可能会包含解压算法,根据UPX的压缩格式进行还原。 3. **内存操作**:由于程序可能已经在内存中运行,脱壳工具可能需要在内存中...
对于想要深入理解脱壳技术的学习者来说,熟悉PE文件格式至关重要。 **PE文件格式简介** - **定义**:PE格式由微软开发,用于定义Windows平台上可执行文件(如.EXE、.DLL等)的结构。 - **关键特性**:PE文件包含了...
- **静态与动态分析的兼容性**:构建一个可以在静态分析时重建有效PE文件,并在动态分析时执行的PE文件。 - **防止恶意软件检测**:确保脱壳过程不会被恶意软件检测到,避免分析过程中的干扰。 - **兼容性问题**:...
这个过程涉及到对PE(Portable Executable)文件格式的理解,包括节区、导入表、导出表等关键结构。脱壳机通过识别和解析ASPack的特定标志和模式来实现这一目标。 在安全社区中,ASPack常被视为一种双刃剑。一方面...
ASPACK是一款著名的软件压缩和加壳工具,由Andrey Breslav开发,它能将可执行文件进行压缩,减小其体积,同时增加反调试和反静态分析的特性,使得程序更加难以逆向工程分析。ASPACK 2.1和2.2是该工具的两个较早版本...
有些模糊处理一个Win32 PE等包装.NET程序集里面的.NET反编译器无法读取该文件。 移除大多数/所有的垃圾类添加混淆。 修复了一些的peverify错误。许多混淆器是马车和创建无法验证的代码错误。 还原类型的方法的参数和...
你可以用它来压缩或解压缩PE(Windows)、ELF(Linux)或DOS格式的可执行文件。例如,将一个.exe文件压缩,可以使用以下命令: ``` upx -q your_program.exe ``` 如果想要脱壳,只需添加`-d`参数: ``` upx -qd your...
这个工具的工作原理,它的壳特征和编译器特征保存在HackFans.txt里面,能识别出来的壳,基本上都有对应的脱壳函数,用壳特征脱壳,可以脱壳,对于一些不好特殊的壳你可以用OEP侦测来脱壳,这要依赖编译器特征,你也可以自己...
通过学习这些基础知识,初学者可以建立起对PE文件格式的理解,学会如何利用SEH技术进行调试,并且能够识别和分析不同类型的壳。这些技能是进行脱壳操作的基础,也是进一步深入学习逆向工程的关键。
UPX(Ultimate Packer for eXecutables)是一款著名的开源加壳工具,它能够对可执行文件(如Windows下的PE文件)进行压缩和加密,以减小文件大小、提高加载速度,同时也能提供一定的保护作用,防止恶意逆向分析。...