2016-11-09 1 views
0

질문을 올바르게 표현하고 있는지는 확실하지 않지만 기본적으로 다른 라이브러리에서 가져온 함수를 호출 할 때 호출 명령어가 어떻게 생성되는지 알고 싶습니다. 예컴파일 된 모듈에서 가져온 함수에 대한 호출 명령어 생성 방법

GetModuleFileName(...) 

들어

0x4D0000는 동적 인 수입 함수의 주소

call 0x4D0000 

로 컴파일된다.

Windows는 어떻게 이러한 호출을 설정하고이를 우회하여 사용자 지정 주소를 설정할 수 있습니까?

+1

찾고있는 용어는 * 재배치입니다. * – fuz

답변

1

호출 문에 사용 된 주소가 동적이 아닙니다. 다른 함수 호출과 마찬가지로 링크시 고정 주소입니다. 이는 호출이 실제로 스텁에 있고 스텁이 실제 함수로의 간접 점프를 수행하기 때문입니다. 간접 점프는 가져 오기 테이블의 위치를 ​​참조하는 메모리 피연산자를 사용합니다. 실행 파일 (또는 DLL)이 Windows에 의해로드 될 때 실행 파일 또는 DLL이 링크 된 모든 DLL에서 사용하는 모든 함수의 주소로 가져 오기 테이블을 업데이트합니다.

이 같은 실행 파일 호출 명령이 그렇다면이 같은 astub

call [email protected] 

그리고 다른 곳에서 같은 실행 파일에 있습니다 : 정의

[email protected]: 
    jmp [[email protected]] 

그리고 어딘가에서 가져 오기 테이블에있다 이렇게 :

[email protected]: 
    DD ? 

Windows는값을 설정합니다. 실행 파일 (또는 DLL)이로드 될 때 가져 오기 테이블의실행 파일 (또는 DLL)이로드 된 후 값을 변경하는 것이 그리 어렵지는 않지만이 작업을 변경할 수있는 방법은 많지 않습니다. 가져 오기 테이블은 읽기 전용 섹션에있을 수 있습니다. 즉, 가상 메모리 보호를 변경해야 할 수도 있습니다.

관련 문제