2017-09-03 21 views
-3

MS Visual C++ 컴파일러가 Win32 API 가져 오기 호출을 (확인되지 ​​않은) 외부 기호로 처리하도록 할 수 있습니까? 즉MS Visual C++ 컴파일러가 Win32 API 가져 오기 호출을 (확인되지 ​​않은) 외부 기호로 처리합니다.

, 내가하는 어떤 IAT를 참조 dword ptr 전화, 예를 들어 변경해야 외부 기호에

FF 15 00 00 00 00 call  dword ptr [[email protected]] 

호출을, 예를 들면 :

E8 00 00 00 00  call  [email protected] 

이 의미하는 컴파일 후 I 연결이 필요하지 않습니다. 분명히 가능하지 않기 때문입니다. 그래서 제품으로 (MS) COFF .obj Win32 API의 비정상적인 호출 파일을 가져오고 싶습니다.

+1

"분명히"연결이 불가능한 이유는 무엇입니까? –

+2

이것은 거의 이해가되지 않습니다.'__imp_MessageBoxA @ 16'은'_MessageBoxA @ 16'처럼 정확하게 "unresolved"입니다. 차이점은 컴파일러가 WinUser.h에서 포함하는 선언의 __declspec (dllimport) 속성으로 인해 발생합니다. 최적화입니다. 함수를 다시 선언하여 최적화를 수행한다고해서 어떤 방식 으로든 "더 나은"결과를 얻지는 못합니다. 가져 오기 라이브러리를 연결하는 것이 항상 필요합니다. LoadLibrary + GetProcAddress를 사용하는 것만 연결을 피할 수 있습니다. –

+0

@BoPersson, Win32 API 함수는 시작할 때 프로세스에로드되는 시스템 DLL에 정의되어 있기 때문에. 따라서 링크 단계에서 실제 Win32 API 함수를 사용하여 이러한 기호를 해결할 수있는 방법은 없습니다. 그러나 ... 그렇습니다, 나는 "가짜"기호로 연결이 가능하다는 것을 인정해야합니다. – RIscRIpt

답변

0

위의 주석에서 지적했듯이 Win32 API 호출이 call [__imp__xxx]으로 컴파일 된 이유는 __declspec(dllimport)입니다.

그래서 질문에서 얻은 것을 달성하기 위해 모든 Win32 API 함수는 __declspec(dllimport)없이 정의해야합니다.

Win32 헤더 파일 (예 : WinUser.h)에서 WINxxxAPI 매크로로 정의 된 모든 함수는 apisetcconv.h으로 정의됩니다. 최신 파일 WINxxxAPI에서 매크로는 DECLSPEC_IMPORT으로 정의되며, 차례로 __declspec(dllimport)으로 정의됩니다.

/DDECLSPEC_IMPORT= 

#define DECLSPEC_IMPORT 

P.S.하는 것과 같습니다

그래서, 요구 사항을 달성 할 수있는 쉬운 방법은 다음 빈 처리기 정의 (see /D flag)와 DECLSPEC_IMPORT를 다시 정의하는 것입니다 다른 방법이 있다면 나는 아직도 그들을 알고 싶다.

+0

링커 입력으로'user32.lib'을 추가하기 만하면됩니다. 그리고 당신은 * pe * – RbMm

+0

을 얻었습니다. 이것이 IAT의 필요성을 제거하지 않는다는 것을 깨닫게됩니다. 코드가 작동하려면'_MessageBoxA @ 16'에 대한 호출이 단지'jmp dword ptr [__imp__MessageBoxA @ 16]'으로 구성된 스텁으로 해석되어야합니다. –

+0

네, 이해합니다. 배경 스토리에 대한 내 [RbMm 대화] (http://chat.stackoverflow.com/rooms/153552/discussion-between-riscript-and-rbmm)에서 왜 내가 필요하고 어떻게 사용하고 싶은지 확인할 수 있습니다. 이. Tl; dr : 런타임 연결을 수행하는 경우 GetProcAddr을 사용하여 활성 프로세스의 모든 함수에 대한 주소를 얻거나 활성 프로세스에서 DLL의 IAT를 수동으로 검사 할 수 있기 때문에 IAT가 필요하지 않습니다. – RIscRIpt