'Reversing/PMA'에 해당되는 글 6건

  1. 2015.01.24 Window Functions used in many malwares
  2. 2015.01.24 finding Network codes
  3. 2015.01.17 Process
  4. 2015.01.17 Networking API
  5. 2015.01.15 DLL
  6. 2015.01.15 Window Registry
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

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
Posted by af334
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

네트워크 통신을 파악하기 위한 첫 단계는 통신을 수행하기 위해 사용되는 시스템 호출을 실제적으로 찾는 것이다. 가장 일반적인 파위 레벨의 함수는 윈도우 소켓 (Winsock)의 한 부분이다. 이 API를 사용하는 악성코드는 일반적으로 WSAStartup, getaddrinfo, socket, connect, send, recv, WSAGetLastError 같은 함수를 사용한다.

악성토드가 대신 윈도우 인터넷(WinINet)을 출하는 상위 레벨의 API를 사용할 수도 있다. WinINet API를 사용하는 악성코드는 일반적으로 InternetOpen, InternetConnect, InternetOpenURL, HTTPOpenRequest, HTTPQueryInfo, HTTPSendRequest, InternetReadFile, InternetWriteFile 같은 함수를 사용한다. 이 상위 레벨 API는 일반 브라우징에 사용되는 동일한 API이기 떄문에 악성코드가 좀 더 효율적으로 정상 트래픽에 숨을 수 있게 한다.

네트워크에 사용할 수 있는 다른 상위 레벨 API는 COM(Component Object Model)인터페이스다. URLDownloadToFile 같은 함수를 통해 COM을 간접적으로 사용하는 것은 매우 일반적이지만, COM의 직접 사용은 아직 드물다. COM을 직접적으로 사용하는 악성코드는 일반적으로 CoInitialize, CoCreateInstance, Navigate 같은 함수를 사용한다. 예를 들어 브라우저를 생성하고 사용하기 위한 COM의 직접 사용은 의도한 바와 같이 브라우저가 실제적으로 사용하는 것이기 때문에 악성코드가 정상 트래픽에 숨어들 수 있게 하며, 악성코드의 활동과 네트워크 트래픽 연결이 효율적으로 발견되지 않게 한다.



윈도우 네트워킹 API


WinSock API

WSAStartup

getaddrinfo

socket

connect

send

recv

WSAGetLastError



WinINet API

InternetOpen

InternetConnect

InternetOpenURL

InternetReadFile

InternetWriteFile

HTTPOpenRequest

HTTPQueryInfo

HTTPSendRequest



COM interface

URLDownloadToFile

CoInitialize

CoCreateInstance

Navigate








'Reversing > PMA' 카테고리의 다른 글

Window Functions used in many malwares  (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
Posted by af334
2015. 1. 17. 03:03
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

악성코드는 새로운 프로세스를 생성하거나 기존 프로세스를 변형해 현재 프로그램 외부에서 코드를 실행할 수도 있다. 프로세스는 윈도우가 실행하는 프로그램이다. 각 프로세스는 오픈된 핸들이나 메모리 같은 고유의 자원을 관리한다. 프로세스는 CPU가 실행하는 하나 이상의 스레드가 있다. 예전 악성코드는 독립적인 프로세스로 구성됐지만, 최근 악성코드는 다른 프로세스의 일부로 코드를 실행하는 경우가 더 많다.


윈도우는 리소스를 관리할 목적으로 컨테이너로 프로세스를 사용하고, 프로그램이 상호 간섭하지 않게 분리한다. 윈도우 시스템은 특정 시점에 적어도 20~30개의 프로세스가 CPU, 파일 시스템, 메모리, 하드웨어를 포함한 동일한 자원을 공유 하면서 동작한다. 개별 프로그램이 다른 프로그램과 자원 공유를 관리해야 한다면 프로그램을 작성하기 매우 어려울 것이다. 운영체제는 모든 프로세스가 서로 간의 간섭 없이 공유 자원에 접근 할 수 있게 한다. 프로세스는 에러를 방지하거나 다른 프로그램에 영향을 주는 프로그램은 다운시켜 안정적인 동작에 기여한다.


프로세스 간에 운영체제가 특히 중요하게 여기는 리소스는 시스템 메모리다. 이를 위해 다른 모든 프로세스와 분리 시키고 프로세스가 사용할 수 있는 메모리 주소의 합한 메모리 공간을 개별 프로세스에 할당한다.


프로세스가 메모리를 요청하면 운영체제는 메모리와 메모리에 접근해 사용할 수 있는 주소를 프로세스에 할당한다. 프로세스는 메모리 주소를 공유할 수 있고 빈번히 공유한다. 예를 들어 특정 프로세스가 메모리 주소 0x00400000에 데이터를 저장하면 다른 프로세스도 해당 주소에 저장 할 수 있으며, 프로세스는 충돌하지 않는다. 주소는 동일하지만 데이터를 저장하는 물리적인 주소는 동일하지 않다. 우편 주소와 같이 메모리 주소는 컨텍스트 내에서만 의미를 가진다. 메인 주소의 ZIP코드가 없으면 주소 202번지의 위치를 알 수 없듯이 프로세스를 모르면 주소 0x0040A010 자체로 데이터 저장 위치를 알 수 없다. 메모리 주소 0x0040A010에 접근하는 악의적인 프로그램은 악의적인 코드를 담고 있는 프로세스가 해당 주소에 저장할 때만 영향을 미치며, 해당 주소를 사용하는 시스템 내의 다른 프로그램은 영향을 받지 않는다.



신규 프로세스 생성

악성코드가 신규 프로세스를 생성할 때 가장 흔히 사용하는 함수는 CreateProcess 다. 이 함수의 많은 파라미터를 통해 호출자(caller)는 프로세스 생성에 관한 세부적인 제어가 가능하다. 예를 들어 악성코드는 호스트 기반의 방화벽과 다른 보안 메커니즘을 우회하기 위해 악성코드를 실행하는 프로세스 생성 함수를 호출 할 수 있다. 또는 인터넷 익스플로러 인스턴스를 생성한 후 악의적인 내용에 접근하는 프로그램을 사용할 수 있다.


악성코드는 보통 CreateProcess를 이용해 함수 하나만을 호출하는 간단한 원격 셀을 생성한다. CreateProcess 함수의 파라미터 중 하나는 STARTUPINFO 구조체인데, 이는 프로세스의 표준 입출력과 표준 에러 스트림 핸들을 포함한다. 악성코드는 프로그램이 표준 출력으로 쓸 때 실제 소켓을 써서 공격자가 원격에서 CreateProcess 호출을 제외한 모든 실행이 가능하게 이 값을 소켓으로 설정한다.


코드는 원격 위치에 소켓을 열어 뒀을 것이다. 소켓 핸들은 스택에 저장돼 STARTUPINFO 구조체로 입력된다. 그 후 CreateProcess를 호출하면 프로세스의 모든 입출력은 소켓으로 라우팅된다.



CreateProcess를 호출하면 모든 입출력을 소켓으로 리다이렉트하기 위해 새로운 프로세스를 생성한다. 외부 호스트를 알아내려면 소켓이 초기화 되는 위치를 알아야 한다. 어떤 프로그램이 동작하는지 알기 위해 IDA Pro에서 해당 주소를 탐색해 저장된 문자열을 알아야 한다.


악성코드는 종종 리소스 섹션(resource section) 내부에 프로그램을 저장해 신규 프로세스를 생성하기도 한다.

악성코드는 때로 리소스 섹션에 또 다른 실행 파일을 저장한다. 프로그램이 실행 될 때 PE 헤더에서 추가 실행 파일을 추출해 디스크에 쓴 후 프로그램 실행을 위한 CreateProcess를 호출한다. 이는 DLL과 다른 실행 코드에서도 가능하다. 이런 경우 리소스  해커 (resource hacker) 라는 유틸리티를 이용해 열고, 분석을 위해 디스크에 임베디드 실행파일로 저장한다.








'Reversing > PMA' 카테고리의 다른 글

Window Functions used in many malwares  (0) 2015.01.24
finding Network codes  (0) 2015.01.24
Networking API  (0) 2015.01.17
DLL  (0) 2015.01.15
Window Registry  (0) 2015.01.15
Posted by af334
2015. 1. 17. 02:19
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.



악성코드는 일반적으로 악성 행위를 위해 네트워크 기능에 의존하며, 네트워크 통신에 사용하는 수많은 윈도우 API가 있다. 네트워크 시그니처를 생성하는 작업은 꽤나 복잡하다. 네트워크 함수가 사용 됐을 때 악성 프로그램의 행위를 식별할 수 있게 일반적인 네트워크 함수를 인지하고 이해하는 것이 필요하다.



버클리 호환 소켓

윈도우 네트워크 옵션 중 악성코드는 버클리 호환 소켓(Berkley Compatible Sockets)을 가장 자주 사용하는데, 윈도우와 유닉스 시스템에서 거의 동일한 기능을 가진다. 윈도우에서 버클리 호환 소켓의 네트워크 기능은 Winsock 라이브러리 내에서 주로 ws2_32.dll에 수현돼 있다. 이중 소켓에서 가장 자주 사용하는 함수는 socket, connect, bind, listen, accept, send, recv이다.


socket  -  소켓을 생성한다.


bind  -  호출 전에 소켓을 특정 포트로 할당한다.


listen  -  소켓이 인바운드 연결을 위해 리스닝하고 있음을 나타낸다.


accept  -  외부 소켓 연결을 오픈하고 연결을 받아들인다.


connect  -  연결을 외부 소켓으로 오픈하고 외부 소켓은 연결을 기다린다.


recv  -  외부 소켓에서 데이터를 받는다.


send  -  외부 소켓으로 데이터를 보낸다.



***

네트워크 라이브러리에 리소스를 할당하기 위해 다른 네트워크 함수가 수행되기 전에 WSAStratup 함수가 할당돼야 한다. 코드 디버깅을 수행하는 동안 네트워크 연결 시작점을 찾을 때 WSAStartup에 브레이크 포인트를 설정하면 유용한데, 이는 바로 네트워크 기능이 시작되기 때문이다.




네트워크의 서버와 클라이언트 관점

네트워크 프로그램에는 항상 두 가지 관점이 있는데, 하나는 서버로서 인바운드 연결을 기다리는 오픈 소켓을 유지하고 다른 하나는 클라이언트로서 기다리는 소켓에 연결한다. 악성코드는 서버 또는 클라이언트 중 하나가 될 수 있다.

외부 소켓에 연결하는 클라이언트 애플리케이션의 경우 socket을 호출하고 이어서 connect를 호출하며, 필요시 send와 recv를 호출한다. 인바운드 연결을 리스닝하는 애플리케이션의 경우 socket, bind, listen, accept 함수를 순서대로 호출하고, 필요시 send와 recv를 호출한다.



우선 WSAStartup은 Win32 소켓 시스템을 초기화한 후 socket 함수로 소켓을 생성한다. bind함수는 소켓을 포트로 바인드하고, listen함수는 소켓을 리스닝하게 설정하며, accept함수는 외부 연결이 올 때까지 대기한다.




WinINet API

Winsock API 외에 WinINet API 라 부르는 좀 더 상위 수준의 API가 있다. WinINet API 함수는 Wininet.dll에 저장돼 있다. 프로그램이 이 DLL에서 함수를 임포트란다면 상위 수준의 네트워크 API를 사용하는 것이다. WinINet API는 애플리케이션 계층에서 HTTP, FTP 같은 프로토콜을 구현한다. 오픈하는 연결에 기반을 두고 악성코드가 하는 행위를 이해할 수 있다.



InternetOpen은 인터넷 연결을 초기화 할 때 사용한다.


InternetOpenUrl은 URL에 연결할 때 사용한다. (HTTP 페이지나 FTP 리소스에 사용할 수 있음)


InternetReadFile은 ReadFile함수 같이 프로그램이 인터넷에서 다운로드한 파일에서 데이터를 읽을 수 있게 한다.



악성코드는 WinINet API를 이용해 외부 서버에 연결하고 실행에 필요한 추가 명령을 받는다.




'Reversing > PMA' 카테고리의 다른 글

Window Functions used in many malwares  (0) 2015.01.24
finding Network codes  (0) 2015.01.24
Process  (0) 2015.01.17
DLL  (0) 2015.01.15
Window Registry  (0) 2015.01.15
Posted by af334
2015. 1. 15. 01:49
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.



IDA Pro에서 보이는 점프와 호출 뿐 아니라 악성코드가 실행 코드를 변경할 수 있는 방법은 많이 있다. 악성코드가 어떻게 다른 코드를 실행하게 유도하는지 이해하는 것은 악성코드 분석가에게 중요한 일이다. 가장 흔한 방식은 DLL 사용을 통해 파일 외부에서 코드에 접근하는 방식이다.


DLL(dynamic link libraries, 동적 링크 라이브러리)은 현재 윈도우에서 다양한 애플리케이션끼리 코드를 공유하는 라이브러리를 사용하는 방식이다. DLL은 그 자체로 실행할 수 없는 실행 파일이지만, 다른 애플리케이션에 의해 사용할 익스포트 함수다. 정적 라이브러리는 DLL 이전에 사용하던 표준이었고, 여전히 사용하지만 훨씬 덜 이용하는 방식이다. 정적 라이브러리 대신 DLL을 사용하는 주요 이점은 실행 중인 프로세스간에 DLL이 사용하는 메모리를 공유할 수 있다는 검이다. 예를 들어 라이브러리가 두 개의 다른 실행 중인 프로세스가 사용한다면 정적 라이브러리 코드는 메모리에 두 번 로드해야 하므로 메모리를 두 배로 사용할 것이다.

DLL을 사용하는 또 다른 이점은 실행 파일을 배포할 때 DLL을 재배포할 필요 없이 알려진 윈도우 시스템 호스트에 DLL을 사용할 수 있다는 점이다. 이를 이용해 소프트웨어 개발자와 악성코드 작성자는 소프트웨어 배포 크기를 최소화 할 수 있다.

DLL은 코드 재사용 메커니즘에서도 매우 유용하다. 예를 들어 대규모 소프트웨어 회사는 다른 많은 애플리케이션과 공통적으로 사용하는 기능을 포함한 DLL을 생성한다. 이후 애플리케이션을 배포할 때 애플리케이션이 사용하는 메인 .exe 와 DLL을 배포한다. 이를 통해 하나의 공유 코드 라이브러리를 유지하고 필요할 때만 배포할 수 있다.




악성 코드 제작자가 DLL을 이용하는 법

악성코드 제작자는 세 가지 방식으로 DLL을 사용한다.


악성코드 저장용

때로 악성코드 제작자가 악성코드를 DLL에 저장하면 .exe 파일보다 이점이 있다. 일부 악성코드는 다른 프로세스에 붙기도 하지만 각 프로세스는 하나의 .exe파일만 가질 수 있다. 악성코드는 때때로 다른 프로세스로 자신을 로드하기 위해 DLL을 이용한다.


윈도우 DLL사용

거의 모든 악성코드는 모든 시스템에서 찾을 수 있는 기본적인 윈도우 DLL을 이용한다. 윈도우 DLL은 운영체제와 상호작용할 때 필요한 기능을 담고 있다. 악성코드가 윈도우 DLL을 사용하는 방식은 악성코드 분석가에게 상당한 통찰력을 제공한다.


외부 DLL사용

악성코드는 다른 프로그램과 상호작용을 위해 외부 DLL도 사용한다. 외부 DLL에서 함수를 임포트하는 악성코드를 발견하면 목적을 이루기 위한 프로그램과 상호작용한다고 유추할 수 있다. 예를 들어 윈도우 API를 직접 통해 접속 하지 않고 모질라 파이어폭스의 DLL을 이용해 서버로 재접속할 수 있다. 악성 코드를 피해자의 장비에 설치돼 있지 않은 라이브러리의 기능을 이용하는 특수화된 DLL를 배포할 수도 있는데, DLL로 배포하는 암호화 기능이 대표적인 예다.



기본적인 DLL 구조

간단히 살펴보면 DLL파일은 .exe실행 파일과 거의 흡사하다. DLL은 PE파일 포맷을 이용하며, 플래그 하나로 파일이 ,exe가 아닌 DLL이라는 점을 명시한다. DLL은 일반적으로 익스포트 함수가 많고 임포트 함수는 적다. 그 외에는 실제 DLL과 exe는 별 차이가 없다.


메인 DLL함수는 DllMain이다. 이름이 없고 DLL 내에 익스포트도 없지만, 파일의 진입점으로서 PE 헤더에 정의돼 있다.  프로세스가 라이브러리를 로드 또는 언로드하거나 새로운 스레드가 생성되거나 기존 스레드가 종료되는 시점을 알려주기 위해 매번 함수를 호출한다. 이 알림을 통해 DLL은 프로세스 단위나 스레드 단위의 리소스를 관리할 수 있다.

대다수 DLL은 스레드 단위의 리소스가 없으며, 스레드 행위를 유발하는 DLLMain으로의 호출을 무시한다. 하지만 DLL이 스레드 단위를 관리해야만 하는 리소스를 가지고 있다면 분석가는 해당 리소스를 통해 DLL의 사용 목적에 대한 감을 잡을 수 있을 것이다.





'Reversing > PMA' 카테고리의 다른 글

Window Functions used in many malwares  (0) 2015.01.24
finding Network codes  (0) 2015.01.24
Process  (0) 2015.01.17
Networking API  (0) 2015.01.17
Window Registry  (0) 2015.01.15
Posted by af334
2015. 1. 15. 01:14
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.



윈도우 레지스트리는 운영체제와 설정이나 옵션 같은 프로그램 구성 정보를 저장한다. 파일 시스템과 같이 악성코드 기능에 관한 호스트 기반의 좋은 표식자이며, 유용한 정보를 제공한다.

초기 버전의 윈도우는 구성 정보를 저장하기 위해 ini 파일을 사용했다. 레지스트리는 성능 향상을 목적으로 수직 구조의 정보 데이터베이스를 생성했고, 정보를 저장하는 애플리케이션 입장에서 그 중요성이 더해져 왔다. 네트워킹, 드라이버, 시작, 사용자 계정, 그리고 다른 정보 등 거의 윈도우 구성 정보는 레지스트리에 저장한다.

악성코드는 레지스트리를 이용해 영구 데이터나 설정 데이터를 저장한다. 악성 코드는 컴퓨터 부팅 시마다 자동으로 동작할 수 있게 레지스트리 항목을 추가한다. 레지스트리는 너무 방대하기 때문에 악성코드를 지속적으로 실행 할 수 있는 다양한 방법이 있다.

레지스트리를 상세히 살펴보기 전에 마이크로소프트 문서를 이해하려면 알아야 할 몇 가지 주요 레지스트리 용어가 있다.


루트 키 (root key) 

레지스트리는 루트키라 부르는 다섯가지 최상위 부분으로 나눠진다. 때로는 HKEY와 하이브란 용어를 사용한다. 각 루트키는 특별한 용도로 이용한다.


서브 키 (subkey)

서브키는 폴더 내의 서브 폴더와 같다.


키(key)

키는 또 다른 폴더나 값을 저장할 수 있는 레지스트리 내의 폴더다. 루트 키와 서브키는 모두 키다.


값 엔트리(value entry)

값 엔트리는 순차적인 이름과 값 쌍이다.


값이나 데이타(value or data)

값이나 데이터는 레지스트리 엔트리 내에 저장된 데이터다




레지스트리 루트키

레지스트리는 다음과 같은 다섯 개의 루트 키로 구성된다.


HKEY_LOCAL_MACHINE  (HKLM)  -  시스템의 전역 설정을 저장한다.


HKEY_CURRENT_USER (HKCU)  -  현새 사용자에 특화된 설정을 저장한다.


HKEY_CURRENT_ROOT  -  정의한 유형 정보를 저장한다.


HKEY_CURRENT_CONFIG  -  현재의 하드웨어 구성 설정, 특히 현재 설정과 표준 설정의 차이를 저장한다.


HKEY_USERS  -  기본 사용자, 새로운 사용자, 현재 사용자의 설정을 정의한다.




가장 자주 사용하는 루트 키는 HKLM과 HKCU다 (이 키는 흔히 약어로 참조한다)

키의 일부는 레지스트리 정보 내부를 참조하는 방식으로 실제는 가상 키다. 예를 들어 HKEY_CURRENT_USER는 실제로 HKEY_USERS\SID에 저장돼 있다. SID는 현재 로그인한 사용자의 보안 식별자다. 예를 들어 자주 사용하는 서브키인 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run은 사용자가 로그인 할 때 자동으로 시작하는 일련의 실행 파일 값을 저장하고 있다. 루트키는 HKEY_LOCAL_MACHINE이며, SOFTWARE, Microsoft, Windows, CurrentVersion, Run 의 서브키를 저장한다.



레지스트리 편집기

레지스트리 편집기(Regedit)는 레지스트리를 보고 설정하는 내장 윈도우 도구다. 서브키를 열어 서브키 내에 있는 값 엔트리를 확인 할 수 있다. 각 값 엔트리는 이름, 유형, 값을 갖고 있다.



자동으로 시작하는 프로그램

Run 서브키에 엔트리를 작성해 자동으로 소프트웨어를 실행하는 방식은 잘 알려져 있다. 은닉 기법이 아니기 때문에 악성코드는 주로 스스로 자동 실행 하는 방식을 사용한다.

Autorun 도구는 운영체제가 시작할 때 자동으로 실행하는 코드를 목록화 한다. 실행 파일, 인터넷 익스플로러와 다른 프로그램으로 로드되는 DLL, 커널로 로드되는 드라이버도 목록화한다. Autorun는 레지스트리에서 자동으로 코드가 실행하게 설계된 25~30군데 위치를 조사하지만, 전체 리스트가 아닐 수도 있다.




일반 레지스트리 함수

악성코드는 시스템이 부팅될 때 자동으로 실행하게 레지스트리를 수정할 목적으로 윈도우 API의 일부인 레지스트리 함수를 사용한다. 다음은 가장 빈번히 사용하는 레지스트리 함수이다.



RegOpenKeyEx

편집과 질의용으로 레지스트리를 오픈한다. 이 함수는 먼저 레지스트리 키를 오픈하지 않고 질의하고 편집할 수 있게 하는데, 대다수 프로그램은 어쨌건 RegOpenKeyEx를 사용한다.


RegSetValueEx

레지스트리에 새로운 값을 추가하고 데이터를 설정한다.


RegGetValue

레지스트리 내의 값 엔트리용 데이터를 반환한다.



악성코드에서 이런 함수들이 보이면 레지스트리 키에 접근함을 식별할 수 있다. 시작 시 실행하기 위해 레지스트리 키를 사용할 뿐 아니라 많은 레지스트리 값이 시스템 보안과 설정에 중요하다. 숫자가 너무 많기 떄문에 여기에 모두 나열할 수는 없고 악성코드가 접근하는 레지스트리 키가 있다면 구글 검색을 통해 확인하자






'Reversing > PMA' 카테고리의 다른 글

Window Functions used in many malwares  (0) 2015.01.24
finding Network codes  (0) 2015.01.24
Process  (0) 2015.01.17
Networking API  (0) 2015.01.17
DLL  (0) 2015.01.15
Posted by af334
이전버튼 1 이전버튼