2013-09-22 3 views
0

내가 인라인 어셈블리를 사용하여 JMP 명령어를 삽입하기 위해 노력하고있어하지만 내가 말하는 오류를 얻을 :C++ 인라인 어셈블리 오류

"예상 표현"

// Allocate a place in memory for the bytes 
BYTE *jmp = (BYTE*)malloc(len + 5); 

// Copy the bytes of original + length to the allocated memory place: 
memcpy(jmp, orig, len); 

// Next we want to insert a jump back to the original + length 
jmp += len; // increment to the end of the copied bytes 
jmp[0] = _asm JMP // this is where i get the error 

*(DWORD*)(jmp + 1) = (DWORD)(orig + len - jmp) - 5; 

내가 어셈블리에 새로운 오전 싶습니다 이 목표를 다른 방법으로 달성하는 방법을 알고 있어야합니다.

답변

1
jmp[0] = _asm JMP 

JMP에 대한 오피 코드 (지시를 나타내는 바이트 (들))로 작동하지 않을 수있는 것은 (명령어에 인수)을 피연산자에 따라 달라집니다. 인텔 ® 64 및 IA-32 아키텍처 소프트웨어 개발자 설명서의 Vol. 2A 3-433을 참조하십시오.

JMP rel32 이후 인 것 같습니다.이 경우 0xE9_asm JMP으로 대체해야합니다.

자세한 내용은 링크 된 인텔 문서 또는 그물에서 x86 명령어 인코딩에 대한 다른 많은 소스 중 하나를 사용하는 것이 좋습니다. 예 : this one from osdev wiki.

관련 문제