Windriver VxWorks模拟器自修改代码

时间:2016-01-20 06:47:40

标签: memory kernel simulator vxworks mmu

早上好。

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

真的,它构建二进制文件,然后由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. 将缓冲区打印到控制台,打印Replacement Prologue Bytes值! (奇怪的)
  3. 查看程序集视图(Mega Weird):显示更改的序言十六进制值,但是原始序言asm命令(push bp; ...),即使字节值与它们不匹配。< / LI>

    我的问题

    • 任何人都有修改.text段的经验吗?
    • 在模拟器上遇到的内存不会改变(没有异常/信号),这不是内存映射端口/ volatile?

    远射假设

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

    编辑2 :尝试将我的指针设为volatile =&gt;同样的行为!

    请帮助。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

  1. Host_Tools存在问题,但未显示.text部分的更改。
    在目标上,字节实际发生了变化。

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

    • 我的功能代码,使用常量字符串"Whatever"
    • 调用函数
    • 当我转换功能代码时,我无意中更改了重定位指针的引用,这在加载时得到了一个糟糕的绝对PTR。
      幸运的是,它指向一个0x00缓冲区,因此打印出一个空字符串而不会崩溃。
  3. 建议的解决方案:

    1. 在更改“可执行文件”和“在运行时更改”时,请勿触摸重定位的指针。
    2. 使用绝对足迹=&gt;创建一个静态自包含可执行文件。这种方式不会发生动态重定位。
    3. 改变dl()将已更改的重新连接指针转换回预期的重新定位。
    4. alter dl()从改变后的重定位指针推断出预期的改变绝对指针,因此转换将创建绝对指针。
    5. 注意:我选择#2因为它是最简单的,因为在我的系统中,无论如何我都不需要共享对象。