【问题标题】:Windriver VxWorks Simulator Self modifying codeWindriver VxWorks Simulator 自修改代码
【发布时间】:2016-01-20 06:47:39
【问题描述】:

早上好。

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

真的,它会构建二进制文件,然后由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 Segment Protection。

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

事实

  1. 查看内存浏览器,我看到 Changed Prologue Bytes(内存没有改变)!
  2. 将缓冲区打印到控制台,打印 Replacement Prologue Bytes 值! (奇怪)
  3. 查看程序集视图 (Mega Weird):显示 Changed Prologue 十六进制值,但显示原始 Prologue asm 命令 (push bp;...),即使字节值与它们不匹配。

我的问题

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

远射假设

我假设它与缓存有关,暗示 vxWorks 知道该区域不应更改,因此它不会 write_through,但不知道如何检查它...

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

请帮忙。

【问题讨论】:

    标签: memory kernel simulator vxworks mmu


    【解决方案1】:

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

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

    【讨论】:

    • `d 0x
      显示正确的、预期的替换序言字节
    【解决方案2】:

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

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

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

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

    建议的解决方案:

    1. 在更改可执行文件和在运行时更改时不要触摸重定位的指针。
    2. 创建一个具有绝对占用空间的静态自包含可执行文件 => 这样不会发生动态重定位。
    3. 更改 dl() 以将更改后的重定位指针转换回其预期的重定位。
    4. 更改dl() 以从更改后的重定位指针推断出预期更改后的绝对指针,因此转换将创建绝对指针。

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

    【讨论】:

      猜你喜欢
      • 2021-03-06
      • 1970-01-01
      • 2015-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-06
      • 2013-06-29
      • 2023-04-05
      相关资源
      最近更新 更多