분석 TIP/정적분석

동적API 구조체로 IDA 함수명 매핑하기

두유노우컴퓨터 2025. 4. 19. 10:40

조금 신경 쓴 악성코드들은 스택이든 메모리든 동적 API를 통해 직접적으로 보이지 않게 API를 사용하는 경우가 있다.

API 스택 저장

 

IDA에서 볼 경우 실제 API는 보이지 않고 아래 그림과 같은 형태로 존재하며, 결국 동적 API는 IDA에서도 해석을 하지 못한 상태이다. 

배열에 따라 API 호출

 

우선 스택에 있는 API들을 추출해보자.

복사

 

이런형태에서 우린 최종 API이름만 필요하기 때문에 각자 노트++이나 메모장으로 이름만 빼놓자.
주의할 점은 공백도 같이 추출해야한다는 점이고, 공백에는 임의의 함수이름을 적어주면 된다.

공백 유의

 

여기에 구조제를 만들기 위해 자료형을 선언해야 한다.

 

64비트의 경우 QWORD
32비트의 경우 DWORD

 

API뒤쪽에는 세미콜론 ; 넣어준다.

(노트패드++ 기준 Alt를 누르고 쭉 스크롤을 해주면 중간부터 모든 line을 한번에 수정할 수 있다)

자료형 선언

 

아래와 같은 구조로 위 아래를 감싸준다. 

struct apis{
...
중략
...
}


최종형태는 아래와 같다. (32비트 기준)

API 리스트 구조체

 

이제 이렇게 만든 것을 IDA에 적용만 해주면 된다.
 
IDA열고 Ctrl + 1을 눌러 Local types로 이동
우클릭 -> Insert 선택
 
앞서 생성한 구조체 붙혀넣고 OK 클릭

에러가 날 경우 구조체 문법에 문제이니 수정하자.

문법 오류

 

에러 메시지를 보니 dword 문제이다. dword -> _dword로 교체해보니 정상 적으로 들어간다.

(_dword는 IDA 내부적에서 사용하는 기본 타입으로 4바이트(32비트 정수)를 나타낸다. IDA에서는 typedef없이 바로 사용이 가능하기 때문에 이럴때 장점이 된다.)

구조체 저장

 

구조체에 적용할 위치를 메모리에서 추출을 했다면, 시작 메모리가 주소가 된다.
API이름을 스택에서 추출했으므로 각 함수마다 하나하나 지정하면 될 것이다. v4에 커서를 두고 y 를 눌러서 구조체를 적용하자.

적용 전
적용 후

 

정상적으로 API를 매핑 시켰음을 확인 할 수 있다.

 

 


 

 

 

스택이 아닌 메모리에서 API 문자열을 추출 했다면 시작점(첫번째 배열 위치) 만 맞춰주면 된다.

처음 NULL 값을 주는 경우도 있고 API함수가 바로 시작되는 경우도 있다.

디버거 시작점

 

디버거에서 찾은 API시작점을 IDA에서도 동일하게 찾은 다음.

IDA 시작점


y를 눌러서 위와 같은 이름을 아래와 같은 구조체 이름으로 변경하면 된다. 

구조체 이름 설정

 

그럼 API 매핑된다.

API 매핑 완료