336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

ntoskrnl.exe

- kernel image, 윈도우NT 커널 공간의 커널과 익스큐티브 계층을 제공한다.

- ntdll.dll이 아니라 bootvid.dll, hal.dll, kdcom.dll에 링크되어 있다.(약 2MB)

- 캐시 매니저, 익스큐티브, 커널, 보안 참조 모니터, 메모리 관리자, 스케쥴러를 포함한다.

- 4개의 커널 이미지 파일들이 존재한다.

  ntoskrnl.exe

  ntkrnlmp.exe, smp지원

  ntkrnlpa.exe, pae지원

  ntkrpamp.exe, smp/pae지원


ntoskrnl의 루틴들은 이름에 그들이 정의된 ntosknl의 구성 요소를 가르키는 접두어를 사용한다.

Cc 파일 시스템 캐시
Csr Win32 하위 시스템 프로세스(csrss)와 통신할 때 사용되는 함수들
Dbg 소프트웨어 브레이크포인트 같이 디버깅을 지원하는 함수들
Ex Ntoskrnl.exe의 외부 층인 윈도우 익스큐티브
Exp 전용 윈도우 익스큐티브 : 밖으로 내보내지지 않는 익스큐티브 층 내부의 루틴들 (p = private)
FsRtl 파일 시스템 런타임 라이브러리
Io 입출력 관리자
Ke 핵심 커널 루틴들
Ki 커널 외부에로 내보내어지지 않는 커널 내부의 루틴들 (i = internal)
Ks 커널 스트리밍
Ldr PE 파일 관리를 위한 로더 함수들
Lpc 로컬 프로시저 호출 (내부의 문서화되지 않고 프로세스사이 또는 사용자/커널 메시지 교환 메커니즘에 사용)
Lsa 로컬 보안 인증
Mi 메모리 관리자에 의한 호출을 위해 내보내지지 않은 메모리 관리 함수들
Mm 메모리 관리
Nls 네이티브 언어 지원
Ob 객체 관리자
Pfx 접두어 관리
Po P&P와 전력 관리
Ps 프로세스와 스레드 관리
Rtl 런타임 라이브러리. 이것은 네이티브 응용 프로그램에서 사용될 수 있는 많은 유틸리티 함수들을 포함하지만 직접적으로 커널 지원하지는 않는다.
Se 보안
Vf 드라이버 확인 프로그램
Vi 드라이버 확인 프로그램에 의한 호출을 위해 내보내지지 않는 드라이버 확인 루틴들
Zw Nt 또는 Zw 는 ntdll.dll과 ntoskrnl..exe에서 정의된 시스템 호출이다.

- 사용자 모드의 ntdll.dll에서 호출될 경우, 여기에 속한 함수들은 거의 똑같은 행동을 한다.

- 커널 모드로 들어가 SSDT를 통해 ntoskrnl.exe의 대응되는 함수를 호출한다.

- ntoskrnl.exe에서 직접적으로 호출될 경우(커널 모드에서만 가능), Zw는 커널 모드라는 것을 보장하지만 Nt는 아니다.



'Analysis > API' 카테고리의 다른 글

GetTickCount를 이용한 안티 디버깅  (0) 2016.04.15
안티 디버깅  (0) 2016.04.11
악성코드에 자주 사용되는 API 함수  (1) 2016.04.07
GetEnvironmentVariable - 환경변수 호출  (0) 2016.04.05
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
GetTickCount를 이용한 디버깅 탐지

특정 루틴 시작 전과 후의 시간 값을 측정하여 차이를 확인하고 Debugger가 존재하는 지 확인
악성코드에서 안티 디버깅으로 흔히 사용된다.


 #include <windows.h>
 #include <stdio.h>
 #pragma comment(lib, "winmm.lib") 
 BOOL anti_debug(DWORD count1) 
 { 
 	DWORD count2; 
 	count2 = GetTickCount(); 
 	if ((count2-count1) > 0x10) { 
 		return 1; 
 	} 
 	return 0; 
 } 
 
 int main(int argc, char **argv) 
 { 
 	DWORD count1; 
 	count1 = GetTickCount(); 
 	if(anti_debug(count1)) 
 		printf("Debugger Detected\n"); 
 	else 
 		printf("No Debugger...\n"); 
 	return 0; 
 } 


336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
API BASED ANTI-DEBUGGING
IsDebuggerPresent
CheckRemoteDebuggerPresent
OutputDebugString
FindWindow
Registry Key
NtQueryInformationProcess (ProcessDebugPort)
NtSetInformationThread Debugger Detaching
Self Debugging with DebugActiveProcess
NtQueryInformationProcess (ProcessDebugObjectHandle)
OllyDbg OutputDebugString() Format String
SeDebugPrivilege OpenProcess
OllyDbg OpenProcess String Detection
OllyDbg Filename Format String

 

DIRECT PROCESS AND THREAD BLOCK DETECTIONS

IsDebuggerPresent Direct PEB
IsDebuggerPresent Set/Check
NtGlobalFlag
Vista TEB System DLL Pointer
PEB ProcessHeap Flag Debugger
LDR_Module

 

HARDWARE AND REGISTER BASED DETECTION

Hardware Breakpoints
VMware LDT Register Detection
VMware STR Register Detection

 

TIMING BASED DETECTIONS

RDTSC
NTQueryPerformanceCounter
GetTickCount
timeGetTime

 

MODIFIED CODE DETECTION

CRC Checking

 

EXCEPTION BASED DETECTION

INT 3 Exception (0XCC)
INT 2D (Kernel Debugger Interrupt)
ICE Breakpoint
Single Step Detection
Unhandled Exception Filter
CloseHandle
Control-C Vectored Exception
Prefix Handling
CMPXCHG8B and LOCK
OllyDbg Memory Breakpoint
VMware Magic Port
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

악성코드에 자주 사용되는 API 함수


DLL Injection에서 사용되는 API //특정 프로세스에 DLL Injection 실행
OpenProcess  
VirtualAllocEx
WriteProcessMemory
LoadLibraryA
GetProcAddress
CreateRemoteThread

Resource 섹션에 있는 리소스 사용 API //Resource 섹션에 암호화된 데이터를 해제하여 메모리에 기록
LoadResource  
SizeofResource
LockResource
FreeResource
FindResourceA

특정 파일 이름 확인 //특정한 이름의 파일을 읽고, 생성하고, 기록하고, 복사
WriteFile   
lstrcmpiA
ReadFile
DeleteFileA
CreateFileA
CopyFileA
CreateProcessA
FindFirstFileA

레지스트리에 관련 API //레지스트리에 특정한 키의 생성과 삭제가 이루어짐
RegSetValueExA  
RegEnumValueA
RegDeleteKeyA
RegCreateKeyExA
OpenProcessToken

암호화와 관련된 API //Resource 섹션에 암호화된 데이터를 해제하여 어딘가에 기록
CryptCreateHash
CryptHashData
CryptGetHashParam
CryptAcquireContextA


-------------------------------------------------------------------------------------------------------

File 관련 API
WriteFile  
ReadFile
CreateFile
CopyFile
MoveFile

Thread 관련 API
LoadLibrary 
CreateThread
ResumeThread
CreateRemoteThread

로깅 관련 API
Mouse_event 
Keybd_event
GetAsyncKeyState

Internet 관련 API
internetWriteFile
InternetConnect  

네트워크 관련 API
WSAStartup  
Gethostbyname
Gethostbyaddr
Socket
Send Recv
Inet_addr

FTP 관련 API
FtpOpenFile
FtpGetFileSize

기타 API 함수 목록
CreateMutex
capCreateCaptureWindows
ClientToScreen


메모리 관련 함수
VirtualAlloc() //가상 메모리 할당
VirtualFree() //가상 메모리 해제
VirtualProtect() // 메모리 보호 설정 값 변경



-------------------------------------------------------------------------------------------------------

GetModuleFileName
- 현재 실행되고 있는 위치 구한다.


GetKeyboardType
- 현재 키보드 타입을 구한다.


GetLocaleinfo
- 현재 설정되어 있는 국가/지역에 대한 정보를 구한다.

CreateFile
- 핸들값 반환 받는다.


WriteFile
- 핸들 값 받아서 파일을 쓴다. //CreateFile로 반환받은 핸들값을 통해 파일을 쓴다.(파일 수정/변조 등)


SetFileAttributes
- 파일의 속성을 바꾼다.

GetTempPathA
- 경로 탐색 API


CreateFileA
- 파일 생성 API


Shellexecute

WinExec
- 생성 파일 실행 센스 API

GetStartupInfoA
GetModuleHandleA
- 파일의 위치를 구할 때 사용


RegopenKeyExA
- 레지스트리를 열어볼 때 사용

CopyFileA
- 파일을 폴더로 복사시키는 역활

CreateServiceA
- 서비스등록


CreateProcessA
- Cmd로 자가 삭제


FindResourceA
- 리소스 찾기


SizeofResource
- 크기검색


SizeofResource
- 첫 바이트 획득


-------------------------------------------------------------------------------------------------------


VMWARE
- magic_num : VMXh


VirtualBox
- \\\.\\VBoxMiniRdrDn
- VboxHook.dll


GetLogicalDrives

- 드라이브 찾기


GetDiskFreeSpaceExW

- 용량 정보를 가져온다. (VM의 경우 보통 20G)


-------------------------------------------------------------------------------------------------------

GetTickCount()
DWORD GetTickCount(VOID); // OS 부팅 후 msec(1/1000초) 단위로 시간을 돌려주는 함수
윈도우즈가 부팅된 후 1초에 1000씩 틱 카운트를 증가 시킨다.
카운트는 32비트값이므로 최대 49.7일간의 카운트를 유지할 수 있다.
특정 루틴 시작 전과 후의 시간 값을 측정하여 차이를 확인하고 Debugger가 존재하는 지 확인 .(SUB 명령어를 통해 비교)


-------------------------------------------------------------------------------------------------------

참고
malloc()의 경우 할당할 수 있는 메모리블럭의 크기에는 한계가 있다.(약 256MB)
(new, delete연산자도 결국 malloc(), free()를 호출해서 메모리를 잡고 풀어준다. 결국 new나 malloc()나 같다.)
VirtualAlloc()함수는 대용량의 메모리를 다룰때 사용한다.
윈95/98 기준으로 프로세스는 4기가 주소공간을 할당 받는다.
이중 실제 응용프로그램이 사용 가능한건 2GB이며, 주소공간은 단지 주소공간일뿐 실제 물리메모리에 로드되는건 아니다.
커밋을 시켜야 물리메모리에 해당 주소공간에 할당된다.
VirtualAlloc() 으로 메모리를 할당-사용-해제하는 절차는 아래와 같다.
  1) 프로세스 주소공간 내에 일정주소공간 예약(Reserve). (이 주소공간은 다른 할당루틴이 사용불가능)
  2) 해당 주소공간중 실제 사용할 부분에 물리적 메모리(보조기억장치, RAM 등...)를 매핑(Commit)
  3) Commit된 부분에 대하여 메모리 사용(Commit되지 않은 부분을 사용하면 페이지폴트 발생)
  4) 주소공간에 매핑된 물리적 메모리를 해제(Decommit), 이때 데이터는 소멸된다.
  5) 할당했던 주소공간 해제(Release). 이제 이 주소공간은 다른 할당루틴이 사용가능
Commit된 영역의 데이터에 대한 캐싱은 시스템에서 한다. 캐싱을 못하게도 할 수도 있다.
malloc()으로 할당한 블럭은 페이지 단위로 나뉘고, 실제 페이지가 사용되는 시점에 해당 페이지가 자동으로 Commit 된다.
만약 RAM의 용량을 넘어서는 페이지들이 사용되면 적절한 페이지들이 보조기억장치(하드디스크의 가상메모리)로 페이지아웃
그리고 Free()를 호출하면 연쇄적으로 Decommit, Release 된다.


추가 확인------------------------------------------------------------------------------------------------

GetFileAttributesW
NtCreateFile
GetFileType
SetFilePointer
NtWriteFile
GetFileAttributesW
SetFileAttributesW





336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

DWORD WINAPI GetEnvironmentVariable( __in LPCTSTR lpName, //환경변수이름 __out LPTSTR lpBuffer, //환경변수를 담을 버퍼, null-terminating 문자를 포함 최대 "32,767"의 크기 제한이 있다. __in DWORD nSize );


시스템 환경 변수 위치
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\control\session Manager\Enviroment


사용자 환경 변수 위치
HKEY_CURRENT_USER\Environment


환경변수 가져오기
int nSize = ::GetEnvironmentVariable("TEMP", NULL, NULL);
TCHAR* buffer = new TCHAR[nSize +1];
GetEnvironmentVariable("TEMP",buffer, nSize);
// 만약 버퍼의 크기가 변수의 크기보다 작다면 0이 리턴 되므로 버퍼의 크기를 nSize만큼 얻어와야 한다.


환경변수 설정하기
SetEnvironmentVariable("TEMP", "C:\\tmp");


환경변수 지우기

SetEnvironmentVariable("TEMP", NULL);


+ Recent posts