跳转至

用 OllyFlow 可视化控制流

OllyFlow 可以在 OpenRCE 插件目录中找到,是一个纯可视化插件,可以生成像图 2-9 这样的代码图,并用 Wingraph32 显示它们。

 Wingraph32 不随 OllyFlow 提供,但它随 IDA 的免费版提供:https://www.hex-rays.com/products/``ida/。下载它,把 .exe 放到你的 OllyDbg 安装文件夹中。

图 2-9 一个 OllyFlow 函数流程图

虽然这些图不是交互式的,但它们允许你轻松识别游戏代码中的循环和嵌套 if() 语句等结构,这在控制流分析中至关重要。安装 OllyFlow 后,你可以通过「插件 → OllyFlow」(或者右键单击反汇编窗格并展开「OllyFlow 图」子菜单)生成图,并选择以下选项之一:

生成函数流程图(Generate function flowchart):生成当前作用域函数的图,拆分不同的代码块并显示跳转路径。图 2-9 显示了一个函数流程图。毫无疑问,这是 OllyFlow 最有用的功能。

从图生成引用(Generate xrefs from graph):生成当前作用域函数调用的所有函数的图。

生成到图的引用(Generate xrefs to graph):生成调用当前作用域函数的所有函数的图。

生成调用栈图(Generate call stack graph):生成从进程入口点到当前作用域函数的假定调用路径图。

生成模块图(Generate module graph):理论上生成整个模块中所有函数调用的完整图,但很少真正奏效。

为了了解 OllyFlow 的有用性,看看图 2-9 中的图,把它与生成它的相对简单的汇编函数进行比较:

76f86878:
 MOV EAX,DWORD PTR DS:[76FE7E54]
   TEST AL,1
   JE ntdll.76F8689B
76f86881:
 MOV EAX,DWORD PTR FS:[18]
   OR DWORD PTR DS:[EAX+68],2000000
   MOV EAX,DWORD PTR DS:[76FE66E0]
   OR DWORD PTR DS:[EAX],1
   JMP ntdll.76F868B2
76f8689b:
 TEST EAX,8000
   JE ntdll.76F868B2
76f868a2:
 MOV EAX,DWORD PTR FS:[18]
   MOV EAX,DWORD PTR DS:[EAX+30]
   OR DWORD PTR DS:[EAX+68],2000000
76f868b2:
 MOV AL,1
   RETN

图 2-9 中有五个框,它们对应这个函数的五段代码。函数从①开始,如果分支失败则落入②,如果成功则跳到③。②执行后,它直接跳到⑤,⑤随后从函数返回。③执行后,它要么落入④,要么分支到⑤直接返回。④执行后,它无条件落入⑤。这个函数做什么与理解 OllyFlow 无关;现在,只要专注于理解代码如何映射到图上。