์ด ํฌ์คํ ์ ์ฟ ํก ํํธ๋์ค ํ๋์ ์ผํ์ผ๋ก, ์ด์ ๋ฐ๋ฅธ ์ผ์ ์ก์ ์์๋ฃ๋ฅผ ์ ๊ณต๋ฐ์ ์ ์์ต๋๋ค.
|
์ด ๋ฌธ์์๋ ๋ค์ ๊ธฐ์ ์ด ์ฌ์ฉ๋ฉ๋๋ค: Windows, Win64, Visual Studio 2005 |
Matt Pietrek (์๋ฌธ)
๋ชฉ์ฐจ
x64 ์ด์์ฒด์
x64์ ๊ฐ๋ตํ ๋ด๋ถ ๊ตฌ์กฐ
Visual C++๋ก x64์ฉ ์ดํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ
Win64 ํธํ๋๋ ์ฝ๋ ๋ง๋ค๊ธฐ
๋๋ฒ๊น
๋งค๋์ง๋ ์ฝ๋๋ ์ด๋ป๊ฒ ํ๋์?
์ต์ข ์ ๋ฆฌ
์๋ก์ด 64๋นํธ ์๋์ฐ์์ ์ผํ๋ ๊ฒฝํ์ ์ข์๋ ์ ์ค์ ํ๋๋, ์๋ก์ด ๊ธฐ์ ์ด ์ด๋ป๊ฒ ๋์ํ๋์ง ๋์ผ๋ก ํ์ธํ ์ ์๋ค๋ ๊ฒ์ด์์ต๋๋ค. ์ ์์ ์ ํนํ ์ด๋ค ์ด์์ฒด์ ๋ฐ๋ฐ๋ฅ์ ๋ํด์ ์กฐ๊ธ์ด๋ผ๋ ์๊ธฐ ์ ๊น์ง๋, ๊ทธ ์ด์์ฒด์ ์ ๋ํด์ ๊ทธ๋ ๊ฒ ํธ์ํจ์ ๋๋ผ์ง ๋ชปํ๋ ํธ์ ๋๋ค. ๊ทธ๋์, 64๋นํธ Windows XP์ Windows Serverโข 2003์ด ๋ํ๋ฌ์ ๋, ์ ๋ ์์ฃผ ์ด์ฌํ ๊ทธ ์ด์์ฒด์ ์ ๋ํด์ ์ฐ๊ตฌํ์์ต๋๋ค.
Win64์ x64 CPU์ ์ข์ ์ ์, ๊ทธ ์ ์ CPU์ ์กฐ๊ธ ๋ค๋ฅธ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์ง๋ง, ๊ทธ ์ฐจ์ด๋ฅผ ๋ฐฐ์ฐ๋๋ฐ ๊ทธ๋ ๊ฒ ๋ง์ ์๊ฐ์ด ์๊ตฌ๋์ง ์๋ ๋ค๋ ์ ์ ๋๋ค. ์ ํฌ ๊ฐ์ ๊ฐ๋ฐ์๋ค์๊ฒ๋, x64๋ก์ ์ด๋์ด ๋จ์ง ์ปดํ์ผ๋ง ๋ค์ ํ๋ฉด ๋๋๋ ๊ทธ๋ฐ ์์ ์ด์์ผ๋ฉด ์ข๊ฒ ์ง๋ง, ๊ทธ๋ ๊ฒ ์๊ฐํ๊ณ ์์ ์ ํ์ ๋ค๋ฉด, ์์ผ๋ก ๋๋ฒ๊ฑฐ์์ ๋๋ฌด ๋ง์ ์๊ฐ์ ๋ณด๋ด์ ์ผ ํ ๊ฒ ๊ฐ์ต๋๋ค.
์ด ๊ธ์์, ์ ๋ Win64์ x64์ ๋ด๋ถ๊ตฌ์กฐ์ ๋ํ ์ ์ ์ง์์ ์ข ํฉํด์ ์ ๋ฅํ Win32ยฎ ํ๋ก๊ทธ๋๋จธ๊ฐ x64๋ก ์ด๋ํ๊ธฐ ์ํด์ ๊ผญ ํ์ํ ์ง์๋ค ์ ๊ณตํ๊ฒ ์ต๋๋ค. ์ ๋ ์ฌ๋ฌ๋ถ์ด ์ด๋ฏธ Win32์ ๊ฐ๋ ๊ณผ ๊ธฐ๋ณธ x86๊ฐ๋ , ๊ทธ๋ฆฌ๊ณ ์ ์ฌ๋ฌ๋ถ์ ์ฝ๋๊ฐ Win64์์ ๋์ ํด์ผ ํ๋์ง์ ๋ํด์ ์ด๋ฏธ ์๊ณ ๊ณ์ ๋ค๊ณ ๊ฐ์ ํ๊ฒ ์ต๋๋ค. ๊ทธ๋ ๊ฒ ํด์ผ์ง ์ ๊ฐ ์ข ๋ ํต์ฌ์ ์ธ ๊ฒ๋ค์ ์ง์คํ ์ ์์๊ฒ ๊ฐ์ต๋๋ค. ์ฌ๊ธฐ์์ ์ด ์์ฝ์ด x86 ๋ด๋ถ๊ตฌ์กฐ์ Win32์ ๋ํ ์๊ณ ์๋ ์ฌ๋ฌ๋ถ์ ์ง์์ ๊ด๋ จ๋ ์๋์ ์ผ๋ก ์ค์ํ x64์์ ์ฐจ์ด์ ์ ๋ํ ๊ณ ์ฐฐ์ด๋ผ๊ณ ์๊ฐํ์๊ธฐ ๋ฐ๋๋๋ค.
x64 ์์คํ ์์ ํ ๊ฐ์ง ์ข์ ์ ์, ์์ดํ ๋์ฐ(Itanium)๊ธฐ๋ฐ ์์คํ ๊ณผ๋ ๋ค๋ฅด๊ฒ ์ฌ๋ฌ ๋ถ์ด ์ฌ๊ฐํ ํจ์จ ์ ํ์ ๋ํ ๊ณ ๋ฏผ์ ํ์ง ์๊ณ , Win32 ํน์ Win64๋ฅผ ๋์ผํ ๊ธฐ๊ณ์์ ์ด์ฉํ์ค ์ ์๋ค๋ ์ ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ธํ ๊ณผ AMD์ x64 ๊ตฌํ์ ์กฐ๊ธ ๋ถ๋ช ํํ ๋ช ๊ฐ์ง์ ์ฐจ์ด๊ฐ ์กด์ฌํจ์๋ ๋ถ๊ตฌํ๊ณ , x64์ฉ ์๋์ฐ๋ ๋ ์ค ์ด๋ ๊ณณ์์๋ ๋์ํฉ๋๋ค. ์ฌ๋ฌ๋ถ์ด AMD x64์ Intel x64 ์์คํ ์ ์ํด์ ๊ฐ๊ฐ ๋ค๋ฅธ ๋ฒ์ ผ์ ์๋์ฐ๊ฐ ํ์ํ์ง ์์ต๋๋ค.
์ ๋ ์ฌ๊ธฐ์ ์ด์์ฒด์ ์ ๊ตฌํ์ ๋ช ๊ฐ์ง ์์ธํ ๋ด์ฉ๋ค, x64 CPU ๋ด๋ถ ๊ตฌ์กฐ์ ๋ํ ๊ฐ๊ด์ ์ธ ์ค๋ช , ๊ทธ๋ฆฌ๊ณ Visual C++๋ก x64์ฉ ํ๋ก๊ทธ๋จ ๊ฐ๋ฐ ์์ญ์ผ๋ก ์ด ๊ธ์ ๋๋์ด์ ์งํํ๋๋ก ํ๊ฒ ์ต๋๋ค:.
x64 ์ด์์ฒด์
์ ๋ ์ด๋ค ์๋์ฐ ๋ด๋ถ๊ตฌ์กฐ๋ฅผ ์ค๋ช ํ๋๋ผ๋, ์ฒ์์๋ ๋ฉ๋ชจ๋ฆฌ์ ์ฃผ์ ๊ณต๊ฐ์์๋ถํฐ ์์ํฉ๋๋ค. ๋น๋ก 64๋นํธ ํ๋ก์ธ์๊ฐ ์ด๋ก ์ ์ผ๋ก๋ 16 ์์ฌ ๋ฐ์ดํธ(exabytes) ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํ ์ ์๋ค๊ณ ํ๋๋ผ๊ณ , Win64๋ ํ์ฌ 16 ํ ๋ผ๋ฐ์ดํธ(terabytes), 44๋นํธ ๋ง์ ์ง์ํ๊ณ ์์ต๋๋ค. ์ 64๋นํธ ์ ๋ถ๋ฅผ ์ฌ์ฉํด์, 16 ์์ฌ๋ฐ์ดํธ ์ ๋ถ๋ฅผ ์ธ ์ ์์์ ๊น์? ๊ฑฐ๊ธฐ์๋ ๋ช ๊ฐ์ง ์ด์ ๊ฐ ์กด์ฌํฉ๋๋ค.
๋งจ ์ฒ์ ์ด์ ๋ก๋, ํ์ฌ x64 CPU๋ค์ด ๋ฌผ๋ฆฌ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ ๊ทผํ ๋, ์ค์ง 40๋นํธ(1ํ ๋ผ๋ฐ์ดํธ)๋ง์ ํ์ฉํฉ๋๋ค. ๊ทธ ์ ํ์ด ์์ด์ง๋ค๊ณ ํ๋๋ผ๊ณ , ์ง๊ธ ํ์ฌ์ ํ๋์จ์ด๊ฐ ์๋, ํฅํ์ ๋์ฌ ์ ์๋ CPU๋ค์ ๋ด๋ถ๊ตฌ์กฐ๋ค์ด ์ค์ง 52๋นํธ (4ํํ๋ฐ์ดํธ)๋งํผ๋ง ํ์ฅ๋ ์ ์์ต๋๋ค.๊ทธ ์ ๋๋ง ํด๋, ๊ทธ ๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋งคํํ๊ธฐ ์ํ ํ์ด์ง ํ ์ด๋ธ์ ์ฌ์ด์ฆ๋ ์ด๋ง ์ด๋ง ํ ๊ฒ์ ๋๋ค.
Win32์์์ ๊ฐ์ด, ์ ๊ทผํ ์ ์๋ ์ฃผ์ ๊ณต๊ฐ์, ์ฌ์ฉ์์ ์ปค๋์ ์์ญ์ผ๋ก ๋๋์ด ์ง๋๋ค. ์ปค๋ ๋ชจ๋์ ์ฝ๋๊ฐ 8 ํ ๋ผ๋ฐ์ดํธ ์์์์ ๋ชจ๋ ํ๋ก์ธ์ค์ ์ํด ์์ญ๋๊ณ , ๊ฐ๊ฐ์ ํ๋ก์ธ์๋ 8 ํ ๋ผ๋ฐ์ดํธ ์ดํ์ ์์ ์ ๊ณ ์ ์์ญ์ ๊ฐ์ง๋๋ค. 64๋นํธ ์๋์ฐ์ ๊ฐ ๋ฒ์ ผ๋ค์ ๊ทธ๋ฆผ 1๊ณผ ๊ทธ๋ฆผ 2์์ ๋ณด์ฌ์ง๋ ๊ฒ์ฒ๋ผ, ์๋ก ๋ค๋ฅธ ๋ฌผ๋ฆฌ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ํ๊ณ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
Win32์์์ ๊ฐ์ด, x64์ ํ์ด์ง ์ฌ์ด์ฆ๋ 4KB ์ ๋๋ค. ์ฒ์์ 64KB ๊ณต๊ฐ์ ์ ๋๋ก ๋งคํ ๋์ง ์๊ธฐ ๋๋ฌธ์, ์ฌ๋ฌ๋ถ์ด ๋ณผ ์ ์๋ ๋งตํ ์ฃผ์์ค ๊ฐ์ฅ ๋ฎ์ ๋ฒ์ง๋ 0x10000์ ๋๋ค. Win32์์๋ ๋ค๋ฅด๊ฒ, ์์คํ DLL๋ค์ ์ฌ์ฉ์ ๋ชจ๋ ์ฃผ์ ๊ณต๊ฐ์ ์ ์ผ ์ ๋ถ๋ถ๊ณผ ๊ทผ์ ํด ์๋, ๊ธฐ๋ณธ ๋ก๋ ์ด๋๋ ์ค๋ผ๋ ๊ฒ์ด ์์ต๋๋ค. ๊ทธ ๋์ , ์์คํ DLL๋ค์ 4GB ์์ ๊ณต๊ฐ์ ์ ์ฌ ๋ฉ๋๋ค. ํต์์ ์ผ๋ก, ๊ทธ ์ฃผ์๋ 0x7FF00000000 (8 ํ ๋ผ๋ฐ์ดํธ) ๊ทผ์ฒ์ ๋๋ค.
์๋ก์ด x64 ํ๋ก์ธ์์ ์ข์ ๊ธฐ๋ฅ ์ค์ ํ๋๋, ์๋์ฐ๊ฐ ํ๋์จ์ด์ ์ผ๋ก ๋ฐ์ดํฐ ์คํ ๋ณดํธ(Data Execution Protection, ์ดํ DEP)๋ฅผ ํ ์ ์๊ฒ ์ง์ํด ์ค๋ค๋ ๊ฒ์ ๋๋ค. x86 ํ๋ซํผ์์๋, ๋ง์ ๋ฒ๊ทธ์ ๋ฐ์ด๋ฌ์ค๊ฐ CPU๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฐ๋ฅธ ์ฝ๋ ๋ฐ์ดํธ๋ก ์ธ์ํ๊ณ ์คํํ๊ธฐ ๋๋ฌธ์ ์กด์ฌํ ์ ์์์ต๋๋ค. ์ค์์ด๋ ํน์ ๊ณ ์์ ์ธ ๋ฒํผ ์ค๋ฒ๋ฐ(buffer overrun)์ด ์๋๋ ๋ฐ์ดํฐ ์ ์ฅ์ ๋ชฉ์ ์ผ๋ก ํ๋ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ฝ์ CPU์์ ๋ช ๋ น์ด๋ก ์ธ์ํ๊ณ ์คํํด ๋ฒ๋ฆฌ๋ ๊ฒฐ๊ณผ๊ฐ ๋ฐ์ํ๊ณค ํ์์ต๋๋ค. ์ด DEP์ ๋์์ผ๋ก, ์ด์์ฒด์ ๋, ์๋ํ ์ฝ๋ ์์ญ์ ๊ฒฝ๊ณ๋ฅผ ๋ช ๋ฃํ๊ฒ ์ค์ ํ ์ ์๊ณ , ์ด ์๋๋ ๊ฒฝ๊ณ๋ฅผ ๋ฒ์ด๋๋ ์ฝ๋ ์คํ์ ๋ํด์๋ CPU๊ฐ ์ผ์ข ์ ๋ซ์ ๋์ ์ ์๊ฒ ๋์์ต๋๋ค. ์ด ๊ธฐ๋ฅ์ ์๋์ฐ๋ฅผ ์ ์์ ์ธ ๊ณต๊ฒฉ์ ๋ ์ทจ์ฝํ๊ฒ ๋ง๋๋๋ฐ ํฐ ๋์์ ์ค ์ ์์ต๋๋ค.
์๋ฌ๋ค์ ์ก๊ธฐ ์ํด์ ๊ณ ์๋ ์ฅ์น๋ค ์ค์ ํ๋๊ฐ, x64 ๋ง์ปค๊ฐ ์คํํ์ผ์ ๋ํ ๊ธฐ๋ณธ ์ ์ฌ ์ฃผ์๋ฅผ 32๋นํธ (4GB) ์ด์์ผ๋ก ์ค์ ํ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ ์ฝ๋๊ฐ Win64๋ก ํฌํ ๋ ํ, ๊ธฐ์กด์ ์๋ ์ฝ๋์์ ์์์ ์ด์ผ๊ธฐํ ๋ณด์์ ๋ฌธ์ ๋ฅผ ์ผ์ผํค๋ ๋ถ๋ถ์ ์ฐพ๊ธฐ ์ฝ๊ฒ ๋ง๋ค์ด ์ค๋๋ค. ํนํ, ๋ง์ฝ ํฌ์ธํฐ๊ฐ 32๋นํธ ๊ฐ(์๋ฅผ ๋ค์ด, DWORD)๊ฐ์ผ๋ก ์ ์ฅ๋์ด ์์ผ๋ฉด, ๊ทธ๋ฌ๋ฉด, ๊ทธ ๊ฐ์ Win64 ๋น๋๋ฅผ ๋์์ํฌ ๋, ๊ฐ์ด ์ผ๋ถ๋ถ์ด ์งค๋ฆผ ์ผ๋ก์, ํฌ์ธํฐ๋ฅผ ๋ฌดํจํ ์ํค๊ณ , ์ ๊ทผ์๋ฐ(access violation)์ ์ผ์ผํต๋๋ค. ์ด๋ฌํ ์๊ธฐ์ ์ ์ง์ ๋ถํ ํฌ์ธํฐ ๋ฒ๊ทธ๋ฅผ ์ฐพ๊ธฐ ์ฝ๊ฒ ๋ง๋ค์ด ์ค๋๋ค.
ํฌ์ธํฐ์ DWORD์ ๋ํ ์ฃผ์ ๋ค๋ Win64์ ํ์ ์ ์ด์ผ๊ธฐํ๋๋ฐ ๋น ์ง ์ ์์ต๋๋ค. Win64์์ ํฌ์ธํฐ์ ํฌ๊ธฐ๊ฐ ์ผ๋ง๋ ๋ ๊น์? LONGํ์ ๊ธธ์ด๋์? ๊ทธ๋ฆฌ๊ณ , ํธ๋ค๊ณผ HWND์ ํฌ๊ธฐ๋ ์ผ๋ง๋ ๋ ๊น์? ๋คํ์ค๋ฝ๊ฒ๋, ๋ง์ดํฌ๋ก ์ํํธ๊ฐ Win16์์ Win32๋ก์ ์ข ์ง์ ๋ถํ ๋ณํ์ ํ๋ฉด์, ์๋ก์ด ์๋ฃํ์ ๋ชจ๋ธ์ ๋ํด์๋ 64๋นํธ ๊น์ง์ ํ์ฅ์ด ์ฝ๊ฒ ๋ ์ ์๋๋ก ๋ง๋ค์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ด์ผ๊ธฐ ํด์, ๋ช ๊ฐ์ง ์์ธ๋ฅผ ์ ์ธํ๊ณ , ์๋ก์ด 64๋นํธ ์ธ๊ณ์์๋, ํฌ์ธํฐ์ size_t๋ฅผ ์ ์ธํ ๋ชจ๋ ๋๋จธ์ง ์๋ฃํ ๋ค์ Win32์์์ ๋์ผํ ๊ธธ์ด๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ฆ, 64๋นํธ ํฌ์ธํฐ๋ 8๋ฐ์ดํธ์ธ ๋ฐ๋ฉด์, int,long, DWORD๋ ์์ง๋ 4๋ฐ์ดํธ์ ๋๋ค. ํ๋ฐ๋ถ์ Win64 ๊ฐ๋ฐ์ ๋ํด์ ์ด์ผ๊ธฐ ํ๋ฉด์, ์ด ์๋ฃํ์ ๋ํด์ ์ข ๋ ์ด์ผ๊ธฐ ํ๋๋ก ํ๊ฒ ์ต๋๋ค. [Editor's Update - 5/2/2006: ํธ๋ค์ ํฌ์ธํฐ ๊ฐ์ผ๋ก ์ ์ธ๋์์ต๋๋ค. ๊ทธ๋์, Win64์์๋ 4๋ฐ์ดํธ๊ฐ ์๋ 8๋ฐ์ดํธ ๊ฐ์ ๋๋ค.]
Win64์ ํฌ๋งท์ PE32+๋ผ๊ณ ๋ถ๋ฆฝ๋๋ค. ๊ฑฐ์ ๋ชจ๋ ๊ด์ ์์ ์ด ํฌ๋งท์ Win32PE ํ์ผ๊ณผ ๊ฑฐ์ ๊ตฌ์กฐ์ ์ผ๋ก ๋์ผํฉ๋๋ค. ImageBase ๊ฐ์ ๋ช ๋ช์ ํฌ๋งท์ ๋ ํฌ๊ธฐ๊ฐ ์ปค์ก๊ณ , ํ ํ๋๋ ์์ด์ก๊ณ , ๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ ํ๋์ ํ๋๋ ๋ค๋ฅธ CPU ํ์ ์ ๋ฐ์ํ ์ ์๋๋ก ๋ณ๊ฒฝ๋์์ต๋๋ค. ๊ทธ๋ฆผ 3 ์ ๋ฐ๋ ํ๋๋ค์ ๋ณด์ฌ ์ค๋๋ค.
PE ํค๋๋ฅผ ๋ง๊ณ ๋, ๊ทธ๋ ๊ฒ ๋ง์ด ๋ฐ๋ ๋ถ๋ถ์ด ์์ต๋๋ค. IMAGE_LOAD_CONFIG, IMAGE_THUNK_DATA๊ฐ์ ๋ช ๋ช ๊ตฌ์กฐ์ฒด๋ค์ ๋จ์ํ ํ๋๋ค์ 64๋นํธ๋ก์ ํ์ฅ์ ํ์ ๋ฟ์ ๋๋ค. PDATA ์น์ ์ ์ถ๊ฐ๋ Win32์ Win64 ๊ตฌํ์ ์ฃผ๋ ์ฐจ์ด์ ์ค์ ํ๋๋ฅผ ๋๋๋ฌ์ง๊ฒ ํ๋ค๋ ์ ์์ ์์ฃผ ํฅ๋ฏธ๋กญ์ต๋๋ค: ๊ทธ ์ฐจ์ด๋ ๋ฐ๋ก ์์ธ ์ฒ๋ฆฌ(exception handling) ์ ๋๋ค.
x86 ์ธ๊ณ์์๋, ์์ธ ์ฒ๋ฆฌ๋ ์คํ์ ๊ธฐ๋ฐํ์์ต๋๋ค. Win32 ํจ์๊ฐ try/catch ํน์ try/finally ์ฝ๋๋ฅผ ๊ฐ์ง๊ณ ์์ ๋, ์ปดํ์ผ๋ฌ๋ ์คํ์ ์์ ๋ฐ์ดํ ๋ธ๋ฝ์ ๋ง๋ค์ด ๋๋ ์ฝ๋๋ฅผ ์์ฑํ์์ต๋๋ค. ์ถ๊ฐ๋ก, ๊ฐ๊ฐ์ ๋ฐ์ดํ ๋ธ๋ฝ์ ์ด์ try ๋ฐ์ดํ ๊ตฌ์กฐ์ฒด๋ฅผ ๊ฐ๋ฆฌ์ผฐ์์ต๋๋ค. ๊ทธ๋์, ์ต๊ทผ์ ์ถ๊ฐ๋ ๊ตฌ์กฐ์ฒด๊ฐ ๋ฆฌ์คํธ์ ํค๋๊ฐ ๋๋ ๋งํฌ๋ ๋ฆฌ์คํธ๋ฅผ ์์ฑํ์์ต๋๋ค. ํจ์๊ฐ ๋ถ๋ ค์ง๊ณ , ์ข ๋ฃ๋ ๋, ๋งํฌ๋ ๋ฆฌ์คํธ์ ํค๋๋ ๊ณ์ ๊ฐฑ์ ์ด ๋์์์ต๋๋ค. ๊ทธ๋ฌ๋ค, ์์ธ๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ, ์ด์์ฒด์ ๊ฐ ์คํ์ ์๋ ๋งํฌ๋ ๋ฆฌ์คํธ์ ๋ธ๋ฝ์ ์ดํด์, ์ ์ ํ ํธ๋ค๋ฌ๋ฅผ ์ฐพ๋ ๋ฐฉ์์ผ๋ก ์ด๋ฃจ์ด์ ธ ์์์ต๋๋ค. ์ ์ 1997๋ MSJ article (์๋ฌธ) ์์ ์ข ๋ ์์ธํ ๋ด์ฉ์ ์ฐพ์ ๋ณด์ค ์ ์์ต๋๋ค.
Win32 ์์ธ์ฒ๋ฆฌ์๋ ๋ฐ๋๋ก, Win64 (x64์ ์์ดํ ๋์(Itanium) ๋ฒ์ ผ ๋ ๋ค ํด๋น๋ฉ๋๋ค.)์์๋ ํ ์ด๋ธ ๊ธฐ๋ฐ์ ์์ธ ์ฒ๋ฆฌ๋ฅผ ์ฌ์ํฉ๋๋ค. ๋ ์ด์ ์คํ ์์ ์๋ try ๋ฐ์ดํ ๋ธ๋ฝ์ ๋งํฌ๋ ๋ฆฌ์คํธ๋ ์์ต๋๋ค. ๋์ , ๊ฐ๊ฐ์ Win64 ์คํํ์ผ์ ๋ฐํ์ ํจ์ ํ ์ด๋ธ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ๊ฐ๊ฐ์ ํจ์ ํ ์ด๋ธ์ ํจ์์ ์์ ์ฃผ์์ ๋ ์ฃผ์๋ฅผ ๊ฐ์ง๊ณ ์์ ๋ฟ๋ง ์๋๋ผ, ํจ์์ ์คํ ํ๋ ์ ๋ ์ด์์๊ณผ ์์ธ ์ฒ๋ฆฌ ์ฝ๋์ ๊ด๋ จ๋ ๋ฐ์ดํ๋ค์ ์์น ์ญ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ด ๊ตฌ์กฐ์ฒด๋ค์ ํต์ฌ์ ๋ณด๊ธฐ ์ํด์ WINNT.H์์ ๋ค์ด ์๋ x64 SDK์์ WINNT.H ์์ ์๋ IMAGE_RUNTIME_FUNCTION_ENTRY ๊ตฌ์กฐ๋ฅผ ์ดํด ๋ณด์๊ธฐ ๋ฐ๋๋๋ค.
์์ธ๊ฐ ๋ฐ์ํ์ ๋, ์ด์์ฒด์ ๋ ์ฐ๋ ๋ ์คํ์ ํ๋์ฉ ํ์ํฉ๋๋ค. ์คํ์ ํ์ํ๋ฉด์ ๊ฐ๊ฐ์ ํ๋ ์์ ํ์ํ๊ณ , ์ ์ฅ๋ ์ธ์คํธ๋ญ์ ํฌ์ธํฐ๋ฅผ ์ฐพ์์, ์ด์์ฒด์ ๊ฐ ์ด๋ค ์คํ ๋ชจ๋์์ ์ธ์คํธ๋ญ์ ํฌ์ธํฐ๊ฐ ์๋์ง๋ฅผ ๊ฒฐ์ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋์, ์ด์์ฒด์ ๋ ๋ฐํ์ ํจ์ ํ ์ด๋ธ์ ๊ทธ ๋ชจ๋์์ ์ฐพ์์, ์ ์ ํ ๋ฐํ์ ํจ์๋ฅผ ์ฐพ์์, ๋ฐ์ดํ๋ก ๋ถํฐ ์ ์ ํ ์์ธ ์ฒ๋ฆฌ ๊ฒฐ์ ์ ๋ด๋ ค ์ค๋๋ค.
๋ง์ฝ, ์ฌ๋ฌ๋ถ์ด ๋ก์ผ ๊ณผํ์์ด๊ณ , PE32+ ๋ชจ๋ ์์ด ์ง์ ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ์์ ์ฝ๋๋ฅผ ์์ฑํ์ผ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์? RtlAddFunctionTable API๋ฅผ ์ด์ฉํ์ฌ, ์ด์์ฒด์ ์๊ฒ ์ฌ๋ฌ๋ถ์ด ๋์ ์ผ๋ก ์์ฑํ ์ฝ๋์ ๋ํด์ ์๋ ค ์ค ์ ์์ต๋๋ค.
ํ ์ด๋ธ ๊ธฐ๋ฐ์ ์์ธ ํธ๋ค๋ง์ ๋จ์ ์ (x86 ์คํ ๊ธฐ๋ฐ ๋ชจ๋ธ์ ๋นํด ์๋์ ์ผ๋ก) ํจ์ ํ ์ด๋ธ์ ์ฐพ์ ๋ณด๋ ๊ฒ์ด, ๋งํฌ๋ ๋ฆฌ์คํธ์์ ๊ฐ์ ์ฐพ๋ ๊ฒ ๋ณด๋ค ํจ์ฌ ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆฐ๋ค๋ ์ ์ ๋๋ค. ์ฅ์ ์, ํจ์๋ฅผ ์คํ์ํฌ ๋ ๋ง๋ค ๋งค ๋ฒ try ๋ฐ์ดํ ๋ธ๋ฝ์ ์์ฑ์ํค๋ ์ค๋ฒํค๋๊ฐ ์๋ค๋ ์ ์ ๋๋ค.
๊ผญ ๊ธฐ์ตํ์ธ์! ์ด ๊ธ์ด ์๋ฌด๋ฆฌ ์ฌ๋ฏธ์๊ณ , ํฅ๋ฏธ๋ก์๋, ์ด ๊ธ์ x64 ์์ธ ํธ๋ค๋ง์ ๋ํ ์์ธํ ์ค๋ช ์ด๋ผ๊ธฐ ๋ณด๋ค, ๊ฐ๋จํ ์๊ฐ์ ๋ถ๊ณผํฉ๋๋ค. x64์ ์์ธ ํธ๋ค๋ฌ์ ๋ํ ์ข ๋ ๊น์ ์ง์์ ์๊ณ ์ถ์ผ์๋ค๋ฉด, Kevin Frei์ ๋ธ๋ก๊ทธ (์๋ฌธ) ์ ๊ผญ ํ ๋ฒ ์ฝ์ด ๋ณด์๊ธฐ ๋ฐ๋๋๋ค.
x64์ ํธํ๋๋ ์๋์ฐ์ ์๋ก์ด API๊ฐ ๊ทธ๋ ๊ฒ ๋ง์ง๋ ์์ต๋๋ค; ๊ฑฐ์ ๋ชจ๋ ์๋ก์ด Win64 API๋ค์ ์์ดํ ๋์(Itanium) ํ๋ก์ธ์๋ฅผ ์ํ ์๋์ฐ ์ถ์ ๋ ์ด๋ฏธ ์ถ๊ฐ๋์๋ ๊ฒ๋ค ์ ๋๋ค. ๊ฐ๋จํ๊ฒ, ๊ทธ API๋ค ์ค ๊ฐ์ฅ ์ค์ํ ๋ ๊ฐ์ API๋ IsWow64Process์ GetNativeSystemInfo ์ ๋๋ค. ์ด ํจ์๋ค์ Win32 ์ดํ๋ฆฌ์ผ์ด์ ์ด ์๊ธฐ ์์ ๋ค์ด Win64์์ ๋๊ณ ์๋์ง์ ์ฌ๋ถ๋ฅผ ์๋ ค ์ค๋๋ค. ๊ทธ๋์, ๋ง์ฝ 64๋นํธ ํ๊ฒฝ์์ ๋์ํ๊ณ ์๋ค๋ฉด, ์์คํ ์ ์ง์ง ์ฌ์(capability)๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ๊ฒฐ์ ํ ์ ์๊ฒ ํด ์ค๋๋ค. ๋ฐ๋ฉด์, 32๋นํธ ํ๋ก์ธ์ค๋ GetSystemInfo ํจ์๋ฅผ ํธ์ถํ๊ณ , ์ค์ง 32๋นํธ ์์คํ ์ธ ๊ฒ์ฒ๋ผ, ์์คํ ์ ์ฌ์(capability)๋ฅผ ๋ณผ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, GetSystemInfo๋ 32๋นํธ ํ๋ก์ธ์ค ์ฃผ์ ์์ญ๋ง์ ๋ณด๊ณ ํฉ๋๋ค. ๊ทธ๋ฆผ 4 ๋ x86์์๋ ์ฌ์ฉํ ์ ์๊ณ , ์ค์ง x64์์ ์ธ ์ ์๋ API๋ค์ ๋ณด์ฌ ์ฃผ๊ณ ์์ต๋๋ค.
์ ๋ถ ๋ค 64๋นํธ๋ก ๋์ํ๋ ์๋์ฐ ์์คํ ์ด ์์ฃผ ๋ฉ์ง๊ฒ ๋ค๋ฆฌ๊ฒ ์ง๋ง, ํ์ค์ ์ผ๋ก ์ฌ๋ฌ๋ถ์ ์ ์ ๋์ Win32 ์ฝ๋๋ฅผ ํ์๋ก ํ๊ฒ ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฌํ ์์ ์ ์ํด์, x64 ๋ฒ์ ผ์ ์๋์ฐ๋ Win32์ Win64 ํ๋ก์ธ์ค๋ฅผ ๋์์ ๋์ผํ ์์คํ ์์ ๋์์ํฌ ์ ์๋ WOW64 ์๋ธ์์คํ ์ด ํฌํจ๋์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋, ์ฌ๋ฌ๋ถ์ 32๋นํธ DLL์ 64๋นํธ ํ๋ก์ธ์ค๋ก ์ฌ๋ฆฌ๊ฑฐ๋ ํน์ ๋ฐ๋์ ์ผ๋ค์ ์ง์๋์ง ์์ต๋๋ค. (์ ๋ฅผ ๋ฏฟ์ผ์ธ์, ์์ฃผ ์ข์ ์ผ์ ๋๋ค.) ๊ทธ๋ฆฌ๊ณ ๋ง์นจ๋ด ์ฌ๋ฌ๋ถ์ ๊ตฌ๋ฅ๋ค๋ฆฌ 16๋นํธ ์ฝ๋์๊ฒ ์ ๊ฐ๋ผ๊ณ ์ธ์ฌ๋ฅผ ํ ์ ์๊ฒ ๋์์ต๋๋ค!
x64 ๋ฒ์ ผ์ ์๋์ฐ์์๋, ํ๋ก์ธ์๋ ์ค์ง Win64 DLL๋ค๋ง ๋ก๋ฉํ ์ ์๋, Explorer.exe ๊ฐ์ 64๋นํธ ์คํ ํ์ผ์์๋ถํฐ ์์๋ ์ ์์ต๋๋ค. ๋ฐ๋ฉด์, 32๋นํธ ์คํ ํ์ผ์์ ์์ํ ํ๋ก์ธ์ค๋ ์ค์ง Win32 DLL ๋ค๋ง ๋ก๋ฉํ ์ ์์ต๋๋ค. Win32 ํ๋ก์ธ์ค๊ฐ ์ปค๋ ๋ชจ๋์ ํจ์๋ฅผ ํธ์ถํ ๋-์๋ฅผ ๋ค์ด์ ํ์ผ์ ์ฝ๋๋ค๋ ์ง-WOW64๋ ๊ทธ ํจ์๋ฅผ ์กฐ์ฉํ ๊ฐ๋ก์ฑ์, ์ฌ๋ฐ๋ฅธ x64 ์ฝ๋์ ์ฃผ์๋ฅผ ์ฃผ์ด์ ํธ์ถํ๊ฒ ํฉ๋๋ค.
๋ฌผ๋ก , ์๋ก ๋ค๋ฅธ ์ข ์กฑ(32๋นํธ์ 64๋นํธ) ํ๋ก์ธ์๋ค๋ผ๋ฆฌ ํต์ ํ ์ผ๋ ์๊ธธ ์ ์์ต๋๋ค. ์ด์ข๊ฒ๋, Win32์์ ์ฌ๋ฌ๋ถ์ด ์ฌ๋ํ๊ณ ์ข์ํ๋ ๋ชจ๋ ํ๋ก์ธ์ค๊ฐ ํต์ ๋ฐฉ๋ฒ์ Win64์์๋ ๋์ํฉ๋๋ค. ์์ด๋ ๋ฉ๋ชจ๋ฆฌ(shared memory), ๋ค์๋ ํ์ดํ(named pipe), ๊ทธ๋ฆฌ๊ณ , ๊ธฐํ ์ด๋ฆ์ด ์๋ ๋๊ธฐํ ๊ฐ์ฒด๋ค์ ํฌํจํด์ ๋ง์ ๋๋ค.
์ฌ๋ฌ๋ถ์ด ํน์ "๊ทธ๋ผ ์์คํ ๋๋ ํ ๋ฆฌ๋ Win32์ Win64๊ฐ ๋์ผํ๊ฐ?"๋ผ๊ณ ์๊ฐํ์ค ์ง๋ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋์ผํ ๋๋ ํ ๋ฆฌ๊ฐ 32 ๋นํธ์ 64 ๋นํธ KERNEL32 ๋ USER32 ๋ฑ๊ณผ ๊ฐ์ ๋์ผํ ์ด๋ฆ์ ์์คํ DLL๋ค์ ๋์์ ๊ฐ์ง ์ ์์ต๋๋ค, ๊ทธ๋ ์ง์? WOW64๋ ์์ ๊ฐ์ด ํ์ผ ์์คํ ์ ๋ฆฌ๋ค์ด๋ ์ (redirection)์ ํตํด์ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค. Win32 ํ๋ก์ธ์ค์์์ ํ์ผ์ ๋ํ ์ฐ๊ธฐ ํน์ ์ฝ๊ธฐ ๋ฑ์ด ๋ฐ์ํ๋ฉด, SysWow64๋ผ๋ ๋๋ ํ ๋ฆฌ์ ์๋ ์ปค๋์ ํจ์๋ฅผ ํธ์ถํ๋ ๊ฒ์ด ์๋, System32์ ์๋ ์ปค๋์ ํจ์๋ฅผ ํธ์ถํ๊ฒ ํฉ๋๋ค. WOW64๊ฐ ์๋ณด์ด๊ฒ SysWow64 ๋๋ ํ ๋ฆฌ๋ก ์์ฒญํ ๊ฒ์ ์กฐ์ฉํ ๋ฐ๊พธ์ด ์ฃผ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋์, Win64 ์์คํ ์ด ํจ๊ณผ์ ์ผ๋ก ๋ ๊ฐ์ ์์คํ ๋๋ ํ ๋ฆฌ, ํ๋๋ x64 ์ฉ ๋ฐ์ด๋๋ฆฌ๋ค๊ณผ ๋ ํ๋๋ Win32์ฉ์ ๋ฐ์ด๋๋ฆฌ๋ฅผ ๊ฐ์ง๋ ๊ฒ ์ ๋๋ค.
์ฝ๊ฐ ํผ๋์ค๋ฌ์ธ ์ ์์ง๋ง, ์ด๋ฌํ ๋ด๋ถ์ ์ธ ์ฒ๋ฆฌ๋ ์๋นํ ๋ถ๋๋ฌ์ด ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค. ์ ๊ฐ System32 ๋๋ ํ ๋ฆฌ์ Kernel32.dll์์ Dir์ ์คํํ์ ๋, SysWow64 ๋๋ ํ ๋ฆฌ์์ ํ๋ ๊ฒ๊ณผ ์ ํํ ๋๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ ์์์ต๋๋ค. ํ์ผ ์์คํ ์ ๋ฆฌ๋ค์ด๋ ์ ์ด ์ด๋ฐ ๋ฐฉ์์ผ๋ก ๋์ํ๋ ๊ฒ์ ์ ํํ ์ดํดํ๊ธฐ ๊น์ง, ์ ์์ ์ ๋จธ๋ฆฌ๊ฐ ์ข ๋ง์ด ์ํ ์์ต๋๋ค. ์ฌ๋ฌ๋ถ์ด x64 ์ดํ๋ฆฌ์ผ์ด์ ์์ 32๋นํธ WindowsSystem32 ํด๋๋ฅผ ์๊ธฐ๋ฅผ ์ ๋ง๋ก ์ํ์ ๋ค๋ฉด, GetSystemWow64Directory ๋ผ๋ API๊ฐ ์ฌ๋ฌ๋ถ๊ป ์ ํํ ๊ฒฝ๋ก๋ฅผ ์ ๋ฌํด ์ค ๊ฒ ์ ๋๋ค. ๊ทธ๋๋, ์ ์ฒด ๋ด์ฉ์ ์๊ธฐ ์ํด์ MSDN ๋ฌธ์๋ฅผ ๊ผญ ์ฝ์ด ๋ณด์๊ธฐ ๋ฐ๋๋๋ค.
ํ์ผ ์์คํ ์ ๋ฆฌ๋ค์ด๋ ์ ์ด์ธ์๋, WOW64๊ฐ ํด์ฃผ๋ ๋ ๋ค๋ฅธ ๋ง๋ฒ ์ค์ ํ๋๊ฐ ๋ ์ง์คํธ๋ฆฌ ๋ฆฌ๋ค์ด๋ ์ ์ ๋๋ค. ์ ๊ฐ ์๊น Win64 ํ๋ก์ธ์ค์์๋ Win32 DLL๋ค์ ๋ถ๋ฌ์ค์ง ์๋๋ค๊ณ ํ๋ ๋ง์ ์๊ฐํด ๋ณด์๊ณ , ๊ทธ๋ฆฌ๊ณ COM ๊ณผ in-process ์๋ฒ DLL์ ๋ถ๋ฌ์ฌ ๋, ๋ ์ง์คํธ๋ฆฌ๋ฅผ ์ด์ฉํ๋ ๊ฒ์ ์๊ฐํด ๋ณด์๊ธฐ ๋ฐ๋๋๋ค. ๋ง์ฝ, Win32 DLL์ ๊ตฌํ๋์ด ์๋ COM ์ค๋ธ์ ํธ๋ฅผ 64๋นํธ ์ดํ๋ฆฌ์ผ์ด์ ์ด CoCreateInstance๋ฅผ ์ด์ฉํด์, ์์ฑํ๋ ค๊ณ ํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์? DLL์ด ์ฌ๋ผ์ฌ ์ ์์ต๋๋ค, ๋ง์ง์? WOW64๋ Win32 ์ดํ๋ฆฌ์ผ์ด์ ์ผ๋ก๋ถํฐ์ ์ ๊ทผ์ SoftwareClasses ๋ ์ง์คํธ๋ฆฌ ๋ ธ๋๋ก ๋ฆฌ๋ค์ด๋ ์ ํด ์ค๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก Win32 ์ดํ๋ฆฌ์ผ์ด์ ์์ ๋ณด๋ ๋ ์ง์คํธ๋ฆฌ ๊ตฌ์กฐ๋ x64 ์ดํ๋ฆฌ์ผ์ด์ ์์ ๋ณด๋ ๊ฒ๊ณผ ์๋ก ๋ค๋ฅด๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ , ์ฌ๋ฌ๋ถ์ด ๊ธฐ๋ํ์๋ ๋๋ก, ์ด์์ฒด์ ๋ 32๋นํธ ์ดํ๋ฆฌ์ผ์ด์ ์ด RegOpenKey์ ๊ทธ ๊ณ์ด ํจ์๊ตฐ์ ์ด์ฉํ์ฌ, ์ค์ ๋ก๋ 64๋นํธ์ธ ๋ ์ง์คํธ๋ฆฌ์ ์ ๊ทผํ๋ ค๊ณ ํ ๋, ๋ด๋ถ์ ์ผ๋ก ์๋ก์ด ํ๋๊ทธ ๊ฐ์ ์ฃผ์ด์, ๊ทธ ๊ฐ๋ค์ ์ ๊ทผํ ์ ์๊ฒ ํฉ๋๋ค.
์ฝ๊ฐ๋ง ๋ ๊น์์ด ๋ค์ด๊ฐ์, ์ฐ๋ ๋ ๋ก์ปฌ ๋ฐ์ดํ ์์ญ๋ ์ดํด ๋ณด์์ผ ํฉ๋๋ค. x86 ๋ฒ์ ผ์ ์๋์ฐ์์๋, FS ๋ ์ง์คํฐ๊ฐ ๊ฐ ์ฐ๋ ๋์ ๋ฉ๋ชจ๋ฆฌ ์์ญ๊ณผ ๊ฐ์ฅ ๋ง์ง๋ง ์๋ฌ(GetLastError๋ก ํ์ธํ ์ ์๋ ์๋ฌ ๊ฐ), ๊ทธ๋ฆฌ๊ณ ์ฐ๋ ๋์ ์ง์ญ ์ ์ฅ ์์ญ(TLS: Thread Local Storage, TlsGetValue๋ก ๊ฐ์ ์ป์ ์ ์๋) ์ ์ฌ์ฉ๋์์ต๋๋ค. x64 ๋ฒ์ ผ์ ์๋์ฐ์์๋, FS ๋ ์ง์คํฐ๋, GS ๋ ์ง์คํฐ๋ก ๊ต์ฒด๋์์ต๋๋ค. ๊ทธ ์ธ์๋ ๊ฑฐ์ ๋์ผํ ๋ฐฉ์์ผ๋ก x32์ x64์ ์ด์์ฒด์ ๊ฐ ๋์ํฉ๋๋ค.
๋น๋ก, ์ด ๊ธ์ด x64์ ์ฌ์ฉ์ ์ ์ฅ์ ์ด์ ์ ๋๊ณ ์๊ธฐ๋ ํ์ง๋ง, ์ปค๋ ๋ชจ๋์ ๋ด๋ถ ๊ตฌ์กฐ์์ ํ ๊ฐ์ง ์ถ๊ฐ๋ ์ค์ํ ์ ์ด ์์ต๋๋ค. PatchGuard๋ผ๊ณ ๋ถ๋ฆฌ๋ ์๋ก์ด ๊ธฐ์ ์ด x64 ์๋์ฐ์ ์ถ๊ฐ๋์์ต๋๋ค. ์ด ๊ธฐ์ ์ ๋ณด์๊ณผ ๊ฒฌ๊ณ ํจ์ ์ํ ๋ชฉ์ ์ผ๋ก ์ถ๊ฐ๋์์ต๋๋ค. ์๊ฒ๋ syscall ํ ์ด๋ธ์ด๋ ์ธํฐ๋ฝํธ ๋์คํจ์น ํ ์ด๋ธ(interrupt dispatch table-IDT)๋ฅผ ๋ณ๊ฒฝํ๋ ์ฌ์ฉ์ ํ๋ก๊ทธ๋จ์ด๋ ๋๋ผ์ด๋ฒ๋ค์ ๋ณด์์์ ๋ฌธ์ ์ ์ ์ฌ์ ์ธ ์์ ์ฑ์ ๋ฌธ์ ๋ฅผ ์ผ์ผ์ผ ์์์ต๋๋ค. x64์ ๋ด๋ถ์์๋, ๊ทธ๋ฌํ ๋ฐฉ์์ผ๋ก ์ปค๋์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ง์๋์ง ์๋ ๋ฐฉ์์ผ๋ก ๋ฐ๊พธ๋ ๋ฐฉ์์ด ํ์ฉ๋์ง ์์ต๋๋ค. ์ด๋ฌํ ๊ฒ์ ๊ฐํ์ํค๋ ๊ธฐ์ ์ด PatchGuard ์ ๋๋ค. ์ด ๊ธฐ์ ์ ์ค์ํ ์ปค๋ ๋ฉ๋ชจ๋ฆฌ์ ์์น๊ฐ ๋ฐ๋๋ ๊ฒ์ ์ปค๋ ๋ชจ๋์ ์ฐ๋ ๋์์ ํญ์ ๊ฐ์ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ฐ๋๋ฉด, ์์คํ ์ ๋ฒ๊ทธ์ฒดํฌ๋ฅผ ํตํ์ฌ ๋ฉ์ถฐ ๋ฒ๋ฆฝ๋๋ค.
๋ชจ๋ ๊ฒ์ ๊ณ ๋ คํด ๋ณด์๋, ๋ง์ฝ ์ฌ๋ฌ๋ถ์ด Win32์ ๋ด๋ถ ๊ตฌ์กฐ์ ์ด๋ ์ ๋ ์๊ณ ์๊ณ , ์ฝ๋๋ฅผ ์ธ ์ค ์๊ณ , ๋์ํ๋์ง๋ฅผ ์๊ณ ์์ผ๋ฉด, Win64๋ก์ ์ด๋์ ์์ด์ ํฌ๊ฒ ๋๋ผ์ง ์์ผ์ค ๊ฒ๋๋ค. ๊ฑฐ์ ๋๋ถ๋ถ์ ์ข ๋ ๋์ ํ๊ฒฝ์ผ๋ก์ ์ด๋์ด๋ผ๊ณ ๊ฐ์ฃผํ์ ๋ฉ๋๋ค.
x64์ ๊ฐ๋ตํ ๋ด๋ถ ๊ตฌ์กฐ
์ ์ด์ , CPU์ ๊ตฌ์กฐ ์์ฒด์ ๋ํด์ ์กฐ๊ธ ์ดํด ๋ณด๊ธฐ๋ก ํ๊ฒ ์ต๋๋ค. ์๋ํ๋ฉด, ๊ธฐ๋ณธ์ ์ธ CPU์ ๋ช ๋ น์ด(instructions)์ ๋ํด์ ์๊ณ ์๋ ๊ฒ์ด, ๊ฐ๋ฐ(ํนํ ๋๋ฒ๊น !)์ ํจ์ฌ ์ฝ๊ฒ ๋ง๋ค๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ฒ์์ ์ฌ๋ฌ๋ถ์ด ์์ ์ฐจ๋ฆด ์ ์๋ ๊ฒ์, ์ปดํ์ผ๋ฌ๊ฐ ์์ฑํ x64 ์ฝ๋๊ฐ ์ฌ๋ฌ๋ถ์ด ์๊ณ ์๊ณ , ์ฌ๋ํ๋ x86 ์ฝ๋์ ๊ฑฐ์ ํก์ฌํ๋ค๋ ์ ์ ๋๋ค. IA64 ์ฝ๋ฉ์ ๊ฒฝ์ฐ๋ ๊ทธ๋ ๊ฒ ์ ์ฌํ์ง ์์์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ , ๋๋ฒ์งธ๋ก ์ฌ๋ฌ๋ถ์ด ์์์ฐจ๋ฆด ์ ์๋ ๊ฒ์, ๋ ์ง์คํฐ ์ด๋ฆ์ด ์ฌ๋ฌ๋ถ์ด ์ฌ์ฉํ๋ ๊ฒ๋ค๊ณผ ์กฐ๊ธ์ฉ ๋ค๋ฅด๊ณ , ๋ ์ง์คํฐ ์์ฒด๋ ์กฐ๊ธ ๋ง๋ค๋ ์ ์ ๋๋ค. ์ผ๋ฐ์ ์ธ ์ฉ๋์ x64 ๋ ์ง์คํท๋ค์ ์ด๋ฆ์ R๋ก ์์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด์, RAX, RBX, ์ด๋ฐ ๊ฒ๋ค์ด ์์ต๋๋ค. ์ด๊ฒ๋ค์ E์ด๋ฆ์ ๊ฐ์ง๊ณ ์๋ 32๋นํธ x86 ๋ ์ง์คํฐ๋ค์ ํ์ฅ์ ๋๋ค. ์์ฃผ ์ค๋ ์ ์, 16๋นํธ AX ๋ ์ง์คํฐ๊ฐ 32๋นํธ EAX๊ฐ ๋๊ณ , 16๋นํธ BX ๋ ์ง์คํฐ๊ฐ 32๋นํธ EBX๊ฐ ๋์๋ ๊ฒ ์ฒ๋ผ ๋ง์ ๋๋ค. 32๋นํธ๋ก ์ ์ด๊ฐ ๋ ๋ ์๊ฒจ๋ E ๋ ์ง์คํฐ๋ค์ 64๋นํธ๋ก ์ด๋ํ๋ฉด์๋ R ๋ ์ง์คํฐ๋ค์ด ๋ ๊ฒ์ด์ฃ . ๊ทธ๋์, RAX๋ EAX์ ๊ณ์น์์ด๊ณ , RBX๋ EBX์ ๊ณ์น, RSI๋ ESI, ๊ทธ๋ฐ ์์ผ๋ก ํ์ฅ๋์์ต๋๋ค.
์ถ๊ฐ๋ก, 8๊ฐ์ ์ผ๋ฐ์ ์ธ ์ฉ๋์ ๋ ์ง์คํฐ (R8-R15)๊ฐ ์ถ๊ฐ๋์์ต๋๋ค. 64๋นํธ์์ ์ฃผ๋ก ์ฐ์ด๋ ์ผ๋ฐ์ ์ธ ์ฉ๋์ ๋ ์ง์คํฐ๋ค์ ๊ทธ๋ฆผ 5 ์ ๊ฐ์ต๋๋ค.
๋ฌผ๋ก 32๋นํธ EIP ๋ ์ง์คํฐ๋ RIP ๋ ์ง์คํฐ๊ฐ ๋์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ 32๋นํธ ๋ช ๋ น์ด๋ ์ฌ์ ํ ๊ณ์ ๋์ํ๊ณ 32๋นํธ ๋ ์ง์คํฐ๋ ๋ฌผ๋ก ์ด๊ณ 16๋นํธ ๋ ์ง์คํฐ๋ (EAX, AX, AL, AH๋ฑ๊ณผ ๊ฐ์) ์ฌ์ ํ ์ ํจํฉ๋๋ค.
๊ทธ๋ํฝ ์์ ์ ํ๊ฑฐ๋ ํน์ ๊ณผํ์ ์ธ ์ฐ์ฐ์ด ํ์ํ ๊ณ ์๋ค์ด ์ฌ์ฉํ ์ ์๋๋ก, x64 CPU๋ ์ฌ์ ํ XMM0์์ XMM15๋ก ๋ช ๋ช ๋ 16๊ฐ์ 128๋นํธ SSE2 ๋ ์ง์คํฐ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ๊ทธ ์ธ ์ฌ๊ธฐ์ ์ด์ผ๊ธฐํ์ง ์๋ ๋ค๋ฅธ x64 ๋ ์ง์คํฐ๋ค์ ๋ํ ๋ชจ๋ ์ ๋ณด๋ค์ WINNT.H ์์์ _CONTEXT๋ก ์ ์ ํ๊ฒ #ifdef๋ ๊ตฌ์กฐ์ฒด์์ ์ฐพ์ ๋ณด์ค ์ ์์ต๋๋ค.
์๋ญํผ, x64 CPU๋ ์ธ์ ๋ผ๋ ๊ตฌํ์ 32๋นํธ ๋ชจ๋ ํน์ 64๋นํธ ๋ชจ๋ ๋ ๋ค ์์ ๋์ํ ์ ์์ต๋๋ค. 32๋นํธ ๋ชจ๋์์, CPU๋ ๋ค๋ฅธ x86 CPU์ฒ๋ผ ๋ช ๋ น์ด๋ฅผ ํด์ํ๊ณ , ์ด์ ๊ธฐ๋ฐํ์ฌ ๋์ํฉ๋๋ค. 64๋นํธ ๋ชจ๋์์๋, CPU๋ ์๋ก์ด ๋ ์ง์คํฐ์ ๋ช ๋ น์ด๋ฅผ ์ง์ํ๊ธฐ ์ํด์ ์ด๋ค ํน์ ๋ช ๋ น์ด ์ธ์ฝ๋ฉ์ ๋ํด์ ์ฝ๊ฐ์ ์ฌ์ํ ์กฐ์ ์ ํ์์ต๋๋ค.
๋ง์ฝ ์ฌ๋ฌ๋ถ์ด CPU ์คํผ์ฝ๋ ์ธ์ฝ๋ฉ ๋ค์ด์๊ทธ๋จ(opcode encoding diagram)์ ์ต์ํ์๋ค๋ฉด, ์๋ง๋, ์๋ก์ด ๋ช ๋ น์ด ์ธ์ฝ๋ฉ์ ์ํ ๊ณต๊ฐ์ ๋นจ๋ฆฌ ์์ด์ง๋ค๋ ๊ฒ๊ณผ ์๋ก์ด ๋ช ๋ น์ ์ํด ์ฌ๋ ๊ฐ์ ์๋ก์ด ๋ ์ง์คํฐ๋ฅผ ์ฅ์ด์ง๋ ๊ฒ์ ์ฌ์ด ์ผ์ ์๋๋ผ๋ ๊ฒ์ ๊ธฐ์ตํ์ค ๊ฒ๋๋ค. ์๋ก์ด ๋ช ๋ น์ด๋ฅผ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ ์ค์ ํ๋๋, ๊ฑฐ์ ์ฐ์ด์ง ์๋ ๋ช ๋ น์ด๋ฅผ ์ญ์ ํ๋ ๊ฒ ์ ๋๋ค. ๊ทธ๋์, x64์์๋ ๊ธฐ์กด์ CPU์์ ์ฌ์ฉ๋๋ ๋ช ๊ฐ์ ๋ช ๋ น์ด๊ฐ ์ญ์ ๋์๊ณ , ์ง๊ธ๊น์ง, ์ ๊ฐ ์ค์ง ๊ทธ๋ฆฌ์ ํ๋ ๋ช ๋ น์ด๋ ์คํ์ ์ผ๋ฐ์ฉ๋ ๋ ์ง์คํฐ์ ๊ฐ์ ๋ชจ๋ ์ ์ฅํ๋ค๊ฐ, ๋ค์ ๋ณต์ํด ์ฃผ๋, 64๋นํธ PUSHAD์ POPAD ์ ๋๋ค. ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ ๋ช ๋ น์ด ์ธ์ฝ๋ฉ ๊ณต๊ฐ์ ํ๋ณดํ๋ ๋ฐฉ๋ฒ์, 64๋นํธ์์ ๋ ์ด์ ์ฐ์ด์ง ์๋ ์ธ๊ทธ๋จผํธ๊ด๋ จ ๋ ์ง์คํฐ๋ค์ ์ ๋ถ ์ ๊ฑฐํด ๋ฒ๋ฆฌ๋ ๊ฒ ์ ๋๋ค. ๊ทธ๋์, CS, DS, ES, SS, FS, ๊ทธ๋ฆฌ๊ณ GS ๋ ์ง์คํฐ๊ฐ ๋ ์ด์์ ์ฐ์ง ์์ต๋๋ค. ๊ทธ๋ ๊ฒ ๋ง์ ์ฌ๋์ด ์ด ๋ ์ง์คํฐ๋ค์ ๊ทธ๋ฆฌ์ํ ๊ฒ ๊ฐ์ง๋ ์๊ตฐ์.
64๋นํธ ์ฃผ์๊ฐ ์ฌ์ฉ๋จ์ ๋ฐ๋ผ, ์ฌ๋ฌ๋ถ์ด ์ฝ๋ ์ฌ์ด์ฆ์ ๋ํด์ ๊ถ๊ธํด ํ ์ง๋ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์๋ฅผ ๋ค์ด์, ์๋์ ๊ฒฝ์ฐ๋ ํํ 32๋นํธ ๋ช ๋ น์ด ์ ๋๋ค:
CALL DWORD PTR [XXXXXXXX]์ ์์, X๊ฐ ๋ ๋ถ๋ถ์ด ๋ฐ๋ก 32๋นํธ ์ฃผ์์ ๋๋ค. 64๋นํธ ๋ชจ๋์์๋, ์์์ X๊ฐ ๋ ๋ถ๋ถ์ด 64๋นํธ ์ฃผ์๊ฐ ๋ฉ๋๋ค. ๊ทธ๋์, 5๋ฐ์ดํธ ๋ช ๋ น์ด๊ฐ 9๋ฐ์ดํธ๋ก ๋๊ฒ ์ง์? ์ด ์ข๊ฒ๋, ๊ทธ๋ ์ง๋ ์์ต๋๋ค. ๋ช ๋ น์ด๋ ์ฌ์ ํ ๋๊ฐ์ ์ฌ์ด์ฆ๋ฅผ ์ ์งํฉ๋๋ค. 64๋นํธ ๋ชจ๋์์๋, ๋ช ๋ น์ด์ 32๋นํธ ์คํผ๋๋ ๋ถ๋ถ์ ํ์ฌ ๋ช ๋ น์ด์ ์๋์ ์ธ ๋ฐ์ดํฐ์ ์คํ์ ์ผ๋ก ์ทจ๊ธ๋ฉ๋๋ค. ์๋ฅผ ํ๋ ๋ค์ด ๋ณด๊ฒ ์ต๋๋ค. 32๋นํธ ๋ชจ๋์์๋, ์๋์ ๋ช ๋ น์ด๊ฐ 00020000h๋ฒ์ง์ ์๋ 32๋นํธ ํฌ์ธํฐ ๊ฐ์ ๋ถ๋ฆ ๋๋ค.
00401000: CALL DWORD PTR [00020000h]64 ๋นํธ์์๋, ๋๊ฐ์ ๋ช ๋ น์ด๊ฐ 0042100h(4010000h + 20000h)์ ์๋ 64๋นํธ ํฌ์ธํฐ ๊ฐ์ ํธ์ถํฉ๋๋ค. ๋ง์ฝ ์ฌ๋ฌ๋ถ์ด ์ฌ๋ฌ๋ถ์ด ์ค์ค๋ก ์ฝ๋๋ฅผ ์์ฑํ๊ณ ์๋ค๋ฉด, ์กฐ๊ธ๋ง ์๊ฐํด ๋ณด์๋ ์ด๋ฌํ ์๋ ์ฃผ์ ๋ชจ๋๊ฐ ์๋ฏธ๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ์ฌ๋ฌ๋ถ์ ๋ช ๋ น์ด์ 8 ๋ฐ์ดํธ ํฌ์ธํธ ๊ฐ์ ์ ๊ณตํ ์ ์์ต๋๋ค. ๊ทธ ๋์ ์, ์ฌ๋ฌ๋ถ์ ์ค์ ์ 64๋นํธ ๋์ ์ฃผ์๊ฐ ์กด์ฌํ๋ ๊ณณ์ 32๋นํธ ์๋ ๊ฒฝ๋ก๋ฅผ ์ ๊ณตํด์ค์ผ ํฉ๋๋ค. ๊ทธ๋์, 64๋นํธ ๋์ ํฌ์ธํฐ๋ ๋ฐ๋์ ์ด ํฌ์ธํฐ๋ฅผ ์ด์ฉํ๋ ๋ช ๋ น์ด์ 2GB ๋ด์ธ๋ก(์๋ค๋ก ๊ฐ๊ฐ 2GB์ฉ) ์กด์ฌํด์ผ ํ๋ค๋ ๋งํ์ง ์์๋ ์ ์ ์๋ ๊ฐ์ ์ด ์๊น๋๋ค. ๊ฑฐ์ ๋ชจ๋ ์ฌ๋๋ค์๊ฒ๋ ์ด๊ฒ์ด ๋ฌธ์ ๊ฐ ๋ ์ด์ ๊ฐ ๋ณ๋ก ์๊ฒ ์ง๋ง, ๋์ ์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํ๋ค๋ ์ง ํน์ ๊ธฐ์กด ์ฝ๋๋ฅผ ๋ฉ๋ชจ๋ฆฌ์์ ๋ณ๊ฒฝํ๋ ๊ฒฝ์ฐ๋ผ๋ฉด, ๋ฌธ์ ๊ฐ ์๊ธธ ์๋ ์์ต๋๋ค.
x64 ๋ ์ง์คํฐ์ ๊ฐ์ฅ ํฐ ์ฅ์ ์ค์ ํ๋๋, ์ปดํ์ผ๋ฌ๊ฐ ์คํ ๋ณด๋ค ๋ชจ๋ ํ๋ผ๋ฏธํฐ๋ค์ ๋ ์ง์คํฐ์ ์ ๋ฌํ๋ ์ฝ๋๋ฅผ ๋ง์นจ๋ด ์์ฑํ ์ ์๋ค๋ ์ ์ ๋๋ค. ์คํ์ ํ๋ผ๋ฏธํฐ๋ฅผ ๊ตฌ๊ฒจ ๋ฃ๋ ๊ฒ์ ๋ฉ๋ชจ๋ฆฌ ์ต์ธ์ค๋ฅผ ํ์๋ก ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ , ์ฐ๋ฆฌ๋ CPU ์บ์ฌ์ ์๋ ๋ฉ๋ชจ๋ฆฌ ์ต์ธ์ค๋ RMA์ด ๊ทธ ๋ด์ฉ์ ๊ฐ์ ธ์ฌ ๋๊น์ง, ๋ช ์ฌ์ดํด ๋์ CPU๋ฅผ ์ ์ ์์๊ฒ ํ๋ค๋ ์ฌ์ค๋ ์๊ณ ์์ต๋๋ค.
ํจ์ ํธ์ถ ๋ฐฉ์(Calling Convention) ์ ๊ฒฝ์ฐ, x64 ๋ด๋ถ๊ตฌ์กฐ๋ฅผ ์ด์ฉํ์ฌ _stdcall, _cdecl, _fastcall, _thiscall ๊ฐ์ ๊ธฐ์กด์ ์กด์ฌํ๋ Win32 ํจ์ ํธ์ถ ๋ฐฉ์์ ๋ชจ์กฐ๋ฆฌ ์ ๋ฆฌํ ์ ์๋ ๊ธฐํ๋ฅผ ๊ฐ์ก์ต๋๋ค. Win64์ ๊ฒฝ์ฐ๋, ๋ฑ ํ๋์ ํจ์ ํธ์ถ ๋ฐฉ์์ด ์กด์ฌํฉ๋๋ค. _cdecl ๊ฐ์ ๋ฐฉ์์ ๊ทธ๋ฅ ์ปดํ์ผ๋ฌ์์ ๋ฌด์๋ฉ๋๋ค. ์ด๋ฌํ ํจ์ ํธ์ถ ๋ฐฉ์์ ๋จ์ผํ๋ ๋ฌด์๋ณด๋ค๋ ๋๋ฒ๊น ์ ์ํํ๊ฒ ํ๋๋ฐ ํฐ ํํ์ ๋๋ค.
x64์ ํจ์ ํธ์ถ ๋ฐฉ์์ fastcall ๋ฐฉ๋ฒ๊ณผ ์ ์ฌํฉ๋๋ค. x64 ํธ์ถ ๋ฐฉ์์์๋, ์ฒ์ ๋ค ๊ฐ์ ์ ์ ์ธ์๊ฐ ์ด ๋ชฉ์ ์ ์ํด ๋์์ธ๋ ๋ ์ง์คํฐ์ ์ ๋ฌ๋ฉ๋๋ค:
RCX: 1๋ฒ์งธ ์ ์ ์ธ์
RDX: 2๋ฒ์งธ ์ ์ ์ธ์
R8: 3 ๋ฒ์งธ ์ ์ ์ธ์
R9: 4๋ฒ์งธ ์ ์ ์ธ์
๋ค ๊ฐ ์ด์์ ์ ์ ์ธ์๋ ์คํ์ ํตํด์ ์ ๋ฌ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ this ํฌ์ธํฐ๋ ์ ์ ์ธ์๋ก ๊ฐ์ฃผ๋์ด ํญ์ RCX ๋ ์ง์คํฐ์์ ๋ฐ๊ฒฌ๋ ์ ์์ต๋๋ค. ๋ถ๋ ์์์ ์ธ์๋ค์ ๋ํด์๋, ์ฒ์ ๋ค ๊ฐ์ ์ธ์๋ค์ XMM0์์๋ถํฐ XMM3 ๋ ์ง์คํฐ๋ฅผ ํตํด์ ์ ๋ฌ๋๊ณ , ๋๋จธ์ง ๋ถ๋ ์ธ์๋ค์ ์ฐ๋ ๋ ์คํ์ ํตํด์ ์ ๋ฌ ๋ฉ๋๋ค.
ํจ์ ํธ์ถ ๋ฐฉ์์ ๋ํด์ ์กฐ๊ทธ๋ง ๋ ๊น์์ด ๋ค์ด๊ฐ๋ฉด, ์ธ์๋ค์ด ๋ ์ง์คํฐ๋ฅผ ํตํด์ ์ ๋ฌ๋ ์ ์์์๋ ๋ถ๊ตฌํ๊ณ , ์ปดํ์ผ๋ฌ๋ RSP ๋ ์ง์คํฐ๋ฅผ ๊ฐ์์ํค๋ฉด์, ์ฌ์ ํ ์คํ์ ๊ณต๊ฐ์ ์์ฝํด ๋์ต๋๋ค. ์ต์ํ, ๊ฐ๊ฐ์ ํจ์๋ ๋ฐ๋์ 32๋ฐ์ดํธ (๋ค ๊ฐ์ 64๋นํธ ๊ฐ)์ ์์ฝํด ๋์์ผ ํฉ๋๋ค. ์ด ๊ณต๊ฐ์ ๋ ์ง์คํฐ๋ค์ด ํจ์์ ์ ๋ฌ๋์ด, ์ ์๋ ค์ง ์คํ ์์น์ ์ฝ๊ฒ ๋ณต์ฌ๋๋๋ก ํฉ๋๋ค. ๋ฌผ๋ก , ๋ถ๋ฆฌ๋ ํจ์ ์ธก์์ ํจ์์ ์ธ์๋ฅผ ์ฑ์ฐ์ง๋ ์์ต๋๋ค. ํ์ง๋ง, ํ์ํ ๊ฒฝ์ฐ์ ์ด๋ฌํ ์คํ ๊ณต๊ฐ์ ์์ฝ์, ํจ์ ์ธ์๋ค์ด ๋ ์ง์คํฐ์์ ์ฝ๊ฒ ์คํ์ผ๋ก์ ๋ณต์ฌ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. ๋ฌผ๋ก , ๋ค ๊ฐ ์ด์์ ์ธ์๊ฐ ์ ๋ฌ๋๋ค๋ฉด, ์ ์ ํ ์คํ์ ์ถ๊ฐ ๊ณต๊ฐ์ด ๋ฐ๋์ ์์ฝ๋์ด์ผ ํฉ๋๋ค.
์๋ฅผ ํ ๋ฒ ๋ค์ด ๋ณด๊ฒ ์ต๋๋ค. ์ด๋ค ํจ์๊ฐ ์์ ํจ์์๊ฒ ๋ ๊ฐ์ ์ ์ ์ธ์๋ฅผ ์ ๋ฌํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค๊ณ ๊ฐ์ ์ ํ ๋ฒ ํด๋ณด๊ฒ ์ต๋๋ค. ์ปดํ์ผ๋ฌ๋ ๋ ๊ฐ์ ์ธ์๋ฅผ ๊ฐ๊ฐ RCX์ RDX์ ๊ฐ๊ฐ ์ ๋ฌํ ๋ฟ๋ง ์๋๋ผ, RSP ์คํ ํฌ์ธํฐ ๋ ์ง์คํฐ์์ 32๋ฐ์ดํธ๋ฅผ ๋นผ๋์ต๋๋ค. ๋ถ๋ฆฌ๋ ํจ์ ์ ์ฅ์์๋, ํ๋ผ๋ฏธํฐ์ ๊ฐ์ RCX์ RDX ๋ ์ง์คํฐ๋ฅผ ํตํด์ ์ ๊ทผ ๊ฐ๋ฅํฉ๋๋ค. ๋ง์ฝ, ๋ถ๋ฆฌ๋ ํจ์ ์ฝ๋๊ฐ ๋ ์ง์คํฐ๊ฐ ๋ค๋ฅธ ์ด์ ์์ ํ์ํ ๊ฒฝ์ฐ, ์ด ๊ฐ๋ค์ ์์ฝ๋ 32๋ฐ์ดํธ ์คํ ์์ญ์ ๋ณต์ฌ๋ฉ๋๋ค. ๊ทธ๋ฆผ 6์ 6๊ฐ์ ์ ์ ์ธ์๊ฐ ์ ๋ฌ๋ ๋ค์ ๋ ์ง์คํฐ์ ์คํ์ ๋ณด์ฌ ์ฃผ๊ณ ์์ต๋๋ค. ๊ทธ๋ฆผ 6 shows the registers and stack after six integer parameters have been passed.
Figure 6 ์ ์์ ์ ๋ฌ
x64 ์์คํ ์์์ ํ๋ผ๋ฏธํฐ ์คํ ์ ๋ฆฌ๋ ์ฝ๊ฐ ์ฌ๋ฐ๋ ๋ชจ์ต์ ๋ณด์ฌ ์ฃผ๊ณ ์์ต๋๋ค. ๊ธฐ์ ์ ์ผ๋ก๋, ๋ถ๋ฆฌ๋ ํจ์(callee)๊ฐ ์๋, ๋ถ๋ฅด๋ ํจ์(caller)๊ฐ ์คํ์ ์ ๋ฆฌ๋ฅผ ์ฑ ์์ง๊ณ ์์ต๋๋ค. ๊ทธ๋ฌ๋, ์ฌ๋ฌ๋ถ์ ํ๋ก๋กค๊ทธ์ ์ํ๋ก๊ทธ ์ฝ๋๋ฅผ ์ ์ธํ๊ณ ๋ค๋ฅธ ๋ถ๋ถ์์ RSP๋ฅผ ์กฐ์ ํ๋ ๋ชจ์ต์ ๊ฑฐ์ ๋ณด๊ธฐ๊ฐ ํ๋ค ๊ฒ ์ ๋๋ค. PUSH์ POP ๋ช ๋ น์ด๋ก ์คํ์์ ์ธ์๋ฅผ ๋ํ๊ฑฐ๋ ๋นผ์ฃผ๋ x86 ์ปดํ์ผ๋ฌ์ ๋ค๋ฅด๊ฒ, x64 ์ฝ๋ ์์ฑ๊ธฐ๋ (ํ๋ผ๋ฏธํฐ์ ์ ์ฅ์์ ๋ณด๋ฉด) ์ผ๋ง๋ ์ง ํฐ ๋์ ํจ์์์๋ ์ธ ์ ์์ ๋งํผ ์ถฉ๋ถํ ์คํ์ ์์ฝํด ๋์์ต๋๋ค. ๊ทธ๋์, ์์ ํจ์๋ฅผ ํธ์ถ ์์, ํ๋ผ๋ฏธํฐ๋ฅผ ์ค์ ํ๊ธฐ ์ํด ๋๊ฐ์ ์คํ ์์ญ์ ๊ณ์ ๋ฐ๋ณตํด์ ์๋๋ค.
์งง๊ฒ ๋งํด์, RSP ๋ ์ง์คํฐ๋ ๊ฑฐ์ ๋ณํ์ง ์์ต๋๋ค. ์ด ์ ์ ESP ๋ ์ง์คํฐ ๊ฐ์ด ํ๋ผ๋ฏธํฐ๊ฐ ์คํ์ ์ถ๊ฐ๋๊ฑฐ๋ ์ ๋ฆฌ๋๋ฉด์, ๊ณ์ ๋ณํ๋ x86 ์ฝ๋์ ์๋นํ ํ๋ฆฝ๋๋ค.
์๋ฅผ ํ๋ ๋ค์ด ๋ณด๊ฒ ์ต๋๋ค. ์ธ ๊ฐ์ ๋ค๋ฅธ ํจ์๋ฅผ ํธ์ถํ๋ x64 ํจ์๊ฐ ์๋ค๊ณ ์๊ฐํด ๋ณด์๊ธฐ ๋ฐ๋๋๋ค. ์ฒ์ ํจ์๋ ๋ค ๊ฐ์ ์ธ์(0x20 ๋ฐ์ดํธ=32๋ฐ์ดํธ)๋ฅผ ๋ฐ์ต๋๋ค. ๋๋ฒ์งธ ์ธ์๋ ์ด ๋๊ฐ์ ์ธ์(0x60๋ฐ์ดํธ=96๋ฐ์ดํธ)๋ฅผ ๋ฐ์ต๋๋ค. ์ธ๋ฒ์งธ ํจ์๋ ์ฌ๋ ๊ฐ์ ์ธ์(0x40=64๋ฐ์ดํธ)๋ฅผ ๋ฐ์ต๋๋ค. ํ๋กค๋ก๊ทธ์์๋, ์์ฑ๋ ์ฝ๋๋, ์คํ์ ๋จ์ง 96๋ฐ์ดํธ๋ง ์์ฝํด์ ๋์ ํจ์๊ฐ ์ธ์๋ค์ ์ฐพ์ ์ ์๋๋ก, 96 ๋ฐ์ดํธ ์์ ์ ์ ํ ์์น์ ์ธ์๋ค์ ๋ณต์ฌํด ๋์ต๋๋ค.
x86 ํจ์ ํธ์ถ ๋ฐฉ์์ ๋ํ ์ข ๋ ์์ธํ ๋ด๋ถ ๊ตฌ์กฐ๋ Raymond Chen's blog (์๋ฌธ) ์์ ์ฐพ์ ์ ์์ต๋๋ค. ์ด๊ฒ์ ๋ํด์ ๋ ์์ธํ ์ค๋ช ํ์ง๋ ์๊ฒ ์ต๋๋ค๋ง, ๋ช ๊ฐ์ง๋ง ์ค์ํ ์ ์ ๋ ๋ง์ ๋๋ฆฌ์๋ฉด. ์ฒซ ๋ฒ์งธ, ํจ์์ ์ธ์๋ค ์ค, ์ฒ์ ๋ค ๊ฐ์ ์ธ์๋ค ์ค์์, 64๋นํธ ๋ณด๋ค ์ ์ ์ ์ ์ธ์๋ค์ ๋ถํธ ํ์ฅ(sign extended)์ด ์ผ์ด๋๊ณ , ์ ์ ํ ๋ ์ง์คํฐ๋ฅผ ํตํ์ฌ ์ ๋ฌํ ์ ์์ต๋๋ค. ๋ ๋ฒ์งธ๋ก, 64๋นํธ ์ผ๋ผ์ธ์ ์งํค๊ธฐ ์ํด์, ์ ๋๋ก 8๋ฐ์ดํธ์ ์ ์๋ฐฐ๊ฐ ์๋ ํจ์ ์ธ์๊ฐ ์คํ์ ์กด์ฌํด์๋ ์๋ฉ๋๋ค. ๊ตฌ์กฐ์ฒด๋ฅผ ํฌํจํด์, 1, 2, 4, ํน์ 8 ๋ฐ์ดํธ๊ฐ ์๋ ์ธ์๋ค์ ๋ํผ๋ฐ์ค๋ฅผ ํตํด์ ์ ๋ฌ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง์ผ๋ก, 8,16,32, 64๋นํธ์ ๊ตฌ์กฐ์ฒด์ ๊ณ ์ฉ์ฒด๋ ๋์ผํ ํฌ๊ธฐ์ ์ ์ ์ธ ๊ฒ ์ฒ๋ผ, ์ ๋ฌ๋ฉ๋๋ค.
ํจ์ ๊ฒฐ๊ณผ ๊ฐ์ RAX ๋ ์ง์คํฐ์ ์ ์ฅ๋ฉ๋๋ค. ๋ถ๋ ์์์ ํ์์ ๊ฐ์ ์์ธ์ ์ผ๋ก XMM0์ผ๋ก ๋๋ ค ๋ฐ์ต๋๋ค. ํจ์ ํธ์ถ์ ํตํ์ฌ, ์ ๊ฐ ๋ง์๋๋ฆฌ๋ ๋ ์ง์คํฐ๋ค์ ์์ฝ๋์ด ์์ด์ผ ํฉ๋๋ค: RBX, RBP, RDI, RSI, R12, R13, R14, ๊ทธ๋ฆฌ๊ณ R15. ๊ทธ๋ฆฌ๊ณ ์ง๊ธ ๋ง์๋๋ฆฌ๋ ๋ ์ง์คํฐ๋ค์ ํ๋ฐ์ฑ์ด๊ณ , ๊ฐ์ด ์์ด์ง ์ ์์ต๋๋ค:RAX, RCX, RDX, R8, R9, R10, ๊ทธ๋ฆฌ๊ณ R11.
์์์ ์ ๊ฐ ์์ธ ์ฒ๋ฆฌ ๋ฉ์ปค๋์ฆ์ ์ผํ์ผ๋ก, ์ด์์ฒด์ ๊ฐ ์คํ ํ๋ ์์ ๊ฒ์ฌํ๋ค๊ณ ๋ง์ ๋๋ ธ์ต๋๋ค. ์ฌ๋ฌ๋ถ์ด ํ ๋ฒ์ด๋ผ๋, ์คํ์ ๊ฒ์ฌํ๋ ์ฝ๋๋ฅผ ์จ๋ณด์ ์ ์ด ์๋ค๋ฉด, ๊ฑฐ์ ์์์ ์ธ Win32 ํ๋ ์์ ๋ ์ด์์์ด ํ๋ก์ธ์ค๋ฅผ ๋ค๋ฃจ๊ธฐ ํ๋ค๊ฒ ํ๋ค๋ ๊ฒ์ ์์ค ๊ฒ๋๋ค. ์ด๋ฌํ ์ํฉ์ด x64์์๋ ๋ ์ข์์ก์ต๋๋ค. ๋ง์ฝ ํจ์๊ฐ ์คํ ๊ณต๊ฐ์ ํ ๋นํ๊ณ , ๋ค๋ฅธ ํจ์๋ฅผ ํธ์ถํ๊ณ , ์ด๋ค ๋ ์ง์คํฐ๋ฅผ ์์ฝํ๊ฑฐ๋, ์์ธ ์ฒ๋ฆฌ๋ฅผ ์ด์ฉํ๋ค๋ฉด, ๊ทธ ํจ์๋ ๋ฐ๋์ ํ์คํ๋ ํ๋กค๋ก๊ทธ์ ์ํ๋ก๊ทธ๋ฅผ ์์ฑํ๊ธฐ ์ํ์ฌ ์ ์ ์๋ ๋ช ๋ น์ด ์งํฉ(well-defined set of instructions)์ ์จ์ผ ํฉ๋๋ค.
ํ์คํ๋ ํจ์์ ์คํ ํ๋ ์์ ์ฌ์ฉํ๋๋ก ๊ฐ์ ํ๋ ๊ฒ์, ์ด์์ฒด์ ๊ฐ ์คํ์ ์ธ์ ๋ ์ง ํ์ํ ์ ์๋ ๊ฒ์ ๋ณด์ฅํ๋ ํ ๋ฐฉ๋ฒ์ ๋๋ค. ์ด๋ฌํ ์ผ๊ด์ฑ์, ํ์คํ๋ ํ๋กค๋ก๊ทธ๋ฅผ ์ด์ฉํ์ฌ ์ปดํ์ผ๋ฌ์ ๋ง์ปค๋ ๊ด๋ จ๋ ํ ์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค. ๊ถ๊ธํ์ ๋ถ๋ค์ ์ํด์, ์ข ๋ ์์ธํ ์ค๋ช ํ๋ฉด, ํ ์ด๋ธ์ ๋ชจ๋ ํจ์ ์ ๋ณด๋ค์ winnt.h์ ์ ์๋์ด ์๋ IMAGE_FUNCTION_ENTRY64์ ๋ฐฐ์ด ํ ์ด๋ธ์ ์ ์ฅ๋์ด์ผ ํฉ๋๋ค. ์ด๋ป๊ฒ ๊ทธ ํ ์ด๋ธ์ ์ฐพ๋์ง ๊ถ๊ธํ์๋ค๊ตฌ์? ๊ทธ ํ ์ด๋ธ์ PEํค๋์ ๋ฐ์ดํฐ ๋๋ ํ ๋ฆฌ ์์ญ ์์ IMAGE_DIRECTORY_ENTRY_EXCEPTION์ ์ํธ๋ฆฌ๊ฐ ์ง์ ํ๊ณ ์์ต๋๋ค.
์๋นํ ์งง์ ๋ถ๋์ด์ง๋ง, ๋ด๋ถ๊ตฌ์กฐ์ ๋ง์ ๋ถ๋ถ์ ๋ค๋ฃจ์์ต๋๋ค. ๊ทธ๋ฌ๋, x86์ ๋ํ ํฐ ๊ฐ๋ ๊ณผ 32๋นํธ ์ด์ ๋ธ๋ฆฌ ์ธ์ด์ ๋ํ ์ง์์ด ์์ผ์ ๋ถ๋ค์, ์๋นํ ์งง์ ์๊ฐ ์์ x64 ๋ช ๋ น์ด๋ฅผ ์ดํดํ์ค ์ ์์ผ์ค ๊ฒ๋๋ค.
Visual C++๋ก x64์ฉ ์ดํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ
Visual Studioยฎ 2005 ์ด์ ์๋ ๋ง์ดํฌ๋ก ์ํํธ์์ ๋์จ C++ ์ปดํ์ผ๋ฌ๋ก x64์ฉ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ ๊ฐ๋ฅํ์ง๋ง, IDE์ ์๋ฒฝํ ํตํฉ์ ๋์ง ์์์์ต๋๋ค. ์ด ๊ธ์์๋, ์ ๋ ์ฌ๋ฌ๋ถ์ด Visual Studioยฎ 2005๋ฅผ ๊ฐ์ง๊ณ ์๊ณ , ์ฌ๋ฌ๋ถ์ด x64์ฉ ๋๊ตฌ (๊ธฐ๋ณธ ์ค์น ์ต์ ์ด ์๋๋๋ค.)์ ์ ํํ๋ค๊ณ ๊ฐ์ ํ๊ณ ์ด ๊ธ์ ์งํํ๊ฒ ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ , ์ฌ๋ฌ๋ถ์ด ๊ธฐ์กด์ Win32 ์ฌ์ฉ์ ๋ชจ๋์์ C++๋ฅผ ์ด์ฉํ ํ๋ก์ ํธ ๊ฒฝํ์ด ์๋ค๊ณ ๊ฐ์ ํ๊ฒ ์ต๋๋ค.
x64๋ฅผ ์ํ ์ฒซ ๋ฒ์งธ ๋จ๊ณ๋, 64๋นํธ ๋น๋ ํ๊ฒฝ์ ๊ตฌ์ถํ๋ ๊ฒ ์ ๋๋ค. ์ด๋ฏธ ๋ค ์์๊ฒ ์ง๋ง, ์ฌ๋ฌ๋ถ ํ๋ก์ ํธ์๋ ๊ธฐ๋ณธ์ผ๋ก ๋ ๊ฐ์ ํ๊ฒฝ์ด ์์ต๋๋ค. Debug์ Retail์ด ๊ทธ๊ฒ์ ๋๋ค. ์ฌ๋ฌ๋ถ์ด ์ฌ๊ธฐ์์ ๋ ํด์ผ ํ๋ ๊ฒ์, ๋ ๊ฐ์ ํ๊ฒฝ์ ๋ ์์ฑํ๋ ๊ฒ ๋ฟ์ ๋๋ค. x64๋ฅผ ์ํ Debug์ Retail ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ ์ ๋๋ค.
๊ธฐ์กด์ ํ๋ก์ ํธ ํน์ ์๋ฃจ์ ์ ํ ๋ฒ ์ด์ด ๋ณด์๊ธฐ ๋ฐ๋๋๋ค. ๋น๋ ๋ฉ๋ด์์, Configuration Manager๋ฅผ ์ ํํด ๋ณด์ญ์์ค. Configuration Manager ๋ค์ด์ผ๋ก๊ทธ ๋ฐ์ค์์, Active Solution Plaftfrom ์ฝค๋ณด ๋ฐ์ค๋ฅผ ๋๋ฌ์, New๋ฅผ ์ ํํ์๊ธฐ ๋ฐ๋๋๋ค(๊ทธ๋ฆผ 7 ). ๊ทธ๋ฌ๋ฉด, ์ฌ๋ฌ๋ถ์ New Solution Plaftform์ด๋ผ๊ณ ๋ช ๋ช ๋ ๋ค๋ฅธ ๋ค์ด์ผ๋ก๊ทธ๋ฅผ ๋ณด์ค ์ ์์ ๊ฒ ์ ๋๋ค.
๊ทธ๋ฆผ7 ์๋ก์ด ๋น๋ ํ๊ฒฝ์ ์์ฑ
x64๋ฅผ ์ ํ๋ซํผ(๊ทธ๋ฆผ 8)๋ก ์ ํํ๊ณ , ๋ค๋ฅธ ์ค์ ์ ๊ทธ๋ฅ ๋๋์๊ธฐ ๋ฐ๋๋๋ค; ๊ทธ๋ฆฌ๊ณ OK๋ฅผ ํด๋ฆญํ์ธ์. ๊ทธ๊ฒ ์ ๋ถ๋๋๋ค! ์ฌ๋ฌ๋ถ์ ์ด์ ๋ค ๊ฐ์ง์ ๊ฐ๋ฅํ ๋น๋ ํ๊ฒฝ์ ๊ตฌ์ถํ์ จ์ต๋๋ค: Win32 Debug, Win32 Retail, x64 Debug, x64 Retail. Configuration Manager ๋ฅผ ์ด์ฉํด์, ์ฝ๊ฒ ๋ค๋ฅธ ํ๊ฒฝ์ผ๋ก์ ๋ณ๊ฒฝ๋ ๊ฐ๋ฅํฉ๋๋ค.
์, ์ด์ ์ฌ๋ฌ๋ถ์ ์ฝ๋๊ฐ ์ด๋ป๊ฒ 64๋นํธ์ ์ ์ฉ ๊ฐ๋ฅํ์ง ํ ๋ฒ ์ดํด ๋ณด๊ธฐ๋ก ํ๊ฒ ์ต๋๋ค. x64 Debug ์ค์ ์ ๊ธฐ๋ณธ์ผ๋ก ๋์ผ์๊ณ , ํ๋ก์ ํธ๋ฅผ ๋น๋ํด ๋ณด์๊ธฐ ๋ฐ๋๋๋ค. ํ๋ก์ ํธ ์์ฒด๊ฐ ์์ฃผ ๊ฐ๋ณ์ง ์์ ์ด์, Win32 ํ๊ฒฝ์์ ๋ณผ ์ ์์๋ ์ปดํ์ผ ์๋ฌ๋ค์ ๋ณด์ค ์ ์์ ๊ฒ๋๋ค. ์ฌ๋ฌ๋ถ์ด ํฌํ ์ด ๋ถ๊ฐ๋ฅํ ์ ๋์ C++์ฝ๋๋ฅผ ์ฐ์ง ์๋ ์ด์, ์๋์ ์ผ๋ก ์ฌ์ด ์๋ฌ ๋ช ๊ฐ๋ง ๋ฐ์ํด์, ์ฌ๋ฌ๋ถ์ ์ฝ๊ฒ Win32์ x64์ ๋์ํ๋ ์ฝ๋๋ฅผ ๊ฐ์ง๊ฒ ๋ ๊ฒ ์ ๋๋ค. ํน๋ณํ ์กฐ๊ฑด๋ถ ์ปดํ์ผ ๊ฐ์ ๊ฒ์ ์ด์ฉํ์ง ์์๋ ๋ง์ด์ฃ .
๊ทธ๋ฆผ 8 ๋น๋ ํ๋ซํผ์ ์ ํ
Win64 ํธํ๋๋ ์ฝ๋ ๋ง๋ค๊ธฐ
์๋ง๋, Win32 ์ฝ๋์์ x64๋ก ์ปจ๋ฒํ ํ ๋ ๊ฐ์ฅ ๋ฌธ์ ๊ฐ ๋๋ ๋ถ๋ถ์, ํ์ ์ ์๋ฅผ ๋ณ๊ฒฝํ๋ ์ผ์ด ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ ๊ฐ ํน์ ์์์ Win64์ ์๋ฃํ์ ๋ํด์ ์ด์ผ๊ธฐ ํ๋ ๊ฒ์ ๋ํด์ ๊ธฐ์ตํ์๋์? C++ ์ปดํ์ผ๋ฌ์ ์๋ ์๋ฃํ (int, long ๊ธฐํ ๋ฑ๋ฑ) ์ ์ฐ๋ ๊ฒ ๋ณด๋ค, ์๋์ฐ์์ ์ ์ํ typedef๋ก ์ ์๋ ์๋ฃํ์ ์ฐ๋ ํธ์ด ๊นจ๋ํ Win32 x64 ์ฝ๋๋ฅผ ์์ฑํ๋๋ฐ ์ฝ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ Win32์ ์๋ฃํ์ ์ฐ์ค ๋, ์ผ๊ด์ฑ์๊ฒ ์ฐ์ ์ผ ํ ํ์๊ฐ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด์, ์๋์ฐ๊ฐ HWND์ ๋๊ฒจ์ค ๋, ๋จ์ง ํธํ๊ณ ์ฝ๋ค๊ณ ํด์, FARPROC ํ์์ ๋ณ์์ ์ด ๊ฐ์ ์ ์ฅํ์ง ๋ง์ญ์์.
๋ง์ ์ฝ๋๋ฅผ ์ ๊ทธ๋ ์ด๋ ํ๋ฉด์, ์๋ง๋ ์ ๊ฐ ํํ ๊ทธ๋ฆฌ๊ณ ์ฝ๊ฒ ๋ณด๋ ์๋ฌ๋, ํฌ์ธํฐ ๊ฐ์ด 32๋นํธ ๋ฐ์ดํ ํ์ ์ธ int ํน์ long, ๊ทธ๋ฆฌ๊ณ DWORD์ ์ ์ฅ๋์ด ์๋ ๊ฒ ์ด์์ต๋๋ค. Win32์ Win64์์์ ํฌ์ธํฐ๋ ์ฌ์ด์ฆ๋ ํ๋ฆฌ์ง๋ง, ์ ์ํ์ ๋์ผํ ํฌ๊ธฐ๋ฅผ ์ ์งํฉ๋๋ค. ๊ทธ๋ฌ๋, ์ปดํ์ผ๋ฌ์๊ฒ ํฌ์ธํฐ ๊ฐ์ ์ ์ํ์ ์ ์ฅํ๋ ๊ฒ์ ๊ธ์งํ๋ ๊ฒ ์ญ์ ๊ฐ๋ฅํ์ง ์์ต๋๋ค.
์ด๋ฐ ์ํฉ์ ํด๊ฒฐํ๊ธฐ ์ํด์, ์๋์ฐ ํค๋์๋ _PTR ํ์ ์ด ์ ์ธ๋์ด ์์ต๋๋ค. ์๋ฅผ ๋ค๋ฉด, DWORD_PTR, INT_PTR, ๊ทธ๋ฆฌ๊ณ LONG_PTR ๊ฐ์ ํ์ ๋ค์ด ๋์ ํ๋ซํผ์ ๋ฐ๋ผ์, ์์ ํ๊ฒ ํฌ์ธํฐ ๋ณ์๋ฅผ ์ด์ฉํ๊ฒ ํด์ค๋๋ค. ์๋ฅผ ๋ค์ด์, DWORD_PTRํ์ ์ Win32์์ ์ปดํ์ผ ๋์์ ๋๋, 32๋นํธ์ง๋ง, Win64์์๋ 64๋นํธ์ ๋๋ค. ์ ์ ๊ฒฝ์ฐ๋, ๊ทธ๋์์ ์ฐ์ต์ผ๋ก, ์ด๋ค ์๋ฃํ์ ์ ์ธํ ๋, "๋ด๊ฐ ์ฌ๊ธฐ์ DWORD๋ฅผ ์ ์ธํด์ผ ํ ๊น? ์๋๋ฉด DWORD_PTR๋ฅผ ์ ์ธํด์ผ ํ ๊น?"๋ผ๊ณ ๋ฌผ์ด๋ณด๋ ๊ฒ์ด ๋ฒ๋ฆ์ด ๋์ด ๋ฒ๋ ธ๋ต๋๋ค.
๊ธฐ๋ํ์๋ ๋๋ก, ์ ์ํ์์ ์ผ๋ง๋ ๋ง์ ๋ฐ์ดํธ๋ฅผ ์ํ๋์ง ๊ณ์ฐํ๋๋ฐ, ์ฝ๊ฐ์ ๋ฌธ์ ๊ฐ ์์ ์ ์์ต๋๋ค. DWORD_PTR๋ฅผ ์ ์ํ๋ ํค๋ํ์ผ(basetsd.h)์์ ์ญ์ INT32, INT64, INT16, UINT32, DWORD64 ๊ฐ์ ์ฌ๋ฌ ํํ์ ์ ์๋ฅผ ์ ์ธํด ๋๊ณ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์๋ฃํ์ ํฌ๊ธฐ์ ๊ด๋ จ๋ ๋ ๋ค๋ฅธ ๋ฌธ์ ๋ printf์ sprintf์ ํฌ๋งทํ (formatting)์ ๋๋ค. ์ ๋ ํ์คํ ๊ณผ๊ฑฐ์ %X ํน์ %08X๋ฑ์ ํฌ์ธํฐ ๊ฐ์ ๋ํ๋ด๋๋ฐ ์ฌ์ฉํ๋ค๋ ์ ์์ ์ฝ๊ฐ์ ์ฃ์ฑ ๊ฐ(?)์ ๋๋ผ๊ณ ์๊ณ , ๊ทธ ์ฝ๋๋ x64 ์์คํ ์์ ๋ฌธ์ ๋ฅผ ์ผ์ผํค๊ณ ์์ต๋๋ค. ์ณ์ ๋ฐฉ์์ ๋์ ํ๋ซํผ์ ํฌ์ธํฐ์ ํฌ๊ธฐ๋ฅผ ์๋์ผ๋ก ๊ณ์ฐํด ์ฃผ๋ %p๋ฅผ ์ฌ์ฉํ๋ ๊ฒ ์ ๋๋ค. ์ถ๊ฐ๋ก, printf์ sprintf๋ ์ฌ์ด์ฆ์ ์์กดํ์ง ์๋ ํ์ ์ธ 'I' ํ๋ฆฌํฝ์ค(prefix)๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด์, ์ฌ๋ฌ๋ถ์ %Iu๋ฅผ UINT_PTR ๋ณ์๋ฅผ ์ถ๋ ฅํ๊ธฐ ์ํด์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด์ ๋์ผํ ๋ฐฉ์์ผ๋ก, ์ฌ๋ฌ๋ถ์ด ํน์ ๋ณ์๊ฐ ์ธ์ 64๋นํธ ๋ถํธ ์๋ ๊ฐ์ด ๋ ๊ฒ์ด๋ผ๋ ์๊ณ ์๋ค๋ฉด, %I64d๋ฅผ ์ฐ์ค ์ ์์ต๋๋ค.
์๋ฃํ์ ๋ถ์ผ์น์์ ์ผ์ด๋ ์๋ฌ๋ค์ ์ ๋ฆฌํ๋ ๊ฒ๋ง์ผ๋ก๋ Win64๊ฐ ์ค๋น๋์๋ค๊ณ ๋งํ ์ ์์ต๋๋ค. ์ฌ๋ฌ๋ถ์ ์์ง์ ์๋ง๋ x86์์๋ง ๋์๊ฐ ์ ์๋ ์์ค์ฝ๋๋ฅผ ๊ฐ์ง๊ณ ๊ณ์ค๊ฒ๋๋ค. Win64๋ก์ ํฌํ ์ ์ํด์, ํน์ ์ฝ๋์์๋ ์ฌ๋ฌ๋ถ์ด Win32์ x64๋ฅผ ์ํ ๋ ๊ฐ์ง ๋ฒ์ ผ์ ํจ์๋ฅผ ์ฐ์ค ์๋ ์์ต๋๋ค. ์ด ๋์ผ๋ง๋ก, ์ ์ฒ๋ฆฌ์(preprocessor)๊ฐ ์์ฃผ ์ ์ฉํ๊ฒ ์ฐ์ ๋๋ค:
_M_IX86์ ์ ํ ์ ์ฒ๋ฆฌ์์ ์ฌ์ฉ์ด์ผ ๋ง๋ก, ์ฌ๋ฌ ํ๋ซํผ์์ ๋์ํ๋ ์ํํธ์จ์ด๋ฅผ ๋ง๋ค๊ธฐ ์ํด์๋ ํ์์ ์ ๋๋ค. _M_IX86๊ณผ _M_AMD64๋ ํน์ ํ๋ก์ธ์๋ฅผ ์ํด์ ์ปดํ์ผํ ๋๋ฅผ ์ํด์ ์ ์๋์ด ์์ต๋๋ค.
_M_AMD64
_WIN64
์ ์ฒ๋ฆฌ์ ๋งคํฌ๋ก๋ฅผ ์ฌ์ฉํ ๋, ๋ญ ์ํ๋์ง ํ ๋ฒ ์ด์ฌํ ์๊ฐํด ๋ณด์๊ธฐ ๋ฐ๋๋๋ค. ์๋ฅผ ๋ค์ด์, ์ด ์ฝ๋๊ฐ ์ ๋ง๋ก x64 ํ๋ก์ธ์๋ง์ ์ํ ๊ฒ์ด๋ผ๋ฉด, ์๋์ ๊ฐ์ด ๋งคํฌ๋ก๋ฅผ ์ฐ์๊ธฐ ๋ฐ๋๋๋ค:
#ifdef _M_AMD64๋ฐ๋ฉด์, ๋์ผํ ์ฝ๋๊ฐ x64์ ์์ดํ ๋์(Itanium)์์ ๋์ํ๊ธฐ๋ฅผ ์ํ๋ค๋ฉด, ์ฌ๋ฌ๋ถ์ ์๋์ ๊ฐ์ด ์ฐ์๋๊ฒ ์ข์ ๊ฒ ๊ฐ์ต๋๋ค:
#ifdef _WIN64
์ด๋ฌํ ๋งคํฌ๋ก๋ฅผ ์ธ ๋ ์ ๊ฐ ์ ์ฉํ๊ฒ ์ฐ๋ ๋ฒ๋ฆ์ด ํ๋ ์์ต๋๋ค. ๋ฐ๋ก ์ ๊ฐ ๋ฌด์์ ์์ด ๋ฒ๋ ธ์ ๋๋ฅผ ๋๋นํด์, ๋ช ์์ ์ผ๋ก ๋ชจ๋ ๊ฒฝ์ฐ์ ๋ํด์ #else ์ผ์ด์ค๋ฌธ์ ์จ์ฃผ๋ ๊ฒ์ ๋๋ค. ์๋์ ์ฝ๋๋ฅผ ํ ๋ฒ ์ดํด๋ด ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค:
#ifdef _M_AMD64๋ ๋ค๋ฅธ ์ธ๋ฒ์งธ CPU๊ฐ ๋ํ๋๋ฉด? ์ ์ x86 ์ฝ๋๊ฐ ์ ์ ์๋์๋ ๋ค๋ฅด๊ฒ ์ปดํ์ผ ๋ฉ๋๋ค. ์์ ์ฝ๋๋ฅผ ๋ ์ข์ ๋ฐฉ๋ฒ์ผ๋ก ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ์ต๋๋ค:
// My x64 code here
#else
// My x86 code here
#endif
#ifdef _M_AMD64
// My x64 code here
#elif defined (_M_IX86)
// My x86 code here
#else
#error !!! Need to write code for this architecture
#endif
๊ทธ๋ฆฌ๊ณ , ๋ง์ง๋ง์ผ๋ก ์ ์ ๊ฒฝ์ฐ๋ Win32์ฝ๋ ์ค์์ x64๋ก ์ฝ๊ฒ ํฌํ ๋์ง ์๋ ๋ถ๋ถ ์ค์ ํ๋๋ ์ธ๋ผ์ธ ์ด์ ๋ธ๋ฌ ๋ถ๋ถ์ด์์ต๋๋ค. Visual C++๊ฐ x64 ๋ฅผ ์ํ ์ธ๋ผ์ธ ์ด์ ๋ธ๋ฌ๋ฅผ ์ง์ํ์ง ์๊ฑฐ๋ ์. ๋์ ์ 64๋นํธ MASM์ด ์ ๊ณต๋๊ณ , MSDN์ ๋ฌธ์ํ๊ฐ ๋์ด ์์ต๋๋ค. ML64.exe์ ๋ค๋ฅธ x64ํด๋ค์ (CL.EXE์ LINK.EXE๋ฅผ ํฌํจํด์) ์ปค๋ฉ๋๋ผ์ธ์์๋ ์ธ ์ ์์ต๋๋ค. ๋จ์ง VCVARS64.BAT๋ฅผ ์คํ์ํค์ธ์. ๊ทธ๋ฌ๋ฉด, ์ฌ๋ฌ๋ถ์ ํจ์ค์ ์ด ํ์ผ๋ค์ ๊ฒฝ๋ก๋ฅผ ํฌํจํด ์ค ๊ฒ ์ ๋๋ค.
๋๋ฒ๊น
์ฌ๋ฌ๋ถ์ ๋ง์นจ๋ด, ์ฌ๋ฌ๋ถ์ ์ฝ๋๋ฅผ Win32์ x64 ์์ชฝ์์ ๊นจ๋ํ๊ฒ ์ปดํ์ผ ํ ์ ์๊ฒ ๋์์ต๋๋ค. ์ด ๋์ฅ์ ์ ๋ง์ง๋ง์ "์ด๋ป๊ฒ ๋๋ฒ๊น ์ ํ๋๋?" ์ ๋๋ค. ์ฌ๋ฌ๋ถ์ด x64 ์์ x64 ๋ฒ์ ผ์ ๋น๋ ํ๋์ง์ ์ฌ๋ถ์ ์๊ด์์ด, ์ฌ๋ฌ๋ถ์ x64 ๋ชจ๋์์ ๋๋ฒ๊น ํ๊ธฐ ์ํด์๋, Visual Studio์ ๋ฆฌ๋ชจํธ ๋๋ฒ๊น ๊ธฐ๋ฅ์ด ํ์ํฉ๋๋ค. ์ด์ข๊ฒ๋, ์ฌ๋ฌ๋ถ์ด 64๋นํธ ์ปดํจํฐ์์ Visual Studio๋ฅผ ๋์์ํค๋ฉด, IDE๊ฐ ๋ด๋ถ์ ์ผ๋ก ์ด ๋จ๊ณ๋ฅผ ์ฌ๋ฌ๋ถ์ ์ํด์ ํด์ค๋๋ค. ์ด๋ค ์ด์ ๋ก, ๋ฆฌ๋ชจํธ ๋๋ฒ๊น ์ ํ ์ ์์ ๋, ์ฌ๋ฌ๋ถ์ ๋ ๋ค๋ฅธ ์ต์ ์ x64์ฉ WinDbg (์๋ฌธ)๋ฅผ ์ฌ์ฉํ์๋ ๋ฐฉ๋ฒ๋ ์์ต๋๋ค. ๊ทธ๋ฌ๋, ๊ทธ๋ ๊ฒ ๋๋ฉด, Visual Studio ๋๋ฒ๊ทธ์ ๋ง์ ํ๋ฅญํ ๊ธฐ๋ฅ๋ค์ ํฌ๊ธฐํ์ ์ผ ํฉ๋๋ค.
์ฌ๋ฌ๋ถ์ด ๋ฆฌ๋ชจํธ ๋๋ฒ๊น ์ ํ ๋ฒ๋ ํด๋ณด์ ์ ์ด ์๋ค๊ณ ํ๋๋ผ๋, ๊ฑฑ์ ํ์ค ํ์ ์์ต๋๋ค. ํ ๋ฒ๋ง ์ค์น ๋๋ฉด, ๋ฆฌ๋ชจํธ ๋๋ฒ๊น ๋ ๋ก์ปฌ์ฒ๋ผ ์ผ์์ด ์ ๋์ํฉ๋๋ค.
์ฒซ ๋ฒ์งธ ๋จ๊ณ๋ 64๋นํธ MSVSMON์ ๋์ ์ปดํจํฐ์ ์ค์นํ๋ ๊ฒ ์ ๋๋ค. ์ด๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก VisualStudio์ ๊ฐ์ด ์ค๋ RdbgSetup์ ๋์์ํค๋ฉด, ์์์ ํด ์ค๋๋ค. ์ผ๋จ MSVSMON์ด ์ค์น๋๋ฉด, Tools ๋ฉ๋ด์์ ์ ์ ํ ๋ณด์ ์ค์ (ํน์ lack)๋ฑ์ ์ค์ ํ ์ ์์ต๋๋ค.
๋ค์์๋, Visual Studio ์์์, ์ฌ๋ฌ๋ถ์ด x64์ฝ๋๋ฅผ ์ํด์ ๋ฆฌ๋ชจํธ ๋๋ฒ๊น ์ ์ํ ์ค์ ์ ํ์ ์ผ ํฉ๋๋ค. ์ด๊ฒ์ ํ๋ก์ ํธ์ ํ๋กํผํฐ( ๊ทธ๋ฆผ 9 )์์ ํ ์ ์์ต๋๋ค.
๊ทธ๋ฆผ 9 ๋๋ฒ๊ทธ ์์ฑ
์ฌ๋ฌ๋ถ์ 64๋นํธ ๊ตฌ์ฑ์ ์ ํํด์, Configuration ํ๋กํผํฐ ์๋์ ์๋ Debugging์ ์ ํํ์๊ธฐ ๋ฐ๋๋๋ค. ์์ชฝ์ Debugger to launch๋ผ๊ณ ๋์ด ์๋ ๋ถ๋ถ์ด ์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ด ๋ถ๋ถ์ด Local Windows Debugger๋ก ์ค์ ๋์ด ์์ต๋๋ค. ์ด ์ค์ ์ Remote Windows Debugger๋ก ๋ณ๊ฒฝํ์๊ธฐ ๋ฐ๋๋๋ค. ๊ทธ ์๋์์, ์ฌ๋ฌ๋ถ์ด ๋๋ฒ๊น ์ ์์ํ ๋์ ๋ฆฌ๋ชจํธ ๋ช ๋ น(์๋ฅผ ๋ค์ด์, ํ๋ก๊ทธ๋จ ์ด๋ฆ)๊ณผ ๋ฆฌ๋ชจํธ ์์คํ ์ ์ด๋ฆ๊ณผ ์ฐ๊ฒฐ ์์ฑ์ ์ ํํด ์ค ์ ์์ต๋๋ค.
๋ชจ๋ ๊ฒ์ด ๋ค ์ ๋๋ก ์ค์ ๋์๋ค๋ฉด, ์ฌ๋ฌ๋ถ์ x64 ์ดํ๋ฆฌ์ผ์ด์ ์ ์ฌ๋ฌ๋ถ์ด Win32 ํ๋ก๊ทธ๋จ์์ ํ๋ฏ์ด ๋๋ฒ๊น ํ ์ ์์ต๋๋ค. ์ฌ๋ฌ๋ถ์ MSVSMON์ด ๋งค ๋ฒ ์ฑ๊ณต์ ์ผ๋ก ๋๋ฒ๊ทธ์ ์ฐ๊ฒฐ์ด ๋ ๋, "connected"๋ผ๋ ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ด ์ฃผ๊ธฐ ๋๋ฌธ์, ์ฐ๊ฒฐ์ด ๋์๋์ง์ ์ฌ๋ถ๋ฅผ ํ๋ณํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์ ๋ถํฐ๋, ์ฌ๋ฌ๋ถ์ด ์๊ณ ์๊ณ , ์ฌ๋ํ๋ Visual Studio ๋๋ฒ๊ฑฐ์ ๊ฑฐ์ ๋ชจ๋ ๊ฒ์ด ๋์ผํฉ๋๋ค. 64๋นํธ ๋ ์ง์คํฐ๋ฅผ ๋ณด๊ธฐ ์ํด์, ๊ทธ๋ฆฌ๊ณ ๋น์ทํ์ง๋ง ์กฐ๊ธ ๋ค๋ฅธ x64 ์ด์ ๋ธ๋ฆฌ ์ฝ๋๋ฅผ ๋ณด๊ธฐ ์ํด์ ๋ ์ง์คํฐ ์ฐฝ๊ณผ ๋์ค์ด์ ๋ธ๋ฌ ์ฐฝ์ ๋์ฐ๋ ๊ฒ์ ์์ง ๋ง์ธ์.
์ฃผ์: 64๋นํธ ๋ฏธ๋๋คํ๋ 32๋นํธ ๋คํ์ฒ๋ผ Visual Studio์์ ์ง์ ๋ถ๋ฌ ์ฌ ์ ์์ต๋๋ค. ๋์ , ์ฌ๋ฌ๋ถ์ ๋ฆฌ๋ชจํธ ๋๋ฒ๊น ์ ์ด์ฉํด์ผ ํฉ๋๋ค. ๋ค์ดํฐ๋ธ(native)์ ๋งค๋์ง๋(managed) 64๋นํธ ์ฝ๋์ ์ํธํธํ์ ํ์ฌ๋ก์ Visual Studio 2005์์ ์ง์๋์ง ์์ต๋๋ค.
๋งค๋์ง๋ ์ฝ๋๋ ์ด๋ป๊ฒ ํ๋์?
๋ง์ดํฌ๋ก ์ํํธ .NET ํ๋ ์ ์์์ ์ฝ๋ฉ ํ๋ ๊ฒ์ ์ฅ์ ์ค์ ํ๋๋, ๊น๋ ค์๋ ์ด์์ ์ ์ ๋ง์ ๋ถ๋ถ์ด ์ผ๋ฐ์ ์ธ ๋ชฉ์ ์ผ๋ก ์ฝ๋๋ก ์ถ์ํ ๋์ด ์ฌ๋ผ์ ธ ๋ฒ๋ ธ๋ค๋ ์ ์ ๋๋ค. ์ถ๊ฐ๋ก IL ๋ช ๋ น์ด ํฌ๋งท์ CPU์ ์์กด์ ์ด์ง ์์ต๋๋ค. ๊ทธ๋์, ์ด๋ก ์ ์ผ๋ก๋, Win32์์ ์ ์๋ .NET์ ๊ธฐ๋ฐ์ ๋ ๋ฐ์ด๋๋ฆฌ ํ์ผ์ x64์์คํ ์์ ์์ ํ์ง ์๊ณ ๋์ํด์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋, ํ์ค์ ์์ฃผ ๋ณต์กํฉ๋๋ค.
x64๋ฒ์ ผ์ .NET ํ๋ ์์ 2.0์ ์ x64์์คํ ์ ์ค์นํ ๋ค์, ์ ๋ ์ ๊ฐ Win32์์ ์คํํ๋ ๋๊ฐ์.NET ์คํํ์ผ์ ๋์์ํฌ ์ ์์์ต๋๋ค. ์ ๋ง ์ข์ง์? ๋ฌผ๋ก , ๋ชจ๋ .NET์ ๊ธฐ๋ฐ์ ๋ ํ๋ก๊ทธ๋จ์ด Win32์ x64์์ ์ปดํ์ผ ํ์ง ์๊ณ , ๋์ผํ๊ฒ ๋์ ํ๋ค๋ ๋ณด์ฅ์ ์์ต๋๋ค๋ง, ๋ค๋ง ํฉ๋ฆฌ์ ์ธ ๋ฒ์์ ์๊ฐ ์์ ๊ทธ๋ฅ ๋์ํฉ๋๋ค.
๋ง์ฝ ์ฌ๋ฌ๋ถ์ ์ฝ๋๊ฐ ๋ช ์์ ์ผ๋ก native code๋ฅผ ํธ์ถํ๋ค๋ฉด (์๋ฅผ ๋ค์ด์, C# ํน์ Visual Basic ์์์ P/Invoke) 64๋นํธ CLR์์ ์คํ ์์ ๋ฌธ์ ์ ๋ถ๋ซํ ํ๋ฅ ์ด ์ปค์ง๋๋ค. ๊ทธ๋ฌ๋, ๋คํ์ค๋ฝ๊ฒ๋ ์ปดํ์ผ๋ฌ ์ค์์น์ ์ฌ๋ฌ๋ถ์ ์ฝ๋๊ฐ ์ด๋ค ํ๋ซํผ์์ ๋์ํ ์ง๋ฅผ ๋ช ์ํ๋ ๋ถ๋ถ์ด ์์ต๋๋ค. ์๋ฅผ ๋ค์ด์, ์ฌ๋ฌ๋ถ์ 64๋นํธ CLR์ด ์กด์ฌํจ์๋ ๋ถ๊ตฌํ๊ณ , ์ฌ๋ฌ๋ถ์ ์ฝ๋๊ฐ WOW64์์ ๋์ํ๊ธฐ๋ฅผ ์ํ๋ค๊ณ ๋ช ์ํ ์๋ ์์ต๋๋ค.
์ต์ข ์ ๋ฆฌ
๋ชจ๋ ๊ฒ์ ๊ณ ๋ คํด ๋ณด์๋, x64 ๋ฒ์ ผ์ ์๋์ฐ๋ก ์ด๋ํ๋ ๊ฒ์, ๋น๊ต์ ์ ์๊ฒ๋ ์ด๋ ต์ง ์์ ๊ณผ์ ์ด์์ต๋๋ค. ์ผ๋จ, ์ฌ๋ฌ๋ถ์ด ์ด์์ฒด์ ๊ตฌ์กฐ์ ํด์ ์๋์ ์ผ๋ก ๋ฏธ๋ฏธํ ์ฐจ์ด์ ์ ํ ๋ฒ ํ์ด ๋ณด๊ธฐ๋ง ํ๋ฉด, ํ๋์ ์ฝ๋๋ฅผ ๋ฐํ์ผ๋ก ํด์ ๋ ๊ฐ์ ํ๋ซํผ์์ ๋์ํ๋ ๊ฒ์ด ์ด๋ ต์ง ์์ต๋๋ค. Visual Studio 2005๊ฐ ์ด ๋ ธ๋ ฅ์ ๊ณผ์ ์ ํจ์ฌ ์ฝ๊ฒ ๋ง๋ค์ด ์ฃผ๊ณ ์๊ณ , x64์ ํนํ๋ ๋๋ฐ์ด์ค ๋๋ผ์ด๋ฒ๋ ํด, ์๋ฅผ ๋ค๋ฉด Sysinternals.com์ Process Explorer์ ๋งค์ผ ์๋กญ๊ฒ ๋ํ๋๊ณ ์์ต๋๋ค, ๊ทธ๋ฌ๋ ์ด ์ชฝ์ผ๋ก ๋ฐ์ด ๋ค์ง ์์ ์ด์ ๊ฐ ์์ต๋๋ค!