참조. 즉, 함수를 올바르게 호출하기 위해 스택을 밀어 넣어야하는 바이트 수이기 때문에 숫자를 쉽게 결정할 수 있어야합니다. 호출 전에 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
호출 규칙에서 지원하지 않습니다. 이 함수는 이름 앞에 _
밑줄이 있으며, 뒤에는 @
또는 숫자가 없습니다. 또한 호출자가 스택에서 인수를 제거해야합니다.
이 방법은 실제로 작동합니다. – hakeris1010