반전 중에 우리는 call dword ds:[004000238h]
또는 call dword ptr ds:_imp_atoi
과 같은 일부 모듈 간 호출을 봅니다.
코드 세그먼트 (CS
) 대신 데이터 세그먼트를 사용하는 이유는 무엇입니까?DS를 사용하여 절차를 호출하는 이유는 무엇입니까?
-1
A
답변
1
call dword ds:[004000238h]
는 간접 호출 근처, 그것은 004000238h에서 DWORD 값을 판독하고 통화를하는 데 사용한다.
대괄호와 dword ptr
은 명령어의 유형을 결정하기위한 부분입니다.
명령어의 피연산자가 메모리 피연산자이므로 DS
은 암묵적으로 읽는 데 사용됩니다 (디스 어셈블리를 세그먼트 대체 구문으로 표시하는 것이 좋습니다).
CS
의 현재 값이 변경되지 않았으므로 통화가 거의 완료되었습니다 (보호 모드의 원거리 전화는 드물고 특별한 의미를 지닙니다).
CS
의 현재 값과 관련하여 CS
이 암시 적으로 사용된다고 말할 수 있습니다.
Intel manual 3은 protected mode의 호출 메커니즘을 설명합니다.
부수적으로 32 비트 시스템에서도 세그먼테이션이 효과적으로 비활성화되어 있으므로 (모든 설명자가 0이됩니다) 선택기 레지스터는 잊어 버릴 수 있지만 TLS 및 SEH는 일반적으로 fs
/gs
을 사용합니다 레지스터).
c의 정적 연결 모듈에서도 가져 오기 주소 테이블이 필요한 이유는 무엇입니까? 동적 연결에 IAT가 사용 된 것 같습니다. –
@ user7445340 특정 예제 없이는 말하기 어렵지만 Windows API는 주로 사용자 공간 DLL로 구현됩니다. C 런타임은 여전히'user32' 및'kernel32'와 같은 라이브러리를로드해야합니다. –