본문 바로가기

Malware Analysis/- Knowledge storage

win32 API

GetComputerName ( API 모든 출처는 MSDN 아닌 경우 별도 표시)

로컬 컴퓨터의 NetBIOS 이름을 검색하는 함수이다. 이 이름은 시스템 시작시 시스템이 레지스트리에서 읽을 때 설정된다. GetComputerName은 로컬 컴퓨터의NetBIOS 이름 만 검색하기 때문에 DNS 호스트 이름, DNS 도메인 이름 또는 정규화된 DNS 이름을 검색하려면 GetComputerNameEx 함수를 호출해야한다.

 

함수의 원형 :

BOOL WINAPI GetComputerName (
  _Out_ LPTSTR lpBuffer,
  _Inout_ LPDWORD lpnSize
);

 

 

매개 변수 :

lpBuffer : 컴퓨터 이름 또는 클러스터 가상 서버 이름을 수신하는 버퍼에 대한 포인터이다. 버퍼의 크기는 컴퓨터이름의 길이보다 1커야한다.

 

lpnASize : 입력시 버퍼의 크기를 TCHAR로 지정합니다. 출력시, 종료 널 문자를 제외하고 대상 버퍼에 복사 된 TCHAR의 수/버퍼가 너무 작으면 함수가 실패하고 GetLastError가 ERROR_BUFFER_OVERFLOW를 반환합니다.

 

반환값 :

함수가 성공하면 반환 값은 0이 아닌 값입니다.

 

이 함수에 대해서 알아야 할 점 :

※ LPTSTR :  분리해보자면 ...

LP : Long Pointer 현재 LP는 64bit pointer를, VC++6.0과 그 이전 버전에는 32bit pointer를 나타낸다.

T : 자신의 운영체제가 multi-byte환경이면, char 형으로 unicode환경이면, w_char, wide char형으로 type casting이 된다.

STR : String

결론 : char *           !!!!! (즉 버퍼의 주소값을 넘겨주면 되는 것이다.)

 

※ LPDWORD : 요것은 쉽다 Long Point에 DWORD (usinged long) unsinged long * !! (즉, 버퍼의 크기를 주소값으로 넘겨주면 된다. : )  )

(출처 : http://egloos.zum.com/pelican7/v/1768951 )

 


GetLogicalDriveStrings

버퍼를 시스템의 유효한 드라이브를 지정하는 문자열로 채 운다.

 

함수의 원형 :

DWORD WINAPI GetLogicalDriveStr    ings ( _In_ DWORD nBufferLength, _Out_ LPTSTR lpBuffer );

 

 

 

매개 변수 :

nBufferLength : 버퍼의 최대 크기가 기리키는 lpBuffer에 TCHARs. 이 크기에는 종료 널 문자가 포함되지 않는다.

 

lpBuffer : 문자열을 수신하는 버퍼에 대한 포인터와 추가 null 문자가있는 포인터이다.

 

반환값 :

함수가 성공하면 반환 값은 버퍼에 복사 된 문자열의 길이이며, 종료 null문자는 포함되지 않는다. 실패하면 0을 반환한다.

 


 

WIN32_FIND_DATA (구조체)

FindFirstFile, FindFirstFileEx 또는 FindNextFile 함수에서 찾은 파일에 대한 정보가 들어 있다.

 

 

구조체의 원형 :

typedef struct _WIN32_FIND_DATA { DWORD    dwFileAttributes; FILETIME ftCreationTime; FILETIME ftLastAccessTime; FILETIME ftLastWriteTime; DWORD    nFileSizeHigh; DWORD    nFileSizeLow; DWORD    dwReserved0; DWORD    dwReserved1; TCHAR    cFileName[MAX_PATH]; TCHAR    cAlternateFileName[14]; } WIN32_FIND_DATA, *PWIN32_FIND_DATA, *LPWIN32_FIND_DATA;

 

 

멤버 :

dwFileAttributes - 파일의 속성

ftCreationTime - 파일 또는 디렉토리가 작성된시기를 지정 하는 FILETIME

ftLastAccessTime - 파일의 경우 파일이 마지막으로 읽거나, 쓰거나, 실행 파일을 실행 한 시점을 지정, 디렉터리는 작성된 시기 지정

ftLastWriteTime - 파일이 마지막으로 기록되거나, 잘리거나 덮어쓰기 된 시점을 지정

nFileSizeHigh - 파일 크기의 상위 DWORD 값 입니다. 파일의 크기는 nFileSizeHigh * (MAXDWORD +1) + nFileSizeLow와 같다

nFileSizeLow - 파일 크기의 하위 DWORD 값

cFileName - 파일의 이름

cAlternateFileName - 파일의 대체 이름

 


FindFirstFile

 

함수의 원형 :

HANDLE WINAPI FindFirstFile(
  _In_  LPCTSTR           lpFileName,
  _Out_ LPWIN32_FIND_DATA lpFindFileData
);

 

매개 변수 :

lpFileName : 디렉터리 또는 경로 및 파일 이름이다. 파일 이름에는 와일드 카드 문자 * 또는 ?가 포함될 수 있다. 이 매개 변수는 NULL 또는 백 슬래시(\)로 끝나지 않아야 한다. 문자열이 와일드 카드, 마침표 또는 디렉토리 이름으로 끝나면 사용자는 경로의 루트 및 모든 하위 디렉토리에 대한 액세스 권한이 있어야 한다.

 

lpFindFileData : 찾은 파일이나 디렉터리에 대한 정보를받는 WIN32_FIND_DATA 구조체에 대한 포인터

 

반환값 :

함수가 성곡하면 반환 값은 FindNextFile 또는 FindClose에 대한 후속 호출에서 사용되는 검색 핸들이고 lpFindFileData 매개 변수에는 찾은 첫 번째 또는 디렉토리에 대한 정보가 들어 있다. 함수가 실패하거나 lpFileName 매개 변수에서 검색 문자열의 파일을 찾지 못하면 반환값은 INVALID_HANDLE_VALUE이다.

  


CreateProcess 

새 프로세스와 기본 스레드를 작성한다. 새 프로세스는 호출 프로세스의 보안 컨텍스트에서 실행된다. 호출하는 프로세스가 다른 사용자를 가장하는 경우 새 프로세스는 호출 프로세스에 토큰을 사용하고 가장 토큰은 사용하지 않는다. 가장 프로세스 토큰이 나타내는 사용자의 보안컨텍스트에서 새 프로세스를 실행하려면 CreateProcessAsUser 또는 CreateProcessWithLogonW 함수를 사용해야한다.

 

함수의 원형 :

BOOL WINAPI CreateProcess (
  _In_opt_ LPCTSTR lpApplicationName,
  _Inout_opt_ LPTSTR lpCommandLine,
  _In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes,
  _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,
  _In_ BOOL bInheritHandles,
  _In_ DWORD dwCreationFlags,
  _In_opt_ LPVOID lp 환경,
  _In_opt_ LPCTSTR lpCurrentDirectory,
  _In_ LPSTARTUPINFO lpStartupInfo,
  _Out_ LPPROCESS_INFORMATION lpProcessInformation
);

 

매개 변수 :

lpApplicationName [in, 선택 사항] : 실행될 모듈의 이름.