安装包逆向(总结)

1、安装包结构:

PE结构的基础上,增加了处理逻辑代码+自定义的资源

PE_Overlay指PE结构的最后一个节的末尾位置,通常用于存储自定义资源

PE结构的最后一个节末尾+1个字节的位置就是OverLay的起点。(last_section.Raw_offset + last_section.Raw_size) = Overlay;

PE_Overlay指的是PE(Portable Executable)文件格式中的Overlay,它是PE文件的最后一个节(section)的末尾位置之后的额外数据。在PE文件加载时,操作系统会将整个文件映射到内存中,其中Overlay部分通常被忽略。这部分数据可以用于存储任意类型的自定义资源,例如图像、音频、配置文件等,而不影响PE文件的正常执行。

详细来说,PE文件由多个节组成,每个节用于存储不同类型的数据,例如代码、数据、资源等。而Overlay是指PE文件的最后一个节之后的数据区域。在PE文件的文件头中,有一个字段指示了节表的起始位置和节表的数量。通过遍历节表,可以找到PE文件的最后一个节,并且通过该节的偏移量和大小可以确定Overlay的起始位置和大小。

Overlay的存在可以让开发者在不修改PE文件的基本结构的情况下,向其添加额外的数据。这对于包含了大量资源或者需要动态更新的程序来说非常有用。在安装包中,Overlay常常被用来存储自定义资源,例如软件的图标、帮助文件、配置文件等等。虽然Overlay不是PE文件的必需部分,但它为软件开发者提供了一个便捷的方式来扩展程序的功能。

逻辑代码
就是内部结构的基址寻找和资源的解析,(自定义的加密或者编码的手段),软件系统的环境变量注册,保护内部数据不被轻易的识别,实现自动化的软件安装部署这么一个过程,部署软件资源代码之后的自启动,自启动特性:一是启动主程序(Exec + Path,ShellExcuteEx + Path),二是启动某些必须要执行的第三方库或者命令(CreateProcess + cmd /c + arg)。

逻辑代码是安装包中负责处理安装、配置和启动软件的一部分代码。这些代码通常具有以下功能:

  1. 基址寻找和资源解析:

    • 逻辑代码负责在安装过程中寻找内部结构的基址,以便正确定位和访问程序的各个组件和资源。
    • 它也负责解析安装包中的资源,包括但不限于图像、音频、文本文件等,以便在安装过程中正确加载和使用这些资源。
  2. 加密或编码手段:

    • 逻辑代码可能采用自定义的加密或编码手段对部分或全部资源进行保护,以防止未经授权的访问或篡改。
  3. 环境变量注册:

    • 逻辑代码可能会在系统中注册环境变量,这些环境变量可以影响软件的行为或配置。
  4. 自动化软件安装部署:

    • 逻辑代码能够实现自动化的软件安装和部署过程,从而简化用户的操作并提高效率。
  5. 自启动特性:

    • 逻辑代码可能包含自启动的特性,即在安装完成后,程序能够自动启动。
    • 自启动可以包括启动主程序,常见的方式包括使用Exec + Path或ShellExecuteEx + Path来启动主程序。
    • 除了启动主程序,逻辑代码还可能涉及启动一些必须执行的第三方库或命令,这通常通过CreateProcess + cmd /c + arg等方式实现。

软件系统
主程序EXE,主要功能的DLL,三方的功能库DLL(ocx,lib,自定义的格式存储的代码模块),软件关联的环境信息(存储到注册表里面),软件系统数据文件,特定的目录结构(特定名字,特定的目录分布)
软件系统是指一个完整的软件应用程序,包括了多个组成部分,具体如下:

  1. 主程序(EXE):

    • 主程序是软件系统的核心部分,通常是用户直接执行的程序文件,包含了软件的主要功能和逻辑。
  2. 主要功能的动态链接库(DLL):

    • 动态链接库是一组可重用的代码和数据,可以被主程序或其他DLL调用,以实现特定的功能。这些DLL通常包含了软件的核心功能模块,以便于模块化开发和维护。
  3. 第三方的功能库DLL(ocx,lib,自定义的格式存储的代码模块):

    • 除了软件内部开发的功能库之外,软件系统还可能依赖于第三方提供的功能库,例如OCX、LIB等格式的DLL文件。这些库提供了各种各样的功能,例如图形界面控件、数学计算库等。
  4. 软件关联的环境信息(存储到注册表里面):

    • 软件系统可能需要在系统中注册一些环境信息,以便于程序的正确运行和配置。这些信息通常存储在注册表中,包括了程序的安装路径、配置参数、许可证信息等。
  5. 软件系统数据文件:

    • 软件系统可能需要使用和管理各种数据文件,包括了用户数据、配置文件、日志文件等。这些数据文件通常存储在特定的目录中,以便程序能够方便地访问和管理。
  6. 特定的目录结构(特定名字,特定的目录分布):

    • 软件系统通常会定义一套特定的目录结构,包括了各种子目录和文件,用于存储程序的各种资源和数据。这些目录可能具有特定的命名规范和分布规则,以便于程序的组织和管理。

资源常见的打包方式
基址 + 偏移;存在于资源当中,课程内容的安装包的基址是从资源中获取解析代码的偏移,然后在进行后续的一系列解包操作。目前我们发现,这个资源中获取的解析基址和PE_Overlay一致的。那么,我们的解析程序是否可以绕过获取资源的这个步骤,直接计算PE的Overlay,得到这个Overlay值之后,直接进行解析呢?

资源常见的打包方式
通常是基于基址加偏移的方式。在安装包中,解析程序通常需要从资源中获取解析代码的偏移,然后进行后续的解包操作。根据描述,目前发现解析基址和PE_Overlay的值一致。

针对这种情况,是否可以直接计算PE的Overlay值并绕过获取资源的步骤呢?这取决于具体的情况,但有几点需要考虑:

  1. Overlay的确定性: 如果PE文件中的Overlay值是确定的,且与资源中的解析基址一致,那么可以尝试直接计算Overlay值。这需要进行验证,确保Overlay的位置是可靠的。

  2. 逻辑的一致性: 确保绕过获取资源步骤后,解析程序的逻辑仍然能够正确地进行解析。如果绕过获取资源步骤后的解析逻辑不完整或不准确,可能会导致解析错误。

  3. 安全性考虑: 绕过获取资源步骤可能会带来一定的安全风险,特别是如果资源中的解析基址经过加密或其他保护手段。在这种情况下,直接计算Overlay值可能会绕过这些保护措施,导致安全漏洞。

既然都知道这个资源内部的值是一个Overlay,那么如果第三方解析程序,直接计算Overlay,去解析,就会出现一个错误的情况,那就是特定构造的一个样本,资源存储块不是Overlay的起始位置。

一是:我把资源内的值改一下,改成Overlay + 2个字节的偏移,然后原始文件相应的也加上两个字节的偏移。

二是:我保留原始的Overlay的资源块结构,在原始块的最末尾,我人为构造了一个新的资源块,然后我把资源内的值改成我的新的资源块的偏移。

  1. 改变资源内的值:

    • 在第一种情况下,你改变了资源内的值,使其不再指向Overlay的起始位置,而是偏移了两个字节。这会导致解析程序直接计算Overlay的位置时出现错误,从而无法正确解析安装包。
    • 为了解决这个问题,需要保持资源内的值不变,以确保解析程序能够正确地定位Overlay的起始位置。
  2. 构造新的资源块:

    • 在第二种情况下,你在原始Overlay资源块的末尾构造了一个新的资源块,并将资源内的值修改为指向这个新资源块的偏移。这同样会导致解析程序无法正确解析安装包,因为它会尝试解析不属于原始结构的新资源块。
    • 解决这个问题的方法是保持原始Overlay资源块的结构不变,并避免在安装包中添加额外的资源块或改变原有资源的结构。

结论:安装包结构的解析,一定要遵循原始解析逻辑,避免关键逻辑被忽略,导致最终结果错误。

你提到了几个与基址、文件流、内部存储结构和分析手法相关的概念,我会逐一详细解释。

基址:

基址是指在解析安装包或执行程序时,用于定位资源或功能的起始位置。根据你的描述,有几种获取基址的方法:

  1. 使用PE的Overlay: 直接使用PE文件的Overlay作为基址。
  2. 利用PE里面的资源节: 通过解析PE文件的资源节来获取基址。
  3. 在Overlay基础上加上特定的Flags_Hex: 通过在Overlay基础上,加上特定的Flags_Hex,(NullSoft,01 02 03 04 05 06 07)浮动搜索,所有的资源数据和内部结构外面还包一层编码或者压缩。

文件流:

文件流指的是安装包中的数据流,可以是原始文件流或经过处理后的文件流。处理方式可能包括压缩(如zlib、lzma)、加密(如AES)、异或等操作。在运行时,文件流可能会被加载到内存中,需要进行解密或解压操作后才能使用,使用后可能会被丢弃以保护数据安全性。

内部存储结构:

内部存储结构用于描述文件流中的信息,包括文件名、释放目录名、文件大小、哈希值、文件属性、文件类型等等。这些信息通常以特定的格式组织,例如一系列字节表示特定含义,比如:4byte + 8字节 + 16字节 + Buff。

分析手法:

分析安装包可以采用多种手法:

  1. 静态分析: 静态分析是在不运行程序的情况下对安装包进行分析,可以通过查看文件结构、元数据和代码逻辑来了解程序的行为。
  2. 逆向分析: 逆向分析是通过反汇编、反编译等技术来分析程序的执行逻辑、数据结构和算法,从而深入了解程序的内部运行机制。
  3. 安装包源码分析: 如果有可用的安装包源码,可以直接对源码进行分析,这样可以更直观地了解程序的实现细节和逻辑。

2、安装包的结构利用

基址的利用是指在解析安装包或执行程序时,使用基址来定位资源或功能的起始位置。

  1. 基址的修改:

    • 这种方式涉及修改安装包或程序中的基址值,使其指向特定位置。例如,可以直接修改PE文件的Overlay值或资源节的偏移量,以便程序在运行时正确定位到相应的资源或功能。
  2. 特定的Flags_Hex浮动搜索:

    • 这种方式涉及使用特定的标志(Flags_Hex)来标识基址,然后进行浮动搜索以找到基址的实际位置。例如,NullSoft可能会使用一组特定的标志值作为基址的标识,然后在安装包中进行浮动搜索以定位这些标志值,从而确定基址的位置。
  3. 从汇编层面获取Flags值:

    • 在汇编代码中填充特定的值(如’mov [esp + 0x0],‘N’,mov [esp + 0x1],'u’等),然后从汇编层面获取这些值作为Flags值。通过识别这些填充值,并从中获取Flags值,可以帮助定位基址的位置。
  4. 定位基址:

    • 一旦获取了基址或基址的标志值,就可以使用这些信息来定位基址的位置。根据具体情况,可能需要对安装包或程序进行进一步的分析和处理,以确定基址的确切位置。

自启动的利用指的是利用安装包或程序中的自启动功能,在系统启动或程序运行时自动执行一些操作或加载一些内容。

  1. 修改路径:

    • 在安装包或程序中,通常会定义一些路径,用于指定需要执行的程序或文件的位置。攻击者可以修改这些路径,使其指向恶意文件或程序,从而在系统启动或程序运行时执行恶意操作。
    • 举例子:在第八个0x194数据块,+0x68位置是一个Path,Path ->Exec或者ShellExecuteEx;这个Buf长度是多少,路径的位置权限问题,D:\Program Files 执行C:\xxx。
  2. 内嵌文件执行:

    • 攻击者可以将恶意文件内嵌到安装包中,并将其放置在需要执行的目录下。然后,通过自启动功能,程序在启动时会自动执行这个内嵌的恶意文件,从而实现攻击目的。
  3. 利用命令行启动:

    • 在安装包或程序中,可以通过命令行参数的方式来指定需要执行的命令或程序。攻击者可以利用这一特性,在系统启动或程序运行时通过命令行参数来执行恶意操作,例如执行系统命令、调用其他程序等。
  4. 利用系统自启动机制:

    • 攻击者可以利用系统的自启动机制,将恶意程序注册到系统的启动项中,使其在系统启动时自动执行。这种方式可以在系统启动时执行恶意操作,从而实现持久化控制。

zip rar 自解压包存在路径穿越的漏洞:

  • 压缩包中的路径穿越漏洞是一种安全问题,通常是由于对压缩包中的路径字符串校验不够严格导致的。攻击者可以利用这种漏洞传入特定的路径,使程序在解压时误解路径,从而导致执行高等级路径下的模块。为了防止这种漏洞,程序应该对解压时的路径进行严格的校验和过滤,确保只解压到指定的目录下。

替换内嵌文件流:

  • 在安装包中内嵌的压缩文件流可能存在被替换的安全问题。攻击者可以替换内嵌的文件流,使其指向恶意文件或代码,从而在程序执行时执行恶意操作。为了防止这种情况,程序应该对内嵌的文件流进行完整性验证,确保其没有被篡改。
  • 内嵌文件流的格式 4bytes + 8bytes + fileZIPStream

常见的压缩库:

  • 包括lzmalib、zlib和7z。这些压缩库都是古老而成熟的算法库,被广泛应用于各种软件中。虽然这些库具有良好的压缩性能和功能,但在使用时也需要注意安全问题,例如防止压缩包中的路径穿越漏洞和内嵌文件流被替换等。

文件流的利用涉及在安装包或程序中对文件流进行加密或其他定制处理,以增强数据的安全性或隐藏内容。下面是关于文件流利用的一些情况:

  1. 加密层:

    • 可以在标准压缩流或加密流的外层添加自定义的加密算法,从而增加文件流的安全性。这种方法可以保护文件内容不被未经授权的人访问或篡改,提高数据的保密性和完整性。
  2. 改变安装包的代码:

    • 攻击者可能会修改安装包的代码,以使其在解压或执行文件流时进行恶意操作。这可能包括插入恶意代码、替换文件流内容等。这种做法可能导致安装包中的文件流被操纵或变得不安全。
  3. 常见的结构和处理:

    • 安装包通常会对文件流采用常见的结构和处理方法,例如使用标准的压缩算法(如zlib、lzma)或加密算法(如AES)来处理文件流。这些方法在提高安装包效率的同时也增加了数据的安全性。
  4. 费时和扫描速率:

    • 对文件流进行加密或定制处理可能会增加解压或执行的时间成本,并且可能会影响安装包的扫描速率。加密算法的复杂性、文件流的大小和数量等因素都会影响到处理的费时和速率。

老的压缩算法存在溢出漏洞的情况并不罕见,尤其是在一些开源压缩库中,因为这些库通常经过多年的使用和演变,难免会出现漏洞或安全隐患。lzmalib,由于源码中可能缺乏对溢出的严格检测,攻击者可能会通过构造恶意的压缩流来触发溢出漏洞。

攻击者可能采取以下步骤来利用老的压缩算法的溢出漏洞:

  1. 源码分析: 首先,攻击者可能会通过分析源码来了解压缩算法的工作原理和逻辑。在源码中,攻击者可能会寻找潜在的缓冲区溢出漏洞或未经检查的用户输入。

  2. 构造恶意压缩流: 接着,攻击者可以利用源码逻辑构造恶意的压缩流,其中包含特定的数据结构或内容,可以导致缓冲区溢出。这通常需要进行深入的理解和分析,并且可能需要进行多次尝试和调试。

  3. Fuzzing: 另一种常见的方法是使用Fuzzing技术来生成大量的测试样本,以寻找潜在的漏洞。通过在压缩算法中模拟各种输入情况,并观察程序的行为,可以发现潜在的溢出漏洞。

  4. 利用漏洞: 一旦攻击者成功构造了恶意的压缩流并发现了溢出漏洞,他们就可以利用该漏洞来执行恶意代码、绕过安全措施或实现其他攻击目的。

CVE-2017-11882 是一个安全漏洞
影响了微软 Office 套件中的 Equation Editor 组件。该漏洞存在于 Microsoft Office Equation Editor 中的一个远程代码执行漏洞,使得攻击者可以通过特制的 Office 文档(.doc 文件)执行任意代码。

具体来说,这个漏洞在解析包含恶意代码的特定文档时会被触发,导致将恶意数据传递给 Equation Editor 组件中的 EQNEDT32.EXE 可执行程序。攻击者可以通过构造恶意的 Word 文档,并在其中插入恶意的公式,以利用这个漏洞执行任意代码。

这种漏洞的利用通常需要深入了解受影响组件的结构和内部工作原理,以便构造有效的恶意输入。攻击者可能会利用文档格式(如 FAT 文件结构或 NTFS),通过特定的结构(例如 struct)来触发漏洞。一旦成功利用了这个漏洞,攻击者就可以在受影响的系统上执行恶意代码,可能导致系统受损、数据泄露或其他安全风险。

脚本类的安装包对抗是指在面对第三方解析脚本内容的情况下采取的一系列对抗措施。

  1. 脚本混淆处理:

    • 攻击者可能会对脚本进行混淆处理,以使其难以理解和分析。这种混淆可能包括重命名变量、添加无用代码、嵌入加密或编码算法等。这使得对脚本内容的分析变得更加困难,增加了攻击者的侦测难度。
  2. 代码压缩和加密:

    • 攻击者可能会对脚本代码进行压缩和加密处理,以防止第三方解析器轻易读取和理解脚本内容。在运行时,脚本会被动态解密和解压,然后才能执行。这种技术可以有效防止逆向工程。
  3. 动态加载和反调试:

    • 脚本可能会动态加载部分或全部代码,以增加解析的复杂性。此外,脚本可能会包含反调试技术,以防止第三方调试器对脚本进行分析和跟踪。
  4. 使用白加黑策略:

    • 攻击者可能会采用白加黑策略,即在正规软件的基础上添加恶意的黑文件。这种做法使得恶意脚本更难被检测到,因为正规软件的信誉度可能会掩盖黑文件的存在。此外,黑文件通常会隐藏在正常操作中,使得其行为更加隐蔽。
  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Back~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值