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
(及其所有相关的内核组件)
和 运行 模拟器:
现在,也不例外!
事实
- 查看内存浏览器,我看到已更改的序言字节(内存未更改)!
- 正在将缓冲区打印到控制台,打印替换序言字节值! (奇怪)
- 查看程序集视图(超级奇怪):显示 Changed Prologue 十六进制值但原始 Prologue asm 命令(push bp;...)即使字节值确实如此不符合他们。
我的问题
- 有人有过修改
.text
段的经验吗?
- 有人遇到过在模拟器上不会更改(没有 exception/signal)的内存,这不是内存映射 port/volatile 吗?
远景假设
我假设它是关于缓存的,暗示 vxWorks 知道这个区域不应该改变,所以它不会 write_through,但不知道如何检查它...
编辑 2:尝试将我的指针设置为 volatile
=> 相同的行为!
请帮忙。
这可能不是答案,但由于您看到的是预期的输出,它确认 .text 部分已更改。我能想到的唯一解释是,如果您使用主机工具查看 .text 内存,则有可能从主机读取信息。
您是否在目标上键入命令以查看内存位置?
忘记了问题:但仍然有答案。
Host_Tools
有一个问题,它没有显示对 .text
部分的更改。
而在目标上,字节实际上发生了变化。
函数不起作用,因为我的转换破坏了动态链接。
- 我的函数代码,使用常量字符串调用函数
"Whatever"
- 当我转换函数代码时,我无意中更改了 重定位指针 的引用,它在加载时得到了一个错误的绝对 PTR。
幸运的是,它指向一个 0x00 缓冲区,因此打印了一个空字符串而没有崩溃。
建议的解决方案:
- 更改可执行文件时和 运行-time 更改时都不要触及重新定位的指针。
- 创建具有绝对占用空间的静态独立可执行文件 => 那样不会发生动态重定位。
- alter
dl()
将更改后的重定位指针转换回预期的重定位指针。
- alter
dl()
从改变的重定位指针推断出预期的改变的绝对指针,因此转换将创建绝对指针。
注意:我选择#2是因为它最简单,而且在我的系统中,反正我不需要共享对象。
早上好。
我有一个自修改代码的程序。
真的,它构建二进制文件,然后由 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
(及其所有相关的内核组件)
和 运行 模拟器:
现在,也不例外!
事实
- 查看内存浏览器,我看到已更改的序言字节(内存未更改)!
- 正在将缓冲区打印到控制台,打印替换序言字节值! (奇怪)
- 查看程序集视图(超级奇怪):显示 Changed Prologue 十六进制值但原始 Prologue asm 命令(push bp;...)即使字节值确实如此不符合他们。
我的问题
- 有人有过修改
.text
段的经验吗? - 有人遇到过在模拟器上不会更改(没有 exception/signal)的内存,这不是内存映射 port/volatile 吗?
远景假设
我假设它是关于缓存的,暗示 vxWorks 知道这个区域不应该改变,所以它不会 write_through,但不知道如何检查它...
编辑 2:尝试将我的指针设置为 volatile
=> 相同的行为!
请帮忙。
这可能不是答案,但由于您看到的是预期的输出,它确认 .text 部分已更改。我能想到的唯一解释是,如果您使用主机工具查看 .text 内存,则有可能从主机读取信息。
您是否在目标上键入命令以查看内存位置?
忘记了问题:但仍然有答案。
Host_Tools
有一个问题,它没有显示对.text
部分的更改。
而在目标上,字节实际上发生了变化。函数不起作用,因为我的转换破坏了动态链接。
- 我的函数代码,使用常量字符串调用函数
"Whatever"
- 当我转换函数代码时,我无意中更改了 重定位指针 的引用,它在加载时得到了一个错误的绝对 PTR。
幸运的是,它指向一个 0x00 缓冲区,因此打印了一个空字符串而没有崩溃。
- 我的函数代码,使用常量字符串调用函数
建议的解决方案:
- 更改可执行文件时和 运行-time 更改时都不要触及重新定位的指针。
- 创建具有绝对占用空间的静态独立可执行文件 => 那样不会发生动态重定位。
- alter
dl()
将更改后的重定位指针转换回预期的重定位指针。 - alter
dl()
从改变的重定位指针推断出预期的改变的绝对指针,因此转换将创建绝对指针。
注意:我选择#2是因为它最简单,而且在我的系统中,反正我不需要共享对象。