Sleep()인자로 ecx가 들어가는 이유는 무엇인가요?

`rsp+0x20에 저장된 값을 ecx에 옮깁니다. 이는 함수의 첫 번째 인자를 설정하는 것입니다.
Sleep함수를 호출합니다. ecx가 0x3e8이므로, Sleep(1000)이 실행되어 1초간 실행이 멈춥니다.

.text:00000001400010EC mov ecx, [rsp+38h+dwMilliseconds] ; dwMilliseconds
.text:00000001400010F0 call cs:Sleep
`

함수 인자가 rdi->rsi->rdx->rcx(ecx)->r8.... 순서로 들어가는 것으로 알고있는데
Sleep() 의 인자로 왜 edi도 아니고 ecx가 들어간건가요?

#리버싱 #실습
작성자 정보
답변 2
2dedce
워게임 고인물

윈도우라서 그래요. 호출규약이 다릅니다. 리눅스는 rdi-rsi-rdx-rcx-r8-r9-스택인데 윈도우는 rcx-rdx-r8-r9-스택 입니다.
윈도우프로그램이니까 첫 번째인자는 rcx 또는 rcx의 하위 32비트인 ecx에 넣어주게 되는 것이죠.

2022.04.13. 15:36
avatar
movptr
공부벌레

윈도우 64비트 환경에서는 64비트 __fastcal 규약을 사용하게 되는데, 해당 규약에서는 왼쪽에서부터 rcx rdx r8 r9 레지스터에 인자를 저장한 이후, 오른쪽에서부터 스택에 인자를 push 하기 때문입니다.

https://docs.microsoft.com/ko-kr/cpp/build/x64-software-conventions?view=msvc-170

2022.04.15. 20:59
질문에 대한 답을 알고 계신가요?
지식을 나누고 포인트를 획득해보세요.
답변하고 포인트 받기