출처 : 실전 악성코드와 멀웨어 분석
accept : 들어오는 연결을 리스닝 할 때 사용, 프로그램이 소켓에서 수신 연결을 리스닝하고 있음을 암시.
AdjustTokenPrivileges : 특정 권한을 활성화하거나 비활성화 할 떄 사용 -> 프로세스 인젝션을 하는 악성코드가 추가 권한을 얻기 위해 사용.
AttachThreadInput : 두 번째 스레드가 키보드나 마우스 같은 입력 이벤트를 수신할 수 있게 하나의 스레드가 다른 스레드의 입력을 처리할 때 사용.
bind : 들어오는 연결을 리스닝할 목적으로 로컬 주소에 연관 지을 때 사용
BitBIt : 한 장치에서 다른 장치로 그래픽 데이터를 복사할 때 사용 -> 스파이웨어는 이 함수를 이용해 화면을 캡처
* 이함수는 라이브러리 코드의 일부로 컴파일러가 종종추가
CallNextHookEx : SetWindowsHookEx가 설정한 이벤트를 후킹하는 코드 내에서 사용. -> CallNextHookEx 함수는 체인 내의 다음 후킹을 호출.
* SetWindowsHookEx가 설정한 후킹의 목적을 알아내려면 CallNextHokEx를 호출한 함수를 분석.
CertOpenSystemStore : 로컬 시스템에 저장한 인증서에 접근할 때 사용
CheckRemoteDebuggerPresent : 특정 프로세스가 디버깅 중인지 확인 -> 안티디버깅 기법의 일부.
CoCreateInstance : COM 객체를 생성 -> COM 객체는 광범위한 기능을 제공
* 클래스 식별자CLSID를 통해 어떤 파일이 COM 객체를 구현한 코드를 갖고 있는지 알 수 있음.
connect : 원격 소켓에 연결할 때 사용 -> 악성코드는 명령 제어 서버에 연결하느 하위 수준의 함수를 종종 사용.
ConnectNamedPipe : 접속하는 클라이언트 파이프를 기다리는 내부 프로세스 통신에 사용하는 서버 파이프를 생성 ->백도어와 리버스 셸은 떄로 ConnectNamedPipe를 이용해 명령 제어 연결 단순화
ControlService : 실행 중인 서비스를 시작, 중지, 수정하거나 시그널을 보낼 때 사용.
*악성코드가 악의적인 서비스를 이용하고 있다면, 호출 용도 확인을 위해 서비스를 구현한 코드를 분석.
CreateFile : 새로운 파일을 생성하거나 기존 파일을 오픈.
CreateFileMapping : 파일을 메모리로 로드하는 파일 매핑 핸들 생성, 메모리 주소를 통해 접근 할 수 있게 함
* 실행기Launcher, 로더, 인젝터는 이 함수를 이용해 PE 파일을 읽고 수정.
CreateMutex : 악성코드가 특정 시간에 시스템에서 하나의 인스턴스 생성만 보장하게 악성코드가 사용할 수 있는 상호 배제(mutual exclustion)를 생성. * 악성코드는 고정된 뮤텍스명을 이용, 이는 악성코드의 추가 감염을 탐지할 수 있는 좋은 호스트기반의 감염 흔적으로 사용할 수 있음.
CreateProcess : 새로운 프로세스를 생성 실행
CreateRemoteThread : 원격 프로세스에서 스레드 시작시 사용 -> 실행기와 은폐형 악성코드는 CreateRemoteThread를 이용해 다른 프로세스에 코드 주입
CreateService : 부팅 시간에 시작할 수 있는 서비스를 생성 -> 악성코드는 CreateService를 이용해 영구적인 설치, 은폐하거나 커널 드라이버를 로드.
CreateToolhelp32Snapshot : 프로세스, 힙, 스레드, 모듈 스냅샷을 생성할 때 사용. 악성코드는 이 함수를 프로세스나 스레드를 통해 반복하는 코드 일부로 사용.
CryptAcquireContext : 종종 윈도우 암호 사용을 초기화하는 악성코드가 이용하는 첫 번째 함수 -> 대부분 Crypt로 시작하는 함수들.
DeviceIoControl : 사용자 공간에서 장치 드라이버로 제어 메세지 전송 -> 커널 기반 악성코드가 이용
DllCanUnloadNow : 프로그램이 COM 서버를 구현하고 있다는 사실을 알 수 이는 익스포트 함수
DllGetClassObject : 프로그램이 COM 서버를 구현하고 있다는 사실을 알 수 이는 익스포트 함수
DllInstall : 프로그램이 COM 서버를 구현하고 있다는 사실을 알 수 이는 익스포트 함수
DllRegisterServer : 프로그램이 COM 서버를 구현하고 있다는 사실을 알 수 이는 익스포트 함수
DllUnregisterServer : 프로그램이 COM 서버를 구현하고 있다는 사실을 알 수 이는 익스포트 함수
EnableExecuteProtectionSupport : 호스트의 데이터 실행 보호 (DEP , Data Execution Protection) 설정을 수정할 때 사용하는 비공시적인 API 함수로 공격을 좀더 용이하게 함.
EnumProcesses : 시스템에 사용 중인 프로세스를 나열하는 데 사용. -> 악성코드는 인젝션할 프로세스를 찾기 위해 프로세스를 종종 나열
EnumProcessModules : 특정 프로세스가 로드한 모듈(실행 파일과 DLL)을 나열하는 데 사용. -> 악성코드는 인젝션할 때 모듈을 나열.
FindFirstFile / FindNextFile : 디렉토리를 통해 검색하고 파일 시스템을 나열하는 데 사용.
FindResource : 실행 파일이나 로드한 DLL에서 리소스를 찾는 데 사용 -> 문자열, 설정 정보, 악의적인 파일을 저장할 때 리소스 사용.
* 이 함수가 보이면 PE 헤더 내에 .rsrc 섹션 확인
FindWindow : PC에서 오픈한 윈도우 찾음.
* OllyDbg 윈도우를 검색하는 안티디버깅 기법으로 사용 가끔
FtpPutFile : 원격 FTP 서버로 파일을 업로드할 때 사용하는 상위 수준의 함수.
GetAdaptersInfo : 네트워크 어댑터에 관한 정보를 획득할 때 사용. 백도어는 이 함수를 이용, 감염 시스템 관련 정보 일부 수집
* 안티가상머신 기법으로 VMware의 MAC주소 확인에 사용
GetAsyncKeyState : 특정 키 눌렀는지 여부를 확인할 때 사용 -> 악성코드는 때때로 이 함수를 이용해 키로거를 구현
GetDC : 윈도우 장치 컨텍스트 핸들 or 전체 화면 반환 -> 화면을 캡처하는 스파이웨어는 이함수를 이용.
GetForegroundWindow : 데스크톱에서 현재 포어그라운드(foreground)로 수행 중인 핸들을 반환 -> 키로거는 보통 이 함수를 이용해 어떤 윈도우에서 사용자가 키 입력을 하고 있는지 확인
gethostbyname : 원격 호스트로 IP 연결하기 전에 특정 호스트명에 대한 DNS 질의를 수행할 때 사용 -> 명령 제어 서버가 제공하는 호스트명은 네트워크 기반의 좋은 시그니처가 될 수 있음.
GetKeyState : 키로거가 키보드에서 특정 키의 상태 정보를 획득할 때 사용.
GetModuleFilename : 현재 프로세스에 로드된 모듈 파일명을 반환. -> 악성코드는 이 함수를 이용해 현재 실행 중인 프로세스 내의 파일을 수정하고 복사.
GetModuleHandle : 이미 로드한 모듈의 핸들을 가져올 때 사용 -> 악성코드는 이 함수를 이용, 로드한 모듈의 코드를 위치시키고 수정하거나 코드 인젝션에 사용
GetProcAddress : 메모리에 로드한 DLL에서 함수 주소 검색, PE 파일 헤더에서 임포트한 함수뿐 아니라 다른 DLL에서 함수를 임포트할 떄 사용.
GetStartupInfo : 표준 핸들이 위치한 곳과 같이 현재 프로세스의 실행 환경에 관한 세부 정보를 담고 있는 구조체를 검색.
GetSystemDefaultLangId : 시스템의 기본 언어 설정을 반환 -> 특정 지역 타겟형 악성코드 개발 가능
GetTempPath : 임시 파일 경로를 반환. -> 악성코드는 임시 파일 경로에 임의의 파일을 익고 쓰는지 확인
GetThreadContext : 주어진 스레드의 컨텍스트 구조체를 반환 -> 스레드는 컨텍스트 레지스터 값과 현재 상태 같은 스레드 정보 모두를 저장
GetTickCount : 부팅 시간 이후 경과 시간을 밀리초로 가져온다.
GetVersinEx : 윈도우 현재 실행 버전에 관한 정보 반환 -> 공격 대상을 관찰
GetWindowsDirectory : 윈도우 디렉토리의 파일 경로를 반환 -> 이를 호출해 추가적인 악성 프로그램을 설치할 디렉토리르 알아냄.
inet_addr : connect와 같은 함수가 사용할 수 있게 127.0.0.1과 같은 IP 주소 문자열을 변환 ( 지정된 문자열은 네트워크 기반 시그니처로 활용)
InternetOpen : InternetOpenUrl과 InternetReadFile 같이 WinlNet에서 인터넷에 접근할 수 있는 상위 수준 함수를 초기화.
* 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 파일에서 메모리로 리소스를 로드 -> 악성코드는 때때로 문자열, 설정 정보, 다른 악의적인 파일을 저장할 목적으로 리소스 사용.
LsaEnumerateLogonSessions : 현재 시스템에서 로그온 세션을 수집하는데 계정 정보를 훔치는 용도로 사용
MapViewOfFile : 메모리로 파일을 매핑해서 메모리 주소를 통해 파일 내용에 접근 할 수 있게 함 -> 실행기, 로더, 주입기는 이 함수를 이용해 PE 파일을 읽고 수정 * 악성코드는 파일 내용을 수정할 목적으로 WriteFile을 사용하지 않을 수 있음.
MapVirtualKey : 가상 키 코드를 문자 값으로 변환 -> 키로깅 악성코드가 자주 사용.
MmGetSystemRoutineAddress : GetProcAddress와 유사하지만 커널 코드가 이용. 이 함수는 다른 모듈에서 함수 주소를 알아낼 수 있지만, ntoskrnl.exe와 hal.dll에서만 가능.
Module32First/Module32Next : 프로세스로 로드한 모듈을 수집하는 데 사용. -> 주입기는 이 함수를 이용해 코드 인젝션 위치를 결정
NetScheduleJobAdd : 특정 날짜와 시간에 실행할 프로그램 요청을 추가 -> 이를 이용해 악성코드는 다른 프로그램을 동작
NetShareEnum : 네트워크 공유 정보 수집
NtQueryDirectoryFile : 디렉토리에서 파일 관련 정보를 반환. -> 루트킷을 주로 파일을 숨길 용도로 이 함수를 후킹
NtQueryInformationProcess : 특정 프로세스에 관련한 다양한 정보를 반환 -> CheckRemoteDebuggerPresent와 동일한 정보를 반환하기 때문에 안티디버깅기법으로 사용하기도.
NtSetInformationProcess : 프로그램 권한 수준을 변경하거나 데이터 실행 방지(DEP) 우회
OleInitialize : COM 라이브러리를 초기화 할 때 사용 -> COM 객체를 사용하는 프로그램은 다른 COM 함수를 호출하기 전에 OleInitialize를 호출
OpenMutex : 특정시간에 하나의 인스턴스만 실행하게 보장하는 상호 배제 객체 핸들 오픈. 악성코드는 뮤텍스명을 고정하는 경우가 많으므로 좋은 호스트 기반 감염 흔적이 될 수 있음.
Openprocess : 시스템에 동작 중인 다른 프로세스 핸들을 오픈, 이 핸들은 다른 프로세스 메모리를 읽고 쓰거나 다른 프로세스로 코드를 주입할 때 사용
OpenSCManager : 서비스 제어 관리자 핸들을 오픈 -> 서비스를 설치, 수정, 제어하는 임의의 프로그램은 다른 서비스 조작 함수 이전에 반드시 이 함수를 호출
OutputDebugString : 디버거에 붙으면(attach)문자를 출력 -> 안티디버깅 기법으로 사용될 수 있음.
PeekNamedPipe : 파이프에서 데이터를 삭제하지 않고 명명한 파이프에서 데이터를 복제할 때 사용. -> 리버스 셸에 자주 사용.
Process32First/Process32Next : CreateToolHelp32Snapshot 이전 호출에서 프로세스를 수집하기 시작할 때 사용
-> 악성코드는 인젝션할 프로세스를 검색할 때 프로세스 검색
QuereyPerformanceCounter : 하드웨어 기반 성능 카운터 값을 검색할 때 사용 -> 안티디버깅 기법의 일부로 시간 정보를 입수
* 컴파일러가 종종 추가.
QueueUserAPC : 다른 스레드에서 코드를 실행할 때 사용 -> 악성코드는 QueueUesrAPC를 이용해 다른 프로세스에 코드 주입
ReadProcessMomory : 원격 프로세스 메모리를 읽을 때 사용
recv : 원격 시스템에서 데이터를 수신 -> 악성코드는 종종 이 함수를 이용, 외부 명령 제어 서버에 데이터 수신
RegisterHotKey ; 특정키 조합을 입력할 시점을 알려주는 핸들러 등록 -> 스파이웨어가 특정 키조합을 입력할 때 까지 은폐할 때 사용
RegOpenKey : 레지스트리 키를 읽고 편집하는 핸들 오픈 -> 레지스트리 키는 때때로 소프트웨어가 호스트에 기록할 때 쓰기도 함
레지스트리는 운영체제 전체와 애플리케이션 설정 정보를 갖고 있다.
ResumeThread ; 이전에 중단한 스레드를 재개
RtlCreateRegistryKey : 커널 모드 코드에서 레지스트리 생성
RtlWriteRegistryValue : 커널 모드 코드에서 레지스트리르 작성
SamIConnect : 계정 정보에 접근하는 호출을 위해 보안 계정 관리자 (SAM, Security Account Manager)에 접속
* 해시를 덤프하는 프로그램은 사용자의 로그인 패스워드 해시를 수집할 용도로 SAM 데이터베이스에 접근
SamIGetPrivateData : 보안 계정 관리자 데이터베이스에서 특정 사용자에 관한 개별 정보를 질의함
* 해시를 덤프하는 프로그램은 사용자의 로그인 패스워드 해시를 수집할 용도로 SAM 데이터베이스에 접근
'Reversing' 카테고리의 다른 글
RCE/CodeEngn/BasicRCE03 (0) | 2018.02.05 |
---|---|
RCE/CodeEngn/BasicRCE02 (0) | 2018.02.05 |
RCE/CodeEngn/BasicRCE01 (0) | 2018.02.05 |
공통 DLL 목록 (0) | 2017.04.08 |
디스어셈블링 할 때 소스 깔끔하게 하기 (0) | 2016.12.19 |