2008. 7. 27. 22:50 과거 저장소/Device Driver
728x90

디바이스 드라이버 스터디 1일차

주제
  - 드라이버 개발 환경 구성
  - WinDBG를 이용한 유저모드 디버깅
  - WinDBG를 이용한 커널모드 디버깅
  - 초 간단 드라이버 제작

invalid-file

요약본 받기

728x90
posted by acedon
2008. 7. 27. 03:53 과거 저장소/Windows Info
728x90

이것저것 공부하던중에 또 샛길로 빠지는 바람에 여기까지 오게되었습니다.
후킹이라는 말은 예전에 들어봤지만 사실상 간단한 개념만 알고 있었지 제대로 된 부분은 잘 몰랐습니다. 그래서 이번기회에 그나마 여러 글들을 읽고 제가 받아들인 부분을 정리차 한번 써보겠습니다.
일단 간단하게 후킹이라는 말이 무엇을 뜻하는지 알아보겠습니다.

            후킹이라는 의미는 가볍게 생각해서 "낚아채다", "가로채다"라고 생각하면 쉽습니다.

그러니 다시 말하자면 어떤 일을 행하려 할때 원래 수행되던 일이 있지만, 그 부분을 가로채서 새로운 일을 하도록 만드는 일이 바로 "후킹(Hooking)" 이라고 할 수 있겠습니다.
이렇게 설명을 듣다보니 뇌리에 스치는 부분이 있을지 모르겠습니다. 바로 이 후킹이라는 부분을 악용한다면?? 이란생각 말입니다. 물론 그런 부분들로 문제가 야기되고 있으니 우리는 악용하면 안되겠죠?ㅎ

이 후킹에도 2가지 정도 종류로 나눌 수 있습니다.
1. 메시지 후킹(Message Hooking)
2. API 후킹(API Hooking)

처음 말한 메시지 후킹은 Windows의 구동방식을 알면 좀더 쉽게 이해할 수 있습니다.
윈도우는 메시지 구동(Message Driven)방식으로 실행되고 있습니다. 이게 무슨 말이냐 하면 우리가 하는 모든 작업은 메시지를 발생되게 되어있습니다. ex) WM_MOUSEMOVE, WM_KEYDOWN
위와 같이 마우스를 움직일 때, 키를 누를 때 처럼 하나하나의 이벤트의 중심이되어서 윈도우는 실행되게 되어있습니다. 이런 메시들이 발생 되면 메시지 큐(Message Queue)라는 공간에 차곡차곡 쌓이게 되고 앞에서 부터 처리 함수로 보내지게 되는데 그 때, 또는 메시지 큐에 들어오려는 시점에서 중간에 가로채서 특정 작업을 할 수 있겠금 바꾸게 되면 그게 바로 메시지 후킹이라는 방법이 되겠습니다. ex)Enter키를 눌렀는데 ESC효과가 나온다

그렇다면 이제 설명 드릴 API 후킹은 무엇인가 하면 API호출이 일어날 때 그 호출을 가로채는 것입니다.
API호출을 하면 그 해당하는 호출 루틴으로 가지 않고 자신의 지정한 작업을 행하게 하는것입니다.

그럼 이제 본론인 User-Mode와 Kernel-Mode의 API Hooking기법들 소개하겠습니다.

 

User-Mode Hooking

  • IAT(Import Address Table) Hooking: IAT 에 적혀있는 API 의 주소를 자신의 함수주소로 바꾸고 자신의 함수 끝에 다시 원래 API 주소로 돌려주는 방식. 가장 일반적으로 바이러스에서 사용하는 기법.
  • InlineFunction Hooking (Detour Hooking): 사용할 API 의 첫 5바이트를 자신의 함수주소로 Jmp 하는코드로 바꾸고 자신의 코드에서 다시 원래 API 의 바뀐 코드를 수정해주고 API 시작위치로 돌려주는 방식. IAT 후킹보다지능적이여서 찾아내기가 쉽지 않다. 요새 많이 등장한다.

Kernel-Mode Hooking (루트킷)

  • SSDT(SystemService Descriptor Table Modification): SSDT 가 가리키는 주소를 후킹 함수의 주소로 바꾸고그 함수 호출후 다시 원래 커널 API 의 주소로 돌려주는 기법. 50% 이상의 루트킷이 사용하는 기법. 이런 기법은 프로세스,파일의 은폐에 많이 사용됨.
  • DKOM(Direct Kernel Object Modification): 커널Object 를 직접 조작해서 실행되는 프로세스, 스레드, 서비스, 포트, 드라이버 및 핸들의 Entry 를실행리스트(PsActiveProcessHead, PsActiveModuleHead....)에서 감추는 기법.
  • SYSENTER:유저모드에서 시스템 호출로 넘어갈때 INT 2E(for Windows 2000)/ SYSENTER 를 사용하게 되는데 호출후시스템 서비스의 핸들러는 IA32_SYSENTER_EIP 라는 레지스터리에 저장된다. 커널 드라이버를 설치하여 해당 값을수정하여 루트킷을 호출하고 다시 원래 값으로 돌려주는 기법.
  • Filter Device Drivers: 시큐리티 제품의 하단에 filter device driver 로 등록하는 기법이다. 부트 타임에 로드됨으로써 다른 어떤 안티바이러스 제품보다 먼저 실행된다.
  • RuntimeDetour Patching: 커널 메모리를 직접 조작함으로써 그 메모리의 포인터가 루트킷을 가르키게 함으로써 커널 함수들을후킹하는 기법. 예를 들면 Exception 을 일으키고 Exception Handle 을 컨트롤하는 IDT 레지스터를 자신을가리키는 주소로 써줌으로써 후킹목적을 달성한다.
  • IRP table Modification: 디바이스드라이버가 네트웍 패킷을 처리하거나 파일을 쓸때 사용하는 I/O Request Packets을 제어하는 DispatchRoutine 은 DEVICE_OBJECT 구조체에 저장된다. 바이러스에서 사용하는 루트킷은IoGetDeviceObjectPointer 란 API를 사용하여 DEVICE_OBJECT 구조체에서 DRIVER_OBJECT의 위치를 선정해줄수 있다. 즉 다른 Original Driver Call 이 일어나기 전에 자신의 루트킷을 먼저 실행하여Call 결과를 조작한다.

출처 : http://octet.egloos.com/1061888

728x90
posted by acedon
2008. 7. 26. 09:36 과거 저장소/IT infomation
728x90

우리는 흔히들 겪는 일들 중에 하나가 메모리를 4GB로 업그레이드 하고 기분좋게 확인을 해보면 4GB로 잡히지 않고 3.2GB 아니면 3.4GB정도로 만족할만한 용량으로 잡히지 않는 경우가 대부분일 것입니다.

이런 부분에 있어서 보통 Windows XP가 32Bit 운영체제 이기때문에 참조 할 수 있는 주소가 32Bit이기 때문이라고 합니다. 사실상 32Bit이면 4GB까지 지원가능합니다.

이부분에 대해서 정리된 내용이 있어서 이렇게 링크를 걸어 봅니다.


728x90
posted by acedon
2008. 7. 23. 15:39 과거 저장소/Device Driver
728x90

제부터 이 카테고리의 내용은 모두 디바이스드라이버(DeviceDriver)라는 내용으로 채워질 것이며, 채워 나갈것이다. 그 내용의 양과 질은 전적으로 나의 몫이니 ...
 

나이 24세, 군 제대 후 현재 3학년,
1학년 때의 과거를 회상해 본다.

 디바이스드라이버라는 말을 대학와서 처음들어보게 되었다.
그게 그럴 수 밖에 없는게 우리 서울산업대학교 컴퓨터 공학과 내 EnlessCreation(이하EC)라는 동아리는 디바이스드라이버라는 분야에서 내놓으라는 분들이 계셨던 곳이라서 간간히 접할수 있었던 것이다.

지만 그 이제 막 들어온 신입생들이 무슨 내용인줄 알아겠나, 그냥 우와~ 라는 생각만 가졌던것 같다.
그렇게 학교생활은 그저 학교 커리큘럼 흐름에만 묻혀서 다니다보니 지금의 여기까지 오게 되었다.
지난 3년 동안을 뒤돌아 보면 정말 나는 그야 말로 "뭐 한게 없다"라는 말이 딱 맞는것 같다.
그냥 그냥 학교 과목만 듣고 하루하루 허비했다는 생각에 현재 나는 몹쓸 자책감에 빠져있다.

실 현재에 있는 어플리케이션을 만드는 부분에 있어서는 그다지 흥미가 생기지는 않는다. 그렇다고해서 내가 하고 싶은대로 다 만들수 있는 실력에는 근처도 가지도 못하고 있고, 노력 또한 별로 하지 않았다. 예전때에 그런 느낌이 없었다.그러는 과정에서 신입생 때 들었었던 DeviceDriver, SystemProgramming, Low-Level part등에 대한 관심이 조금씩 싹트기 시작했다.  하지만 그 기초라고 생각되는 내용에 접근하려 하니 그다지 쉽게 나에게 문을 열어주지 않는듯 보인다. 그런 부분이 또다시 나를 움직이게 하는 원동력이 될거라는 생각이 들었다.

과정에서 역시나 내 동기들도 같은 부분에 관심을 가지고 있어서 가는길이 외롭지는 않을듯 보인다.
또한 유능하신 선배님들이 많으셔서 더욱더 힘이 난다.

제부터 5주간 5번의 DeviceDriver특강을 EC 9기 최정현 선배님이 고생해주시기로 해서 천군만마를 얻은듯하여 매우 기뻤다. 정말 이제부터 시작인듯 보인다. ! 열심히 해야지

혹시라도 관심을 가지시고 접해보시려고 하시는 분들이 있다면 현재 특강(스터디) 진행 사항을 구글그룹에 올려놓고 있으니 참고 하시기 바랍니다.

                                           DeviceDriver 접하러 가기
728x90
posted by acedon
2008. 7. 22. 00:00 과거 저장소/Something New
728x90
요새들어 평문을 나만의 방식으로 암호화 하는 재미가 쏠쏠합니다.
예전에 암호가 단순히 재미있어서 책 몇권 사서 읽어던 기억을 되살리며 아주 간단한 방법으로 놀아보았습니다.

현재까지 해본 방법은 한 3가지 정도로 책에 나온 아주 고전적인 방법과 나름 생각해본 방법들입니다.

1. 암호문 : aeoray?deuyr
2. 암호문 : ant0s a2fd3fR2dy/ d2fd2 a2wcn1 qht-dy
3. 암호문 : 416332 417312 528222 4182 3261

현재 이 3가지 정도로 생각해 보았습니다.
즉흥적으로 생각해본 부분도 있고, 고전적인 방법도 있으니 한번 풀어보시겠습니까?
728x90
posted by acedon
2008. 7. 21. 21:10 과거 저장소/IT infomation
728x90
레지스터 란?

어셈블리 언어로 프로그래밍을 하려면 C/C++ 같은 고급 언어와는 달리 CPU 내부에
있는 특별한 메모리에 대해서 잘 알고 있어야 한다. 우리가 일반적으로 알고 있는
메인메모리 혹은 시스템 메모리외에 CPU의 내부에는 레지스터(Register)라고 불리
는 특별한 메모리가 있다.

레지스터는 CPU가 접근할 수 있는 메모리 중에서 가장 빠르게 동작하는 메모리로
CPU가 여러가지 연산등의 처리를 하는 동안 필요한 임시적인 데이터들을 보관하는
데 사용된다.

메인 메모리는 바이트 단위로 매겨진 번지 혹은 주소를 이용해서 접근할 위치를 구
분하는데, 레지스터의 경우는 번지의 개념이 없고 모두 고유한 이름이 부여되어 있
다.

인텔 80x86 계열의 CPU에는 여러 개의 레지스터가 있어서 다양한 역할들을 맡고 있
다. 여러 레지스터 중에서 운영체제가 특별한 용도로 사용하는 레지스터를 제외하
면 일반적인 응용프로그램이 직접 이용할 수 있는 레지스터는 불과 10개 정도에 지
나지 않는다.

2. 레지스터의 종류

2.1 범용 레지스터

EAX      EBX      ECX      EDX

이들 레지스터는 말그대로 범용적인 목적으로 사용되는 레지스터로 크기는 각각 32
비트이고 다른 레지스터에 비해서 비교적 다양한 역할을 한다. 이름에서도 짐작이
가겠지만 단순히 A B C D 라는 이름을 가진 레지스터이다. A B C D 는
Accumulator, Base, Counter, Data 라는 단어의 첫 글자이기도 하다.      

16비트 시절에는 AX, BX, CX, DX 라는 이름을 가지고 있다가, 386 CPU부터 레지스
터의 크기가 32비트로 확장되면서 모두 이름앞에 E(Extended) 가 붙여진 것이다.

16비트 시절의 AX, BX, CX, DX 는 모두 16비트 크기였지만 8비트 크기로 나누어서
접근이 가능했다. 그래서 AX의 경우는 상위 8비트가 AH, 하위 8비트가 AL 이라는
이름을 가진다(H는 high, L은 Low라는 뜻). BX, CX, DX 의 경우도 마찬가지로 BH,
BL,    CH, CL,    DH, DL 이라는 이름으로 8비트 단위의 접근도 가능하다.

                                 EAX
----------------------------------
!..............EAX...............!    32비트
!---------------------------------      
!...............!.......AX.......!    16비트
!---------------------------------      
!...............!...AH...!...AL..!      8비트
----------------------------------

                                 EBX
----------------------------------
!...............EBX..............!    32비트
----------------------------------      
!...............!.......BX.......!    16비트
----------------------------------      
!...............!...BH...!...BL..!      8비트
----------------------------------

                                 ECX
----------------------------------
!..............ECX...............!    32비트
----------------------------------      
!...............!.......CX.......!    16비트
----------------------------------      
!...............!...CH...!...CL..!      8비트
----------------------------------

                                 EDX
----------------------------------
!..............EDX...............!    32비트
----------------------------------      
!...............!.......DX.......!    16비트
----------------------------------      
!...............!...DH...!..DL...!      8비트
----------------------------------

그림처럼 네개의 범용 레지스터는 동일한 32비트 공간을 이름에 따라 다양한 크기
로 접근할 수가 있다. 이는 범용 레지스터의 독특한 특징이기도 하다.

2.2 포인터 레지스터

ESI    EDI    ESP    EBP    (EIP)

이들 레지스터는 메인메모리의 번지값을 저장해서 포인터의 역할을 하는 레지스터
로 16비트 시절에는 SI, DI, SP, BP, IP 라고 불리던 레지스트이다. 범용 레지스터
와 마찬가지로 32비트로 확장 되면서 앞에 E가 붙게 된 것이다. 각각의 이름은
Source Index, Destination Index, Stack Pointer, Base Pointer, Instruction
Pointer 에서 유래한다.

이중에서 EIP는 현재 실행되고 있는 프로그램의 실행코드가 저장된 메모리의 주소
를 가리키는 레지스터로 프로그램의 실행이 진행됨에 따라 자동으로 증가하고 프로
그램의 실행 순서가 변경되는 제어문이 실행될때 자동으로 변경된다. 그래서 직접
접근해서 값을 저장하거나 읽거나 하는 일이 없기 때문에 응용 프로그램에서는 손
댈 일이 없는 레지스터이다.

ESI와 EDI는 이름이 암시하듯이 주로 메모리의 한 영역(Source)에서 다른 역영
(Destination)으로 데이터를 연속적으로 복사해서 옮길 때 사용한다. 이렇게 메모
리의 번지를 저장하는 포인터의 역할 외에도 단순히 32비트 데이터를 저장하는 데
도 사용할 수 있다.

ESP와 EBP 는 STACK 으로 동작하는 특별한 메모리 영역을 가리키는 데 사용되는 포
인터 레지스터로 특히 ESP 의 경우는 절대적으로 이 용도로만 사용해야 한다.

스택은 보통 함수를 호출해서 프로그램의 제어가 서브루틴으로 넘어 간후 다시 원
래 실행되던 루틴으로 돌아오기 위한 복귀 주소를 저장해 두는 곳으로 사용되고.
특히 고급언어로 작성된 프로그램의 경우 함수의 파라메터나 함수 내부에서 선언
된 지역변수의 저장 공간으로도 사용된다. ESP 는 바로 이런 스택공간의 꼭대기를
가리키는 포인터 레지스터이다. ESP의 값은 직접 변경할 수도 있지만 보통은 스택
에 데이터를 넣고 빼는 PUSH, POP 명령어의 실행시 자동으로 변경된다.

EBP 는 ESP 에 보조적으로 사용되는 포인터 레지스터로 ESP를 대신하여 스택에 저
장된 함수의 파라메터나 지역변수의 주소를 가리키는 용도로 주로 사용된다. 스택
을 가리키는 데는 ESP 하나로도 충분하지만 ESP 대신 EBP를 보조적으로 사용하는
이유는 프로그램의 오류로 중요한 스택 공간이 망가지는 일을 어느정도 방지할 수
있기 때문이다. EBP를 이런 용도로 사용하지 않을 경우에는 단순히 데이터를 저장
하는 용도로도 사용할 수 있다.(보통 속도 최적화 옵션으로 컴파일된 프로그램들
의 경우 인텔의 모자라는 레지스터를 보충하기 위해 EBP를 데이터 저장용으로 사용
하고, 스택은 ESP 하나로 감당하기도 한다.)

2.3 플래그 레지스터

EFLAGS

이 레지스터는 16비트 시절 FLAGS 였고, 32비트로 확장 되면서 앞에 E가 붙은 것이
다. 이 레지스터는 이름이 암시하듯이 비트 단위의 플래그 들을 저장하는 레지스터
로 아주 특별한 용도로 사용된다. 이 레지스터는 비트 단위로 의미를 가지는데 32
비트 모두가 사용되는 것은 아니고, 일부만 의미를 가진다. 각각의 플래그 마다 SF
(Sign Flag), ZF(Zero Flag), CF(Carry Flag), DF(Direction Flag) 등의 이름이 붙
어 있다.

보통 이 레지스터의 값을 직접 읽거나 쓰는 일은 거의 필요하지 않다. 각종 연산을
수행한 결과가 어떠한 지를 기록해 놓는 용도나 특정 명령어의 동작을 조절하는 용
도로 활용된다. 연산 결과가 0인지 음수 인지 자리올림이 발생했는지 따라 각각
ZF, SF, CF등이 설정된다. 이렇게 설정된 플래그들은 조건 제어문들이 자동으로 참
조해서 자신의 동작을 선택하기 때문에 우리가 직접 그 값을 챙길 필요는 없다.

DF의 경우는 MOVS 같은 연속적으로 메모리 복사를 하는 명령어가 동작할 때 번지가
증가하면서 동작할지 감소하면서 동작할 지를 지정해주는 용도로 사용된다. 이 때
에도 이 플래그의 값을 켜고 끄는 명령어가 별도로 있기 때문에 직접 EFLAGS 의 값
을 손 댈 일은 없다.

일반적인 응용 프로그램에서 DF의 경우를 제외하면 나머지 언급하지 않은 플래그들
은 물론 이거니와 ZF, SF, CF등도 관련되는 명령어들이 자동적으로 참조하기 때문
에 이들 플래그의 값을 직접 신경쓰지 않아도 무방하고 그냥 없는 듯이 여기면 된
다.


2.4 세그먼트 레지스터

CS    SS    DS    ES    (FS    GS)

이들 레지스터는 모두 16비트 크기로 메모리의 특정 영역을 가리키는 용도로 사용
되는 레지스터이다. 인텔의 CPU는 메모리의 영역을 용도에 따라 세그먼트로 나누어
서 사용한다. 과거 16비트 프로그래밍 시절에는 한 세그먼트가 가리키는 메모리 영
역이 64KB에 불과 했기 때문에 중요한 의미를 가졌지만 요즘의 32비트 프로그래밍
시절에는 32비트 주소만 해도 4GB 라는 방대한 메모리 영역을 나타낼 수 있다.그래
서운영체제가 한번 설정을 해주고 나면 응용 프로그램에서는 신경 쓸일이 거의 없
는 레지스터들이다. 일반적인 프로그램에서는 없듯이 생각해도 무방하다는 것이
다.

각각의 레지스터의 이름은 Code Segment, Stack Segment, Data Segment, Extra
Segment이고 이름이 암시하듯이 코드 영역, 스택 영역, 데이터 영역 을 가리키는
용도로 사용된다.

ES, FS, GS 는 모두 Extra Segment로 DS 처럼 데이터 영역을 가리키는 용도로 사용
되고 DS를 보조 해주는 세그먼트 레지스터이다. 두곳 이상의 데이터 저장영역을 가
리켜야 할 때 DS와 함께 사용된다. 하지만 32비트 프로그램에서는 DS와 ES가 같은
영역을 가리키고 있기 때문에 굳이 세그먼트 레지스터에 대해서 신경을 쓸 필요가
없다. 특히 FS, GS는 286 이후에 추가된 것으로 운영체제를 작성하는 게 아니라면
없듯이 여겨도 된다.

3. 꼭 알아야 하는 레지스터
위에서 언급한 레지스터 외에도 다른 레지스터가 더 있지만 나머지는 모두 운영체
제 같은 시스템 프로그램들에서나 신경 쓸 레지스터이고 일반적인 응용 프로그램
을 작성한다면 아래 8개의 레지스터만 잘 알고 있으면 충분하다.

EAX, EBX, ECX, EDX
ESI, EDI, ESP, EBP
 
728x90
posted by acedon
2008. 7. 21. 00:02 찜 리스트
728x90

아...
오늘 친구녀석이 노트북 쿨러랍시고 가져온 "크라디아 플랙스 mini"

생각보다 크기는 컸지만, 다양한 기능으로 약간의 지름신 압박을 당하고 있습니다.
제 생각에는 쿨러의 역할은 무난할듯 보이고, 또한 거취대의 기능, USB포트 확장의 기능까지 그 부가적인 부분이 더 끌린다고 할수 있습니다.

하지만 가격이 생각보다 3만원이라는 부분이 약간의 NG 인듯 합니다.
혹시라도 관심있으신 분이라면 이쪽에서 자세한 그림과 함께 정보를 얻으시면 됩니다.

"크라디아 플랙스 mini" 쿨럭 보러가기

간단한 제 친구녀석의 사용기 보러가기

728x90
posted by acedon
2008. 7. 20. 22:36 과거 저장소/IT infomation
728x90

우연찮게 갱주니님의 블로그에서 흥미 있는 글이 있어서 읽어보게 되었습니다.

간략한 내용은 예전에 8086에서부터 서서히 발전해서 펜티엄이라는이름을 가지기까지, 또한 싱글코어라는 부분에서 이제는 듀얼코어,쿼드코어 등 멀티코어의 시대로 도래함에 있어서의 내용입니다.

그 안에서 코어의 스피드클럭(hz, Mhz, Ghz)이라는 부분으로 컴퓨터의 성능을 저울질 해왔지만 요새들어서는 오히려 몇 Ghz라는 말보다는 싱글? 또는 듀얼, 쿼드? 라는 말로써 컴퓨터의 성능이 표현되고 있는것 같습니다.
이런 말들에 대해서 왜 그렇게 갈수 밖에 없고 그렇게 가게 된다면(병렬프로세서형식) 우리 프로그래머들이 해나가야 하는 그에 합당한 행동태세는 어떤것인지에 대해서 설명해주고 있었습니다.

그렇게 길지 않은 글이라 생각보다 재미나게 읽었습니다.
워낙 가지고 있는 지식이 없는터라 유익하게 받아들였습니다.

그럼 이 글에 흥미를 가지시는 분들은 읽어보시기 바랍니다.
고고씽!  "멀티프로세서 프로그래밍의 시대 개막"

728x90
posted by acedon
2008. 7. 20. 14:02 카테고리 없음
728x90
처음 쓰는 글입니다.
Test 목적입니다.



사용자 삽입 이미지

728x90
posted by acedon