2016-10-13 2 views
0

앞에서 설명한 것처럼 어셈블리 코드의 extern WinAPI 함수에는 [email protected]과 같은 이름이 있습니다.Win32 어셈블리 - Extern 함수 이름 지정 (의미는 '@')

@4 부분의 의미는 무엇이며 @ 다음에 사용할 번호를 결정하는 방법은 무엇입니까?

저는 이것이 우리가 연결하는 DLL과 관련이 있다는 것을 알고 있습니다. 그러나 많은 경우에 @ 다음에 사용할 번호를 알지 못해서 많은 불쾌한 undefined reference 오류가 발생합니다.

답변

4

참조. 즉, 함수를 올바르게 호출하기 위해 스택을 밀어 넣어야하는 바이트 수이기 때문에 숫자를 쉽게 결정할 수 있어야합니다. 호출 전에 4의 PUSH 명령어 수 여야합니다. 대부분의 경우이 값은 함수에 전달 된 인수의 수와 4를 곱한 값이됩니다.

당신은 당신이 바로 그 번호를 입수 한 당신은 마이크로 소프트 비주얼 스튜디오는 개발자 명령이 같은 프롬프트에서 장식 기호 이름을 찾을 수 있습니다 설치되어 있는지 다시 한 번 확인하고 싶은 경우

C:\> dumpbin /headers kernel32.lib | find "ExitProcess" 
    Symbol name : [email protected] 
    Name   : ExitProcess 

당신이 '를 어셈블리 코드를 연결하기는 MinGW 컴파일러 도구를 사용하고, 대신이 작업을 수행 할 수 있습니다

C:\> nm C:\MinGW\lib\libkernel32.a | find "ExitProcess" 
00000000 I [email protected] 
00000000 T [email protected] 

당신은 당신이는 MinGW를 설치 한 디렉토리로 C:\MinGW를 교체해야합니다.

모든 Windows API가 kernel32 가져 오기 라이브러리에 있기 때문에 연결할 API 함수에 대해 Windows SDK 설명서에 지정된 가져 오기 라이브러리의 이름으로 바꿔야합니다 (kernel32). 예를 들어, MessageBoxA으로 Visual Studio에서는 user32.lib을, MinGW에서는 libuser32.a을 사용해야합니다.

참고 전화 교환 규칙 stdcall을 사용하지 않는 드문 Windows API는 거의 없습니다. 이들은 wsprintf과 같은 함수로 다양한 수의 인수를 취하는데 stdcall 호출 규칙에서 지원하지 않습니다. 이 함수는 이름 앞에 _ 밑줄이 있으며, 뒤에는 @ 또는 숫자가 없습니다. 또한 호출자가 스택에서 인수를 제거해야합니다.

+0

이 방법은 실제로 작동합니다. – hakeris1010

1

숫자를 사용하려면 _NT_SYMBOL_PATH가 올바른 값으로 정의되어 있는지 확인하십시오.

처럼 :

srv*https://msdl.microsoft.com/download/symbols 

또는

srv*c:\MyServerSymbols*https://msdl.microsoft.com/download/symbols 

예를 들어 (cmd.exe를 창 명령 줄에서) :

set _NT_SYMBOL_PATH=srv*https://msdl.microsoft.com/download/symbols 

그런 다음 사용

dumpbin /exports /symbols kernel32.dll | grep -i ExitProcess 

kernel32가있는 디렉토리에 있어야하고 grep이 있어야합니다.

아마도 built in find 명령을 사용하는 방법 일 것입니다. 파일로 리디렉션 한 다음 편집기에서 볼 수도 있습니다.

+0

나를 위해 작동하지 않습니다. 방금'289 120 ExitProcess (NTDLL.RtlExitUserProcess로 전달)'을 받았습니다. –

+0

수정 됨/기호도 추가해야합니다. –

+0

여전히 운이 없으므로 '/ exports/symbols'과 같은 결과가 나옵니다. –

3

@ 기호는 앞에 밑줄로 함수에 stdcall 호출 규칙이 지정된 경우 함수 이름의 일부입니다.

숫자는 함수가 스택에서 제거하는 바이트 수를 지정합니다.

컴파일러가이 번호를 생성합니다.

잘못된 접미사 규칙을 사용하여 실수로 함수를 호출하거나 소스 코드의 프로토 타입이 잘못된 숫자 나 인수 크기를 지정하도록 접미사가 추가되었습니다. 그래서 의도는 프로그램 충돌을 피할 수있는 수단을 제공하는 것입니다. 안드레아스 H 응답이 @ 후 수가 함수 반환되기 전에 함수가 스택으로부터 제거되는 바이트 수 인 것처럼

또한 https://msdn.microsoft.com/de-de/library/zxk0tw93.aspx

관련 문제