我已经大量搜索了这个没有成功的答案。 在调试器中,可以编写指令然后执行它们。 这需要可执行映像中的特殊权限。 我试图在没有调试器的情况下执行此功能。
请给我看一个具有自修改代码的ASM“hello world”程序 (也许用代码替换一系列090H,用hello中的'h'大写) 以及启用其执行所需的命令。 接下来的两行是h-> H替换的机器代码之前和之后。
90 90 90 90 90 90 90 90 90 90 90 ; 11 NOPs
8a 26 50 00 80 e4 df 88 26 50 00 ; MOV AH,[BX]; AND AH,0DFH; MOV [BX],AH;
我有完全的能力和信心构建iAPX86机器代码。 我的问题是说服linux,darwin / yosemite和windows允许执行。 最后,我希望能够构造和修改可执行文件 我正在写一种新语言。 新语言的架构在现代实践中没有相似之处。
我期待在面对常规时飞行的批评, 但我会继续我的计划。
答案 0 :(得分:1)
谢谢大家认真对待我的问题。 这段代码有效!事实证明这比我想象的要简单得多; 没有特殊的编译器标志,或ELF或MACHO专业化。 在iAPX86机器代码中,C3接近RET而没有返回值。 我在代码之后列出了一些改进, 但正如所提出的那样,这个问题完全得到了我的满意答复。
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <string>
using namespace std;
typedef void (*fptr)();
int main(int argc, char **argv) {
try {
fptr p = (fptr)"\xc3";
p();
cout << "Hello world" << endl;
}
catch (const int e) { cout << "int exception: " << e << endl; }
catch (const char e) { cout << "char exception: " << e << endl; }
catch (const string &e) { cout << "string exception: " << e << endl; }
catch (...) { cout << "default exception" << endl; }
exit(0);
}