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_lcov
HTML报告
生成基本块覆盖率
利用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,止损放弃。