首页 文章

Windriver VxWorks模拟器自修改代码

提问于
浏览
1

早上好 .

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

真的,它构建二进制文件,然后由 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,以及 excluded INCLUDE_PROTECT_TEXT (及其所有相关的内核组件)
并运行模拟器:
现在,也不例外!

事实

  • 查看内存浏览器我看到更改的序言字节(内存没有改变)!

  • 将缓冲区打印到控制台,打印Replacement Prologue Bytes值! (奇怪的)

  • 查看汇编视图(Mega Weird):显示 Changed Prologue 十六进制值但是原始序言asm命令(push bp; ...),即使字节值与它们不匹配 .

我的问题

  • 任何人都有修改 .text 段的经验吗?

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

远射假设

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

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

请帮忙 .

2 回答

  • 0

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

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

  • 0

    忘了这个问题:但仍然有答案 .

    • Host_Tools 存在问题,该问题未显示对 .text 部分的更改 .
      在目标上,字节实际上已更改 .

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

    • 我的函数代码,用一个常量字符串调用函数 "Whatever"

    • 当我转换了函数代码时,我无意中改变了一个重定位指针的引用,它在加载时获得了一个糟糕的绝对PTR .
      幸运的是,它指向一个0x00缓冲区,因此打印出一个空字符串而不会崩溃 .

    建议的解决方案:

    • 在更改可执行文件和在运行时更改时,请勿触摸重定位的指针 .

    • 使用绝对足迹创建一个静态自包含可执行文件=>不会以这种方式进行动态重定位 .

    • alter dl() 将已更改的重定向指针转换回预期的重定位指针 .

    • alter dl() 从改变后的重定位指针推断出预期改变的绝对指针,因此转换将创建绝对指针 .

    Note: I Choose #2 because it is the simplest, and because in my system, I do not need shared objects anyway.

相关问题