악성코드에 자주 사용되는 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까지 밖에안된다고 들음)

VirtualAlloc함수는 대용량의 메모리를 다룰때 사용한다.



정리가 잘 되어있어서 나름 읽고 재정리



출처: http://vencedor.tistory.com/9 [vencedor]



여기도 정리 잘되어있음

추가 : http://hack4profit.com/archives/204

'Programming > WinAPI' 카테고리의 다른 글

[API함수] WaitForSingleObject  (0) 2017.03.02
WinAPI WinMain과 윈도우 클래스  (0) 2017.02.08
WinAPI 핸들에 대한 이해  (0) 2017.02.08
API란?  (0) 2017.02.08
WinAPI 윈도우의 특징  (0) 2017.02.08


DWORD WINAPI WaitForSingleObject(

  __in  HANDLE hHandle,            //오브젝트 핸들

  __in  DWORD dwMilliseconds    // 타임아웃 시간

);


쉽게말해 어떤 오브젝트가 시그널 상태가 되거나 타임아웃이 되면 제어를 돌려준다.


이게 무슨말이냐면 WaitForSingleObject는 지정한 오브젝트의 현재 상태를 채크를 한다.

그 오브젝트가 비시그널 상태일 때는 호출한 스레드는 대기상태가 되고

오브젝트가 시그널 상태가 되거나 타임아웃 시간이 경과하는 것을 기다린다.


파라미터

hHandle

오브젝트의 핸들을 지정한다.

핸들을 지정할 수 있는 함수의 해설을 참조


핸들이 대기 상태로 있을때에는 그 핸들을 없앴을 경우 그 함수의 동작은 정의되지않는다.

(If this handle is closed while the wait is still pending, the function's behavior is undefined. : 동작을 안한다는 이야기인가? -.-)

Windows NT/2000:이 핸들에 SYNCHRONIZE 억세스 권을 할당해야만 된다. 상세한 내용은  MSDN 라이브러리의 「Standard Access Rights」를 참조


dwMilliseconds

타임아웃 시간을 밀리초(ms)단위로 지정한다.

타임아웃 시간을 경과하면 오브젝트가 비시그널 상태에 있더라도 제어권을 돌려준다.(WaitForSingleObject함수에서 더 이상 대기하지않는다.)

0으로 지정하면 이 함수는 지정된 오브젝트의 상태를 확인하고 바로 다음 행을 실행한다.

INFINITE를 지정하면 오브젝트가 시그널 상태가 될때까지 기다린다.





대강적으로 어떤 스레드를 불러오고 그 스레드가 종료될때까지 기다리는것? 인 것 같다.

'Programming > WinAPI' 카테고리의 다른 글

악성코드에 자주 사용되는 함수목록  (0) 2017.03.04
WinAPI WinMain과 윈도우 클래스  (0) 2017.02.08
WinAPI 핸들에 대한 이해  (0) 2017.02.08
API란?  (0) 2017.02.08
WinAPI 윈도우의 특징  (0) 2017.02.08

Visual Stdio로 코딩을 할때


프로젝트 -> (프로젝트) 속성을 보면


문자 집합으로 2가지가 있을거다



1 멀티바이트 문자 집합

2. 유니코드 문자 집합


그 전에 아스키코드에 대해 알아야 이해하기 쉬울것이다.

아스키코드는 문자를 모르는 컴퓨터를 위해 1Byte단위(8bit)로 128개의 글자와 일부 특수문자들을 매칭시켜놓은 것이라 보면된다.


멀티바이트에 대해서 알아보면

멀티바이트는 1Byte로는 다른 언어를 표시할수가 없었고, 한국어나 일본어 등

영어를 제외한 언어마다 크기를 다르게 할당을 해주는 방식이 만들어야 했고, 이렇게 만들어진 것이 멀티바이트 방식이다.

"hello헬로"라는 문자열 배열은 총 5+4+1(Null)=10Byte가 된다.


근데 멀티바이트에는 문제가 있는게

"A"가 들어가거나 "가"가 들어간 것의 배열의 크기를 다르게 인식하다보니

프로그래밍을 어렵게 만들게 했다. 이 문제를 해결하기 위해 유니코드 방식이 만들어졌고

처음부터 칸을 2Byte로 만들어 이 안에 세상의 모든 글자들을 담을 수 있게 했다.

영어든 타 언어든 무조건 2Byte

1. 문자 인코딩

- 인코딩의 사전적 의미는 코드화, 암호화를 의미한다. 문자 인코딩문자나 기호들의 집합을 컴퓨터에 저장하거나 통신에 사용할 목적으로 부호화 한 것


2. 소개

- 초창기 컴퓨터는 사용자와 기계어로만 소통을 했었고, 당연히 사용과정에서 여러가지 문제가 있었다. 그리고 사람들이 쓰는 문자를 사용할 필요가 있엇끼에 몇몇의 문자와 숫자를 2의 7승개 많큼 1:1대응 시키는 법을 생각했고, 1963년에 최초의 문자 코드라 할 수 있는 아스키 코드가 만들어졌다.

아스키 코드를 쓰면서 세상의 모든 문자를 다 담기에는 부적절했고, 지금 현재는 다양한 언어의 다양한 문자인코딩 방식이 존재한다.


잘 알려진 한국어의 문자열 인코딩은 KS X 1001, ECU-KR 이 있다.


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

2017.03.26 추가


유니코드 코드 포인트를 8비트 숫자의 집합으로 나타내는 UTF-8이나, 

16비트 숫자의 집합으로 나타내는 UTF-16도 일반적인 문자열 인코딩에 속한다.


UTF-8 : 유니코드 인코딩 중 하나, 문자열을 8bit기반으로 저장


★ UTF-16 : UTF-8과 마찬가지로 16이니까 16bit으로 저장. 이 16bit으로 문자를 저장해서 한글도 2byte로 저장할 수 있다.

  다만 이게 ANSI와 호환이 안되고 2바이트라서 리틀엔디안,빅엔디안 개념이 필요해진다.

  Notepad에서 텍스트파일 저장시 유니코드가 바로 UTF-16이다.


EUC-KR : ANSI를 한국에서 확장한 것

1. WinMain함수


int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow)

- hInstance : 프로그램의 인스턴스 핸들

- hPrevInstance : 바로 앞에 실행된 현재 프로그램의 인스턴스 핸들

없는 경우에는 NULL이 되어야하며 Win32에서는 항상 NULL

- lpCmdLine : 명령행으로 입력된 프로그램 인수. DOS의 argv에 해당

- nCmdShow : 프로그램이 실행될 형태 / 최소화, 보통모양 등이 전달




2. 윈도우 클래스

윈도우 클래스는 windows.h에 정의되어있는 구조체이다.


typedef struct tagWNDCLASS

{

    UINT        style;

    WNDPROC     lpfnWndProc;

    int         cbClsExtra;

    int         cbWndExtra;

    HINSTANCE   hInstance;

    HICON       hIcon;

    HCURSOR     hCursor;

    HBRUSH      hbrBackground;

    LPCSTR      lpszMenuName;

    LPCSTR      lpszClassName;

} WNDCLASS;


- style : 윈도우의 스타일을 정의

- lpfnWndProc : 메시지가 발생할 때마다 여기에 지정된 함수가 호출됨

- cbClsExtra, cbWndExtra : 윈도우가 내부적으로 아주 특수한 목적에 사용되는 공간. 사용되지 않으면 0으로 지정

- hInstance : 윈도우의 클래스를 사용하는 프로그램의 번호

- hIcon, hCursor : 윈도우가 사용할 마우스와 출력되는 아이콘을 정함.

- hbrBackground : 윈도우의 배경색상 정의, 보통 GetStockObject라는 함수를 사용하여 윈도우에서 기본적으로 제공하는 브러쉬를 사용

- lpszMenuName : 프로그램이 사용할 메뉴 지정

- lpszClassName : 윈도우 클래스의 이름을 정의. CreateWindow함수에 전달되며 

CreateWindow함수는 윈도우 클래스에서 정의한 값을 참조하여 윈도우를 생성한다

'Programming > WinAPI' 카테고리의 다른 글

악성코드에 자주 사용되는 함수목록  (0) 2017.03.04
[API함수] WaitForSingleObject  (0) 2017.03.02
WinAPI 핸들에 대한 이해  (0) 2017.02.08
API란?  (0) 2017.02.08
WinAPI 윈도우의 특징  (0) 2017.02.08

+ Recent posts