본문 바로가기

Reversing

주요 원도우 함수 (기록)

반응형

출처 : 실전 악성코드와 멀웨어 분석 

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 데이터베이스에 접근


SamQueryInformationUse : 보안 계정 관리자 데이터베이스에서 특정 사용자에 관한 개별 정보를 질의함
* 해시를 덤프하는 프로그램은 사용자의 로그인 패스워드 해시를 수집할 용도로 SAM 데이터베이스에 접근

send : 원격 시스템에 데이터 전송

SetFileTime : 파일의 생성, 접근, 최근 수정 시간을 변경 -> 악성코드는 종종 이 함수를 이용해 악의적인 행위를 숨김

SetThreadContext : 주어진 스레드 문맥을 수정할 때 사용 -> 인젝션 기법은 SetThreadContext를 사용

SetWindowsHookEx : 특정 이벤트를 호출할 때 매번 호출하는 후킹 함수를 설정 -> 주로 키로거나 스파이웨어가 사용
* 이 함수는 DLL을 시스템상의 모든 프로세스로 로드하는 쉬운 방법을 제공
* 때로 컴파일러가 추가

SfcTerminateWatcherThread  : 윈도우 파일 보호를 비활성화하고 보호돼야 할 파일을 수정하는 데 이용.
* SfcFileException도 이 기능에 사용.

ShellExecute : 다른 프로그램을 실행할 때 사용 -> 악성코드 신규 프로세스를 생성하면 새로운 프로세스도 역시 분석할 필요 있음

StartServiceCtrlDispatcher : 프로세스의 main 스레드를 서비스 제어 관리자로 연겨랗는 서비스에 의해 사용
* 서비스로서 동작하는 임의의 프로세스는 이 함수를 시작한지 30초 이내에 호출해야만 함.

SuspendThread : 실행 중지를 위해 스레드를 중단 -> 악성코드느 때때로 스레드를 중단해 코드 인젝션을 수행

system : 일부 C 런타임 라이브러리에서 제공하는 다른 프로그램을 실행시키는 함수
*윈도우에서 이 함수는 CreateProcess의 래퍼 함수

Thread32First/Thread32Next : 프로세스 스레드를 통해 반복할 때 사용 -> 주입기는 이 함수를 이용해 인젝션할 적절한 스레드를 찾아냄

Toolhelp32ReadProcessMemory : 원격 프로세스 메모리를 읽을 때 사용

URLDownloadToFile : 웹 서버에서 파일을 다운로드하고 디스크에 저장하는 상위 수준의 호출, 이 함수는 모든 종류의 다운로더 기능을 하나의 함수 호출에서 구현 대중적인 다운로더

VirtualAllocEx : 원격 프로세스에서 메모리를 할당 할 수 있는 메모리 할당 루틴, 악성코드는 때때로 이 함수를 프로세스 인젝션의 일부로 사용.

VirtualProtectEx : 메모리 지역 보호를 변경함 -> 악성코드는 이 함수를 이용해 메모리 읽기 전용 섹션을 실행 가능하게 변경

WideCharToMultiByte : 유니코드 문자열을 ASCII 문자열로 변환할 때 사용

WinExec : 다른 프로그램을 실행할 때 사용 -> 악성코드가 신규 프로세스를 생성하면 새로운 프로세스도 역시 분석할 필요가 있음.

WlxLoggedOnSAS(그리고 기타 Wlx* 함수) : 인증 모듈 행위를 하는 DLL이 익스포트해야만 하는 함수. 
* Wlx* 함수를 익스포트하는 악성코드는 그래픽 식별과 인증(GINA, Graphical Identification and Authentication)교체를 수행할 수 있음.

Wow64DisableWow64FsRediection : 64비트 운영체제에서 32비트 파일을로드할 때 발생하는 파일 리다이렉션을 비활성화
* 32비트 애플리케이션이 이 함수를 호출한 이후 (C:\Windows\System32로 쓰려고하면 C:\Widnows\SysWOW64로 리다이렉션하는 대신 실제 C:\Windows\System32로 쓰게됨

WriteProcessmomory : 원격 프로세스 데이터를 작성할 때 사용 -> 악성코드는 이 함수를 프로세스 인젝션의 일부로 사용

WSAStartup : 하위 수준의 네트워크 기능을 초기화할 때 사용 -> 네트워크 관련 기능의 시작점을 알아내는 쉬운 방법으로 WSAStartup 호출 검색 사용



반응형

'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