我正在讀的自修改代碼一個密碼破譯期刊文章和有此代碼段:自修改代碼[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