Windriver VxWorks Simulator 自修改代码

Windriver VxWorks Simulator Self modifying code

早上好。

我有一个自修改代码的程序。

真的,它构建二进制文件,然后由 ELFPatch 更改并更改某些函数的序言。

我正在使用 Windriver WorkBench 3.3 & VxWorks 6.9 Update3.

我创建了一个标准的模拟器(PENTIUM), 当我 运行 我在模拟器上的代码时:

void replace_prolog(void* func_ptr) {
    char* p = (char*)func_ptr;
    for (int i=0; i < PROLOGUE_SIZE; ++i)
        p[i]=m_prologue[i]; // << prologue is a member array. 
    ...
}

让我们称之为真正的序幕:原始序幕;
改变的序言 : 改变的序言;
放置在运行-时间的那个:替换序言;

我遇到异常(信号 11 - 分段错误)。
!!我意识到这是VxWorks的.text段保护。

因此,我创建了一个 SimPC based VIP 作为我的模拟器 BSP,并且 排除了 INCLUDE_PROTECT_TEXT(及其所有相关的内核组件)
和 运行 模拟器:
现在,也不例外!

事实

  1. 查看内存浏览器,我看到已更改的序言字节(内存未更改)!
  2. 正在将缓冲区打印到控制台,打印替换序言字节值! (奇怪)
  3. 查看程序集视图(超级奇怪):显示 Changed Prologue 十六进制值但原始 Prologue asm 命令(push bp;...)即使字节值确实如此不符合他们。

我的问题

远景假设

我假设它是关于缓存的,暗示 vxWorks 知道这个区域不应该改变,所以它不会 write_through,但不知道如何检查它...

编辑 2:尝试将我的指针设置为 volatile => 相同的行为!

请帮忙。

这可能不是答案,但由于您看到的是预期的输出,它确认 .text 部分已更改。我能想到的唯一解释是,如果您使用主机工具查看 .text 内存,则有可能从主机读取信息。

您是否在目标上键入命令以查看内存位置?

忘记了问题:但仍然有答案。

  1. Host_Tools 有一个问题,它没有显示对 .text 部分的更改。
    而在目标上,字节实际上发生了变化。

  2. 函数不起作用,因为我的转换破坏了动态链接。

    • 我的函数代码,使用常量字符串调用函数 "Whatever"
    • 当我转换函数代码时,我无意中更改了 重定位指针 的引用,它在加载时得到了一个错误的绝对 PTR。
      幸运的是,它指向一个 0x00 缓冲区,因此打印了一个空字符串而没有崩溃。

建议的解决方案:

  1. 更改可执行文件时和 运行-time 更改时都不要触及重新定位的指针。
  2. 创建具有绝对占用空间的静态独立可执行文件 => 那样不会发生动态重定位。
  3. alter dl() 将更改后的重定位指针转换回预期的重定位指针。
  4. alter dl() 从改变的重定位指针推断出预期的改变的绝对指针,因此转换将创建绝对指针。

注意:我选择#2是因为它最简单,而且在我的系统中,反正我不需要共享对象。