C++ 自修改代码[C+;+;]

C++ 自修改代码[C+;+;],c++,self-modifying,C++,Self Modifying,我在读一篇关于自我修改代码的codebreakers杂志文章,其中有一段代码片段: void Demo(int (*_printf) (const char *,...)) { _printf("Hello, OSIX!n"); return; } int main(int argc, char* argv[]) { char buff[1000]; int (*_printf) (const char *,...); int (*_main)

我在读一篇关于自我修改代码的codebreakers杂志文章,其中有一段代码片段:

void Demo(int (*_printf) (const char *,...))
{ 
      _printf("Hello, OSIX!n"); 
      return; 
} 
int main(int argc, char* argv[]) 
{ 
  char buff[1000]; 
  int (*_printf) (const char *,...); 
  int (*_main) (int, char **); 
  void (*_Demo) (int (*) (const char *,...)); 
  _printf=printf; 
  int func_len = (unsigned int) _main ­- (unsigned int) _Demo; 
  for (int a=0; a<func_len; a++) 
    buff[a] = ((char *) _Demo)[a]; 
  _Demo = (void (*) (int (*) (const char *,...))) &buff[0]; 
  _Demo(_printf); 
  return 0; 
}
void演示(int(*\u printf)(常量字符*,…)
{ 
_printf(“你好,OSIX!n”);
返回;
} 
int main(int argc,char*argv[])
{ 
字符增益[1000];
int(*u printf)(常量字符*,…);
内部(*主)(内部,字符**);
void(*_Demo)(int(*)(常量字符*,…);
_printf=printf;
int func_len=(无符号int)\u main­(无符号int)\u Demo;

对于(int a=0;a,此代码使用未初始化的变量
\u main
\u Demo
,因此它一般无法工作。即使它们的含义不同,也可能假定内存中函数的某些特定顺序


我的意见是:不要相信这篇文章。

代码依赖于编译器对函数布局的了解,这对于其他编译器可能不可靠

func\u len
行一旦更正为包含最初丢失的
-
,就可以通过从
\u main
中的地址减去
\u Demo
中的地址(该地址应该包含
Demo()
的起始地址)来确定函数
Demo
的长度(应该包含
main()
的起始地址)。这被假定为函数
Demo
的长度,然后将其按字节复制到缓冲区
buff
。然后将
buff
的地址强制转换为函数指针,然后调用该函数。但是,由于
\u Demo
\u main
都没有实际初始化,因此代码是错误的此外,尚不清楚
无符号int是否足够大以准确容纳指针;强制转换可能应该是从
uintptru

如果错误被修复,如果关于代码布局的假设是正确的,如果代码是位置独立的代码,并且没有针对执行数据空间的保护,那么这种方法是有效的。这种方法不可靠、不可移植,不推荐使用。但是,如果它有效,它确实说明代码和数据非常相似


我记得在两个进程之间做了一个类似的特技,将一个程序中的一个函数复制到共享内存中,然后让另一个程序从共享内存中执行该函数。这大约是四分之一个世纪前的事了,但这项技术很相似,并且在它被试过的机器上“起作用”。我从来都不需要使用这项技术因为,谢天谢地!

你能链接到这篇文章吗?发布的代码充满了错误。这个想法似乎是将机器代码从Demo复制到buff中,然后从那里执行,但假设操作码是可重定位的(一个危险的假设,可能需要编译器标记位置无关的代码).
fun\u len
大概是指
\u main-\u Demo
,作为
Demo
函数大小的最大值。但是,它在分配给address Demo之前复制自\u Demo,因此它没有希望。它还存在对齐问题,因为缓冲区可能没有按照函数对齐。我没有文章的链接,是吗在我的计算机上有一个PDF文件。我将把它上传到mediafire:很抱歉这么直截了当,但是…编写该代码的人是个笨蛋。简单明了。不要这样写代码。对。我理解代码是如何工作的。我不理解的是,为什么代码的原始作者要从另一个未初始化的点减去一个未初始化的指针呃。不过,代码的概念让我达到了我想要的目的。我现在有一个我自己编写的工作示例。对于那些感兴趣的人,这里是: