我想记录应用程序对给定输入文件执行的所有内存读取操作,以帮助推断输入的哪些特定部分与打开输入的特定执行相关。
我正在尝试为 Windows 应用程序实现这一点,而应用程序本身可以是x86
或x64
,并且输入不是特定格式(例如,解决方案不仅应与 一起使用JPG
,还应与PNG
或 一起使用XYZ
)。该解决方案适用于无需访问源代码(仅限二进制文件,无符号)的应用程序。
一个例子
输入foo.bar
:
- 输入文件为
100
字节长,二进制格式。
程序n:
可以这样调用
> Program.exe foo.bar
,或通过File> Open>foo.bar打开 foo.bar 并解析 offsets
x
,y
, 并z
用它做一些事情(例如转换成别的东西,在某处输出,用它做一些算术并返回结果等)。对于 inputfoo.bar2
,使用的偏移量可能不同。
我能想到的潜在问题:
如果开发人员使用类似
fseek (SetFilePointer?)
,他们将直接转到输入中的相关偏移量。但是,在许多情况下,它可能更有可能打开整个输入/文件,然后使用类似offset_n+34
.有多种方法如何输入文件可以由一个应用程序打开或访问(
OpenFile
,CreateFileA/W
,MapViewOfFile
,OpenFileMappingA
,等等)如果有很多读取操作,速度可能是一个问题(但是,就我而言,我不太关心性能)。
根据我目前的理解,我可以做的是:
1) 研究用于文件打开/处理的特定 Windows API
2)在它们上设置断点并检索参数
3) 从这里开始,我如何确定或映射输入中的特定偏移量以及对其的程序访问?
是否有任何脚本或工具已经完成了这样的操作,例如依靠 WinDbg 或 DBI 框架(如 DynamoRIO 或 PIN)?
如果没有,如果有人可以向我指出特定的资源或关键词,以帮助我更好地理解如何解决这个问题并提出实用的解决方案,我将不胜感激。任何帮助将非常感激。