Skip to content

怎么使用 Metasploit::Framework::Obfuscation::CRandomizer

L edited this page May 22, 2022 · 1 revision

怎么使用 Metasploit::Framework::Obfuscation::CRandomizer

什么是 CRandomizer

CRandomizer 是 Metasploit 框架中的一个混淆功能, 允许你随机化 C 代码. 它是通过注入随机语句来完成的, 例如本机 API 调用、自定义假函数调用或其他例程等. Metasploit 框架的代码编译 API 也支持 CRandomizer, 它允许你构建一个独特的自定义应用程序 (就校验和而言) , 也更难进行逆向工程.

修改的随机性基于权重, 从 0 到 100 的任意数字. 数字越高, 代码越随机.

组件

CRandomizer 依赖 Metasm 来解析 C 代码. 构建以下组件来解析和修改源代码

CodeFactory

也称为 Metasploit::Framework::Obfuscation::CRandomizer::CodeFactory.

CodeFactory 模块用于生成稍后将在源代码中注入的随机存根(无内容的函数). 目前, 这个类能够制作的东西包括小的存根, 如 if 语句、开关、假函数和 Windows API 调用等. 每个存根往往很小, 并且被大多数 AV 认为是无害的.

CodeFactory 中的每个类, 除了 Base、FakeFunction 和 FakeFunctionCollection 之外, 都是随机选择并在源代码中使用的存根候选对象.

如果存根需要本地 API 调用, 则该类可以指定 @dep 来设置该依赖关系. 如果源代码不支持 API 调用, 则使用下一个候选存根 (或直到找到一个存根) .

例如, CRandomizer::CodeFactory::OutputDebugString 类用于生成假的 OutputDebugString 调用, 并且依赖项设置为 ['OutputDebugString']. 如果源代码包含 Windows.h 标头, 则 CRandomizer 知道可以注入 OutputDebugString. 如果没有, CRandomizer 将不会使用它.

Modifier

也称为 Metasploit::Framework::Obfuscation::CRandomizer::Modifier.

Modifier 类决定了应该如何修改某些东西, 并实际修改源代码, 例如: 函数、不同的 if 语句、循环、嵌套块等.

当修饰符遍历源代码时, 它会在每个语句中随机注入额外的代码 (由 CodeFactory 类提供) , 直到没有更多的函数需要修改.

Parser

也称为 Metasploit::Framework::Obfuscation::CRandomizer::Parser.

Parser 类的主要目的是使用 Metasm 将源代码转换为可解析的格式, 然后将函数传递给 Modifier 类进行处理.

Utility

Utility 类提供了任何 CRandomizer 类都可以使用的快速使用方法.

代码示例

创建新存根

首先, 在 code_factory 下添加一个具有任意文件名的新文件. 例如: hello.rb. 在这个例子中, 让我们创建一个新的存根, 它将 printf() "Hello World". 你的存根应编写为 CodeFactory 命名空间下的类, 并确保继承 Base 类. 像这样:

require 'metasploit/framework/obfuscation/crandomizer/code_factory/base'

module Metasploit
  module Framework
    module Obfuscation
      module CRandomizer
        module CodeFactory

          class Printf < Base
            def initialize
              super
              @dep = ['printf']
            end

            def stub
              %Q|
              int printf(const char*);
              void stub() {
                printf("Hello World");
              }|
            end
          end

        end
      end
    end
  end
end

注意几件事:

  • 每个类都应该有自己的存根方法. 这个存根方法应该返回一个字符串, 其中包含你希望注入的代码. 此外, 你的代码应该写成一个函数, 以便 Metasm 知道如何获取它, 因此 printf 位于一个 void stub() 函数中.
  • 如果你的存根需要原生 API (在本例中, 我们使用的是 printf) , 那么你必须将此函数名称添加到 @dep 实例变量中, 该变量是一个数组.
  • 请记住, 你的存根应该保持简单和小巧, 并且不是唯一的. 例如避免:
    • 分配一大块内存
    • 避免标记或分配可执行内存
    • 循环
    • 加载引用的部分、资源或 .data
    • 来自 Windows API 的反调试功能
    • 大量的函数调用
    • 唯一的字符串
    • 访问 Windows 注册表或文件系统的 API
    • XOR
    • Shellcode
    • 恶意软件特有的任何其他可疑代码模式.

随机化源代码

例如, 请参考 tools/exploit/random_compile_c.rb.

Clone this wiki locally