帮酷LOGO
  • 显示原文与译文双语对照的内容
A branch monitor-based solution for process monitoring.

  • 源代码名称:BranchMonitoringProject
  • 源代码网址:http://www.github.com/marcusbotacin/BranchMonitoringProject
  • BranchMonitoringProject源代码文档
  • BranchMonitoringProject源代码下载
  • Git URL:
    git://www.github.com/marcusbotacin/BranchMonitoringProject.git
  • Git Clone代码到本地:
    git clone http://www.github.com/marcusbotacin/BranchMonitoringProject
  • Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/marcusbotacin/BranchMonitoringProject
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
  • 分支监视器项目

    简介

    分支监视项目。

    目标

    分支监视器是现代( Windows ) 系统运行时进程监控的替代方案。 我们的方法利用来自英特尔处理器的分支跟踪存储( BTS ) 实现一个动态的。透明的框架。 框架提供了许多分析工具,如函数调用跟踪和控制流图( CFG ) 重构。

    作者

    这个项目是botacin工作的大师的一部分。 美国大学的计算机科学硕士candidate是Campinas大学Computing大学的计算机科学硕士 candidate,由教授advised教授提供。 Paulo 。Lício 教授。 Dr 。Ricardo Abed Grégio 。com 。 更详细的信息,如学术论文,可以在项目页面上找到。

    命令行知识库

    从代码到现实世界。

    组织

    存储库按如下方式组织:

    • 基于的客户机: 一个基于查询客户机能够检索和打印收集到的数据的简单的轮询客户机。
    • 为一个给定的进程 ID ( PID ) 提供一个高级驱动程序客户端,可以执行流分析和 CG,CFG重构。 你需要为要监视的所有库提供地址。
    • Branch.Tester: 用于验证目的的循环程序。
    • 启动: 简化监视进程启动的工具。 给定 PID,转储所有内存地址,并将它们作为输入提供给高级客户端。
    • BranchMonitor.NMI: 监视驱动程序( NMI处理程序) 。
    • BranchMonitor.PMI: 监视驱动程序( PMI处理程序) 。
    • BranchMonitor.Multi-core: 多核心版本( PMI处理程序) 中的监控驱动程序。
    • BranchMonitor.Multi-paeg: 多页面收集版本( PMI处理程序) 中的监视驱动程序。
    • DumpDLL: 一种简化内省头生成的。
    • 内核: 内核自省模块。
    • Misbehavior.Detection: 检测应用程序misbehavior的分析工具。
    • Transparency.Tests: 用于验证branchmonitor透明度的工具。
    • ROP: 在执行跟踪中使用的CFI验证工具。
    • 调试器: 基于BranchMonitor框架构建的调试器。
    • Utils: 使用进行二进制分析的通用工具工具。
    • PIN.Branch.Monitor: 基于dbt的分支监视器实现,用于比较目的。

    版本

    目前,BranchMonitor 驱动程序在两个版本上。 第一种方法是使用NMI回调来处理中断,而第二个是通过钩子性能处理器来实现的。

    依赖项

    配置

    一些配置,比如监控核心,应该在 config.h 文件中设置。

    你应该定义是否要显示或者不显示调试消息。

    #defineDEBUG

    在这种情况下,还需要定义在调试器屏幕上打印的驱动程序 NAME 。 这里步骤非常重要,以便你可以筛选正在显示的驱动程序消息。

    #defineDRIVER_NAME"[BRANCH-MONITOR]"

    你还应该为系统和DOS子系统设置驱动程序 NAME 。 这是使用OpenFile进行通信的NAME 。

    #defineDRIVERNAME L"DeviceBranchMonitor"#defineDOSDRIVERNAME L"DosDevicesBranchMonitor"

    你应该设置监视器将启用的核心。

    #defineBTS_CORE3

    按 @smaresca, 自省头注意到的Introspection更新更新 version 。 提供的值适用于 Windows 8 x64 6.2构建 9200. 下面显示一些DLL版本,而其他的则可以在 DLL.Versions 找到。

    ProductVersion FileVersion FileName 
    -------------- ----------- -------- 
    6.2.9200.16384 6.2.9200.1638... C:WindowsSystem32ntdll.dll
    6.2.9200.16384 6.2.9200.1638... C:WindowsSystem32kernel32.dll

    为了在其他系统上运行该解决方案,你需要转储目标DLL并生成头文件。 这一过程由 DumpDLL命令行工具 eased,它解析DLL转储并产生正确的有序输出,如下所示:

    NTDLL输入:

    ==================================================
    Function Name : ZwYieldExecution
    Address : 0x0000000180003040
    Relative Address : 0x00003040
    Ordinal : 1971 (0x7b3)
    Filename : ntdll.dll
    Full Path : C:Windowssystem32ntdll.dll
    Type : Exported Function
    ==================================================

    NTDLL输出:

    strcpy, 4896
    strcat, 4720
    memcmp, 4496
    _local_unwind, 4432
    RtlGetCurrentUmsThread, 4240
    RtlEnterCriticalSection, 4192
    RtlLeaveCriticalSection, 4112

    建筑

    为了构建框架的许多组件,你应该在编译项目中包括它们的路径,如下所示:

    Including libraries paths

    在我的计算机中,我是在C 下编译的:。 如果要从其他目录编译,则需要正确地指向/src 路径。

    为了使插件的编译更加简单,我在存储库中包含了的capstone-3.0.4-win64.

    你还应该定义系统架构和配置,如下所示:

    Solution Configuration

    运行

    获胜所需的所有步骤 !

    驱动程序安装

    由于驱动程序没有签名,因此你应该禁用驱动程序的强制签名强制执行,以便使用它。

    安装后,你可以使用服务管理器加载它,如下所示:

    Driver startup

    测试

    为了检查解决方案是否正常工作,你可以使用简单客户端检索分支数据,如下所示:

    Simple client in action

    要筛选过程操作和执行分析任务,如拆除,必须启动具有二进制库地址的高级客户端:

    BranchClient usage

    启动程序可以执行检索地址信息和启动客户机的任务,如下所示,可以简化这里过程:

    Launcher usage

    客户端启动后,它已经在运行,如下所示:

    BranchClient in action

    示例

    BranchClientexamples 目录包含一些从真正的恶意软件示例获取的跟踪示例。 我希望他们能明确branchmonitor在二进制监控上的作用。 某些已经标识的操作如下所示:

    LIB C:WindowsSysWOW64user32.dll at 74c68038 (GetCursorPos+0x12) returned to Binary avr.exe at 465806
    LIB C:WindowsSysWOW64user32.dll at 76489ddc (IsWindowVisible+0x38) returned to Binary Chrome.exe at 4c52a5

    在这种情况下,这些函数用于显示以下消息:

    Message displayed by a malware sample )

    透明度

    使用BranchMonitor的最大优点之一是提供的透明度。 你可以使用来自目录的检查来验证这种声明。 我无意提供详尽的反演技术列表,但是有些透明的观点是。

    当前实现的测试:

    • IsDebuggerPresent
    • CheckRemoteDebugger
    • OutputDebugString

    有关反分析技巧的更多信息,请检查

    命令行调试

    如果驱动程序是使用调试标志编译的,则可以检查调试消息,如下所示:

     #defineDEBUG

    调试消息在调试屏幕上打印。 下图显示了在DbgView上打印的消息,从 SysInternals 。

    Debugging messages printed on DbgView

    应用程序

    应用程序基于开发的框架。

    命令行调试器

    基于BranchMonitor框架的调试器。 目录按如下方式组织:

    • :可以用来控制调试器的GDB存根。 在最初的文章中,它被集成到调试器解决方案本身,但是我在这里发布了一个独立版本,所以人们可以在不同。 它完全基于 gdb-debug-stub的mseaborn
    • 驱动程序: 要释放。
    使用 GDB

    通过在GDB客户机上设置远程目标可以获得GDB存根,如下所示:

    GDB stub

    更多信息即将发布。

    ROP探测器

    在BranchMonitoring框架下,实现了ROP攻击检测的一些控制流完整性( 中金中金) 策略。 你可以在中找到call的目录实现 for call调用 ret 和小工具大小策略。 虽然我以前已经经介绍过一篇文章的实时解决方案,但是这里发布的工具是针对。 但是,你可以在 DriverClient 上轻松实现这些算法,因为从工具中检索到了这些。

    基于规则的调用RET策略由匹配对匹配 and和 RETs RETs RETs基于每个的思想,在整数流中必须是一个 CALL 。 这里策略如下所示:

    ('CURRENT STACK ', [['call', 'NewToy', 'printf']])
    ('CURRENT STACK ', [['call', 'NewToy', 'printf'], ['call', 'printf', '__iob_func']])
    ('CURRENT STACK ', [['call', 'NewToy', 'printf'], ['call', 'printf', '__iob_func'], ['ret', '__iob_func', 'printf']])
    CALL-RET MATCH, REMOVING
    ...
    ('CURRENT STACK ', [['call', 'NewToy', 'printf']])
    ('CURRENT STACK ', [['call', 'NewToy', 'printf'], ['ret', 'printf', 'NewToy']])
    CALL-RET MATCH, REMOVING
    ('CURRENT STACK ', [])

    小工具规则是一个启发式,假定:小于普通的,所以一个移动窗口用于 register的执行。

    ('Detected in', [2, 17, 36, 4, 2, 27, 13, 5, 46, 2])

    反分析技巧检测

    考虑到透明特性,我们的框架可以执行反分析技巧,没有任何问题。 它允许我们执行 Pattern 匹配搜索,以寻找回避尝试和其他技巧。 通过使用这些探测器,我可以探测其中的一些,如下所示:

    伪条件跳转:

    4001b: xor %eax,%eax
    4001d: jne 4000 <main>
    4001f: pop %rbp

    CPU比较:

    4400: push %rbp
    4401: str 0x0(%ebp)
    4406: mov %rsp,%rbp
    4409: mov $0x0,%edi
    440e: callq 44013 <main+0x13>

    散度分析

    我们还可以使用我们的透明跟踪器作为groundTruth来评估在另一个跟踪工具中执行二进制代码的方式。 工具在 utils/散度下的工具适用于这里任务。 散度示例如下所示:

    0x01 | 0x01
    0x02 | 0x02
    /
    ---- | 0x41
    0x03 | 0x42
    /
    0x05 | 0x05
    0x06 | 0x06

    前面的技巧还检测到在分支指令前放置的指令块。

    命令行工具

    Utils目录包含一些使用进行二进制分析的工具和实用程序。 目前,可以使用以下工具:

    • PrintFunc: 一个简单的脚本,用于打印给定跟踪上调用的函数
    • ManualDisasm: disasming小字节的pybfd -based解决方案。

    PrintFunc

    这里实用程序应按如下方式使用:

    Usage: python PrintFunc.py <trace> --remove-offsets

    可以按如下所示打印被调用的函数,而不考虑它的偏移量:

    考虑偏移:

    LdrShutdownProcess+0x256
    LdrShutdownProcess+0x2b7
    RtlExitUserProcess+0xac

    丢弃偏移量:

    LdrShutdownProcess
    LdrShutdownProcess
    RtlExitUserProcess

    你可以过滤输出以提高分析能力。 下面的示例显示正在计算的函数调用。

    计数命令:

    python PrintFunc.py $1 $2 | sort | uniq -c | sort -gr

    命令输出插件:

    56 printf
    12 WriteFile
    10 TerminateThread
    2 ExitProcess

    ManualDisasm

    从跟踪检索数据中提取小段代码的工具。

    用法示例:

    Usage: python ManualDisasm.py <trace> <addr>

    考虑以下跟踪摘录的示例:

    should disasm from 444417 to 444427
    x8bx45xf0x3bxc7x74x11x8dx4dxf0x51x8bx4dx08x48x50

    命令示例:

    python ManualDisasm.py"x8bx45xf0x3bxc7x74x11x8dx4dxf0x51x8bx4dx08x48x50" 0

    命令输出插件:

    0x4 (size=1) pop rsp
    0x5 (size=2) js 0x000000000000003b
    0x7 (size=5) xor eax,0x3066785c
    0xC (size=1) pop rsp
    0xD (size=2) js 0x0000000000000042

    将BranchMonitor与其他解决方案进行比较

    我总是尽量将BranchMonitor与其他解决方案进行比较,以验证或者评估。 为此,我在这里展示了一个动态二进制翻译( DBT ) 工具,该工具在上实现。 工具目录 PIN.Branch.Monitor,按如下方式组织:

    • Windows: 在 Windows 上运行的检测代码。
    • Linux: 在Linux上运行的仪表代码。
    • 比较: 引脚工具与BranchMonitor的比较结果。

    由于这个工具是作为一个仪表代码实现的,它可以在Linux或者 Windows 上运行。 这两个版本之间的细微差别是函数或者类型名称。

    通过在BranchMonitor上运行 Branch.Tester 代码和PIN工具,比较目录显示了results的结果。 在上面的例子中可以看到,结果是相似的。

    引脚结果:

    From: 0000000077332F89 To: 0x7732ec90 Disasm of 1 instr: call
    From: 000000007732EC97 To: 0x7732ecab Disasm of 1 instr: jnz
    Disasm of 0x7 bytes from 000000007732EC90: 0x48 0x3b 0xd 0x39 0x8e 0xe 0x0

    BranchMonitor结果:

    Binary C:BranchMonitoringProjectBranch.Testerx64DebugBranch.Tester.exe at <0x1ca1> to Binary C:BranchMonitoringProjectBranch.Testerx64DebugBranch.Tester.exe at <0x1c90>
    Binary C:BranchMonitoringProjectBranch.Testerx64DebugBranch.Tester.exe at <0x1c96> to Binary C:BranchMonitoringProjectBranch.Testerx64DebugBranch.Tester.exe at <0x1c9a>
    should disasm from 7ff6d6ec1c90 to 7ff6d6ec1c96

    在这两种情况下,执行跟踪中都考虑了相同数量的字节。

    开放实现问题

    我在发布最终解决方案之前,正在执行一些代码清理。 这样,某些功能还不可用。 我计划尽快发布这样的特性。

    限制

    这里框架是作为 proof-of-concept的分支监视功能presented的,因此存在一些限制,例如:

    • 单核心分析: 分支机制应该扩展为在多核系统上运行。
    • i/o 限制: 目前,I/O 是通过轮询执行的。 应该扩展驱动程序以支持 ioctl 。
    • 调试:
      • 调试消息当前作为函数实现。 应改用 MACROS 。
      • 使用 #defines. 启用调试,应该实现动态控制机制。
      • 在每个函数上都打印调试信息。 我们需要详细的控制。
    • CPU检查: PERF_COUNT支持检查未命中。
    • BranchClient多线程支持: 如何在不中断流跟踪的情况下启动更多线程?

    使用BranchMonitor的其他研究

    未来计划

    • Linux版本。

    捐赠

    我想收到你的捐赠。 目前,可能会有一个不完整的捐赠列表:

    • 实现缺少的功能: 请参见限制部分。
    • 解决问题:代码上有许多改进。
    • 替换不安全的函数: 从代码中删除所有 strcpy and and shell=True 。
    • 添加新的Utils: 分析工具越多越好 !

    出版物

    我与分支监控相关的学术工作。

    英语中的

    我们发表了一篇学术论文,标题为增强分支机构监控,用于安全目的: 从控制流完整性到恶意软件分析和调试,在的隐私权和安全( 顶部)的交易中 。 它涵盖了分支监控的理论和实践。

    葡萄牙语中的

    媒体

    查看我们的 Youtube播放列表。

    提到BranchMonitoring项目

    我们的工作通常是很好的,所以我在这里提到了一些提示:

    请告诉我你是使用还是引用这个项目。




    Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备05059198号-3  |  如果智培  |  酷兔英语