xrefs to (단축키 x)
gethostbyname 함수의 경우 18개의 함수들이 호출하고 있고, Type은 P는(호출), r(읽기) 를 알 수 있다. Direction (Up/Down)은 호출 방향이다.

Type | o - offset, the address of the item is taken r - read access w - write access t - textual referenced (used for manually specified operands) i - informational (e.g. a derived class refers to its base class) J - far (intersegment) jump j - near (intrasegment) jump P - far (intersegment) call p - near (intrasegment) call ^ - ordinary flow s - xref from a structure m - xref from a structure member k - xref from a stack variable |
Address | For 'xrefs to' dialogs: where the reference comes from (source) For 'xrefs from' dialogs: where the reference goes to (destination) |
Text | Additional info about the cross reference |
지역변수 / 파라미터
이 함수의 지역 변수는 음의 오프셋에 대응하고, 파라미터는 양의 오프셋으로 참조한다.

인자값 / 매개변수
인자 값은 함수 호출 시 넣어주는 값을 말합니다 --> Func("argument");
매개변수는 전달된 인자를 받아들이는 값입니다 --> void Func(char* parameter)
Test eax, eax 이해
Test eax, eax는 조건분기 확인용으로 쓰인다. cmp eax, 0을 쓰는것보다 Test eax, eax가 더 빠르고 효율적이다.
이 코드는 사이즈, 사용자입력값, 비교문자열 3개의 인자를 받아서 memcmp 함수를 호출 Memcmp 두 비교 문자열이 같으면 0의 결과값을 eax로 반환 Test eax, eax 명령어 수행한다. 결과값이 0 반환이면 -> 문자열 같음 -> ZF=1 세팅 -> loc10052a2 동작하고, 결과값이 0 아니면 -> 문자열 다름 -> ZF=0 세팅 -> loc10010468 점프한다.
Xrefs From 그래프 활용
이 함수에서 send 와 GetSystemDefaultLangID 함수를 불러오므로 소켓을 통해 식별자를 전송하는 함수를 추측할 수 있고, 함수명을 Fun_SendSystemInfo 등으로 설정하면 추후 분석이 빠르게 될 수 있다.
최상단 함수에선 IDA View 상태 -> Graphs -> Users xrefs chart 에서 Depth를 1로 주면 보기 편하다.
실제 코드를 보기 전 Xrefs From 그래프를 먼저 보는 습관을 기르면 좋다.

함수 파라미터 설정
특정 함수 파라미터는 M 단축키(Symbolic Constant)를 이용하여 매개변수 명을 변경할 수 있다. Enum이 의미하는 것은 특정상수 값을 의미있는 이름을 그룹화한 것이다.

sub_
sub_ 로 시작하는 일반적인 함수는 리턴값이 eax에 저장된다. (일반적인 함수 반환 방식 stdcall, cdecl, fastcall)

printf 함수
문자열 뒤 \n 값을 통해 sub_40105F가 printf 함수라고 알 수 있다.

섹션 특징 확인
.text : CPU가 실행하는 명령어를 담고 있다. 일반적으로 실행 가능한 코드를 포함하는 유일한 섹션.
.data : 프로그램의 초기화된 전역 데이터를 저장하는데, 프로그램의 어디서든지 접근 가능함. 읽기/쓰기 가능
.rdata : 프로그램 내의 전역에서 접근 가능한 읽기 전용 데이터를 담고 있음.
.bss : 프로그램의 초기화 되지 않은 전역 변수들을 위한 섹션. 가상주소공간에 매핑될 경우 보통 .data 섹션에 병합됨.
.idata : 존재 시 임포트 함수 정보를 저장하고 있으며, 존재하지 않는다면 .rdata 섹션 내의 임포트 함수 정보에 저장
.edata : 존재 시 익스포트 함수 정보를 저장하고 있으며, 존재하지 않는다면 .rdata 섹션 내의 익스포트 함수 정보에 저장
.pdata : 64비트 실행 파일에만 존재하며, 예외 처리 정보를 저장
.rsrc : 실행 파일에 필요한 리소스를 저장
.reloc : 라이브러리 파일 재배치 정보
IDA 뷰 단축키
IDA 단축키를 보고 싶을때는 Ctrl + 1 로 Quick View를 보자.

IDA 주석 기록
- / : 명령어 줄 옆에
- Insert : 명령어 아래 줄에
User-Agent 값
for문 밑에 인터넷연결 (InternetOpenA) 함수의 user-agent 값을 통해 서버가 체크 할 수 있다. User-Agent 값의 경우 접속한 프로그램, 운영체제, 디바이스 종류 등을 구분 가능 한 값으로 식별하는 용도로 사용된다. 쉽게 변조가 가능하기 때문에 신뢰할 수 없는 데이터이다.
스트링 처리 함수 A / W 의미
API 뒤에 붙은 A 또는 W는 String을 다루는 API임을 알려줍니다. A는 ANSI를, W는 UNICODE를 의미한다.
COM 함수 호출
COM을 사용하는 각 스레드는 다른 COM 라이브러리 함수 호출 전에 적어도 한번은 OleInitialize나 CoInitializeEx 함수를 호출해야한다. COM은 Windows에서 "객체 기반 프로그래밍"을 지원하는 기술이다. 하나의 프로그램에서 만든 컴포넌트(객체)를 다른 프로그램에서도 사용할 수 있도록 해준다. Windows의 여러 기능 (OLE, ActiveX, DirectX, WMI, Shell Extensions 등)이 COM 기반으로 동작한다.
Export 목록이 비어있는 DLL
보통 DLL은 Export Table에 함수 목록을 가지고 있어서, 다른 프로그램이 임포트(import)할 수 있다. 하지만 Export가 비어 있다면, 다른 프로그램에서 이 DLL을 직접 사용할 수 없다. LoadLibrary를 사용하지 않는다면, 메모리 맵 파일(Memory-Mapped File) 기능을 이용해서 직접 로드할 수 있다.
- CreateFileMapping
- MapViewOfFile
LoadLibrary 없이 DLL 파일을 직접 메모리에 로드할 수 있으며, 일반적인 방식으로 DLL을 추적하기 어려워진다.
Function Calls
Function Calls 윈도우는 현재 분석중인 DLL의 DllMain 중심으로 대부분의 기능을 구현하고 있기 때문에 호출하는 함수만 요약하여 볼 수 있는 기능이다.
Hex-Rays Decompiler에서 사용되는 호출 규약
__usercall과 __userpurge는 Hex-Rays Decompiler에서 사용되는 호출 규약(Calling Convention)이다. 일반적인 프로그램 분석에서는 크게 신경 쓰지 않아도 될 수 있지만 Exploit 개발, 정확한 디컴파일 결과 분석, 수정된 바이너리에서 크래시 방지 작업을 할 때 중요하다.
- __usercall : 스택 정리 (Stack Cleanup): 호출자 (Caller)가 수행
- __userpurge : 스택 정리 (Stack Cleanup): 피호출자 (Callee)가 수행
MOV vs LEA
LEA는 "주소 계산기" 같은 역할을 한다. 단순히 주소를 계산하거나 빠른 수식을 만들 때 쓰는 거지, 메모리를 실제로 접근하려면 MOV를 사용해야 한다.
- MOV (Move): 메모리에서 값을 읽거나, 값을 직접 복사할 때 사용
- LEA (Load Effective Address): 주소 계산만 하고, 실제 메모리 접근 없이 결과를 레지스터에 저장
DllMain에서 fdwReason의 의미
DllMain은 DLL이 특정 이벤트를 만날 때 호출되는 엔트리 포인트 함수다. 이벤트는 fdwReason 값으로 구분되며, 이 값에 따라 DLL이 초기화 또는 정리 작업을 수행한다.
fdwReason 값 | 의미 |
DLL_PROCESS_ATTACH (1) | DLL이 프로세스에 로드될 때 호출됨 (한 번만 실행됨) |
DLL_PROCESS_DETACH (0) | DLL이 프로세스에서 언로드될 때 호출됨 |
DLL_THREAD_ATTACH (2) | 새 스레드가 생성될 때 호출됨 |
DLL_THREAD_DETACH (3) | 스레드가 종료될 때 호출됨 |
ESP(Stack Pointer) 위치 표시 & Auto Comments 옵션
IDA에서 옵션에서 ESP 스택포인터의 위치를 표시할 수 있어 함수 호출, 로컬 변수, 리턴 값 추적이 쉬우며, Auto comments를 통해 JMP, CALL, CMP 등 조건에서 쉽게 해석이 가능하다.
디컴파일된 코드에서 문자열이 제대로 안 보이는 경우
방법 1 : IDA 메뉴에서 옵션 해제 (일부 적용 안될수도)
- Edit → Plugins → Hex-Rays Decompiler → Options 이동
- "Use opaque pointer representations" 옵션을 해제
- OK를 누르고 다시 디컴파일 수행
방법 2 : hexrays.cfg 파일 수정 (더 강제적인 방법)
- IDA 설치 폴더\cfg\hexrays.cfg 파일을 열기
- 설정을 찾아서 수정 : HOUDINI = 0x831FF → HOUDINI = 0x831BF
- IDA를 재시작.
디버거와 IDA의 주소가 다르게 나오는 경우
디버거에서 확인한 메모리 주소와 IDA에서 분석하는 바이너리의 주소를 일치시킬 수 있다.
방법 : IDA에서 Manual Load 사용하기
- IDA에서 바이너리를 로드할 때, Load options 창에서 "Manual load" 옵션을 체크
- 바이너리 로드 후, Edit → Segments → Rebase program 선택
- 디버거에서 확인한 실제 Base Address (예: 0x400000)를 입력
- OK를 누르면 IDA에서 로드된 오프셋이 디버거에서 본 주소와 동일하게 조정됨

IDA에서 unicode 문자열로 변환
유니코드 문자열을 드래그 한 뒤, Alt + A 누르면 다음과 같은 창이 뜬다. Unicode C-style 을 클릭하면 다음 그림 처럼 잘 나온다.

IDA 헥스레이 literals String Print
IDA에서 스트링을 해석할때 아래와 같은형태로 기본적으로 보여준다.
해당 변수를 클릭하면 연결된 스트링 확인이 가능하다.
하지만 빠르게 분석을 위한 우리를 위해 아래 옵션을 꺼주면 정의된 스트링을 빠르게 확인할 수 있다.
IDA에서 Edit -> Plugins -> Hex-rays Decompiler -> Options -> Analysis options 1 -> 'Print only constant string literals' 체크 해제
해당 옵션을 체크해제 하면 빠르게 스트링을 확인 할 수 있다.
분석 시 문자열을 바로 확인하며, 빠른 분석이 가능하다.
'분석 TIP > 정적분석' 카테고리의 다른 글
Visual Basic 6.0 샘플 분석 (0) | 2025.04.18 |
---|---|
PDF Deflate JavaScript 분석 (0) | 2025.04.17 |
HWP OLE 파일 분석 (0) | 2025.04.16 |
HWP PS 파일 분석 (0) | 2025.04.15 |
IDA 파이썬 스크립트 (0) | 2025.04.04 |