简单的活着

Analysis of Windows DLLs

Posted on By Mista Cai

Analysis of Windows DLLs

利用S2E分析DLL文件。作为示例,分析kernel32.dll中的Beep函数。

准备测试环境

创建Windows镜像,详细见521-s2e.

拥有镜像后,创建DLL项目,

s2e new_project /path/to/kernel32.dll Beep 5000 1000

DLL项目的目标文件扩展名必须为.dll,打开bootstrap.sh会发现rundll32程序会用来执行DLL文件,并且Beep函数为主函式(程序开始执行地方)。5000和1000是Beep函数的频率和持续时间。

rundll32启动后不会结束,必须修改s2e-config.lua确保翻译块覆盖率被记录;启用周期性覆盖率更新插件,通过修改TranslationBlockCoverage,

pluginsConfig.TranslationBlockCoverage = {
    writeCoverageOnStateKill = true,
    writeCoveragePeriod = 60,
}

launch-s2e.sh开始分析后,运行两分钟后中断,通过killall -9 qemu-system-x86_64.

生成行覆盖率

s2e coverage lcov --html kernel32

projects/kernel/s2e-last xia将生成

  • Kernel32.dll.info包含覆盖率信息
  • Kernel32.dll_lcovHTML报告

生成基本块覆盖率

利用s2e-env生成基本块覆盖,验证Beep函数是否执行。

s2e coverage basic_block kernel32

将生成projects/kernel32/s2e-last/basic_block_coverage.json.利用install/bin/ida_highlight_basic_blocks.py来高亮代码覆盖。

安装IDA Pro之后,指定路径到s2e.yaml,还是找不到IDA Pro

ERROR:[coverage] IDA Pro not found at /path/to/ida

利用IDA Pro可以显示S2E执行的代码块(绿色标记),图形界面更直观;但是始终找不到IDA Pro,止损放弃。