debug모드에서, vs는 default로 함수의 시작,끝, 함수호출 전,후에 esp를 검사합니다.

아래와 같이요.

mov edi, esp
push imarg1
push imarg2
call somekindafunction
[add esp, 8]                               ; <- _stdcall시 생략되겠죠?
cmp edi, esp
call __chkesp

somekindafunction 함수 호출 전에 esp를 edi에 저장하고, 호출 후에 바뀌었나 비교합니다.

목적은 calling convention이나 인자 개수가 안맞나 확인해주는 거죠

Release mode에선 __chkesp 코드를 안넣기 때문에 상관없지만

개발 완료전에 디버깅하며 code injection시에 __chkesp가 문제가 됩니다.

rtl이므로 저~멀리 코드어딘가에 있게 되고, 저 call __chkesp는 direct call을 쓰기 때문에

VirtualAllocEx등, 각종 injection루틴시 __chkesp를 고려하지 않으면, 엉뚱한 주소로 호출을 하게 됩니다.

debug mode에 compiler command line에 명시된 /GZ 옵션이 스택 체크 옵션입니다.

디폴트로 들어가있는 /GZ를 compiler command line에서 제거해버리면 됩니다.