Reverse Engeenering

IDA Pro에서의 KUSER_SHARED_DATA 구조체 매핑

7un4 2024. 4. 5. 01:56

문제 발생

악성코드를 분석하던 중, KUSER_SHARED_DATA.NtBuildNumber를 참조하여 동작 환경의 빌드 넘버를 비교해 분기를 진행하는 루틴에 대한 분석 시, IDA Pro에서 해당 구조체의 멤버를 해석하지 못해 MEMORY[0x7FFE0260]과 같이 표현되는 경우가 발생하였다.

KUSER_SHARED_DATA.NtBuildNumber 해석 실패
메모리 내 KUSER_SHARED_DATA 영역


KUSER_SHARED_DATA 구조체 매핑 진행

1. Type Libaray 로드

Views → Open subviews → Type Libraries(Shift + F11)에서 우클릭 후, Load type library...(Ins)클릭

Views → Open subviews → Type Libraries (Shift + F11) → Load type library...(Ins)

ntddk 검색 후, 동작 환경에 맞게 선택

Available Type Libraries - ntddk 검색
추가된 Type Library

2. 구조체 생성

Views → Open subviews → Structres(Shift + F9)에서 우클릭 후, Add struct type...(Ins)클릭

Views → Open subviews → Structres(Shift + F9) → Add struct type...(Ins)

Struct nameKUSER_SHARED_DATA 입력 진행

Create structure/union - KUSER_SHARED_DATA 입력
추가된 구조체

3. 세그먼트 생성 및 수정

3-1. KUSER_SHARED_DATA 세그먼트 생성

Edit - Segments - Create segment... 클릭 후, Create a new segment에서 아래와 같이 KUSER_SHARED_DATA 영역에 대한 정보 입력 진행

Edit → Segments → Create segment...
Create a new segment - KUSER_SHARED_DATA 정보 입력

3-2. KUSER_SHARED_DATA 세그먼트 수정

생성한 KUSER_SHARED_DATA 세그먼트의 시작 주소인 0x7FFE0000으로 이동 후, Edit → Struct var...(Alt + Q) 클릭

Edit → Struct var...(Alt + Q)

Choose a structure type에서 KUSER_SHARED_DATA 클릭

Choose a structure type - KUSER_SHARED_DATA

4. 디컴파일 진행 및 변수명 수정

View → Open subviews → Generate pseudocode(F5)를 통해 수도코도를 재생성하면 다음과 같이 구조체로 인식이 되었지만, 이름 설정이 되지 않았음을 알 수 있다. 따라서 Rename global item...(N)을 통해 이름 변경을 해주면 된다.

다만, 이미 세그먼트의 이름을 KUSER_SHARED_DATA으로 생성했기에, 중복된 이름으로 설정이 불가능하여 언더바를 추가하였다.

구조체로 인식이 되었지만, 이름 설정이 되지 않은 상태
Rename address - _KUSER_SHARED_DATA

5. 매핑 완료

최종적으로 매핑이 완료된 KUSER_SHARED_DATA


참고 자료

https://reverseengineering.stackexchange.com/questions/26157/how-to-show-kuser-shared-data-members-in-decompiled-c-code