accept
들어오는 연결을 리스닝할 때 사용한다. 이 함수는 프로그램이 소켓에서 수신 연결을 리스닝하고 있음을 암시한다.
AdjustTokenPrivileges
특정 권한을 활성화하거나 비활성화 할 때 사용한다. 프로세스 인젝션을 행하는 악성코드는 종종 추가 권한을 얻기 위해 이 함수를 호출한다.ㅏ
AttachThreadInput
두 번째 스레드가 키보드나 마우스 같은 입력 이벤트를 수신할 수 있게 하나의 스레드가 다른 스레드의 입력을 처리할 때 사용한다. 키로거나 스파이 웨어가 이 함수를 이용한다.
bind
들어오는 연결을 리스닝 할 목적으로 로컬 주소에 연관 지을 때 사용한다.
BitBlt
한 장치에서 다른 장치로 그래픽 데이터를 복사할 때 사용한다. 스파이 웨어는 이 함수를 이용해 화면을 캡처한다. 이 함수는 라이브러리 코드의 일부로 컴파일러가 종종 추가한다.
CallNextHookEx
SetWindowsHookEx가 설정한 이벤트를 후킹하는 코드 내에서 사용한다. CallNextHookEx 함수는 체인 내의 다음 후킹을 호출한다. SetWindowsHookEx가 설정한 후킹의 목적을 알아내려면 CallNextHookEx을 호출한 함수를 분석하면 된다.
CertOpenSystemStore
로컬 시스템에 저장한 인증서에 접근할 때 사용한다.
CheckRemoteDebuggerPresent
특정 프로세스가 디버깅 중인지 확인한다. 이 함수는 떄로 안티디버깅 기법의 일부로 사용한다.
CoCreateInstance
COM 객체를 생성한다. COM객체는 광범위한 기능을 제공한다. 클래스 식별자(CLSID)를 통해 어떤 파일이 COM 샛체를 구현한 코드를 갖고 있는지 알 수 있다.
connect
원격 소켓에 연결할 때 사용한다. 악성코드는 명령 제어 서버에 연결하는 하위 수준의 함수를 종종
ConnectNamedPipe
접속하는 클라이언트 파이프를 기다리는 내부 프로세스 통신에 사용하는 서버 파이프를 생성한다. 백도어와 리버스 셀은 떄로 ConnectNamedPipe를 이용해 명령 제어 연결을 단순화한다.
ControlService
실행중인 서비스를 시작, 중지, 수정하거나 시그널을 보낼 때 사용한다. 악성코드가 악의적인 서비스를 이용하고 있다면 호출 용도를 확인하기 위해 서비스를 구현한 코드를 분석할 필요가 있다.
CreateFile
새로운 파일을 생성하거나 기존 파일을 오픈한다.
CreateFileMapping
파일을 메모리로 로드하는 파일 매핑 핸들을 생성하고 메모리 주소를 통해 접근 할 수 있게 한다. 실행기(Launcher), 로더, 인젝터는 이 함수를 이용해 PE파일을 읽고 수정한다.
CreateMutex
악성코드가 특정 시간에 시스템에서 하나의 인스턴스 생성만 보장하게 악성코드가 사용할 수 있는 상호 배제(mutual excursion)를 생성한다. 악성코드는 고정된 뮤텍스명을 이용하는데, 악성코드의 추가 감염을 탐지할 수 있는 좋은 호스트 기반의 감염 흔적으로 사용할 수 있다.
CreateProcess
새로운 프로세스를 생성하고 실행한다. 악성코드가 신규 프로세스를 생성하면 새로운 프로세스 역시 분석할 필요가 있다.
CreateRemoteThread
원격 프로세스(호출프로세스가 아닌)에서 스레드를 시작할 때 사용한다. 실행기와 은폐형 악성코드는 CreateRemoteThread를 이용해 다른 프로세스에 코드를 주입한다.
CreateService
부팅 시간에 시작할 수 있는 서비스를 생성한다. 악성코드는 CreateService를 이용해 영구적인 설치, 은폐하거나 커널 드라이버를 로드한다.
CreateToolhelp32Snapshop
프로세스, 힙, 스레드, 모듈 스냅샷을 생성할 때 사용한다. 악성코드는 이 함수를 프로세스나 스레드를 통해 반복하는 코드 일부로 사용한다.
CryptAcquireContext
종종 윈도우 암호 사용을 초기화하는 악성코드가 이용하는 첫번째 함수다. 암호화와 관련한 다른 함수가 많이 존재하는데, 대부분 Crypt로 시작한다.
DeviceIoControl
사용자 공간에서 장치 드라이버로 제어 메시지를 전송한다. DeviceIoControl은 커널 기반의 악성코드가 가장 자주 이용하는데, 이는 쉽고 사용자 공간과 커널 공간 사이에서 정보를 주고받는 유연한 방법이기 때문이다
DllCanUnloadNow
DllGetClassObject
DllInstall
DllRegisterServer
DllUnregisterServer
프로그램이 COM서버를 구현하고 있다는 사실을 알 수 있는 익스포트 함수다
EnableExecuteProtectionSupport
호스트의 데이터 실행 보호(DEP, Data Execution Protection) 설정을 수정할 때 사용하는 비공식적인 API 함수로 공격을 좀 더 용이하게 한다.
EnumProcess
시스템에 사용 중인 프로세스를 나열하는 데 사용한다. 악성코드는 인젝션할 프로세스를 찾기 위해 프로세스를 종종 나열한다.
EnumProcessModules
특정 프로세스가 로드한 모듈(실행 파일과 DLL) 을 나열하는데 사용한다. 악성코드는 인젝션할 때 모듈을 나열한다.
FindFirstFile / FineNextFile
디렉토리를 통해 검색하고 파일 시스템을 나열하는 데 사용한다.
FindResource
실행 파일이나 로드한 DLL에서 리소스를 찾는데 사용한다. 악성코드는 때때로 문자열, 설정 정보, 악의적인 파일을 저장할 때 리소스를 사용한다. 이 함수의 사용 흔적이 보이면 악성코드의 PE헤더 내에 있는 .rsrc 섹션을 확인해 보자
FindWindow
데스크톱에서 오픈한 윈도우를 찾는다. 이 함수는 때때로 OllyDbg 윈도우를 검색하는 안티디버깅 기법으로 사용한다.
FtpPutFile
원격 FTP서버로 파일을 업로드할 때 사용하는 상위 수준의 함수이다.
GetAdaptersInfo
시스템에서 네트워크 어댑터에 관한 정보를 획득할 때 사용한다. 백도어는 떄때로 GetAdaptersInfo를 호출해 감염 시스템 관련 정보를 일부 수집하는 용도로 사용한다. 일부 경우에는 안티 가상머신 기법의 일부로 VMware의 MAC 주소 확인에 사용하기도 한다.
GetAsyncKeyState
특정 키를 눌렀는지 여부를 확인할 때 사용한다. 악성코드는 떄떄로 이 함수를 이용해 키로거를 구현한다.
GetDC
윈도우 장치 컨텍스트 핸들이나 전체 화면을 반환한다. 화면을 캡처하는 스피이웨어는 이 함수를 이용한다.
GetForegroundWindow
데스크톱에서 현재 포어그라운드(foreground)로 수행중인 핸들을 반환한다. 키로거는 보통 이 함수를 이용해 어떤 윈도우에서 사용자가 키 입력을 하고 있는지 확인한다.
gethostbyname
원격 호스트 IP 연결하기 전에 특정 호스트명에 대한 DNS질의를 수행할 떄 사용한다. 명령 제어 서버가 제공하는 호스트명은 네트워크 기반의 좋은 시그니처가 될 수 있다.
gethostname
컴퓨터의 호스트명을 검색한다. 백도어는 공격 대상 장비를 조사할 때 때때로 gethostname을 사용한다.
GetKeyState
키로거가 키보드에서 특정키의 상태 정보를 획득할 때 사용한다.
GetModuleHandle
현재 프로세스에 로드된 모듈 파일명을 반환한다. 악성코드는 이 함수를 이용해 현재 실행중이 프로세스 내의 파일을 수정하고 복사한다.
GetProcAddress
메모리로 로드한 DLL에서 함수 주소를 검색한다. PE파일 헤더에서 임포트한 함수뿐 아니라 다른 DLL에서 함수를 임포트 할 때 사용한다.
GetStartupInfo
표준 핸들이 위치한 곳과 같이 현재 프로세스의 실행 환경에 간한 세부 정보를 담고 있는 구조체를 검색한다.
GetSystemDefaultLandId
시스템의 기본 언어 설정을 반환한다. 이를 이용해 특정 지역에 있는 시스템만 영향을 받게하는 '충성스러운' 악성코드는 감염 장비의 정보 일부로 화면과 파일명을 개별화한다.
GetTempPath
임시 파일 경로를 반환한다. 악성코드가 이 함수를 호출하면 임시 파일 경로에 임의의 파일을 읽고 쓰는지 확인한다.
GetThreadContext
주어진 스레드의 컨텍스트 구조체를 반환한다. 스레드 컨텍스트는 레지스터 값과 현재 상태 같은 스레드 정보 모두를 저장한다.
GetTickCount
부팅 시간 이후 경과 시간을 밀리초로 가져온다. 이 함수는 때때로 안티 디버킹 기법으로 시간 정보를 수집할 때 사용한다. 컴파일러가 종종 GetTickCount를 추가해 많은 실행파일을 포함하므로 단순히 이 함수가 임포트 됐다고 해도 알아 낼 수 있는 정보는 거의 없다.
GetVersionEx
윈도우 현재 실행 버전에 관한 정보를 반환한다. 이를 이용해 공격 대상을 관찰하거나 다른 버전의 윈도우 사이에 바뀐 문서화하지 않은 구조체의 다른 오프셋 중에 선택한다.
GetWindowsDirectory
윈도우 디렉토리(보통 c:\Windows)의 파일경로를 반환한다. 악성코드는 이를 호출해 추가적인 악성 프로그램을 설치할 디렉토리를 알아낸다.
Inet_addr
connect와 같은 함수가 사용할 수 있게 127.0.0.1과 같은 IP주소 문자열을 변환한다. 지정된 문자열은 네트워크 기반 시그니처로 활용할 수 있다.
InternetOpen
InternetOpenUrl이나 InternetReadFile같이 WinINet에서 인터넷에 접근할 수 있는 상위 수준 함수를 초기화 한다. InternetOpen을 검색하면 인터넷 접속 기능 시작점을 발견할 수 있는 좋은 방법이다. InternetOpen 파라미터 중 하나는 User-Agent인데, 좋은 네트워크 기반 시그니처로 활용할 수 있다.
InternetOpenUrl
FTP, HTTP, HTTPS를 사용해 특정 URL 연결을 오픈한다. URL이 고정이라면 좋은 네트워크 기반의 시그니처로 사용할 수 있다.
InternetReadFile
이전에 오픈한 URL에서 데이터를 읽는다.
InternetWriteFile
이전에 오픈한 URL에서 데이터를 쓴다.
IsDebuggerPresent
현재 프로세스가 디버깅 중인지 여부를 확인하는데, 안티디버깅 기법의 일부로 종종 사용한다. 이 함수는 컴파일러가 종종 추가해 많은 실행 파일에 포함돼 있으므로 단순히 이 함수를 임포트한 사실만으로 알아낼 수 있는 정보는 거의 없다.
IsNTAdmin
사용자가 관리자 권한을 갖는지 확인한다.
IsWoW64Process
32비트 프로세스가 64비트 운영체제에서 동작하고 있는지 확인할 때 사용한다.
LdrLoadDll
LoadLibrary와 같이 프로세스로 DLL을 로드하는 하위 수준의 함수다. 일반 프로그램은 LoadLibrary를 사용하므로 임포트 함수의 존재 여부로 프로그램이 은폐시도를 하는지 알 수 있다.
LoadLibrary
프로그램을 시작할 때 로드하지 않은 프로세스로 DLL을 로드한다. 거의 모든 Win32프로그램이 임포트한다.
LoadResource
PE파일에서 메모리로 리소스를 로드한다. 악성코드는 때때로 문자열, 설정 정보, 다른 악의적인 파일을 저장할 목적으로 리소스를 사용한다.
LsaEnumerateLogonSession
현재 시스템에서 로그온 세션을 수집하는데 계정 정보를 훔치는 용도로 하용할 수 있다.
MapViewOfFile
메모리로 파일을 매핑해서 메모리 주소를 통해 파일 내용에 접근할 수 있게 한다. 실행기, 로더, 주입기는 이 함수를 이용해 PE 파일을 읽고 수정한다. MapViewOfFile을 이용해 악성코드는 파일 내용을 수정할 목적으로 WriteFile을 사용하지 않을 수 있다.
MapVirtualKey
가상 키 코드를 문자 값으로 변환한다. 키로깅 악성코드가 자주 사용한다.
MmGetSystemRoutineAddress
GetProcAddess와 유사하지만 커널 코드가 이용한다. 이 함수는 다른 모듈에서 함수 주소를 알아낼수 있지만, ntoskrnl.exe 와 hal.dll에서만 가능하다.
Moudule32First / Module32Next
프로세스로 로드한 모듈을 수집하는데 사용한다. 주입기는 이 함수를 이용해 코드 인젝션 위치를 결정한다.
NetScheduleJobAdd
특정 날짜와 시간에 실행할 프로그램 요청을 추가한다. 악성코드는 NetScheduleJobAdd를 이용해 다른 프로그램을 동작할 수 있다. 악성코드 분석가로서 미래에 실행될 프로그램 위치를 알아내고 분석할 필요가 있다.
NetShareEnum
네트워크 공유 정보를 수집할 때 사용한다.
NtQueryDirectoryFile
디렉토리에서 파일 관련 정보를 반환한다. 루트킷을 주로 파일을 숨길 용도로 이 함수를 후킹한다.
NtQueryInformationProcess
특정 프로세스에 관련한 다양한 정보를 반환한다. 이 함수는 떄때로 CheckRemoteDebuggerPresent와 동일한 정보를 반환하기 때문에 안티디버깅기법으로 사용하기도 한다.
NtSetInformationProcess
프로그램 권한 수준을 변경하거나 데이터 실행 방지(DEP)를 우회할 때 사용한다.
OleInitialize
COM 라이브러리를 초기화 할 떄 사용한다. COM 객체를 사용하는 프로그램은 다른 COM 함수를 호출하기 이전 OleInitialize를 호출해야만 한다.
openMutex
악성코드가 시스템에서 특정 시간에 하나의 인스턴스만 실행하게 보장하는 상호 배제 객체 핸들을 오픈한다. 악성코드는 뮤텍스명을 고정하는 경우가 많으므로 좋은 호스트 기반 감염 흔적이 될 수 있다.
OpenProcess
시스템에 동작중인 다른 프로세스 핸들을 오픈한다. 이 핸들은 다른 프로세스 메모리를 읽고 쓰거나 다른 프로세스로 코드를 주입할 때 사용한다.
OpenSCManager
서비스 제어 관리자 핸들을 오픈한다. 서비스를 설치, 수정, 제어하는 임의의 프로그램은 다른 서비스 조작 함수 이전에 반드시 이 함수를 호출해야만 한다.
OutputDebugString
디버거에 붙으면(attach) 문자를 출력한다. 이는 안티디버깅 기법으로 사용할 수 있다.
PeekNamedPipe
파이프에서 데이터를 삭제하지 않고 명명한 파이프에서 데이터를 복제할 때 사용한다. 이 함수는 리버스 셀에 자주 사용한다.
Process32First / Process32Next
CreateToolhelp32Snapshot 이전 호출에서 프로세스를 수집하기 시작할 때 사용한다. 악성코드는 인젝션할 프로세스를 검색할 때 프로세스를 검색한다.
QueryPerformanceCounter
하드웨어 기반 성능 카운터 값을 검색할 때 사용한다. 이 함수는 때때로 안티디버킹 기법의 일부로 시간 정보를 입수할 때 사용한다. 컴파일러가 종종 추가해 많은 실행 파일에서 포함하고 있으므로 이 함수를 임포트했다는 사실 자체가 제공하는 정보는 거의 없다.
ReadProcessMemory
원격 프로세스 메모리를 읽을 때 사용한다.
recv
원격 시스템에서 데이터를 수신한다. 악성코드는 종종 이 함수를 이용해 외부 명령 제어 서버에서 데이터를 수신한다.
RegisterHotKey
사용자가 특정 키 조합(Ctrl + Alt + J)을 입력할 시점을 알려주는 핸들러를 등록할 때 사용한다. 이 함수는 사용자가 키 조합을 입력할 때 활성화된 윈도우와 관계 없다. 이 함수는 때때로 스파이웨어가 특정 키 조합을 입력할 때까지 은폐할 때 사용한다.
RegOpenKey
레지스트리 키를 읽고 편집하는 핸들을 오픈한다. 레지스트리 키는 때때로 소프트웨어가 호스트에 기록할 때 쓰기도 한다. 레지스트리는 운영체제 전체와 애플리케이션 설정 정보를 갖고 있다.
ResumeThread
이전에 중단한 스레드를 재개한다. ResumeThread는 인젝션 기법의 일부로 사용한다.
RtlCreateRegistryKey
커널 모드 코드에서 레지스트리를 생성할 때 사용한다.
RtlWriteRegistryValue
커널 모드 코드에서 레지스트리를 작성할 때 사용한다.
SamIConnect
계정 정보에 접근하는 호출을 위해 보안 계정 관리자 (SAM, Security Account Manager)에 접속한다. 해시를 덤프하는 프로그램은 사용자의 로그인 패스워드 해시를 수집할 용도로 SAM 데이터 베이스에 접근한다.
SamIGetPrivateData
SamQueryInformationUse
보안 계정 관리자 데이터베이스에서 특정 사용자에 관한 개별 정보를 질의한다. 해시를 덤프하는 프로그램은 사용자의 로그인 패스워드 해시를 수집할 용도로 SAM 데이터 베이스에 접근한다.
send
원격 시스템에 데이터를 전송한다. 악성코드는 이 함수를 이용해 원격 명령 제어 서버로 데이터를 전송한다.
SetThreadContext
주어진 스레드 문맥을 수정할 때 사용한다. 일부 인젝션 기법은 SetThreadContext를 사용한다.
SetWindowsHookEx
특정 이벤트를 호출할 때 매번 호출하는 후킹 함수를 설정한다. 주로 키로거나 스파이웨어가 사용하며, 이 함수는 DLL을 시스템상의 모든 프로세스로 로드하는 쉬운 방법을 제공한다. 이 함수는 떄로 컴파일러가 추가한다.
SfcTerminateWatcherThread
윈도우 파일 보호를 비활성화하고 보호돼야 할 파일을 수정하는 데 이용한다. SfcFileException도 이 기능에 사용할 수 있다.
ShellExecute
다른 프로그램을 실행할 때 사용한다. 악성코드가 신규 프로세스를 생성하면 새로운 프로세스도 역시 분석할 필요가 있다.
StartServiceCtrlDispatcher
프로세스의 main스레드를 서비스 제어 관리자로 연결하는 서비스에 의해 사용한다. 서비스로서 동작하는 임의의 프로세스는 이 함수를 시작한지 30초 이내에 호출해야만 한다. 악성코드에서 이 함수가 존재한다면 함수는 서비스로 동작할 것이다.
SuspendThread
실행 중지를 위해 스레드를 중단한다. 악성코드는 때때로 스레드를 중단해 코드 인젝션을 수행한다.
system
일수 C 런타임 라이브러리에서 제공하는 다른 프로그램을 실행시키는 함수다. 윈도우에서 이 함수는 CreateProcess의 래퍼 함수(wrapper function)를 제공한다.
Thread32First / Thread32Next
프로세스 스레드를 통해 반복할 때 사용한다. 주입기는 이 함수를 이용해 인젝션할 적절한 스레드를 찾아낸다.
Toolhelp32ReadProcessMemory
원격 프로세스 메모리를 읽을 때 사용한다.
URLDownloadToFile
웹 서버에서 파일을 다운로드하고 디스크에 저장하는 상위 수준의 호출이다. 이 함수는 모든 종류의 다운로더 기능을 하나의 함수 호출에서 구현했기 때문에 대중적인 다운로더다.
VirtualAllocEx
원격 프로세스에서 메모리를 할당할 수 있는 메모리 할당 루틴이다. 악성코드는 때때로 VirtualAllocEx를 프로세스 인젝션의 일부로 사용한다.
VirtualProtectEx
메모리 지역 보호를 변경한다. 악성코드는 이 함수를 이용해 메모리 읽기 정용 섹션을 실행 가능하게 변경한다.
WideCharToMultiByte
유니코드 문자열을 ASCII 문자열로 변환할 때 사용한다.
WinExec
다른 프로그램을 실행할 떄 사용한다. 악성코드가 신규 프로세스를 생성하면 새로운 프로세스도 역시 분석할 필요가 있다.
WlxLoggedOnSAS (그리고 기타 Wlx* 함수)
인증 모듈 행위를 하는 DLL이 익스포트해야만 하는 함수다. Wlx* 함수를 익스포트하는 악성코드는 그래픽 식별과 인증(GINA, Graphical Identification and Authentication) 교체를 수행할 수도 있다.
Wow64DisableWow64FsRedirection
64비트 운영체제에서 32비트 파일을 로드할 때 발생하는 파일 리다이렉션을 비활정화 한다. 32비트 애플리케이션이 이 함수를 호출한 이후 C:\Windows\System32로 쓰려하면 C:\Windows\SysWOW64로 리다이렉션하는 대신 실제 C:\Windows\System32로 쓰게 된다.
WriteProcessMemory
원격 프로세스로 데이터를 작성할 때 사용한다. 악성코드는 WriteProcessMemory를 프로세스 인젝션의 일부로 이용한다.
WSAStartup
하위 수준의 네트워크 기능을 초기화 할때 사용한다. 네트워크 관련 기능의 시작점을 알아내는 쉬운 방법으로 WSAStartup 호출 검색을 사용한다.
'Reversing > PMA' 카테고리의 다른 글
finding Network codes (0) | 2015.01.24 |
---|---|
Process (0) | 2015.01.17 |
Networking API (0) | 2015.01.17 |
DLL (0) | 2015.01.15 |
Window Registry (0) | 2015.01.15 |