2017-03-15 11 views
0

나는 어셈블리가 처음이며 Ollydbg에서 가져온 핀볼 기능의 예를 제시 한 안내서를 읽었습니다. 대부분의 지시 사항을 이해하려고했지만 다음 줄은 완전히 혼란 스럽습니다.x86 어셈블리의 꺾쇠 괄호

01017455 |. E8 249D0000 CALL <JMP.&[email protected]@Z> 

이 점에서 꺾쇠 괄호는 무엇을 의미합니까? 그 기능의 이름으로 의미있는 것이 있습니까? "JMP." 혼란 스럽습니다. 함수 이름의 일부이며 무시해야합니까?

답변

2

파일에 정적으로 링크 된 .LIB이 (가)있는 것 같습니다. Windows에서 API/라이브러리 호출은 실행 파일의 특수 섹션에서 JMP 명령어를 호출하여 구현됩니다.

들어
CALL <JMP.&[email protected]@Z> 

는 다음 명령어

JMP.&[email protected]@Z 

CALL 스택의 리턴 어드레스를 푸시하고이 부분의 다음 JMP 명령어로 점프에 CALL 할 것이다. 이 JMP은 반송 주소를 수정하지 않으므로 실제로는 직접 CALL과 같습니다.

간체 :

curEIP: 
    CALL <JMP.&[email protected]@Z>  ; pushes (curEIP+insLen) to the stack and JMPs to (some virtual label named) `msvcrt.??3` in this section named above 
    ... 
msvcrt.??3: 
    JMP [email protected]      ; JMPs to `[email protected]` - address of the real function in the statically linked LIB in memory 
    ... 
; after the CALL completes... 

를 ... 그것은 이전에 실행을 계속 스택 (초기 EIP + instructionLengthInBytes)에 푸시 반환 값 주소로 반환합니다.

이와 관련하여 꺾쇠 괄호는 무엇을 의미합니까?

그들은 당신에게 위의 계획

의 관련 데이터를 보여주는 단지 대회이며, 그 함수의 이름에서 의미가 있나요?

예. 위 참조. 대괄호 사이의 이름은 디버거에서 디버거와 다릅니다.

"JMP." 혼란 스럽습니다. 함수 이름의 일부이며 무시해야합니까?

<JMP...은 단순히 다음과 같은 문자/주소합니다 ((특별 섹션 포함) 언급 한 위의) 실행 파일에 정적으로 링크 된 라이브러리의 점프 테이블에 대한 참조로 해석되도록, incidcates. PE-Explorer/Debugger에서이를 재현 해보십시오.

-1

꺾쇠 괄호는 Windows API 호출에 사용됩니다.

예를 들어, Kernel32 라이브러리의 함수를 사용하면 Kernel32가 천사 대괄호로 호출됩니다.