- 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바이트로 변경
'Reversing(리버싱 핵심 원리) > 개념' 카테고리의 다른 글
C언어 #Pragma commnet, #Pragma data_seg 란 (0) | 2018.09.04 |
---|---|
EP(Entry Point)란 (0) | 2018.09.04 |
스텔스 프로세스 // 프로세스 숨기기 // 프로세스 은폐 (0) | 2018.07.29 |
IMAGE_THUNK_DATA 구조체 (IAT 구조체) (0) | 2018.07.26 |
HMODULE 과 HINSTANCE 차이점 (0) | 2018.07.20 |