2014-02-23 3 views
2

여기에서 볼 수 있듯이 나는 실행의 PEB 정보를 액세스하려고했습니다에 대한 구문 : Access x64 TEB C++ & Assembly변환 AT & T 인텔 구문 (ASM)

코드는 어떤 이상한 이유로 단 AT & T 구문에서 작동을하지만 인텔 구문을 사용하려고하면 동일한 값을 제공하지 못합니다. 물론 내 부분에는 오류가 있습니다. 그래서 부탁 해요 ..

어떻게 변환 할 수 있습니다

int main() 
{ 
    void* ptr = 0; //0x7fff5c4ff3c0 
    asm volatile 
    (
     "movq %%gs:0x30, %%rax\n\t" 
     "movq 0x60(%%rax), %%rax\n\t" 
     "movq 0x18(%%rax), %%rax\n\t" 
     "movq %%rax, %0\n" 
     : "=r" (ptr) :: 
    ); 
} 

인텔 구문에?

내가 시도 :

asm volatile 
(
    "movq rax, gs:[0x30]\n\t" 
    "movq rax, [rax + 0x60]\n\t" 
    "movq rax, [rax + 0x18]\n\t" 
    "movq rax, %0\n" 
    : "=r" (ptr) :: 
); 

과 : 0x7fff5c4ff3c0

모든 아이디어 :

asm volatile 
(
    "mov rax, QWORD PTR gs:[0x30]\n\t" 
    "mov rax, QWORD PTR [rax + 0x60]\n\t" 
    "mov rax, QWORD PTR [rax + 0x18]\n\t" 
    "movq rax, %0\n"      //mov rax, QWORD PTR [%0]\n 
    : "=r" (ptr) :: 
); 

그들은 AT & T 구문과 동일한 값을 출력하지 않습니다를?

답변

4

마지막 줄에서 피연산자 순서를 뒤집어 놓지 않았습니다. 즉, 나머지는 gs 세그먼트 오버라이드로 인한 첫 번째 명령 일뿐 나머지는 C로 완료 될 수 있습니다.

+0

해결되었지만 첫 번째 명령은 왜 그렇게 되었습니까? 나는이 대답을 해결할 때 표시해 줄 것이다. – Brandon

+1

@Cant 나머지 명령어는 단순히 포인터 연산 및 역 참조를 수행하기 때문에. C에서 할 수있는 일은 아무것도 없습니다. – IInspectable

+0

컴파일러에게'rax'라는 문구가 있다는 것을 잊어 버렸습니다. – Jester