简单的活着

process stalker

Posted on By Mista Cai

PR

高亮代码需要.json文件,需要提前获得已执行和全体基本块信息。

S2E把执行的基本块信息和全部基本块信息记录在了json文件中,然后用python处理。

接下来

  • 跑一遍s2e,获取json文件
  • 看s2e源码,弄明白s2e coverage basic_block --disassembler=ida **

IDA 插件Process Stalker,pinlog

  • process stalker

Process stalker

Process Stalking套件分为三个主要部分:

  • 一个IDA Pro插件,
  • 一个独立的跟踪工具
  • 以及一系列Python脚本,用于检测中介和GML图形文件。 生成的GML图定义旨在与免费提供的交互式图可视化工具一起使用。

IDA Pro插件

要安装IDA插件,请将适当版本的process_stalker.plw复制到顶级IDA Pro安装目录中的plugins文件夹中。 重新启动后,成功安装将在IDA日志窗口中生成以下消息

[*] pStalker> Process Stalker - Profiler
[*] pStalker> Pedram Amini XXXXXXXXXXXXXXXXXXXXXX
[*] pStalker> Compiled on Jul 5 2005

很遗憾,IDA Pro6.8里面是

E:\IDA 6.8\plugins\process_stalker.plw: incompatible plugin version, skipped

IDA插件用于预处理目标二进制文件,并生成以下输出:

  • 单个功能级别的GML图
  • 交叉引用文件,列出所有功能间调用。
  • 断点列表,其中包含二进制文件中每个基本块的条目。

要启动该插件,请等待IDA的自动分析完成,然后使用热键Alt + 5或从“编辑”->“插件”菜单中启动它。

追踪工具

Process Stalker独立跟踪程序实用程序无需安装。 可执行文件process_stalker.exe是一个命令行实用程序,用于附加或加载进程:

usage:
  process_stalker <-a pid | -l filename | -la filename args>

options:
  [-b bp list]   specify the breakpoint list for the main module.
  [-r recorder]  enter a recorder (0-9) from trace initiation.
  [--one-time]   disable breakpoint restoration.
  [--no-regs]    disable register enumeration / dereferencing.
  • -a pid 附加进程pid
  • -l filename 加载进程,不带命令行选项
  • -la filename args 加载进程并传递参数
  • -b breakpoint list 加载并解析主映像的指定断点列表。 无需为随后加载的DLL指定此参数。
  • -r recorder 立即开始记录到指定的记录器中。 有效参数为0到9。记录输出保存到[pid | 文件名].[记录器编号]
  • --one-time 如果指定,则禁用断点还原。 指定此选项可以显着提高性能。
  • --no-regs如果指定,则禁用寄存器枚举和取消引用。 指定此选项可以显着提高性能。 寄存器记录输出保存到[pid | 文件名] -regs.[记录器编号]

相关断点列表必须存在于从中执行Process Stalker的目录中。 仅在主映像的命令行上需要指定初始断点列表。 当目标进程加载模块时,Process Stalker将检查当前目录中的MODULE_NAME.bpl。 如果找到,断点列表将被自动加载和解析。 以下输出说明在PID 864超级终端上成功启动Process Stalker会话:

$ process_stalker -a 864 --one-time

process stalker
pedram amini XXXXXXXXXXXXXXXXXXXXXX
compiled on Jul 5 2005
target: 864

processing breakpoints for module HYPERTRM.dll at 67441000
done. 10568 of 10577 breakpoints set.

initial break, tid = 0794.

commands: [h]   this screen                     [m] module list
          [0-9] enter recorder modes            [x] stop recording
          [v]   toggle verbosity
          [d]   detach (XP/2003 only)           [q] quit/close

004d68b2 T:00000a74 [bp] 6747D041 mov edi,edi
004d68b2 T:00000a74 [bp] 6747D05C cmp [ebp+0C],0x1
004d68b2 T:00000a74 [bp] 6747D0AB cmp [ebp+0C],esi
004d68bc T:00000a74 [bp] 6747D0EB xor eax,eax
...

当达到断点时,Process Stalker将生成一个到STDOUT的日志条目。条目的格式如下。第一个字段004d68bc显示Windows报告的当前滴答计数。第二个字段T:00000a74显示到达此断点的线程ID。第三个字段[bp]显示写入该条目的记录器。默认情况下,录音处于关闭状态,并用标签“ [bp]”表示,否则录音编号将出现在标签中。第四个字段6747D0EB显示断点的地址。最后一个字段xor eax,eax在断点地址显示指令的反汇编。

热键可用于在Process Stalker运行时随时控制它。数字键[0-9]向Process Stalker发出信号,表明它应该在指定的记录器插槽中开始记录。记录器文件名由附加的pid或加载的文件名指定,并带有扩展名。[recorder#]。记录器文件将附加到文件,不会被覆盖。要关闭记录器,请按[x]热键。 [v]热键可切换断点级别的输出日志记录。禁用日志记录以提高性能。 [m]热键显示所有已加载模块的列表和当前正在监视的模块的列表:

---------- MODULE LIST ----------
module 01001000 HYPERTRM.EXE
module 7c801000 KERNEL32.dll
module 7c901000 ntdll.dll
module 7c9c1000 SHELL32.dll
...

stalking:
67441000 - 67480000 [0003f000] HYPERTRM.dll
---------- MODULE LIST ----------

使用[q]热键关闭所有打开的记录器以及调试对象。 或者,在支持分离的系统(Windows XP和2003)上,使用[d]热键关闭所有打开的记录,重置所有断点并从调试对象分离。

Python工具

提供了许多Python实用程序来检测断点列表,记录,统计数据和图形。 请注意,处理记录的实用程序需要处理后的记录(请参见ps_process_recording)。 以下是每个实用程序的描述和示例用法(按字母顺序):

ps_add_register_metadata.py

Process Stalker图注册元数据导入器 提供此实用程序可将记录的寄存器元数据添加到指定图形。 用法示例:

ps_add_register_metadata <recording-regs> <GML file> [rebase address]

ps_add_register_metadata 2360-regs.0 in.gml > out.gml

输出图使用实时寄存器数据进行渲染,并显示立即的32位寄存器值。 被确定为潜在的指向堆栈或堆空间的指针的寄存器将被取消引用并显示。 如果检测到ASCII或UNICODE字符串,它将代替4字节对齐数据显示。

ps_bp_filter.py

Process Stalker断点过滤器,提供此实用程序是一种过滤生成的断点列表的方法。 断点列表应通过标准输入传递,并可以通过以下两种方式之一进行过滤:

  • 函数-过滤不在函数上的断点,即:我们不在乎块级细节。
  • 函数列表-过滤属于用户提供的函数列表定义的任何函数的断点。

“输入/输出”修饰符指定是将功能列表中的功能过滤到输出列表中还是从输入列表中过滤掉。 该文件的输出必须重定向到新的断点列表。 用法示例:

ps_bp_filter <in bpl> <out bpl> <functions|<func1>:[func2]:[...] <in | out>>

ps_bp_filter input.bpl filtered.bpl functions
ps_bp_filter input.bpl filtered.bpl 00001234:deadbeef in

该实用程序经常用于微调我们的跟踪过程,使其仅对有趣的代码区域进行调整。 在跟踪带有GUI的进程时,请考虑以下内容。 在与GUI进行大量交互的同时记录目标进程。 将ps_recording_to_list实用程序与’module’参数一起使用,以从记录中提取功能列表。 使用ps_bp_filter从断点列表中删除这些无关紧要的节点。

ps_gde_fixup.py

Process Stalker GDE生成的GML修复程序, Oreas GDE有时会保存无法解析的GML文件。 发生这种情况时,请使用此脚本来解析并重新呈现损坏的GML描述。 用法示例:

ps_gde_fixup <in.gml>

ps_gde_fixup gde-generated.gml

ps_graph_cat.py

Process stalker图连接, 提供此实用程序可将多个功能图组合成一个更大的,可选的互连图。 节点按功能聚集在一起。 用法示例:

ps_graph_cat [-x <xrefs file> -b <base addr>] <file_1> [file_2] ...

ps_graph_cat.py -x dll.xrefs -b 46001000 1.gml 2.gml > out.gml

交叉引用文件名和基址是经常使用的变量,因此有助于在开始工作之前将它们添加到您的环境中。 请注意,可视化和与大型互连图进行交互会显着降低性能。

ps_graph_highlight.py

Process Stalker 图高亮, 该实用程序用于突出显示潜在有趣的图形节点。 我们将有趣的节点定义为包含以下任何一个的节点:

  • 指令级循环(REP MOVS等)
  • 调用字符串操作API(wstrcpy,strcat,sprintf等)
  • 调用内存分配和操作API(malloc,LocalAlloc等)
  • 中断指令(INT 80等)

命令行选项可用于控制是否应突出显示“所有”或仅“命中”的有趣节点以及控制突出显示条件(rep,int,str,mem,all)。 用法示例:

ps_graph_highlight [--nodes hit,missed,all] [--reps,--ints,--str,--mem] <GML>

ps_graph_highlight --nodes hit in.gml              > graph-highlighted.gml ps_graph_highlight --nodes all --reps --str in.gml > graph-highlighted.gml

Sample Graphs

使用过滤和图形工具与上述实用程序的组合可以生成大量可视化。 为了帮助熟悉新用户,已编译了以下示例和图形屏幕截图摘录。 下图摘录演示了“块式”功能代码的包含和突出显示:

块函数通常在Microsoft优化编译的二进制文件中看到。在编译时,Microsoft编译器将从各种函数中合并并提取相似且“不太可能执行”的代码,并将它们存储在连续的函数空间之外。功能片段在IDA导航栏中显示为栗色。标准的IDA绘图仪不支持功能块的可视化,只会将它们显示为无用的红色块。随着IDA 4.7的引入,SDK中提供了分块功能支持,但绘图仪没有使用它。对于安全工程师来说,“不太可能被执行”的代码很有趣,特别是因为常见的安全处理例程已被分类。流程跟踪套件在跟踪和可视化方面都支持分块功能。

下图摘录演示了基本块级别“命中”突出显示,并且例如可以在运行时跟踪之后使用实用程序ps_process_recording-> ps_view_recording_funcs构建:

进行汇编级代码审核时出现的常见困难是确定从哪里开始寻找。 大多数二进制文件包含许多功能,从〜500的低端到高端的数千个。 研究人员通常从已知的处理用户输入的库例程开始,例如recv(),然后手动跟踪可能遍历的代码。 使用流程跟踪套件,我们能够快速直观地确定处理指定输入所涉及的功能,并且遍历该功能中的哪些基本基础块同样重要。

甚至,生成的过程跟踪可视化过程也很耗时。 ps_graph_highlight实用程序已经比传统方法快得多,但可以将其用于立即区分潜在有趣的代码块:

ps_graph_highlight实用程序可通过命令行选项轻松扩展,自定义和控制。 分析人员可以指定是否突出显示所有可能感兴趣的节点,仅突出显示在跟踪过程中被遍历的那些潜在感兴趣的节点,或者仅突出显示在跟踪过程中未被遍历的那些潜在感兴趣的节点。 在上面的图表摘录中,立即检测到内联字符串副本并将其突出显示。 在图中的前三个节点处,可以分析分支条件以确定如何修改提供的用户输入以更改控制流以到达此潜在易受攻击的块。

突出的静态反汇编使研究人员可以立即查看代码执行路径。 为了更好地确定特定节点正在处理的数据的“类型”,可以将Process Stalker定向为保存和呈现寄存器元数据:

上图中的节点使用实时寄存器数据进行了渲染,并显示了立即的32位寄存器值。 被确定为潜在的指向堆栈或堆空间的指针的寄存器将被取消引用并显示。 如果检测到ASCII或UNICODE字符串,它将代替4字节对齐数据显示。

用户可以使用多种布局算法,每种都有其自己的优势。 下图摘录显示了在应用了层次布局的单个图中显示的许多功能:

上图可能是用ps_view_recording_funcs或ps_graph_cat生成的。 同样,有许多方法可以让研究人员灵活掌握。 如上所述,红色节点表示在过程跟踪过程中被“命中”的基本块。 摘录来自更大的图,其中至少包含二十个函数。 虽然不建议将如此大的图串联视为互连的,但研究人员可以这样做:

上面生成的图非常复杂,仅作为演示呈现。 可以并且应该应用进一步的过滤来减少可视化所需的功能集。 或者,在不可避免的情况下,必须创建和分析功能组。 通过非常大的互连图,圆形布局提供了快速的可视化效果:

尽管不那么有用,但它确实很漂亮,并且在手动发现和过滤频繁引用(高边沿计数)但不重要的功能和块时可能很有用。 作为最后一个示例,请考虑以下生成的群集正交视图:

显示多个组合功能的实用程序(例如pg_graph_cat)通过其包含的功能将节点分组为群集。 该视图有助于在视觉上分离屏幕上的功能,同时允许研究人员查看它们之间的关系。 GDE中的资源管理器面板构造可折叠的标记树,从而允许快速搜索和访问函数及其底层节点。