typedef struct _IMAGE_SECTION_HEADER{ 

BYTE Name[IAMGE_SIZEOF_SHORT_NAME];

union{

DWORD    PhysicalAddress;

DWORD    VirtualSize;

}Misc;

DWORD    VirtualAddress;

DWORD    SizeOfRawData;

DWORD    PointerToRawData;

DWORD    PointerToRelocations;

DWORD    PointerToLinenumbers;

WORD     NumberOfRelocations;

WORd     NumberOfLinenumbers;

DWORD    Characteristices;

}IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;



RAW = RAV - VirtualAddress + PointerToRawData


'System > Windows' 카테고리의 다른 글

세션종료 메세지 WM_QUERYENDSESSION  (0) 2012.09.26
MSG Struct  (0) 2012.09.18
DLL 암시적 연결 & 명시적 연결  (0) 2012.08.23
DLL  (0) 2012.08.21
visual studio DLL complie  (0) 2012.08.21
실행파일에서 DLL의 함수를 호출하는 방법에는 다음 두가지가 존재한다.

암시적연결

함수가 어느 DLL에 있는지 밝히지 않고 그냥 사용함. 프로젝트에 임포트 라이브러리를 포함해야 하며 윈도우즈는 임포트 라이브러리의 정보를 참조하여 알아서 DLL을 로드하고 함수를 찾는다. 클라이언트 프로그램이 로드 될 떄 LL이 같이 로드되거나 이미 DLL이 로드되어 있으면 사용 카운트를 1증가시킨다. 클라이언트 프로그램이 실행될 떄 DLL이 로드되므로 실행시 연결이라고 함.


명시적 연결


어느 DLL에 있는 함수인지를 밝히고 사용하는 방법이다. 클라이언트 프로그램이 실행될 때 DLL이 로드되는 것이 아니라 로드하라는 명령이 있을 때 로드된다. 필요할 때 선택적으로 DLL을 로드하므로 상황에 따라 리소스 교체가 가능하며 함수가 속해있는 DLL의 이름을 명시적으로 지정하여 호출하므로 임포트 라이브러리는 불필요하다. 클라이언트 프로그램 실행중에 DLL이 메모리로 읽혀지므로 실행중 연결이라고 한다.


--출처 : 윈도우즈 API 정복


위 방법 중에 암시적연결을 한번 해보자.


전에 포스팅 했던 대로 DLL 프로젝트를 하나 연다음에(DLL Project & complie)


사진과 같이 써주고 컴파일을 하면


위와 같이 DLL파일과 lib파일이 만들어 진것을 볼수 있다.

DLL에서는 제공하고자 하는 함수의 정보를 밖으로 공개해 놓아야 하며 이를 export라 하고 클라이언트에서 이 함수를 사용하는 것을 import라고 한다.

즉 함수를 제공하는 측은 선언을 해야 하는데 __declspec함수가 이 기능을 한다.


__declspec(extended-attribute) declarator 

__declspec함수는 괄호안에 4가지의 인수를 가질 수 있고 그 인수는 다음과 같다.


thread : TLS(Thread Local Storage)데이터로 지정한다. 이 지정자가 붙은 변수는 해당 스레드에서만 사용가능


naked : prolog,epilog,를 생성하지 않고, 어셈블리 언어를 사용하여 직접 prolog ,epilog를 달고자 할 때 사용한다.


dllimport : DLL에 있는 데이터, 오브젝트 함수를 임포트한다. DLL에 있는 이렇게 생긴 함수를 앞으로 사용하겠다는 선언이다.


dllexport : DLL에 있는 데이터, 오브젝트,함수를 엑스포트한다. DLL을 사용하는 클라이언트에게 DLL의 정보를 명시적으로 제공하는 역할을 한다.

이제 새로운 cpp 프로젝트를 하나 만들고


#include<Windows.h>


extern "C" __declspec(dllimport) int add(int a, int b);


LRESULT FAR PASCAL WndProc(HWND, UINT, UINT , LONG);


int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)

{

static char szAppName[]="Hello Win";

MSG msg;

HWND hwnd;

WNDCLASS wndclass;


if(!hPrevInstance)

{

wndclass.style = CS_HREDRAW | CS_VREDRAW;

wndclass.lpfnWndProc=WndProc;

wndclass.cbClsExtra = 0;

wndclass.cbWndExtra = 0;

wndclass.hInstance = hInstance;

wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION);

wndclass.hCursor = LoadCursor(NULL,IDC_ARROW);

wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);

wndclass.lpszMenuName = szAppName;

wndclass.lpszClassName = szAppName;


RegisterClass(&wndclass);

}

hwnd = CreateWindow(szAppName,"Hello Win Demo",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);

ShowWindow(hwnd,nCmdShow);

UpdateWindow(hwnd);

while(GetMessage(&msg,NULL,0,0))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

return msg.wParam;

}


LRESULT FAR PASCAL WndProc(HWND hwnd, UINT message, UINT wParam, LONG lParam)

{

HDC hdc;

PAINTSTRUCT ps;

RECT rect;

char str[128];

static HINSTANCE hinstDll;

static HHOOK hKeyHook;

static int count =0;


switch(message)

{

case WM_PAINT:

hdc = BeginPaint(hwnd,&ps);

GetClientRect(hwnd,&rect);

DrawText(hdc,"hello,Windows!",-1,&rect,DT_SINGLELINE | DT_CENTER | DT_VCENTER);

EndPaint(hwnd,&ps);

return 0;

case WM_LBUTTONDOWN:

wsprintf(str,"1+2 = %d",add(1,2));

MessageBox(NULL,str,"result",MB_OK);

return 0;

case WM_DESTROY:

PostQuitMessage(0);

return 0;

}

return DefWindowProc(hwnd,message,wParam,lParam);

}


위 소스를 입력해주고 컴파일 하면 완료!인 줄 알았지만 ㅠㅠ

아무런 설정도 안해줬기 때문에 우리의 DLL을 찾을수가 없다.따라서



솔루션 탐색기에서 프로젝트에서 우클릭하고 속성에서 


링커 밑에 Input에 첫번째에 다음과 같이 아까만들었던 lib파일 이름을 적어준다.

그리고 만들어졌던 dll파일과 lib파일을 우리가만들고 있는 프로젝트 소스파일과 같이 놔주면 된다. 



컴파일한후에 실행하면....



윈도우 창이 뜬다

WndProc에 설정했던 LBUTTONDOWN을 실행시키면(마우스 좌클릭)



dll에 있는 add함수를 실행하여 3이란 결과값을 가져온후에 실행파일에 있는대로 MessageBox를 띄운다.! ㅠㅠ 



명시적 연결


#include<Windows.h>

#pragma comment(lib,"dll.dll")


LRESULT FAR PASCAL WndProc(HWND, UINT, UINT , LONG);


int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)

{

static char szAppName[]="Hello Win";

MSG msg;

HWND hwnd;

WNDCLASS wndclass;


if(!hPrevInstance)

{

wndclass.style = CS_HREDRAW | CS_VREDRAW;

wndclass.lpfnWndProc=WndProc;

wndclass.cbClsExtra = 0;

wndclass.cbWndExtra = 0;

wndclass.hInstance = hInstance;

wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION);

wndclass.hCursor = LoadCursor(NULL,IDC_ARROW);

wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);

wndclass.lpszMenuName = szAppName;

wndclass.lpszClassName = szAppName;


RegisterClass(&wndclass);

}

hwnd = CreateWindow(szAppName,"Hello Win Demo",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);

ShowWindow(hwnd,nCmdShow);

UpdateWindow(hwnd);

while(GetMessage(&msg,NULL,0,0))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

return msg.wParam;

}


LRESULT FAR PASCAL WndProc(HWND hwnd, UINT message, UINT wParam, LONG lParam)

{

HDC hdc;

PAINTSTRUCT ps;

RECT rect;

char str[128];

static HINSTANCE hdll;

static HHOOK hKeyHook;

static int count =0;

int (*pFunc)(int,int);

switch(message)

{

case WM_PAINT:

hdc = BeginPaint(hwnd,&ps);

GetClientRect(hwnd,&rect);

DrawText(hdc,"hello,Windows!",-1,&rect,DT_SINGLELINE | DT_CENTER | DT_VCENTER);

EndPaint(hwnd,&ps);

return 0;

case WM_LBUTTONDOWN:

hdll=LoadLibrary("dll.dll");

pFunc=(int (*)(int,int))GetProcAddress(hdll,"add");

wsprintf(str,"1+2 = %d",(*pFunc)(1,2));

MessageBox(NULL,str,"result",MB_OK);

    FreeLibrary(hdll);

return 0;

case WM_DESTROY:

PostQuitMessage(0);

return 0;

}

return DefWindowProc(hwnd,message,wParam,lParam);

}


위 암시적 연결과 기능은 똑같지만 명시적으로 연결하는 소스이다.


#pragma comment(lib."dll.lib");


이 지시자는 컴파일러의 라이브러리 관리 모듈에게 dll.lib를 검색해 보도록 하는 명령이다. 소스에서 곧바로 임포트 라이브러리를 지정할 수 있어 편리함.


HINSTANCE LoadLibrary(LPCTSTR lpLibFileName);


이 함수는 지정한 DLL을 메모리로 읽어와 현재 프로세스의 주소 공간에 맵핑시켜 사용할 수 있도록 하되 DLL이 이미 메모리에 올라와 있는 상태라면 사용 카운트만 1증가시킨다. 

DLL을 읽어오는데 성공하면 DLL의 모듈 핸들을 리턴하며 이 핸들은 GetProcAddress함수에서 사용된다. 에러 발생시 NULL 리턴.


FARPROC GetProcAddress(HMODULE hModule, LPCSTR lpProcName);


DLL에서 엑스포트한 함수의 번지를 찾아 그 함수의 함수 포인터를 리턴한다. 첫 번째 인수hModule은 함수가 포함된 DLL의 모듈핸들이고 LoadLibrary 함수가 리턴한 값이다.두번째 lpProcName은 찾고자 하는 함수의 일므을 지정함.


BOOL FreeLibrary(HMODULE hLibModule);


DLL 카운터를 1감소시키며 사용 카운트가 0이 되었을 경우 메모리에서 DLL을 삭제한다. 

'System > Windows' 카테고리의 다른 글

MSG Struct  (0) 2012.09.18
PE struct  (0) 2012.08.30
DLL  (0) 2012.08.21
visual studio DLL complie  (0) 2012.08.21
Message HOOK - Window  (0) 2012.08.20

DLL ?

DLL은  dynamic link library의 약자로 동적 링크 라이브러리를 뜻한다. 초기에 여러 프로그램을 실행할때 메모리가 부족하게 되었다고 했다. 그래서 생각해낸 대안으로 DLL이 나오게 되었는데, DLL은 평소 중요하지 않은 것들을 저장해놓고 필요할때마다 불러 쓰는 원리를 이용한 것이다. 


예를들어 C에서 stdio.h 파일을 포함하여 컴파일은 한다. stdio.h 헤더파일 안에는 scanf, printf등과 같은 함수들이 있고, 필요한 기능들이 실행파일에 합쳐져 실행파일의 크기가 증가하게 된다. 그런데 만일 이 헤더파일을 include하지 않고 모든 프로그램마다 일일이 써준다고 생각한다면, 헤더파일의 크기를 만일 10KB라고 했을때 10개의 프로그램을 동시에 실행시키면 최소한 100KB가 나온다.(10개*10KB) 하지만 include함으로써 10개를 실행시키든 100개를 실행시키든 10KB의 메모리가 필요하고 나머지 프로그램에서는 필요할때마다 stdio.h에서 함수를 가져다 사용하면 되는 것이다.



MS는 윈도우의 모든 기능을 DLL에 담아 배포하며, 이렇게 운영체제의 기능을 DLL에 담아 배포하고 프로그램이 동적으로 연결해 사용하는 방식을 WinAPI라고 한다. 또한 DLL이 C함수와 같은 방식이기 때문에 WinAPI는 기본적으로 C언어를 표준으로 사용함.


DLL은 두가지 형태로 프로그램에 링크된다.

바로 정적링크와 동적링크인데, 먼저 정적링크를 알아보자.


정적링크 : Lib로 빌드되며 프로그램 빌드시에 같이 빌드가 되면서 해당 프로그램의 일부가 된                  다. 속도는 동적링크보다 빠르지만 크기가 커진다는 단점이 존재하며, 공유하지 않음. 프로그램 빌드시에 프로그램에 포함되기 때문에 실행할때 LIB의 필요가 없다.


동적링크 : DLL로 빌드되며 프로그램의 빌드시에 DLL안의 함수선언만 있으면 된다.속도가 정적링크보다는 느리지만 메모리의 효율성이 높다. 여러 프로그램이 DLL의 함수를 공유해서 쓰게 된다. 공유메모리 공간에 따로 할당이 되며 프로그램안에 포함되는게 아니라 실행시카다 DLL파일이 필요하다.



만일, 어떤프로그램을 작성할 때 DLL함수를 가져다가 쓰고 싶다면 DLL에서 Export되어 있는 함수가 있어야한다. 그래야 프로그램에서 import하여 프로그램에서 쓸수 있다.


ex)

extern "C" __declspec(dllexport) void function();

라고 DLL에서 선언해야 하며


쓰고자 하는 프로그램에서는

extern "C" __declspec(dllimport) void function();

과 같이 선언해야 한다.


※__declspec(extended-attrivute) declarator 는 함수에 대한 정보를 제공하는 선언문이다. export, import하는 함수들은 모두 이 선언문 뒤에 나올수 있다.


프로그램이 DLL을 찾는 경로

1) 본프로그램이 있는 디렉토리

2) 프로그램을 실행한 디렉토리

3) 윈도우즈의 시스템 디렉토리

4) 윈도우즈 디렉토리



'System > Windows' 카테고리의 다른 글

PE struct  (0) 2012.08.30
DLL 암시적 연결 & 명시적 연결  (0) 2012.08.23
visual studio DLL complie  (0) 2012.08.21
Message HOOK - Window  (0) 2012.08.20
CreateProcess  (2) 2012.08.03

DLL injection을 공부하면서 DLL 소스에 대해 이해도 할겸 이런저런 소스도 구해서 해석도 해보다가 DLL컴파일방법에 대한 자세한 포스팅이나 방법이 안나와있길래 글올려봅니다~


visual studio 2010 에서 

New Project 에 들어갑니다~


계속해서 사진대로 오시면 되요


Win32 Project 를 눌러주시고 프로젝트 이름을 정해준다음에 OK를 눌러주시면 창이 하나 뜹니다.



위와 같은 창이 뜨는데 여기서 Finish가 아닌 Next> 입니다.



여기서 중요한데요 기본적으론 Windows application에 체크가 되어 있습니다. 이걸 DLL에 체크를 해주시면 되요 ㅎ 그리고 Finish ~!




이제 원하는 소스를 입력하시고 컴파일은 일반 C언어와 같은 Ctrl + F5 입니다~

모를땐 되게 해멧는데 막상 한번하고나면 별거 아니죠?ㅠㅠ 

컴파일 방법도 알았겠다 다시 열공

'System > Windows' 카테고리의 다른 글

DLL 암시적 연결 & 명시적 연결  (0) 2012.08.23
DLL  (0) 2012.08.21
Message HOOK - Window  (0) 2012.08.20
CreateProcess  (2) 2012.08.03
파일복사 api  (0) 2012.08.02

메세지 후킹은 키보드나 마우스로 입력할 떄 이를 가로채는 기술을 말한다.



윈도우에서 발생하는 키보드 혹은 마우스 입력은 메시지 형태로 다루어진다. 

이를 위해선 User32.dll, GDI32.dll , Kernel32.dll 위 세가지가 필요하다.



                      <윈도우 3대 핵심 DLL>


위 그림과 같이 User32.dll은 대부분 사용자 입력을 받는 역할을 하고 GDI는 어디엔가 결과를 표현하는 역할을 하며, kernel 은 실행을 위한 쓰레드 관리, 메모리 관리 등을 담당한다.

키보드나 마우스로부터 입력에 대한 신호가 오면 디바이스 드라이버는 프로그래머가 다룰수 있는 API로 프로그래밍 할 수 있도록 메시지로 변환 시켜준다.


프로세스가 다른 프로세스의 영역을 함부로 건드릴 수 없다는 것은 기본적으로 알고 있는 사실일 것이다. 메시지 후킹을 하기 위해서는 Hook프로세스가 다른 프로세스에게 가는 메시지를 가로채야 하는데 이를 위해 DLL형태로 담아야 한다.

이유는 DLL은 공유데이터에 로드되고 같이 읽히기 때문에 다른프로세스영역을 침범하기 때문이다.


메세지를 처리하는 방식에는 두가지가있다.


GetMessage();

PeekMessage();


비슷한 함수이지만, GetMessage함수는 메세지를 가져올 때까지 계속 대기한다. 하지만 PekkMessage함수는 메시지가 없어도 리턴을 해버린다. 가져올 메시지가 없으면 바로 윈도우로 제어를 다시 넘기기 때문에 다른 루틴을 실행할 수 있다.


또한, 메세지를 보낼 때는 다음과 같은 형태를 취하게 된다.

LRESULT SendMessage(

HWND hwnd,

UINT Msg,

WPARAM WParam,

LPARAM lParam

);


SendMessage는 메시지를 보내고 결과를 가져와서 사용해야 할때 이용한다. 결과값을 얻어와야 하기 때문에 메시지를 받은 측에서 리턴할때까지 기다린다.



BOOL PostMessage(

HWND hwnd,

UINT Msg,

WPARAM wParam,

LPARAM lParam

);

메시지 큐에 메시지를 추가해 놓고 바로 리턴함.


만일, 키보드에서 키하나를 누른다면, WM_KEYDOWN 메시지가 발생하고, 이것을 GetMessage가 받으면 시스템은 입력받은 가상 키 정보를 캐릭터 타입으로 변환하여 리턴 하며, TranslateMessage는 메시지큐에 WM_CHAR를 넣는다.따라서 키입력시 발생하는 메시지 순서는,


WM_KEYDOWN

WM_CHAR

WM_KEYUP


이다. 이런 흐름을 바꾸는 기술을 메시지 훅이라고 한다.

메시지 후킹을 하기 위한 윈도우 가장 핵심적인 함수는 SetWindowsHookEx();이다.


SetWindowsHookEx(

int idHook;

HOOKPROC lpfn,

HINSTANCE hMod,

DWORD dwTreeadID

);


idHook : 훅의 종류를 결정한다.

WH_CALLWNDPROC - SendMessage로 누군가에게 메시지를 보낼때 누군가가 WH_CALLWNDPROC를 걸어놓았는지를 확인한다. 누군가 걸었다면 해당 훅 프로시저를 호출함.


WH_CALLWNDPROCRET - 첫번쨰 옵션과는 반대로 메시지를 보내고 나서 훅을 건 녀석이 있는지 확인하고 있으면, 훅 프로시저를 부른다. WH_CALLWNDPROC는 메시지 값을 조작하기 위해 윈도우로 메시지가 가기 전에 가로채는 일이 많다.


WH_GETMESSAGE - 윈도우에 와 있는 메시지를 GetMessage나 PekkMessage등으로 가져가려고 할 때 사용한다.


WH_KEYBOARD - 입력 포커스가 없어도 키 입력을 가로챔.


WH_JOURNALRECORD 

WH_JOURALRECORDPLAYBACK



'System > Windows' 카테고리의 다른 글

DLL  (0) 2012.08.21
visual studio DLL complie  (0) 2012.08.21
CreateProcess  (2) 2012.08.03
파일복사 api  (0) 2012.08.02
WinAPI 레지스트리  (0) 2012.07.27

리눅스에는 fork();함수도 있고 execl();도 있는데... 

윈도우에서 프로세스에서 다른 프로그램을 실행시키려고 하니까 fork();가 없구 그래서 CreateProcess API를 사용해야 한다네요 ㅠㅠ


일단 CreateProcess 함수부터 살펴봅시다.!


BOOL CreateProcess(

LPCTSTR lpApplicationName,    //생성프로세스의 실행파일 이름

LPTSTR lpCommandLine,    //argc,argv인자 전달, 첫인자를 NULL로 주고 실행파일이름 인자 써도 가능

LPSECURITY_ATTRIBUTES lpProcessAttributes,    //보안속성 보통NULL

LPSECURITY_ATTRIBUTES lpThreadAttributes,    //쓰레드 보안속성 보통NULL

BOOL blnheritHandles,    //전달인자가 TRUE면 자식프로세스는 부모의 핸들중일부상속

DWORD dwCreationFlags,    //프로세스의 특성결정

LPVOID lpEnvironment,    //메모리 블록관리 문자열저장.

LPCTSTR lpCurrentDirectory,    //생성하는 프로세스의 현재 디렉터리 설정

LPSTARTUPINFO lpStartupinfo,    //STARTUPINFO 구조체 변수 포인터

LPPROCESS_INFORMATION lpProcessinformation);//PROCESS_INFORMATION 변수의주소값




ex)

#include<windows.h>

#include<stdio.h>

#include<tchar.h>


int main(int argc,char *argv[]){

  STARTUPINFO si={0,};

PROCESS_INFORMATION pi;

si.dwX=0;

si.dwY=0;

si.dwXSize=0;

si.dwYSize=0;

si.dwFlags= STARTF_USEPOSITION | STARTF_USESIZE;

si.wShowWindow=SW_HIDE;

CreateProcess(NULL,"bad_code.exe hecked",NULL,NULL,TRUE, DETACHED_PROCESS,NULL,NULL,&si,&pi);

return 0;

}

새로 생성되는 프로세스는 윈도우창을 띄우지 않는다.

'System > Windows' 카테고리의 다른 글

visual studio DLL complie  (0) 2012.08.21
Message HOOK - Window  (0) 2012.08.20
파일복사 api  (0) 2012.08.02
WinAPI 레지스트리  (0) 2012.07.27
WinApi MessageBox  (0) 2012.07.26

BOOL CopyFile( LPCTSTR lpExistingFileName LPCTSTR lpNewFileName, BOOL bFailIfExists );



lpExistingFileName : 원본파일의 경로

lpNewFileName : 복사될파일의 위치

bFailfExitsts : 파일이 이미 존재하면 덮어쓸지 유무, FALSE옵션을주면 덮어씀,                                TRUE를 주면 덮어쓰지 않음.


ex)


#include<stdio.h>

#include<Windows.h>


int main()

{

char path[]="C:\\Documents and Settings\\Administrator\\My Documents\\Visual Studio 2010\\Projects\\bad_code\\Debug\\FileName.exe";

char new_path[]="C:\\bad_code.exe";

CopyFile(path,new_path,false);

return 0;

}


'System > Windows' 카테고리의 다른 글

Message HOOK - Window  (0) 2012.08.20
CreateProcess  (2) 2012.08.03
WinAPI 레지스트리  (0) 2012.07.27
WinApi MessageBox  (0) 2012.07.26
CreateWindow  (0) 2012.07.26

레지스트리키를 만들어주는 API


RegCreateKeyEx( hKey,lpKey,0,NULL,REG_OPTION,KEY_OPTION,NULL,&key,NULL);


hKey : 생성할 키의 루트키이다.

lpKey : 생성할 서브키(문자열)

NULL : 키의 지정된 클래스명,보통 NULL

REG_OPTION : REG_OPTION_NON_VOLATILE, REG_OPTION_VOLATILE 중에 선택할 수 있는데 전자는 정보를 파일에 기록한다는 의미이고, 후자는 시스템종료시 기록을 지우겠다는 의미이다. 보통 전자를 선택함.


KEY_OPTION : KEY_WRITE , KEY_ALL_ACCESS , KEY_READ 바로 눈에 보이겠지만, WRITE는 쓰기에 관한 모든권한, 가운데는 모든권한, READ는 읽기와 관련된 모든권한을 설정한다는 의미이다.


NULL : SECURITY_ATTRIBUTES 구조체 포인터 ,보통 NULL

&key : 생성된 키의 핸들포인터

NULL : DWROD포인터 보통 NULL



여기서 루트키에 대해서 잠깐 살펴보고 넘어가자.

루트키란 , 실행창에서 regedit을 치고 들어가면


위와 같은 창을 볼 수 있다. 내컴퓨터 하위항목들이 루트키에 해당함.

(각 루트키에는 서브키를 가지고 있다.)


HKEY_CLASSES_ROOT 

윈도우에 사용하는 프로그램과 각 프로그램에 연결된 확장명에 대한 정보, 단축키,드래그 앤 드롭, 윈도우의 관련된 정보가 저장.


HKEY_CURRENT_USER 

사용자가 설정한 윈도우 환경에 대한 정보가 저장


HKEY_LOCAL_MACHINE 

컴퓨터에 설치된 하드웨어와 소프트웨어에 관련된 모든 설정 내용이 저장. 특히 하드웨어와 하드웨어를 구동시키는 드라이버와 설정 사항에 대한 정보가 저장.


HKEY_USERS 

HKEY_CURRENT_USER에 저장된 정보 전체와 데스크탑 설정, 네트워크 연결등의 정보가 저장되어있다.


HKEY_CURRENT_CONFIG 

HKEY_LOCAL_MACHINE 키의 하위키인 Config키의 내용을 담고 있다.




열려있는 레지스트리 키를 이용하여 명시된 항목이름의 데이터 형식이나 내용을 설정하는 사용


RegSetValueEx(HKEY hKey,LPCTSTR lpValueName,DWORD lpReserved, DWORD dwType, const BYTE *lpData, DWORD cbData);


hKey : 현재 열어서 사용하고 있는 레지스트리 키에 대한 핸들


lpValueName : 정보를 설정하고자 하는 항목의 이름을 가지고 있는 문자열의 주소 명시.


lpReserved : 0으로 예약.


dwType : lpData에 들어있는 정보를 설정할 항목의 데이터 형식을 명시,

REG-BINARY : 이진값으로 구성된 데이터 형식

REG_DWORD : 32비트 크기의 정수 데이터 형식

REG_DWORD_LITTLE_ENDIAN :32비트 크기정수(바이트정렬little endian)

REG_DWORD_BIG_ENDIAN : 32비트 크기정수(바이트정렬 big endian)

REG_SZ : NULL로 끝나는 문자열 형식

REG_MULTI_SZ : NULL로 끝나는 문자열이 나열되어 있는 형식

 종결시에는 NULL을 두번.

REG_EXP_AND_SZ : NULL로 끝나는 문자열형식,환경변수참조가능

REG_RESOURCE_LIST : 장치드라이버의 자원목록에 관련된 형식

REG_NONE  : 데이터 형식이 정해져 있지 않은 경우


lpData  : 설정할 항목에 사용할 데이터가 들어있는 메모리 공간의 주소를 명시.


cbData : lpData 매개변수에 사용한 메모리 공간의 크기를 명시.


'System > Windows' 카테고리의 다른 글

Message HOOK - Window  (0) 2012.08.20
CreateProcess  (2) 2012.08.03
파일복사 api  (0) 2012.08.02
WinApi MessageBox  (0) 2012.07.26
CreateWindow  (0) 2012.07.26

MessageBox(내용,타이틀,옵션)

MessageBox 옵션 :

  • MB_ABORTRETRYIGNORE   The message box contains three pushbuttons: Abort, Retry, and Ignore.

  • MB_OK   The message box contains one pushbutton: OK.

  • MB_OKCANCEL   The message box contains two pushbuttons: OK and Cancel.

  • MB_RETRYCANCEL   The message box contains two pushbuttons: Retry and Cancel.

  • MB_YESNO   The message box contains two pushbuttons: Yes and No.

  • MB_YESNOCANCEL   The message box contains three pushbuttons: Yes, No, and Cancel.

Message-Box Modality

  • MB_APPLMODAL   The user must respond to the message box before continuing work in the current window. However, the user can move to the windows of other applications and work in those windows. The default is MB_APPLMODAL if neither MB_SYSTEMMODAL nor MB_TASKMODAL is specified.

  • MB_SYSTEMMODAL   All applications are suspended until the user responds to the message box. System-modal message boxes are used to notify the user of serious, potentially damaging errors that require immediate attention and should be used sparingly.

  • MB_TASKMODAL   Similar to MB_APPLMODAL, but not useful within a Microsoft Foundation class application. This flag is reserved for a calling application or library that does not have a window handle available.

Message-Box Icons

  • MB_ICONEXCLAMATION   An exclamation-point icon appears in the message box.

  • MB_ICONINFORMATION   An icon consisting of an “i” in a circle appears in the message box.

  • MB_ICONQUESTION   A question-mark icon appears in the message box.

  • MB_ICONSTOP   A stop-sign icon appears in the message box.

Message-Box Default Buttons

  • MB_DEFBUTTON1   The first button is the default. Note that the first button is always the default unless MB_DEFBUTTON2 or MB_DEFBUTTON3 is specified.

  • MB_DEFBUTTON2   The second button is the default.

  • MB_DEFBUTTON3   The third button is the default.


From MSDN


ex)

#include<Windows.h>


#define CONTENT "Error code:1401 - 응용 프로그램 구성이 올바르지 않기 때문에 이 응용 프로그램을 시작하지 못했습니다. 이 문제를 해결하려면 응용 프로그램을 다시 설치하십시오.\nDLL <C:\\Program Files\Autodesk\3ds Max 9\Plugins\CurveCtl.dle> failed to initialize."

int main(){

MessageBox(NULL,CONTENT,"Error ",MB_RETRYCANCEL | MB_ICONSTOP);

return 0;

}



'System > Windows' 카테고리의 다른 글

Message HOOK - Window  (0) 2012.08.20
CreateProcess  (2) 2012.08.03
파일복사 api  (0) 2012.08.02
WinAPI 레지스트리  (0) 2012.07.27
CreateWindow  (0) 2012.07.26
#include<Windows.h>

API선언, 상수, 데이터타입, 필요한 헤더들 포함.


Winmain

- Windows 프로그램의 엔트리 포인트


hInstance

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

- 인스턴스(Instance) : 클래스가 메모리에 실제로 구현된 실체


WndClass

-윈도우를 생성하는 클래스




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 : 예약영역

hInstance : 윈도우 클래스를 사용하느 프로그램

hIcon,hCursor : 마우스 커서와 아이콘 지정

hbrBackground : 배경 색지정

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

lpszClassName : 클래스 이름 정의


윈도우 클래스를 정의한 후에는 다음과 같이 등록한다.

RegisterClass(&ClassName);


윈도우 생성 함수 : CreateWindow


HWND CreateWindow(lpszClassName,lpszWindowName,dwStyle,x,y,nWidth,nHeight,hwndParent,hmenu,hinst,lpvParam);


lpszClassName : 생성하고자 하는 윈도우 클래스 지정

lpszWindowName : 타이틀 바에 나타날 문자

dwStyle : 윈도우 형태 지정

X,Y,nWidth,nHeigth : 윈도우 크기와 위치 지정

hWndParent : 부모윈도우 존재 시 부모윈도우 핸들 지정

hmenu : 윈도우에서 사용할 메뉴의 핸들 지정

hinst : 윈도우를 만드는 주체 지정

lpvParam : 보통 NULL


화면 출력함수

ShowWindow(hWnd,nCmdShow);


hwnd : 출력하고자 하는 윈도우의 핸들 값

nCmdShow : 화면에 출력하는 방식 지정.


윈도우 창띄우기 소스


#include <windows.h>

 

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);


int WINAPI WinMain ( HINSTANCE hInstance, HINSTANCE hPrevious, LPSTR lpCmdString, int CmdShow )

{

    WNDCLASS windowClass;

    HWND hWnd;


    windowClass.cbClsExtra = 0;

    windowClass.cbWndExtra = 0;

    windowClass.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH);

    windowClass.hCursor = LoadCursor (NULL, IDC_ARROW);

    windowClass.hIcon = LoadIcon (NULL, IDI_APPLICATION);

    windowClass.hInstance = hInstance;

    windowClass.lpfnWndProc = (WNDPROC)WndProc;

    windowClass.lpszClassName = "ClassName";

    windowClass.lpszMenuName = NULL;

    windowClass.style = CS_HREDRAW | CS_VREDRAW;

 

    if (!RegisterClass (&windowClass))

    {

        MessageBox(NULL, "Error : Cannot Register Window Class", "ERROR", MB_OK);

        return (0);

    } // end if

 

    hWnd = CreateWindow ("ClassName",   // 클래스명

       "Taesun1114",   // 윈도우 타이틀

       WS_OVERLAPPEDWINDOW | 

       WS_VISIBLE |

       WS_SYSMENU |

       WS_CLIPCHILDREN |

       WS_CLIPSIBLINGS,

       100,     // 윈도우 좌표 x

       100,     // 윈도우 좌표 y

       640,     // 윈도우 너비

       480,     // 윈도우 높이

       NULL, 

       NULL, 

       hInstance, 

       NULL);

 

    if ( hWnd == NULL )

    {

        MessageBox(NULL, "Error : Failed to Create Window", "ERROR", MB_OK);

        return (0);

    } // end if

 

    ShowWindow ( hWnd , CmdShow);

    UpdateWindow ( hWnd );

 

    MSG msg;

    while(1)

    {

        if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))

        {

            if (msg.message == WM_QUIT)

                break;

 

            TranslateMessage(&msg); 

DispatchMessage (&msg);

        } // end if

    } // end while

 

    return msg.wParam;

}


LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam){

switch(iMessage)

{

case WM_DESTROY:

PostQuitMessage(0);

return 0;

}

return (DefWindowProc(hWnd,iMessage,wParam,lParam));

}


윈도우가 띄어짐!!


'System > Windows' 카테고리의 다른 글

Message HOOK - Window  (0) 2012.08.20
CreateProcess  (2) 2012.08.03
파일복사 api  (0) 2012.08.02
WinAPI 레지스트리  (0) 2012.07.27
WinApi MessageBox  (0) 2012.07.26

+ Recent posts