반응형

악성코드는 결국 프로그래밍에서 특정 함수를 사용하여 악의적인 행동을 할 때 그냥 프로그램에서 악성코드로 바뀌게 되는 것이다.

결국 개발과 악성코드는 똑같은 프로그램이라도, 악성 행위를 하느냐 하지 않느냐로 구분할 수 있다. 

당연히 개발할 때 사용하는 함수도 악성행위를 목적으로 사용된다면 악성코드로 봐야 하기 때문에, 

아래 함수들은 개발할때 사용되는 함수이면서, 악성코드에서 자주 보이는 함수들의 목록이다.

특정 함수만 보고도 악성코드의 목적이나 종류를 알 수 있어야 하겠다.

 

 

일단 이 3개의 함수는 일반적인 프로그램에서는 사용하지 않는 함수이고, 디버깅 API라고 한다.

이 함수들은 sysmon에서 관찰하고 있는데 그만큼 위험하다는 소리다.

  • VirtualAllocEx()
  • WriteProcessMemory()
  • CreateRemoteThread()

이 함수가 쓰이는데 목적이 불명확하다면 거의 악성코드라고 봐도 무방하다

 

 

1. 네트워크 모니터링

  • WSASocket(),  socket() -> 소켓을 생성하는 함수
  • bind() -> 네트워크 인터페이스에 소켓을 바인딩하는 함수
  • WSAIoctl() , ioctlsocket() -> 네트워크 인터페이스 설정을 Promiscuous mode로 변경한다.

 

2. 키로거

키로깅을 할때, 2가지의 일반적인 방법이 있는데, 

1. 키보드 상태를 계속 갖고 오기

2. 특정 키보드가 눌렸을때 데이터를 수집

  • GetAsyncKeyState()  -> 키가 눌려졌을 때나 떨어졌을 때 키가 무엇인지를 반환하는 함수
  • GetKeyState()  -> 키가 눌려졌을 때나 떨어졌을 때 키가 토글상태인지 아닌지를 반환하는 함수
  • SetWindowsHookEx()  -> 프로세스간에 주고 받는 메시지를 후킹하는 함수 (injection 기법에 사용)

 

3. 다운로더

  • URLDownloadToFile()  -> 파일을 다운로드 및 디스크에 저장하는 함수
  • ShellExecute(),  WinExec(), ... -> 새로 생성된 파일을 실행하는 함수

 

3. 서버요청 및 응답

악성코드에서 C&C로 요청을 하는 행위

  • InternetOpen() -> WinInet 함수들을 초기화하는 함수
  • InternetConnect()  -> 특정 URL과 연결하는 함수
  • HttpOpenRequest(), HttpAddRequestHeaders()  -> HTTP 요청을 작성하는 함수
  • HttpSendRequest() ->  HTTP 요청을 보내는 함수
  • InternetReadFile()  -> HTTP 요청을 보내고 C&C에서 응답을 받는 함수

 

4. 드로퍼

드로퍼는 정상 파일처럼 있다가 자기 자신 안에 있는 데이터로 악성코드를 생성한다.

그렇기 때문에 아래에 있는 함수를 사용하여 자신 내부 리소스 섹션에 있는 데이터를 가져온다.

  • FindResource()
  • LoadResource()
  • SizeOfResource()
  • LockResource()

 

5. DLL Injection을 통한 함수 호출

 

1. SetWindowsHookEx()를 사용하는 방법

  • LoadLibraryA() ->
    1. 악성 DLL을 특정 프로세스의 주소 공간에 불러온다.
    2. 이 함수는 프로세스가 실행되고 있는 도중에는 아무 DLL이나 불러올 수 있다.
    3. 이 함수의 파라미터로는 DLL파일의 이름이 들어간다.
  • GetProcAddress() -> 프로세스의 주소를 얻는 함수로써 DLL의 함수 주소를 가져오는 함수
  • GetWindowsThreadProcessId() -> 해당 스레드의 ID를 반환하는 함수
  • SetWindowsHookEx() -> GUI응용 프로그램에서 사용되는 프로세스간에 주고 받는 메시지를 후킹하는 함수 (키로거 에서 봤던 것과 동일) 
  • 한번의 호출로 모든 프로그램에 주입되는 로직
  • BroadcastSystemMessage() -> 공격 프로세스가 피해 프로세스에게 메시지를 보낼 때 사용하는 함수
  • GetMessage(), DispatchMessage() -> 위에서 보낸 메시지를 받는 함수

 

2. CreateRemoteThread() 사용하는 방법

  • OpenProcess() -> 공격자 프로세스가 피해자 프로세스와 통신할 수 있게 하는 함수
  • VirtualAllocEx() -> 다른 프로세스 내부에 메모리 공간을 할당하게 해주는 함수
  • WriteProcessMemory() -> 위 함수로 할당한 공간에 쓰기 할 수 있는 함수
  • GetModuleHandle() -> 실행 파일의 Module값을 가져오는데 사용하는 함수
  • GetProcAddress() -> 프로세스의 주소를 얻는 함수로써 위에서 가져온 모듈의 함수 주소를 얻는다.
  • CreateRemoteThread() -> 자신 프로세스가 아닌, 다른 프로세스에 스레드를 생성하는 함수
  • LoadLibraryA() -> 위에서 생성된 스레드에서 실행되고, 악성 DLL을 원격 주소 공간으로 로드시키는 함수

 

6. API Hooking

  • GetProcAddress() -> 프로세스의 주소를 얻는 함수로써 후킹할 함수의 주소를 얻는다.
  • VirtualProtect() -> 메모리 영역의 보호 속성을 쓰기 읽기 권한 중에서 변경하는 함수
  • ReadProcessMemory() -> 다른 프로세스의 메모리를 읽어오는 함수
  • 특정 구문으로의 점프 보통은 루트킷코드로의 점프
  • WriteProcessMemory() -> 특정 값을 다른 프로세스의 메모리 주소에 쓰는 함수
  • VirtualProtect() -> 처음에 바꿨던 보호 속성을 원래 값으로 복원

 

7. PROCESS HOLLOWING

  • CreateProcessA() -> 프로세스를 생성하는 함수로써 일시정지 상태의 프로세스를 생성한다.
  • NtUnmapViewOfSection() -> 원래 프로세스에서 정상적인 행동을 하고 있는 부분을 제거
  • VirtualAllocEx() -> 다른 프로세스 내부에 메모리 공간을 할당하게 해주는 함수로써 할로잉 되고 있는 프로세스에 새 메모리 주소를 할당
  • WriteProcessMemory() -> 특정 값을 다른 프로세스의 메모리 주소에 쓰는 함수로써 악성행위를 하는 코드가 할당한 메모리 주소에 삽입된다.

 

8. AntiDebugger, AntiVM

  • GetTickCount -> 컴퓨터 부팅부터 지난 시간을 msec단위로 반환하는 함수로써 디버거가 컴퓨터에 있는지 확인
  • CountClipboardFormats() -> 클립보드의 상태를 확인하는 함수
  • GetForeGroundWindow() -> 현재 포커스되어 사용되는 프로그램의 핸들을 리턴하는 함수로써 핸들이 가상머신이라면 프로그램을 종료시키는 등의 기능을 구현할 수 있음
  • Isdebuggerpresent() -> 디버거로 열렸는지 확인하는 함수

 

9. 일반적인 함수들

  • Fopen()  -> 파일을 여는 함수
  • Sscanf()  -> 문자열을 읽는 함수
  • ReadFile()  -> "핸들"을 통해 파일을 읽는 함수
  • CreateFIleA()  -> 새 파일을 생성할 뿐만 아니라 기존 파일을 읽을 때도 사용하는 함수
  • CreateToolhelp32Snapshot()  -> 현재 실행 중인 프로세스 목록을 가져오는 함수
  • Process32First()  -> CreateToolhelp32Snapshot 으로 가져온 핸들로 끝까지 함수 목록을 가져오는 함수
  • FindWindowsA()  -> 클래스의 이름이나 창의 이름으로 특정 창을 찾는 함수
  • RegCreateKeyEx() -> 레지스트리키를 새로 만들지만, 이미 있다면 해당 키를 반환하는 함수
  • RegSetValueEx()  -> RegCreateKeyEx로 얻은 Handle의 위치에 레지스트리를 생성하거나 수정할때 사용하는 함수
  • CreateThread()  -> 현재 프로세스 내에서 별도의 스레드를 생성 스레드를 시작하는 함수
  • GetEIP  -> EIP를 가져오는 함수로써 쉘코드를 메모리에서 EIP에 올리기 위해 사용하는 함수
  • GetFIleSize()  -> 파일의 사이즈를 구하는 함수로써 쉘코드에서 일반적으로 사용한다. 따라서 크기를 비교하여 자체 문서를 식별하고 추가 실행 파일을 삽입한다.
  • malloc()  -> 동적할당 하는 함수
  • free()  -> 할당한 메모리를 해제하는 함수로써 보통 버퍼 익스플로잇을 사용하여 쉘코드가 실행되는 구문이 있다.
  • GetTempPathA()  -> 현재 윈도우에서 임시 폴더로 사용하는 경로를 반환하는 함수로써, 보통 C&C로부터 파일을 다운로드할 위치로 사용된다.
  • WinExec()  – 다운로드한 파일을 실행하는 함수

 

10. 그 외 다수...

AdjustTokenPrivileges, CallNextHookEx, CreateMutexA, DispatchMessageA, ExitWindowsEx, FindClose, FindResourceA, FlushFileBuffers, FreeEnvironmentStringsA, FreeEnvironmentStringsW, FreeLibrary, GetCommandLineA, GetCurrentProcess, GetCurrentThreadId, GetExitCodeProcess, GetExitCodeThread, GetFileAttributesA, GetFileType, GetForegroundWindow, GetKeyboardState, GetModuleHandleA, GetStartupInfoA, GetSystemDirectoryA, GetTickCount, GetUserNameA, GetVersionExA, GetWindowsDirectoryA, GlobalMemoryStatus, HeapCreate, ioctlsocket, keybd_event, LookupPrivilegeValueA, MapVirtualKeyA, mciSendStringA, MoveFileA, OleInitialize, OpenProcessToken, PeekMessageA, PeekNamedPipe, PostMessageA, RaiseException, RasEnumConnectionsA, RasGetConnectStatusA, SetEnvironmentVariableA, SetFileAttributesA, SetFileTime, SetKeyboardState, SetStdHandle, SetUnhandledExceptionFilter,UnhandledExceptionFilter, UnhookWindowsHookEx, URLDownloadToFileA, VirtualAlloc, WSAAsyncSelect, WSACleanup, WSAGetLastError, WSAStartup, RegCreateKeyA, RegCreateKeyExA, RegDeleteValueA, RegOpenKeyA 등.....

 

 

 

 

 

 

참고 https://www.linkedin.com/pulse/interesting-apis-malware-hunter-gibin-john/

반응형