为何CreateFileA在Windows XP正常运行,在Windows 10却调用失败?
我正在用OllyDbg做逆向工程练习,遇到一段调用CreateFileA的代码:
00402D71 |. 6A 00 PUSH 0 ; /hTemplateFile = NULL 00402D73 |. 68 80000000 PUSH 80 ; |Attributes = NORMAL 00402D78 |. 6A 03 PUSH 3 ; |Mode = OPEN_EXISTING 00402D7A |. 6A 00 PUSH 0 ; |pSecurity = NULL 00402D7C |. 6A 00 PUSH 0 ; |ShareMode = 0 00402D7E |. 68 00000080 PUSH 80000000 ; |Access = GENERIC_READ 00402D83 |. FF75 F0 PUSH DWORD PTR SS:[EBP-10] ; |C:\Windows\system32\eLearnRE#5.dat 00402D86 |. E8 DF642300 CALL <JMP.&KERNEL32.CreateFileA> ; \CreateFileA
在Windows 10系统中,我已经创建了eLearnRE#5.dat文件,且确认NTFS权限允许读取,但调用后返回0xFFFFFFFF,错误码为ERROR_FILE_NOT_FOUND(00000002)。
我尝试过以下操作但未解决问题:
- 从OllyDbg中复制粘贴文件名避免拼写错误
- 在记事本中逐字符对比文件名检查拼写
- 修补进程内存尝试读取
C:\temp\test.txt(怀疑系统目录下的文件有特殊限制) - 向文件中写入数据,避免空文件导致问题
- 以管理员身份运行OllyDbg
该操作在Windows XP中完全正常,为何在Windows 10中失败?
核心原因:32位进程的文件系统重定向
Windows 10 64位系统中,32位进程访问C:\Windows\system32目录时,会被系统自动重定向到C:\Windows\SysWOW64目录——这是系统为兼容32位程序设计的机制。
你在真实的system32目录下创建了文件,但OllyDbg默认是32位程序(大部分逆向场景用的是32位版本),所以它实际访问的是SysWOW64目录,而这个目录里并没有你创建的eLearnRE#5.dat,因此返回ERROR_FILE_NOT_FOUND。
Windows XP没有这个重定向机制,32位进程可以直接访问system32目录,因此操作正常。
解决方法
将文件放到SysWOW64目录
把eLearnRE#5.dat复制到C:\Windows\SysWOW64下,32位的OllyDbg就能找到该文件。禁用文件系统重定向
在调用CreateFileA之前,调用Wow64DisableWow64FsRedirection函数禁用重定向,调用完成后再用Wow64RevertWow64FsRedirection恢复。你可以在OllyDbg中手动注入这段代码,或者修改目标程序的逻辑。使用64位版本的OllyDbg
如果目标程序是64位的,直接用64位OllyDbg调试,64位进程不会触发文件系统重定向,可以直接访问system32目录。使用绝对路径的替代写法
可以用C:\Windows\Sysnative路径替代C:\Windows\system32,这个路径是系统预留的,允许32位进程直接访问64位的system32目录。你可以修改进程内存中的路径为C:\Windows\Sysnative\eLearnRE#5.dat再测试。
内容的提问来源于stack exchange,提问作者user3280964

