Excel中的Hook ReadFile函数



我使用每个字节与"A"异或来生成加密文件。并再次执行该操作以解密文件->Excel正常打开解密文件。

现在我想用Excel打开一个加密文件。

在返回缓冲区之前,我挂接ReadFile API对其进行解密

但Excel显示

Excel无法打开文件filename.xlsx,因为文件格式或文件扩展名不是有效的

读取前8个字节后。

解密的8个字节是50 4B 03 04 14 00 06 00,这是正确的Open Office XML签名,与原始文件相同。

这里是myReadFile函数:

BOOL WINAPI MyReadFile(
_In_ HANDLE hFile,
_Out_writes_bytes_to_opt_(nNumberOfBytesToRead, *lpNumberOfBytesRead) __out_data_source(FILE) LPVOID lpBuffer,
_In_ DWORD nNumberOfBytesToRead,
_Out_opt_ LPDWORD lpNumberOfBytesRead,
_Inout_opt_ LPOVERLAPPED lpOverlapped){
BOOL result = ReadFile(hFile, lpBuffer, nNumberOfBytesToRead, lpNumberOfBytesRead, lpOverlapped);
if (!result) {
return result;
}
if (*lpNumberOfBytesRead == 0) {
return result;
}
char* Buf = (char*)lpBuffer;
for (long i = 0; i < (*lpNumberOfBytesRead); i++)
{
Buf[i] = Buf[i] ^ 'A';
}
return result;}

需要挂接其他API才能完美地打开加密文件。

需要挂接其他API才能完美打开加密文件。

可能是。在您观察到的ReadFile读取后,文件可能会以其他方式读取。

ReadFileExReadFileScatter,虽然第一种很少被调用,但第二种更为罕见。应用程序可能会直接调用NtReadFile,但可能性不大。

更有可能的是,使用CreateFileMapping或等效工具创建文件映射,然后使用MapViewOfFile或等效工具。在这种情况下,我看不出有一种干净的方法可以通过挂钩来完成。

也有可能是从其他进程中读取的。

我的建议是获取procmon工具,过滤对目标文件路径的访问,并查看所有文件操作。您可以查看每个操作的调用堆栈,并查看需要挂接的内容。

Excel调用属性为FILE_FLAG_OVERLAPPED的CreateFile。如果我挂接CreateFile API并在没有file_FLAG_OVERLAPPED的情况下创建文件,那么问题中的代码现在可以正常工作。

最新更新