항상 보던 윈도우 로그인 화면 지겹지 않나요?ㅠㅠ


항상 똑같은 윈도우7 로그인 화면입니다.ㅠㅠ뭔가 밋밋하네요~


자그럼 로그인화면을 바꿔봅시다.

실행에 regedit을 치고 레지스트리편집기에 들어가셔서


HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Authentication\\LogonUI\\Background에 보시면




OEMBackground 가 보일거예요 더블클릭해서 값을 1로 바꿔줍니다.(1로 바꿔주면 윈도우로그인화면을 사용자가 설정하게끔 허용한다는 의미입니다.)


자 이제. 

C:\Windows\System32\oobe\info\backgrounds 로 들어갑니다.

(보통 대부분은 oobe까지만 있고 info~부터는 없는분들이 많으실거예요 그때는 그냥 info만드시고 안에 backgrounds만드시면 되세요.)


이제 원하시는 jpg파일을(꼭 jpg여야 합니다. 크기도 256MB였던가?제한이 있어요) backgroundDefault.jpg

로 파일이름을 변경해줍니다.


그리고 로그오프를 하면 로그인 화면이 바뀐것을 보실수 있을 겁니다~


저는 ANONYMOUS 화면으로 바꿔봤는데 로그인화면을 어떻게 찍어야하는지 몰르겠네요 ㅠㅠ

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

세션종료 메세지 WM_QUERYENDSESSION  (0) 2012.09.26
MSG Struct  (0) 2012.09.18
PE struct  (0) 2012.08.30
DLL 암시적 연결 & 명시적 연결  (0) 2012.08.23
DLL  (0) 2012.08.21

컴퓨터 종료, 다시시작, 로그오프를 할 때 WM_QUERYENDSESSION메세지가 발생된다.

그냥 인터넷보다가 호기심이 생겨서 좀더 찾아보니 역시!

Ezbeat님 블로그에서 재미난 자료를 찾았다.


위 세션종료 메세지가 발생하면 메세지박스를 띄운후에 컴퓨터 종료를 인위로 막는것이다.

#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;

MSG msg;


    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,

       CW_USEDEFAULT,    

       CW_USEDEFAULT,     

       CW_USEDEFAULT,    

       CW_USEDEFAULT,     

       NULL, 

       (HMENU)NULL, 

       hInstance, 

       NULL);

 

    ShowWindow ( hWnd , SW_HIDE);


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

    {

      TranslateMessage(&msg); 

      DispatchMessage (&msg);

    } 

 

    return msg.wParam;

}


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

switch(iMessage)

{

case WM_DESTROY:

PostQuitMessage(0);

return 0;

case WM_QUERYENDSESSION:

MessageBoxA(hWnd,"Don't Windows End!!","MERONG~!!",MB_OK);

return FALSE;

}


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

}


이때 중요한것이. WM_QUERYENDSESSION메세지를 받으면 FALSE를 리턴해줘야 종료가 되지 않는다. TRUE를 리턴하면 정상종료된다.

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

Window 로그인 화면 바꾸기  (0) 2012.09.27
MSG Struct  (0) 2012.09.18
PE struct  (0) 2012.08.30
DLL 암시적 연결 & 명시적 연결  (0) 2012.08.23
DLL  (0) 2012.08.21

typedef struct tag MSG{

HWND hwnd;

UINT message;

WPARAM wParam;

LPARAM lParam;

DWORD time;

POINT pt;

}MSG, *PMSG, *LPMSG;


HWND - 메시지를 받을 윈도우의 핸들

message - 메시지 종류

wParam - 메시지에 따른 부가 정보

lParam - 메시지에 따른 부가 정보

time - 메시지가 발생된 시각

pt - 메시지가 발생했을 때 마우스 위치


이 구조체를 통해서 메시지가 전달되고 DispatchMessage에 의해 윈도우 프로시저로 전달됨.



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

Window 로그인 화면 바꾸기  (0) 2012.09.27
세션종료 메세지 WM_QUERYENDSESSION  (0) 2012.09.26
PE struct  (0) 2012.08.30
DLL 암시적 연결 & 명시적 연결  (0) 2012.08.23
DLL  (0) 2012.08.21






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

+ Recent posts