`
cfree
  • 浏览: 17892 次
  • 性别: Icon_minigender_1
  • 来自: 成都
最近访客 更多访客>>
社区版块
存档分类
最新评论

压缩与脱壳-PE文件格式 六 续

阅读更多
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文件的UPX脱壳算法的实现

    都会使计算机产生安全隐患或者使软件的核心技术被窃取,所以保护PE文件不被修改是一件很重要的工作,当前通常采用加壳的方法对PE文件进行保护,这其中UPX是具有代表性的压缩类外壳。 本文首先对PE文件格式进行了全面...

    .Net 脱壳 反混淆神器De4dot-3.1.41592最新版

    有些模糊处理一个Win32 PE等包装.NET程序集里面的.NET反编译器无法读取该文件。 移除大多数/所有的垃圾类添加混淆。 修复了一些的peverify错误。许多混淆器是马车和创建无法验证的代码错误。 还原类型的方法的参数和...

    红黑全能自动脱壳机——全能脱壳机

    这个工具的工作原理,它的壳特征和编译器特征保存在HackFans.txt里面,能识别出来的壳,基本上都有对应的脱壳函数,用壳特征脱壳,可以脱壳,对于一些不好特殊的壳你可以用OEP侦测来脱壳,这要依赖编译器特征,你也可以自己...

    脱壳入门初级教学(CHM格式)

    第一课 PE格式 第二课 SEH技术 第三课 认识壳 第四课 常见压缩壳与加密壳 第五课 文件类型分析 第六课 寻找OEP 第七课 Dump内存映像 第八课 重建输入表 第九课 手动确定IAT的地址与大小 第十课 DLL文件脱壳 第十一课...

    脱壳AspackDie

    - 询问用户是否继续解压缩不能解压缩的文件 (不知道是谁提的建议) 1.3d: (2002.3.26) --------------------- - 支持另外的一个未知的 Aspack 版本 (感谢: Proggi Killa) 1.3c: (2002.3.21) --------------------- ...

    软件脱壳破解工具

    AspackDie——AsPack的脱壳利器, 这是一个小小的PE 文件解压缩器 (EXE, DLL, ...) 她可以解压缩自Aspack 2000 以后的任何Aspack 版本. 包括: - Aspack 2000 - Aspack 2001 - Aspack 2.1 - Aspack 2.11 - Aspack 2.11...

    ASPack脱壳

    这是一个小小的 PE 文件解压缩器 (EXE, DLL, ...) 她可以解压缩 自 Aspack 2000 以后的任何 Aspack 版本. 包括: - Aspack 2000 - Aspack 2001 - Aspack 2.1 - Aspack 2.11 - Aspack 2.11c/d - Aspack 2.12 - Aspack...

    rordbg辅助脱壳工具

    答:点击“打开被分析文件”,出现Windows标准的文件打开对话框,选择欲分析的文件(必须是PE格式的EXE文件), 这时,被调试程序已经加载,可以先设置断点等调试条件,如果希望研究壳的技术,可以点选“遇到异常...

    全能脱壳机

    这个工具的工作原理,它的壳特征和编译器特征保存在HackFans.txt里面,能识别出来的壳,基本上都有对应的脱壳函数,用壳特征脱壳,可以脱壳,对于一些不好特殊的壳你可以用OEP侦测来脱壳,这要依赖编译器特征,你也可以自己...

    软件加密技术内幕 chm

    第1章 PE文件格式深入研究 1.1 PE文件格式格式纵览 1.1.1 区块(Section) 1.1.2 相对虚拟地址(Relative Virtual Addresses) 1.1.3 数据目录 1.1.4 输入函数(Importing Functions) 1.2 PE文件结构 ...

    多种脱壳软件

    现在为了适应脱壳的需要,发现原来的代码对非标准格式的PE文件的处理有些小问题, 所以代码基本都重写过了,但是基本处理步骤还是一致的,外表上看不出来 3.cooldebugger plugin(调试插件) 完全自主开发的插件,说是调试...

    软件加密技术内幕

    1.1 PE文件格式格式纵览 1.1.1 区块(Section) 1.1.2 相对虚拟地址(Relative Virtual Addresses) 1.1.3 数据目录 1.1.4 输入函数(Importing Functions) 1.2 PE文件结构 1.2.1 The MS-DOS头部 1.2.2 IMAGE...

    Windows应用程序捆绑核心编程光盘代码

    2.2 PE文件格式概述 28 2.2.1 PE文件结构布局 28 2.2.2 PE文件内存映射 30 2.2.3 Big-endian和Little-endian 31 2.2.4 3种不同的地址 31 2.3 PE文件结构 32 2.3.1 MS-DOS头部 32 2.3.2 IMAGE_NT_HEADER头部 ...

    强大UPX加壳压缩工具(Free UPX) v1.7汉化版.rar

    UPX 加壳压缩工具绿色版本,无需安装,Free UPX1.4,在编程开发过程中我们可以利用其对EXE, DLL, OCX, BPL, CPL 等格式文件加壳,使用方便快速、而且是免费的! UPX(the Ultimate Packer for eXecutables)是一个...

    软件破解入门教程.txt

    PE文件格式 认识脱壳 自动脱壳 手动脱壳 脱壳高级篇 第9章 注册机和补丁制作 概念介绍 补丁制作 注册机制作工具 rufeng教程 第一章 如何成为一个Cracker 第二章 破解软件的基础 第三章 破解windows 95...

    加密解密.技术内幕.chm

    第1章 PE文件格式深入研究1.1 PE文件格式格式纵览 1.1.1 区块(Section) 1.1.2 相对虚拟地址(Relative Virtual Addresses) 1.1.3 数据目录 1.1.4 输入函数(Importing Functions)1.2 PE文件结构 1.2.1 The MS-...

    完全掌握加密解密实战超级手册.z01

    462.1.3 PE文件格式的头结构 462.1.4 设置Optional Header可执行信息 492.1.5 Section Table结构数组 512.1.6 Import Table输入表 522.1.7 Export Table输出表 532.1.8 重定位表 542.2 简述代码分析实战 552.2.1 ...

    易语言程序免安装版下载

    注意:静态编译后常量数据位于PE文件的.rdata段中,只可读不可写,编程时请避免修改它们。譬如以下的代码,静态编译后就可能会出现问题: a = " " GetWindowTextA(hWnd, a, 20) 正确的代码为: a = 取空白文本 ...

Global site tag (gtag.js) - Google Analytics