문제

내가 다음과 같이하고 있다고 상상해보십시오.

void *p = malloc (1000);
*((char*)p) = some_opcode;
*((char*)p+1) = another_opcode; // for the sake of the example: the opcodes are ok

....
etc...

함수 포인터를 어떻게 함수 인 것처럼 palling을 정의 할 수 있습니까? (저는 VC ++ 2008 Express를 사용하고 있습니다).

감사

도움이 되었습니까?

해결책

댓글 만 있으면 공간이 충분하지 않았습니다. joe_muc가 정확합니다. 획득 한 메모리에 코드를 채워서는 안됩니다 malloc 또는 new. Windows가 할당하는 페이지의 페이지 속성을 변경하면 문제가 발생합니다.

VirtualAlloc ()를 사용하는 문제가 발생하지 않으며 관련 Win32 API는 모든 것이 쉽습니다 : virtualalloc ()) flProtect 에게 [PAGE_EXECUTE_READWRITE][2]

참고, 아마도 3 개의 할당, 1 개의 가드 페이지, 코드에 필요한 페이지, 다른 가드 페이지를 수행해야 할 것입니다. 이것은 나쁜 코드로부터 약간의 보호를 제공합니다.

또한 생성 된 코드로 호출을 랩핑하십시오 구조화 된 예외 처리.

다음으로, Windows X86 ABI (전화 규칙)는 잘 문서화되어 있지 않습니다 (나는 알고 있습니다. 정보가 있습니다 여기, 여기, 여기 일이 어떻게 작동하는지 확인하는 가장 좋은 방법은 컴파일러가 생성 한 코드를 보는 것입니다. 이것은 쉽게 할 수 있습니다 \FA 스위치 (그 중 4 개가 있습니다).

64 비트 전화 규칙을 찾을 수 있습니다 여기.

또한 여전히 Microsoft의 매크로 어셈블러를 얻을 수 있습니다. 여기에 masm. MASM에 기계 코드를 작성하고 출력을보고 기계 코드 생성기가 비슷한 작업을 수행하도록하는 것이 좋습니다.

인텔 그리고 AMD 프로세서 매뉴얼은 좋은 참조입니다.

다른 팁

실제로 Malloc은 아마 그것을 자르지 않을 것입니다. Windows에서는 [VirtualAlloc] (http://msdn.microsoft.com/en-us/library/aa366887(vs.85).aspx) 실행 파일 메모리 페이지를 얻기 위해.

작은 시작 :

void main(void)
{
    char* p = (char*)VirtualAlloc(NULL, 4096, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    p[0] = (char)0xC3;  // ret

    typedef void (*functype)();
    functype func = (functype)p;
    (*func)();
}

코드를 사용하여 Nice를 연주하기위한 다음 단계는 EBP 레지스터를 보존하는 것입니다. 이것은 운동으로 남아 있습니다. :-)

이것을 작성한 후, 나는 Malloc과 함께 실행했고 그것은 또한 효과가있었습니다. Windows 2000 서버에서 관리자 계정을 실행하기 때문일 수 있습니다. 다른 버전의 Windows에는 실제로 VirtualAlloc 호출이 필요할 수 있습니다. 누가 알아.

올바른 opcode가있는 경우, 호출은 기능 포인터에 캐스팅하여 호출하는 것만 큼 간단 할 수 있습니다.

typedef void (*voidFunc)();

char *p = malloc (1000);
p[0] = some_opcode;
p[1] = another_opcode; // for the sake of the example: the opcodes are ok
p[n] = // return opcode...

((voidFunc)p)();

페이지를 실행 파일로 표시하지 않으면 프로세서를 사용하면 힙에서 생성 된 코드를 실행할 수 없습니다.

나는 또한 현재 생성 된 코드를 실행하려고하는데, 여기서 답변이 내가 필요한 것을 정확하게 주지는 않았지만, 너희들은 나를 올바른 길로 보냈다.

Posix Systems (Linux, BSD 등)에서 페이지를 실행 파일로 표시 해야하는 경우 MMAP (2) 기능.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top