EIP 不在已知模块中,在 WOW64 下

逆向工程 视窗 风袋 amd64
2021-06-19 03:48:35

我正在使用 WinDbg 调试 WOW64 下的程序(操作系统为 x64,应用程序为 32 位)。

我在 process 模块(由应用程序而不是 Windows 创建的模块)内部遇到了一些间接调用,并开始关注它。

进入这个调用让我找到一个(*)与任何加载的模块都不匹配地址:尝试使用 手动搜索lm,没有看到匹配项。使用!address该地址的命令,它说页面已提交但保护是PAGE_NOACCESS. 堆栈跟踪也给了我一个警告“frame ip not in any known module”。

再多一步,我再次收到一个间接调用,fs[0c0h]它是一个存根WOW32Reserved(在更多的单步之后,我进入了ntdll.dll。所以它显然是一些 WOW64 代码)。

问题是,里面的代码是(*)从哪里来的?谁负责?为什么不映射到任何模块?

1个回答

这听起来像是进程为自己分配了一个页面,在其中放置了要运行的代码。这可能是一种混淆形式,或者如果文件被打包,那么解包器代码可能在该页面中。如果您能够进入代码,那么它就不可能PAGE_NOACCESS,因此调试器可能会感到困惑。call throughfs[0c0h]是32位代码在64位环境下调用内核代码的接口。根据 Windows 的版本,在该位置(Win10 之前)有一个远跳转,或者一些堆栈操作后跟一个retf(Win10)。