2017-04-17 15 views
0

C 또는 C++에서 함수가 차지하는 크기를 알아 내고 malloc()과 함께 동적으로 메모리를 할당하고 복사본을 만들고 함수 포인터를 캐스팅하여 실행할 수 있습니까? 여기에 단지에 대한 호기심, 그리고함수의 크기를 가져 와서 복사하고 실행할 메모리를 할당하는 방법이 있습니까?

암이 아닌 작업 예입니다

당신이 함수와 같은 방법으로 사용되는 코드의 크기를 얻을 수 없다,
#include <stdio.h> 

int main(void) 
{ 
    void *printf_copy = malloc(sizeof(printf)); 
    ((int(*)(const char *, ...))printf_copy)("%s\n", "hello, world"); 
    return 0; 
} 
+3

* "함수가 차지하는 크기를 얻으십시오"* - 가능성은 희박합니다. * "그것에 대해 malloc()을 사용하여 동적으로 메모리를 할당하고 복사본을 만듭니다"* - 예. * "함수 포인터 캐스팅으로 실행하십시오."* - 대부분의 OS에서는 기본적으로 쓰기가 가능한 메모리 페이지가 보안상의 이유로 기본적으로 실행되지 않기 때문에 가능하지는 않습니다. – cdhowie

+1

코드 사본에는 작동하지 않는 것들이 있습니다 (예 : 상대 코드 점프/동일한 코드 외부의 코드 호출). 또한 코드를 복사 할 위치에서 코드가 실행되지 않거나 코드를 실행할 수있는 메모리로 복사하는 것이 불가능할 수도 있습니다. – Yunnosch

+0

포인터를 사용하기 위해 함수를 복사 * 할 필요가 없습니다. – crashmstr

답변

1

첫째, 어떤 C 연산자가 없다 또는 이에 대한 기능. 유일한 방법은 ELF 헤더 등에서 가져 오는 것입니다. 함수가 다른 함수를 호출 할 수 있으므로, 일종의 링크가 필요합니다. 함수 코드는 상대적인 것이 아닙니다!

둘째, 실행 가능한 메모리를 얻는 유일한 방법은 mmap입니다. malloc은 일반적으로 프로세스 공간의 실행 가능 부분이 아닌 힙 메모리를 제공합니다.

0

코드가 자체 수정되지 않는 한 (매우 나쁜 개발자 였음) 안전하게 수행 할 수있는 경우에도 함수를 복사 할 필요가 없습니다. 복사 된 내용은 항상 보입니다. 원래와 똑같습니다. 왜 그렇게합니까? 다른 사람들이 설명했듯이, 시도를 피하는 데에는 많은 이유가 있습니다.

포인터를 통해 함수를 실행하려면 포인터를 그냥 호출하면됩니다. 자체 실행을 원하면 스레드를 끄십시오.