2013-02-11 7 views
0

함수를 호출하기 전에 프로세서 레지스터 중 하나의 값을 수정해야하는 C로 작성한 응용 프로그램이 있습니다. 일반적으로 인라인 어셈블리를 사용하여이 작업을 수행하지만, 64 비트 응용 프로그램에서는 제거 된 것으로 알고 있습니다. 또한 특정 프로젝트 제약으로 인해 ml64로 컴파일 된 별도의 .asm 파일에서이 작업을 수행 할 수 없습니다. 그래서 기본적으로 다음 코드 인라인의 동등한를 실행해야합니다Visual Studio 2010 x64 __setReg 동등한 컴파일러 내장 함수

_asm mov r10d, 0xDEADBEEF 

사람이 창조적 인 방법 또는 레지스터 인라인의 값을 수정할 수 64에 대한 고유 다른 컴파일러를 알고 있나요 ?

+0

* 왜 * 등록을 변경해야합니까? 그리고 어떤 등록? –

+0

그건 불가능합니다. 대안을 없앴습니다. –

+3

여전히 기계어 코드를 배열에 넣고 기본 메모리를 실행 가능하게 만들고 실행할 수 있습니다. 창조적 인 방법에 대해 어떻습니까? –

답변

1

유감스럽게도 가능한 해결 방법을 살펴본 후에 한스가 옳았으며 인라인 레지스터의 내용을 수정할 수없는 것으로 보입니다. 그것을하기 위해 존재하는 컴파일러 내장 함수는 없으며 유일한 대안은 64 비트 어셈블리의 전체 함수를 별도의 .asm 파일로 작성하고 ml64로 컴파일하거나 Alexey가 제안한 것처럼 실행 가능 메모리 블록을 할당하기 전에 수행하는 것입니다 손을 잡고 opcode를 써라. 그런 다음 함수 포인터를 만들고이 코드를 직접 호출 할 수 있습니다. 나는에 해당하고 싶어한다면, 예를 들어, :

mov r10d, ecx 
ret 

을 그냥 옵 코드를 저장하는 배열을 생성 :

BYTE copyValueToR10[] = "\x44\x8B\xD1\xC3"; 

을 할 수 있습니다 다음 PAGE_EXECUTE 보호 기능이 작은 함수에서 VirtualAlloc 메모리. 다음으로 함수 포인터를 작성하면됩니다. 확실히 더러운 방법이지만, 인라인 asm이 없거나 ml64를 사용하여 컴파일하려는 제약을 감안할 때이 방법을 사용하는 유일한 방법 인 것 같습니다.