- 64비트 CPU

-> IA-64 : Intel과 HP에서 제작한 64비트 CPU(간접적인 x86하위호환)

-> x64 : AMD64와 Intel64 통합하여 말함



- 64비트 OS

-> 32비트 MS Windows : ILP32 데이터 모델 (Int,Long,Pointer 32비트)

-> 64비트 MS Windows : LLP64 데이터 모델 (LongLong, Pointer 64비트)

-> 64비트 UNIX : LP64 데이터 모델 (Long, Pointer 64비트)



- WOW64(Windows On Windows 64)

-> 기존 32비트 응용 프로그램을 64비트 OS에서 실행시켜주는 메커니즘

-> 32비트 응용프로그램을 kernel32.dll과 ntdll.dll(32비트)를 로딩하는데 중간에서 'WOW64'가 ntdll.dll(32비트)의 요청(API 호출)을 ntdll.dll(64비트)로 리다이렉션 해준다.



- 폴더구조 

-> System32 : 64비트 환경에서도 'System32' 라는 이름을 가진다. 32비트 하위 호환을 위하여 'SysWow64' 폴더를 제공한다.

-> System32 : 64비트 시스템 설정파일

-> System64 : 32비트 시스템 설정파일


-> 32비트 프로그램에서 GetSystemDirectory()를 호출하면 폴더이름은 'System32'가 리턴되고 폴더 내용은 'SysWOW64'와 같다. WOW64가 중간에서 API 호출을 가로채서 조작한 결과이다. (이러한 방법때문에 32비트 프로그램이 문제 없이 잘 동작 할 수 있다.)



- 레지스트리

-> 만약 32비트 프로세스에서 HKLM\SOFTWARE 아래의 키를 요청하면 'WOW64'가 32비트 용 HKLM\SOFTWARE\Wow6423Node 키로 리다이렉션 해버린다.



-범용 레지스터

-> x64에서 범용레지스털의 크기는 64비트로 확장 개수도 18개로 늘어남.



- CALL/JMP Instruction

-> FF15 XXXXXXXX -> XXXXXXXX 주소는 IAT 영역의 한 곳을 가르키는 '절대주소(VA)' 이다.

-> x64에서는 XXXXXXXX가 절대주소가 아니라 상대주소로 해석된다.

-> 절대주소로 계산법 Address + 상대주소 + 현재명령어의 길이(6)


- 함수 호출 규약

-> 32비트의 함수 호출 규약에는 cdecl, stdcall, fastcall 등이 있지만 64비트에선느 '변형된 fastcall' 하나로 통일

-> 함수파라미터 4개까지 레지스터에 저장하여 전달하는 것이 특징

-> 5번째부터는 스택에 저장시켜 전달

-> 함수가 리턴할때 스택정리는 Caller에서 정리

-> 첫4개의 파라미터에 대한 공간을 예약해 놓는다


(1st 파라미터 -> RCX(정수), XMM0(실수) )

(2nd 파라미터 -> RDX(정수), XMM1(실수) )

(3rd 파라미터 -> R8(정수), XMM2(실수) )

(4th 파라미터 -> R9(정수), XMM3(실수) )



- PE 32+(PE+, PE64)

-> IMAGE_NT_HEADERS 구조체

-> PE32+ : IMAGE_NT_HEADERS64 구조체 사용

-> PE32 : IMAGE_NT_HEADERS32 구조체 사용

-> 3번째 멤머가 IMAGE_OPTIONAL_HEADER32와 64이다.



- IMAGE_FILE_HEADER 구조체

-> Machine 값이 변경 (PE32: 014C, x64용 PE32+: 8664, IA-64용 PE+: 0200)



- IMAGE_OPTIONAL_HEADER 구조체 (가장 많이 바뀜)

-> Magic : (PE32: 010B, PE32+:020B) PE로더는 이 값을 확인하여 IMAGE_OPTIONAL_HAEDER 구조체가 32비트 64비트 인지 확인한다

-> BaseOfData 제거됨

-> ImageBase 자료형이 ULONGLONG(8바이트로)로 변경 -> 프로세스의 가상 메모리에 대응하기 위함



- 스택&힙

-> 자료형이 ULONGLONG(8바이트)로 변경



- IMAGE_THUNK_DATA 구조체 

-> IMAGE_IMPORT_DESCRIPTOR 구조체의 OriginalFirstThunk(INT)와 FirstThunk(IAT) 멤버의 값

-> IMAGE_THUNK_DATA 구조체 리스트

-> 8바이트로 변경


- IMAGE_TLS_DIRECTORY 구조체

-> StartAddressOfRawData, EndAddressOfRawData, AddressOfIndex, AddressOfCallBack 8바이트로 변경










+ Recent posts