早上好 .
我有一个自修改代码的程序 .
真的,它构建二进制文件,然后由 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 回答
这可能不是答案,但由于您看到预期的输出,它确认.text部分已更改 . 我能想到的唯一解释是,如果您使用主机工具查看.text内存,则可能会从主机读取信息 .
您是否在目标上键入命令以查看内存位置?
忘了这个问题:但仍然有答案 .
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.