自己変更コードに関するコードブレーカーのジャーナル記事を読んでいたところ、次のコード スニペットがありました。
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;
}
このコードは、スタック上で Demo() を実行したと思われます。ほとんどのコードは理解できますが、「func_len」が割り当てられている部分で混乱します。私が知る限り、彼らは別のランダム ポインター アドレスから 1 つのランダム ポインター アドレスを減算しています。
誰か説明してくれませんか?