例如,我想知道,如果发生 ReadFile 并且句柄编号为 100,那么该句柄属于哪个文件或任何内容?让我们假设无论出于何种原因我都无法跟踪 CreateFiles 来记录自己的句柄。
显然我在调试过程中想要这个,那么是否有任何句柄表,就像 xdbg 中存在的那样?
例如,我想知道,如果发生 ReadFile 并且句柄编号为 100,那么该句柄属于哪个文件或任何内容?让我们假设无论出于何种原因我都无法跟踪 CreateFiles 来记录自己的句柄。
显然我在调试过程中想要这个,那么是否有任何句柄表,就像 xdbg 中存在的那样?
句柄是一个抽象对象。
我假设您使用 IDA 进行静态分析,并且您没有通过 IDA 使用任何嵌入式调试器。如果不是这样,请纠正我。
从静态分析的角度来看,您无法仅通过其值(在您的示例中为 100)来追溯来自的对象。每次使用时句柄值都会不同,因此它与 IDA 的静态分析无关。
由于您特别要求 IDA,请查看 ReadFile() 调用之前发生的情况。
由于 ReadFile() 将句柄作为输入,您应该在代码中找到打开此句柄的位置。类似于对 CreateFile 的调用(例如)。您可以在此处找到与此句柄值映射的文件名。
您始终可以尝试搜索指向持有句柄的局部变量的交叉引用(IDA 中的快捷方式“X”),以检索句柄打开的位置。如果句柄未保存到局部变量,只需追溯保存句柄的寄存器即可。或者简单搜索与您正在查找的内容一致的导入
看看这个小例子:
HANDLE hFile = CreateFile( "C:\\filename.txt", // <- what you are looking for
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
NULL);
[...]
int result = ReadFile( hFile, // <- what you are looking at
ReadBuffer,
BUFFERSIZE-1,
&ol,
FileIOCompletionRoutine);
您需要在代码流程中返回一点以搜索首先打开此句柄的位置。
如果你想偷懒,你可以使用调试器,它们都支持句柄跟踪。当您在问题中排除 x64dbg 时,请尝试使用另一个。如果工具不起作用,请选择另一个工具并查看。
如果它仍然不起作用(反调试/静态分析太痛苦),我宁愿尝试调查阻止您跟踪 CreateFiles() 调用的“任何原因”。