跨平台自修改代码(仅限Intel / AMD)

时间:2015-09-29 20:47:02

标签: nasm intel jit

我已经大量搜索了这个没有成功的答案。 在调试器中,可以编写指令然后执行它们。 这需要可执行映像中的特殊权限。 我试图在没有调试器的情况下执行此功能。

请给我看一个具有自修改代码的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允许执行。 最后,我希望能够构造和修改可执行文件 我正在写一种新语言。 新语言的架构在现代实践中没有相似之处。

我期待在面对常规时飞行的批评, 但我会继续我的计划。

1 个答案:

答案 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);
}

TODO

  • 使用安全码括起操作码字符串。
  • 防止某些操作码出现在字符串中。
  • 捕获信号以及异常。