加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – WinAPI:是否需要在可执行的内存映射文件上调用FlushInstru

发布时间:2020-12-16 05:01:39 所属栏目:百科 来源:网络整理
导读:我写了一个简短的程序来读取一个 windows obj文件并找到.text部分并在其中运行代码.为此,我进行了以下 Windows API函数调用( Full code [gist.github.com],对于那些感兴趣的人): HANDLE FileHandle = CreateFile("lib.obj",GENERIC_READ | GENERIC_EXECUTE,
我写了一个简短的程序来读取一个 windows obj文件并找到.text部分并在其中运行代码.为此,我进行了以下 Windows API函数调用( Full code [gist.github.com],对于那些感兴趣的人):
HANDLE FileHandle = CreateFile("lib.obj",GENERIC_READ | GENERIC_EXECUTE,FILE_SHARE_READ,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);

HANDLE MappingHandle = CreateFileMapping(FileHandle,PAGE_EXECUTE_READ,0);

void *Address = MapViewOfFile(MappingHandle,FILE_MAP_EXECUTE | FILE_MAP_READ,0);

然后,我在文件中找到.text部分,并将指针转换为C中的函数指针,并简单地调用该函数.这实际上似乎对我有用.

我是否在映射到文件的虚拟内存范围内调用FlushInstructonCache时出错?

我问这个是因为我最近阅读了VirtualAlloc文档并在底部注明:

When creating a region that will be executable,the calling program bears responsibility for ensuring cache coherency via an appropriate call to 07002 once the code has been set in place. Otherwise attempts to execute code out of the newly executable region may produce unpredictable results.

我的代码是否可能导致CPU在指令缓存中执行旧指令?

MapViewOfFile或CreateFileMapping页面上没有这样的说明.

解决方法

如果你只使用MapViewOfFile将文件内容加载到内存中,那么它应该没问题.

如果修改内存中的内容,则需要在执行代码之前刷新instructioncache,因为它可能以未修改的形式存在于缓存中,然后可以在不进行修改的情况下执行.

我使用MAY这个词是因为两件事:

>它取决于处理器架构,处理器是否检测到它将要执行的存储器的写入[某些处理器甚至没有硬件来注册写入指令缓存中的数据 – 因为它非常罕见,因此非常不可能].
>因为很难预测缓存中的内容 – 处理器
有各种各样的“聪明”方式预取和一般“填充”
缓存.

显然,VirtualAlloc没有机会包含你想要的数据,因此在那里提到它是因为你总是在执行之前写入它.

修改包括“修复绝对地址”(例如,如果要完成加载复杂的项目以执行它,则必须执行的操作),或者如果编写调试器,则在通过替换设置断点时在x86上使用INT 3指令的指令.

第二种“修改”的情况是,如果你卸载文件,并加载一个不同的文件(例如“同一”文件,但重建,例如),在这种情况下,先前执行的代码可能仍在缓存中,并且你得到了神秘的“为什么我的改变不符合我的期望”

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读