【问题标题】:Executable Packer (decompression/decryption stub)可执行打包程序(解压缩/解密存根)
【发布时间】:2013-05-16 06:22:32
【问题描述】:

我正在开发一个可执行的 Packer,到目前为止我已经完成了压缩和加密部分。现在我必须将解压缩/解密存根/例程存储在压缩文件中。我的问题是这个存根是用十六进制代码编写的还是我可以直接放置汇编指令?如果以后可以,那怎么办?

【问题讨论】:

  • 看一下UPX打包的一些可执行文件的结构。这可能会对您有所帮助。
  • 感谢@V-X 我已经分析了 UPX 源代码,但显然我无法理解存根的格式(即十六进制/汇编)以及它们是如何放置的。我们将不胜感激。

标签: c inline-assembly packing portable-executable


【解决方案1】:

创建一个有效的打包二进制文件需要:

  1. 修改 PE 几何结构
  2. 插入您的代码

根据您的代码大小,您可能希望使用部分填充,或添加您自己的部分。

然后,插入您的代码 - 因为您似乎更喜欢直接插入 ASM - 我的建议是使解密代码与 EIP 无关,然后将其与 YASM 之类的东西组装成纯代码 (-o),并包括直接编译成二进制代码。

我写了几个mini-packers 作为开始参考可能会有所帮助,因为它们还“插入”了汇编代码。

【讨论】:

  • 非常感谢 Ange,这个建议很有帮助。是的,我修改了 PE 几何形状。我还为该存根部分添加了一个新部分。但现在的问题是我压缩和加密文件。创建一个新部分,我将在其中放置我的存根部分,我使用输入文件的头信息创建一个新的 PE 文件,对新创建的文件应用修改。一切似乎都很好,即标题等。但是当我运行文件时,我看到错误消息“不是有效的 Win32 应用程序”。我使用的是 Visual Studio 2010 和无增量链接。我无法弄清楚问题是什么?也许您可以提出更好的解决方案?
  • 这可能有 许多 原因(忘记增加 SizeOfImage,...?),所以您应该尝试使用 pefile 打开您的新 PE 并查看警告告诉你。
  • 我增加了 SizeOfImage。你能告诉我这样做是否正确,即 SizeOfImage=stubSection->VirtualAddress+stubSection->Misc.VirtualSize 其中 stubSection 是最后一节。如果这种计算方式是错误的,那么增加 SizeOfImage 的正确方法是什么?我也在用 LordPE 和 PEiD 打开我的 PE,但他们没有发出任何警告。可能是其他原因,MajorLinkerVersion、OSversion 等?
【解决方案2】:

您必须有具有“可读”和“可写”和“包含代码”和“可执行”特征的部分

  Address of Entry Point:        0x00019860

  Section Header #1
    Name:                             UPX0
    Virtual Size:                     0x00010000 (65536)
    Virtual Address:                  0x00001000
    Size of Raw Data:                 0x00000000 (0)
    File Pointer to Raw Data:         0x00000400
    File Pointer to Relocation Table: 0x00000000
    File Pointer to Line Numbers:     0x00000000
    Number of Relocations:            0
    Number of Line Numbers:           0
    Characteristics:                  0xE0000080
      Section contains uninitialized data.
      Section is executable.
      Section is readable.
      Section is writeable.

  Section Header #2
    Name:                             UPX1
    Virtual Size:                     0x00009000 (36864)
    Virtual Address:                  0x00011000
    Size of Raw Data:                 0x00008A00 (35328)
    File Pointer to Raw Data:         0x00000400
    File Pointer to Relocation Table: 0x00000000
    File Pointer to Line Numbers:     0x00000000
    Number of Relocations:            0
    Number of Line Numbers:           0
    Characteristics:                  0xE0000040
      Section contains initialized data.
      Section is executable.
      Section is readable.
      Section is writeable.

  Section Header #3
    Name:                             .rsrc
    Virtual Size:                     0x00001000 (4096)
    Virtual Address:                  0x0001A000
    Size of Raw Data:                 0x00000800 (2048)
    File Pointer to Raw Data:         0x00008E00
    File Pointer to Relocation Table: 0x00000000
    File Pointer to Line Numbers:     0x00000000
    Number of Relocations:            0
    Number of Line Numbers:           0
    Characteristics:                  0xC0000040
      Section contains initialized data.
      Section is readable.
      Section is writeable.

简而言之,UPX 生成一个包含压缩代码和解压缩例程的部分,以及第二个未初始化但允许具有可写和可执行特性的部分。解压器例程将代码解压到未初始化的部分并继续执行原始入口点...

【讨论】:

  • 我创建了一个用于放置具有 RWE 特性的存根的新部分。但问题不在于这些部分。这应该是解压/解密存根的格式,即它应该是汇编或 HEX(如 shellcode)?
  • 我仍然看不出将汇编写成二进制或将汇编指令写成后来编译成二进制的区别......
  • 好的,假设我选择了第二个选项,即编写为汇编指令。现在如何将这些说明放入我的存根部分?因为我需要某种缓冲区来存储这些指令并将缓冲区写入文件?
猜你喜欢
  • 1970-01-01
  • 2022-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多