我正在读的自修改代码一个密码破译期刊文章和有此代码段:自修改代码[C++]
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;
}
此代码理应在堆栈上演示()执行。我了解大部分代码,但他们分配'func_len'的部分让我感到困惑。据我所知,他们从另一个随机指针地址中减去一个随机指针地址。
有人在乎解释吗?
你能链接到文章吗? – 2011-04-26 06:08:11
发布的代码充满了错误。这个想法似乎是将机器代码从Demo复制到buff中,然后从那里执行,但假定操作码是可重定位的(这是一个危险的假设,可能需要一个用于位置独立代码的编译器标志)。 'fun_len'大概意味着'_main - _Demo',作为'Demo'函数大小的最大值。尽管如此,它还是在_Demo之前将它分配给Demo,所以它没有希望。它也有风险对齐问题,因为缓冲区可能不按照功能对齐。 – 2011-04-26 06:13:20
我没有指向文章的链接,它是我电脑上的PDF文件。我将它上传到mediafire:http://www.mediafire.com/?8zslfj6fjsgcsxd – Gogeta70 2011-04-26 06:13:56