SSDT Hooking
|
|
- 해수 남궁
- 5 years ago
- Views:
Transcription
1 SSDT Hooking Last Update : 2007 년 1 월 4 일 Written by Jerald Lee Contact Me : lucid78@gmail.com 본문서는커널모드후킹기술중의하나인 SSDT 후킹에대해정리한것입니다. 제가알고있는지식이너무짧아가급적이면다음에언제봐도쉽게이해할수있을정도로쉽게쓸려고노력하였습니다. 제가작성하였던기존의 Windows Hook 시리즈가유저모드에서의후킹을다루었던반면본 SSDT는커널모드에서의후킹을사용하므로디바이스드라이버를다루는부분이포함되어있습니다. 윈도우디바이스드라이버의경우많은부분을상세히설명하지는못했으나코드작성에필요한부분을중점으로설명하였습니다. 다양한분야의방대한자료들중에서필요한것만골라요약하다보니두서없이써내려간부분도많이있습니다. 읽으시는분들의양해를부탁드립니다. 이번에도역시기존에나와있는여러문서들을짜집기하는형태로작성되었으며기술하지못한원문저자들에게매우죄송할따름입니다. 본문서는읽으시는분들이어느정도 Windows API를알고있다는가정하에쓰여졌습니다. 본문서에서자세히다루지못한내용은참고자료를살펴보시기바랍니다. 제시된코드들은 Windows XP Professional Service Pack 2, Windows Server 2003 SP1 DDK 1 에서테 스트되었습니다. 문서의내용중틀린곳이나수정할곳이있으면연락해주시기바랍니다
2 목차 1. WINDOWS SYSTEM의구조 NATIVE API SYSTEM SERVICE DESCRIPTOR TABLE DEVICE DRIVER 기초및활용 SSDT HOOK 추가 참고자료
3 그림목차그림 1. SIMPLIFIED WINDOWS ARCHITECTURE 5 그림 2. WINDOWS ARCHITECTURE 6 그림 3. NTQUERYDIRECTORYFILE() API 7 그림 4. ZWQUERYDIRERCTORYFILE() API 8 그림 5. NATIVE API 진입단계 9 그림 6. NTDLL LOAD 10 그림 7. NTDLL LOAD에성공한화면 10 그림 8. SOFTICE로진입한화면 11 그림 9. FINDFIRSTFILE() AND FINDNEXTFILE(), -INSIDE WINDOWS ROOTKITS에서발췌- 15 그림 10. SSDT HOOKING, -INSIDE WINDOWS ROOTKITS에서발췌- 16 그림 11. PROTECTION RINGS 18 그림 12. SEGMENT DESCRIPTOR 19 그림 13. DUMP GDT 20 그림 14. SOURCES 22 그림 15. MAKEFILE 22 그림 16. HELLOWORLD.C 22 그림 17. BUILD 23 그림 18. BUILD 결과 23 그림 19. 드라이버 LOAD 24 그림 20. DEBUG MESSAGE 24 그림 21. SOURCE 24 그림 22. MINIMAL.H 25 그림 23. MINIMAL.CPP #1 25 그림 24. MINIMAL.CPP #2 26 그림 25. MINIMAL.CPP #3 27 그림 26. DEBUG MESSAGE 27 그림 27. NEWMINIMAL.H 28 그림 28. NEWMINIMAL.CPP #1 28 그림 29. NEWMINIMAL.CPP #2 29 그림 30. NEWMINIMAL.CPP #3 30 그림 31. DEBUG MESSAGE 30 그림 32. LASTMINIMAL.H 31 그림 33. LASTMINIMAL.CPP #1 32 그림 34. NTDDK.H 33 그림 35. LASTMINIMAL.CPP #2 34 3
4 그림 36. KESERVICEDESCRIPTORTABLE DUMP(D) 35 그림 37. KESERVICEDESCRIPTORTABLE DUMP(DD) 36 그림 38. DUMP ADDRESS OF KISERVICETABLE 36 그림 39. DUMP ADDRESS OF NTACCEPTCONNECTPORT 36 그림 40. KESERVICEDESCRIPTORTABLE DUMP(DD) 37 그림 41. DUMP ADDRESS OF SSPT 37 그림 42. 인덱스로 0X25를넘김 37 그림 43. 0X8056F136이 NTCREATEFILE API의주소 38 그림 44. NTCREATEFILE API의주소임을확인 38 그림 45. SYSTEM SERVICE NUMBER TO SYSTEM SERVICE TRANSLATION 39 그림 46. KESERVICEDESCRIPTORTABLE 선언 39 그림 47. SSDT 구조체추가 40 그림 48. SYSTEMSERVICE 매크로 40 그림 49. ZWCREATEFILE의주소 41 그림 50. 0X804FF558 메모리의내용 41 그림 51. 매크로결과확인 42 그림 FF559 메모리덤프 42 그림 53. SYSTEMSERVICE 매크로사용법 42 그림 54. BUFFERED I/O 45 그림 55. DIRECT I/O 46 그림 56. MDL 구조 46 그림 57. MDL 구조체의원형 47 그림 58. MDL을이용한 WRITE PROTECTION 제거 47 그림 59. INTERLOCKEDEXCHANGE 48 그림 60. NEWZWWRITEFILE 49 그림 61. ZWWRITEFILE HOOKING MESSAGE 50 4
5 1. Windows System 의구조 먼저 Windows System 에대해알아봅니다. 이문서를읽으시는많은분들이이미해당내용을잘알 고계실테지만만약을위해간략하게설명해봅니다. Windows는유저모드 (User Mode) 와커널모드 (Kernel Mode) 로구분되어프로세스가실행됩니다. 커널모드에서동작하는프로세스만이컴퓨터에장착된모든메모리와하드웨어에대한직접적인접근이가능하며디바이스드라이버가가장대표적인예라고할수있습니다. 일반적인윈도우프로그램의경우유저모드프로세스가작동하는것이므로직접하드웨어장치나메모리에접근할수는없습니다. 하드웨어장치나메모리에접근하기위해유저모드프로그램은시스템서비스 (API라고이해하시면될듯합니다.) 를호출하게되고운영체제는 trap을발생시켜커널모드로의스위칭을위한스레드를호출하게됩니다. 이후이스레드에서하드웨어장치또는메모리에접근하게됩니다. 이를 context switch( 공룡책에는문맥교환이라고번역되어있습니다.) 라고합니다. 정확한시점은알수없지만 (-_-;) 어느시점이후부터최근에제작되는 OS는대부분마이크로커널의형태를가집니다.( 좀더엄밀하게말해서수정된마이크로커널의형태를가집니다.) 운영체제에서프로세스스케쥴링이나메모리관리등과같은가장핵심적이고필수적인부분만커널에구현이되어있고기타기능은서브시스템에서관리하는형태를띄게됩니다. 아래그림 1은 Windows Internal에서발췌한간단한형태의 Windows 구조입니다. 그림 1. Simplified Windows architecture 5
6 2. Native API 위에서도잠시설명했지만유저모드프로세스는하드웨어장치나메모리에접근하기위해커널모드로스위칭을해야합니다. 일반적으로사용하는 Win32 API는이러한기능을자동으로수행하는데사실 Win32 API는운영체제에서제공하는서브시스템중의하나입니다. 그림 2. Windows Architecture 위의그림 2 에서살펴볼수있듯이 Win32, OS/2, Wow, POSIX 등은모두서브시스템환경의일부이 6
7 며이는운영체제가다른기종에서작성된프로그램들의호환을위해제공하는것들입니다. 각각의서브시스템들은커널모드에서동작하는서비스 ( 시스템서비스라고합니다.) 들을이용하여하드웨어장치나메모리에접근하게되며이때사용되는커널모드서비스들은 Native API라고불리는함수들을호출하여이러한작업들을수행하게됩니다. 조금더구체적으로알아봅시다. Microsoft는보안을이유로유저모드에서동작하는코드가직접커널모드에서동작하는코드를 call 하는것을허용하지않습니다. MFC 개발자들이디렉토리구조를알기위해서자주사용하는 FindFirstFile(), FindNextFile() 함수가있습니다. FindFirstFile() 로디렉토리를찾은후디렉토리내모든구조를 FindNextFile() 이찾게됩니다. 프로그래머는단순히위의두 API를호출함으로써임의의디렉토리구조를알수있지만실제운영체제내부에서는더많은작업들이수행되게됩니다. 즉, 유저모드코드 FindNextFile() 은 NtQueryDirectoryFile() 이라는 Native API를호출하고 NtQueryDirectoryFile() 은동일한이름의커널모드코드의 Wrapper 역할을함으로써디렉토리구조를얻을려는목적을이루게됩니다. Visual Studio를설치하면기본적으로설치되는 Dependency Walker을이용해 ntdll.dll을열어보면동일한이름을가진 (Nt, Zw로구분되는 ) 함수가존재함을볼수있습니다. 그림 3. NtQueryDirectoryFile() API 7
8 그림 4. ZwQueryDirerctoryFile() API Native API는운영체제에서사용하기위해만들어진것이며대부분이문서화되어있지않습니다. 하지만수많은해커들의노력에의해많은수의 Native API가 Undocument API 라는이름으로문서화되기에이르렀습니다. Native API들은보통 Nt 또는 Zt 로시작하는이름을가집니다. 유저모드에서동작하는프로그램이 Native API를이용하려면 ntdll.dll 파일을통해야만하며 ntdll.dll 파일은모든시스템서비스들의진입점을포함하고있습니다. MSDN에따르면 Zw로시작하는함수의경우해당함수를호출한프로세스에대한접근권한체크를하지않습니다. 좀더자세한설명은아래의 URL을참고하시기바랍니다. 이과정은그림 5 와같습니다. 8
9 그림 5. Native API 진입단계 위의그림 5과같이 ntdll.dll은커널모드로진입하기위해인터럽트를사용합니다. INT 2E는 XP 이전버전의운영체제에서사용되던방법이며성능상의이유로 XP부터는 SYSENTER을사용합니다. INT 2E 는소프트웨어인터럽트, SYSENTER는하드웨어인터럽트라고생각하시면될듯합니다. 이내용은다음절에서다루도록하겠습니다. 그럼실제함수는어떻게동작하도록되어있는지살펴봅시다. 위에서잠깐언급했었던 NtReadFile을예로들어보도록하겠습니다. 이작업은드라이버스튜디오또는 WinDbg가준비되어있다면가능합니다. 본문서에서는드라이버스튜디오를이용하였습니다. 여기서부터는 Devguru의 Attack Native API 의내용을참고하였음을미리밝힙니다. 먼저유저모드에서의함수동작을알기위해 Softice를실행시키기전 NtReadFile 함수가들어있는 ntdll.dll을로드해야합니다.( 앞에서도이야기했지만 ntdll.dll 파일에유저모드에서커널모드로의진입점이존재합니다 ). 이함수는디폴트로로드되지않습니다. 아래그림 6은 Driver Studio에포함된 Symbol Loader 프로그램을이용해 ntdll.dll 을로드하는화면을캡쳐한것입니다. File LoadExports 를클릭하여 ntdll.dll 을로드합니다. 9
10 그림 6. ntdll Load 로드에성공하면아래그림 7 에서빨간색부분처럼 ntdll 부분이생성됩니다. 그림 7. ntdll Load 에성공한화면 이제 Softice 를실행시킵니다. Softice 가성공적으로실행된후 Ctrl + D 를누르면 SoftIce 화면으로 진입하게됩니다. 10
11 그림 8. Softice 로진입한화면 위의그림 8 에서빨간색으로표시된부분이명령창입니다. Vmware 를통한이미지캡쳐라실제명령 어를수행한결과화면은캡쳐할수없어서텍스트형태로결과를보이도록하겠습니다. 먼저명령어창에 u ntdll!ntreadfile 을입력한결과입니다. : u ntdll!ntreadfile ntdll!ntreadfile 11
12 mov eax, b7 mov edx, ntdll!kifastsystemcall call edx ret 0024 : u ntdll!kifastsystemcall ntdll!kifastsystemcall mov edx, esp sysenter eax 레지스터에 NtReadFile 의주소인 0xb7 값을넣고 KiFastSystemCall 을호출합니다. KiFastSystemCall 에서는 edx 에 esp 값을넣은후 SysEnter 을호출하게됩니다. 다음으로 ZwReadFile을살펴보겠습니다. 명령창에 u ntdll!zwreadfile을입력하면 NtReadFile 값이나오는것을확인할수있습니다. 즉, Wrapper인 ntdll을통한 ( 유저모드에서의 ) NtReadFile, ZwReadFile은결국 NtReadFile 함수를호출하게됩니다. 유저모드에서는커널모드함수인 ZwReadFile을호출하더라도결국 NtReadFile을호출하게된다는말입니다. 커널모드 (Ntoskrnl.lib) 에서의 NtReadFile, ZwReadFile 은모두정상적으로해당함수를실행합니다. 명령창에서직접 u ntoskrnl!ntreadfile, u ntoskrnl!zwreadfile 을실행해보시기바랍니다. 12
13 3. System Service Descriptor Table Windows는수많은테이블들의집합이라고할수있습니다. 앞에서살펴보았듯이인터럽트가발생하면해당인터럽트의종류에따른결과를반환하게됩니다. 인터럽트가발생했을때어떤시스템서비스가호출되어야하는지에대한판단을하기위해윈도우는테이블을참조하게됩니다.( 정확히얘기하면 CPU는해당시스템서비스들이위치하고있는메모리상의주소를알아야할필요가있습니다. 하지만모든주소를내부적으로저장할수없기때문에 CPU는테이블이라는자료구조를사용하는것이며윈도우, 즉운영체제는이를이용하는것입니다. 좀더자세하고정확한내용은 Windows Internals를참고하시기바랍니다.) 이런테이블들 (CPU가참조하는 ) 에는여러종류의테이블이있으며아래와같습니다. GDT : Global Descriptor Table LDT : Local Descriptor Table IDT : Interrupt Descriptor Table 이런테이블들을통칭하여 System Service Descriptor Table이라고부릅니다. 운영체제또한자신만의테이블을만들어참조하는방법을사용하는데운영체제에서구현된중요한 테이블중에아래의테이블이있습니다. SSDT : System Service Dispatch Table 바로이문서의목표인 SSDT 테이블입니다. 이테이블은시스템에서이용가능한모든시스템서비스들의주소를가지고있으며인터럽트발생시운영체제는이테이블을참고하여적절한결과값을돌려주게됩니다. 이테이블을간단히조작 / 변경함으로써시스템의모든서비스를다룰수있기때문에커널루트킷, 안티바이러스프로그램양쪽모두에사용됩니다. 커널루트킷의경우에는프로세스 / 파일 / 디렉토리은닉등을위해사용됩니다. SSDT 를이용한후킹은 GDT, IDT 등과복합형태의후킹코드로서이용되기도합니다. 여기서앞절에서잠시나왔던 INT 2E와 SYSENTER을알아봅시다. 커널모드의 System Call을위해 Intel 기반하에서 Windows는 INT 2E 또는 SYSENTER을이용합니다. Windows 2000과이전버전의 Windows는유저모드에서커널모드로진입하기위해소프트웨어인터럽트인 INT 2E를이용했습니다. 인터럽트가발생하면 0x2E 값은 Interrupt Descriptor Table(IDT) 에서 Processor가참조하는 offset 값이됩니다.( 일반적으로 EAX 레지스터에들어가는값들은대부분 Offset으로쓰입니다.) 이 Offset이가리키는테이블의값은 System Service Dispatcher( 일반적으로 KiSystemService라고합니다.) 의주소입니다. CPU는 Instruction Pointer Register(IP Register) 에이값을 Load하고 System Service Dispatcher가실행되게됩니다. System Service Dispatcher는 System Service Dispatch Table(SSDT) 에기록된 System Service를실행하게되며 ( 실행할 System Service의 13
14 구분은 EAX 레지스터를참조하며 EDX 레지스터에서시스템서비스에전달된매개변수의목록 - 메모 리주소 - 을참조합니다. Windows NT 의경우 EDX 레지스터가아니라 EBX 레지스터를사용합니다.) 유저모드에서호출된 API 가재호출되게됩니다. 즉, 커널모드에서 API 가수행되게됩니다. Windows XP에서는 INT 2E 대신 SYSENTER이라고하는 Instruction을사용하게됩니다. INTEL은 SYSENTER Instruction을 CPU Instruction Set에포함시킴으로써성능상의향상을꾀했습니다. 이 Instruction은펜티엄 2 이상의 CPU에서지원하기시작하였으며 Windows 2000에서는 INT 2E와 SYSENTER을같이사용했으나 XP부터는 SYSENTER만을사용하게됩니다. 윈도우는이 Instruction을지원하기위해부팅할때명령과연결된레지스터에서커널의 System Service Dispatcher 루틴의주소를저장합니다. ntdll.dll이 SYSENTER Instruction을발생시키면 Processor는 IA32_SYSENTER_EIP 라는특수 Register 에저장된값, 즉 System Service Dispatcher의주소를체크하여 IP Register에 Load 하고실행시킵니다. INT 2E와마찬가지로실행할 System Service의구분은 EAX 레지스터에저장된값을참조하며전달되는매개변수의정보는 EDX 레지스터를참조합니다. 유저모드로되돌아가기위해서는일반적으로 SYSEXIT Instruction을사용합니다. AMD 의경우 SYSCALL 이라는 SYSENTER 과비슷한 Instruction 을사용하는데이는생략하도록하겠습 니다. 더자세한정보는 Windows Internals 와참고자료 web)5 를살펴보시기바랍니다. 위에서설명한과정을도식하면아래와같습니다. 14
15 그림 9. FindFirstFile() And FindNextFile(), -Inside Windows Rootkits 에서발췌 - 본문서에서다루고자하는 SSDT Hooking 의목적은바로아래그림으로써표현될수있습니다. 15
16 그림 10. SSDT Hooking, -Inside Windows Rootkits 에서발췌 - 위의그림 10에서볼수있듯이 Rootkit을중간에삽입시키는것이본문서의목적이라고할수있겠습니다. 자그럼어떻게 Rootkit을삽입시키는가, 아니그전에어떻게 SSDT를후킹하여우리가만든 Rootkit 으로향하게하는가, 그것이해결해야할가장중요한문제이며그답은디바이스드라이버에있습니다. 16
17 4. Device Driver 기초및활용 자디바이스드라이버시간입니다. 기존의 SDK 프로그래밍에익숙한사용자라면약간어색할듯하고프로그래밍에자신이없는분이라면매우어려울듯합니다. 몇년전만해도윈도우드라이버프로그래밍은윈도우프로그래밍의꽃이다라고생각되었었습니다.( 저만의견해인가요? -_-;). 자료라고는그저 MSDN 밖에없던시절, 극악무도또는진짜독한사람들만이하는분야라고취급되었었습니다. 그만큼어렵다는이야기입니다. -_-; 그러던것이시간이흘러한글로된윈도우디바이스드라이버책도나올만큼대중화 (?) 되었습니다만여전히그난해함은있습니다. 이번절은정말정말필요한부분만을모아놓았으니심화학습을원하시는분들은드라이버관련전문 서적을읽으시고정말당장써먹을수있는게필요해 ~ 하시는분들은 RootKits 1 를읽으시길바랍니다. 자이제시작해보겠습니다. 먼저 RING에대한설명으로시작해야할것같습니다. 앞절에서유저모드와커널모드에대한설명이있었습니다. 이것은운영체제에의한분류 (?) 법이라고할수있습니다. INTEL CPU에서는 ( 이하 x86) 이를 Ring이라고부르며우리가잘알고있는유저모드는 Ring 3, 커널모드는 Ring 0를나타내게됩니다. x86 에서지원하는 Ring 모델의구조는아래그림 11 과같습니다. 1 Rootkits: Subverting the Windows Kernel 17
18 그림 11. Protection Rings 그림 11에서볼수있듯이 x86은총 4개의 Ring을이용하여 Access Control을지원합니다. 실제이 Ring의구분은숫자 0~3으로구분되며물리적으로 Ring 모양과는전혀상관이없습니다. 네개의 Ring 중에서 Ring 0가가장큰권한을, Ring 3이가장낮은권한을가지게됩니다. 4개의 Ring 중 Windows는 Ring 0 와 Ring 3의두개만을사용하며 Ring 0를커널모드, Ring 3을유저모드라고부릅니다. 즉 Windows의모든커널코드들은 Ring 0의권한을가지고실행되는것입니다. Ring 0와 Ring 3에서실행되는프로그램들의접근제한규칙은아래와같습니다. 특권수준이낮은코드세그먼트가특권수준이높은데이터세그먼트로액세스하는것은불가능 특권수준이낮은코드세그먼트에서특권수준이높은코드세그먼트로의제어이행은특별한방법을사용해서만이가능 특권수준이높은코드세그먼트에서특권수준이낮은코드세그먼트로의제어이행은불가능 - Windows 구조와원리그리고 Codes, 정덕영저- 앞에서도얘기했지만실제 Ring 을구분하는것은 0~3 까지의숫자입니다. 현재프로그램을실행하는특권레벨을결정하는것은코드세그먼트의특권레벨입니다. X86 보호모드에서실행되는프로그램의각코드세그먼트는세그먼트디스크립터라고불리는 8바이트의데이터구조체에의해기술됩니다. 세그먼트디스크립터는아래와같은구조를가지고있습니다. 18
19 그림 12. Segment Descriptor - 출처 : University of Nebraska-Lincoin Computer Science & Engineering CSCE 351- 그림 12에서 DPL(Descriptor Privilege Level) 부분이바로특권레벨을나타내는부분입니다. 운영체제는해당필드를참고하여커널모드, 유저모드를구분하게됩니다. DPL 중현재실행되고있는코드의 DPL 값을 CPL(Current Privilege Level) 이라고부릅니다. 세그먼트디스크립터는메인메모리에저장되며이디스크럽터들을디스크럽터테이블이관리하게됩니다. 메인메모리에는두개의중요한테이블이있는데그것이바로앞절에서살펴본 GDT 와 LDT d입니다. 즉 GDT와 LDT에세그먼트디스크럽터에대한정보가있습니다. GDT, LDT 의두개의테이블이있기때문에어떤테이블에서찾아야할것인지를알필요가있습니다. 이를위해세그먼트셀렉터 (Segment Selector) 라고하는것이존재합니다만이에대한설명은넘어가도록하겠습니다. 실제 GDT는어떤값을가지고있는지 WinDBG에서확인을해보도록합시다. Dump를위해 ProtMode 1 라는 WinDBG 확장 dll 파일을이용했습니다. ProtMode.dll 파일을 C: Program Files Debugging Tools for Windows winxp 에복사합니다.(Debugging Tools for Windows 가설치되어있어야합니다.) WinDBG에서먼저 ntsdexts.dll 파일을 load 한후 ProtMode.dll을 load 합니다. 그리고!ProtMode.Descriptor GDT 1 를입력하면 GDT 를확인할수있습니다. 1 ProtMode : 19
20 그림 13. Dump GDT 그림 13 은 GDT 를 WinDBG 에서확인한모습입니다. 커널모드에서작동하는프로그램의경우에는 DPL 부분이 0, 유저모드에서작동하는프로그램의경우에는 DPL 부분이 3 으로표시됩니다. 저의경 우는 VMWARE 를이용한커널디버깅모드로동작중이기때문에 DPL 이 0 으로되어있습니다. Ring에의한메모리접근제한과더불어 x86에서제공하는다른하나의보안장치가있습니다. 몇몇명령어들의경우특권을가지고있는것으로간주되어오직 Ring 0에서만실행됩니다. 이명령들은일반적으로 CPU의행동을수정하거나직접하드웨어에접근하기위해사용됩니다. 그명령어들중일부는아래와같습니다. cli : 현재 CPU에서실행중인인터럽트를중지시킵니다. sti : 현재 CPU에서인터럽트를실행시킵니다. in : 하드웨어포트로부터데이터를읽어들입니다. out : 하드웨어포트로데이터를씁니다. - RootKits - 위와같은명령어들이있다정도만알아두시면될듯합니다. 디바이스드라이버를설명하기위해서필수적인 Ring Model에대한설명이여기까지입니다. 디바이스드라이버란위에서설명한유저모드 커널모드스위칭을하지않고직접적으로하드웨어에접근하는소프트웨어라고말할수있습니다. 즉커널모드에서동작하며하드웨어에직접접근할수있는프로그램입니다. 윈도우는이런디바이스드라이버를설계하기쉽도록하나의모델을제시하고있는데이것이 WDM(Windows Driver Model) 이라고합니다. 다만모든운영체제가 WDM 방식을지원하는것은아니 20
21 며모든드라이버가 WDM 방식을사용해서개발할수있는것도아닙니다. WDM 의역사, 문제, 특징등과같은자세한내용은디바이스드라이버서적을참고하시기바랍니다. 디바이스드라이버프로그램은실행프로그램이아닙니다. 즉확장자가 exe 나 dll 이아니라 sys 입니다. 개발된디바이스드라이버프로그램을사용하기위해서는해당드라이버를 LOAD 시켜줘야만합니다. 리눅스에서의모듈이라고생각하시면훨씬더이해가쉬울듯합니다. 디바이스드라이버의기본골격은아래의 4가지엔트리로구성됩니다. DriverEntry Routine AddDevice Routine IRP Dispatch Routine DriverUnload Routine - 디바이스드라이버구조와원리그리고제작노하우, 이봉석 - 간단히정말간단히필요한것들만설명하겠습니다. 디바이스드라이버전문서적참고를권고합니 다. :) * 디바이스드라이버코드를예시함에있어서커널모드드라이버형태또는 WDM 형태로구현될수있으며이차이점에대해서는상세히기술하지않았습니다. 표현의차이만있을뿐원리는동일합니다. 디바이스드라이버분야는넓고도방대해서일일이설명하려면무지막지한시간이걸리는관계로 ( 본인도잘모른다는게큰이유입니다 -_-;) 대충대충넘어가겠습니다. DriverEntry Routine 일반 C 프로그램의시작점은 main(), 윈도우응용프로그램은 WinMain(), dll 프로그램은 DllMain() 그리고디바이스드라이버의시작점은 DriverEntry입니다. 즉드라이버가로드된후처음으로실행되는곳이바로이부분입니다. 이부분은처음드라이버가로드될때단한번만수행하는부분이므로주로초기화과정에많이사용됩니다. AddDevice Routine 자신이만든새로운디바이스를추가하고자할때사용되는부분입니다. 이부분에서 Device Object 를생성하게됩니다. IRP Dispatch Routine IRP는디바이스와 IO Manager 사이에서명령을전달하는역할을하는구조체이며그실체는하나의버퍼에불과합니다. 유저모드프로그램에서파일을열고쓰는동작같은것이 IRP를통해서이루어지게됩니다. 21
22 DriverUnload Routine 이름그대로드라이버를언로드할때수행되는부분이며이것저것수행한것들을깨끗하게정리하는 부분으로사용됩니다. 먼저만인의연인 Hello World 를작성해보도록하겠습니다. 빌드를위해서는소스파일외에도 Makefile 과 Source 파일이필요하게됩니다. 역시구체적인것은전문서적을참고하시고아래의화면대로입력하시기바랍니다. 그림 14. Sources 그림 15. Makefile 그림 16. HelloWorld.c 위의세개파일을작성한다음 DDK 를설치하면생기는 Windows XP Checked Build Environment 를실행한다음해당파일들이있는디렉토리로이동합니다. 그리고아래그림 17 처럼컴파일을하고 나면 HelloWorld.sys 파일이생성됩니다. 22
23 그림 17. build 그림 18. build 결과 이제작성한프로그램을로드하고메시지를볼수있는프로그램이필요합니다. 드라이버를로드하는 방법은두가지가있는데그방법은역시서적을참고하시길바랍니다. 본문서에서드라이버를로드하는툴은 Rootkit.com 1 의 InstDrv 를, 메시지를보기위해서는 sysinternals 2 의 Debugview 프로그램을사용했습니다
24 그림 19. 드라이버 Load Install -> Start -> Stop -> Remove 버튼을차례로누르면 DebugView 화면에 HelloWorld.c 파일에서 작성한 DbgPrint 함수가출력하는메시지를확인할수있습니다. 그림 20. Debug Message HelloWorld.c 파일을보시면알겠지만위에서구현된것은 DriverEntry 에진입했을때와 Unload 시에 대한것뿐입니다. 이제여기에조금더살을붙여보도록하겠습니다. 그림 21. Source 24
25 Source 파일은 TARGETNAME 과 SOURCES 부분만변경되었습니다. 그림 22. Minimal.h Minimal.cpp 는조금더많은부분이추가되었습니다. 하나씩보겠습니다. 그림 23. Minimal.cpp #1 CreateDevice 함수가하나더추가된것을볼수있습니다. DriverEntry 부분은 CreateDevice 를호출 하는부분이추가되었습니다. 아래는 CreateDevice 함수입니다. 25
26 그림 24. Minimal.cpp #2 이부분은 WDM에서는 AddDevice 함수가처리합니다. 디바이스드라이버는, 즉커널내부에서는모두유니코드를사용합니다. 생성할디바이스의이름을유니코드로변환하는부분이 CreateDevice함수의초반부분입니다. 중간쯤에가면 IoCreateDevice 함수를이용해서디바이스를생성하게됩니다. 이 API의자세한설명은전문서적을참고하시기바랍니다. 디바이스생성에성공하면해당디바이스를유저모드어플리케이션에서이용하기위해전역변수를만들어줘야합니다. 이를위해 Symbolic Link를만들게되며이를 IoCreateSymbolicLink API에서담당하게됩니다. 만약 Symbolic Link 생성에실패하게되면 IoDeleteDevice API를이용해생성한디바이스를삭제합니다. 이부분은왜이렇게해야하는지에대한명확한답변을해드리기어려우나아마도일종의안전장치로써사용되는것이아닌가짐작됩니다. Symbolic Link를생성하는방법에있어서 WDM 을이용하게되면 DriverExtension->AddDevice에서처리를하게됩니다만해당내용은생략하도록하겠습니다. CreateDevice 함수가완료되면디바이스드라이버객체가생성되고어플리케이션에서이를이용할수 26
27 있는 Symbolic Link 까지생성되게됩니다. 그림 25. Minimal.cpp #3 위의그림 25 는 DriverUnload 부분입니다. 드라이버를 Unload 할때 Symbolic Link 를삭제한후디바 이스를삭제합니다. 그림 26. Debug Message 작성한디바이스드라이버를설치하면위의그림 26 과같은화면을볼수있습니다. 자여기까지오면이제우리는 Windows System 에커널모드에서작동하는디바이스를생성할수있 게된것입니다. 다음예제는디바이스익스텐션 (Device Extension) 구조체가추가된것입니다. 디바이스익스텐션은 nonpaged 풀에존재하며디바이스의상태정보등을기록하는데쓰입니다. 즉, 디바이스전용이므로 디바이스익스텐션의구조체는헤더파일에정의되어있어야합니다. 27
28 아래는디바이스익스텐션구조체가추가된헤더파일입니다. 그림 27. NewMinimal.h 그림 27 에서디바이스익스텐션구조체변수중 PDEVICE_OBJECT 부분은반드시있어야하는부분 입니다. Linked List 에서 Next 포인터의역할을한다고생각하시면됩니다. 나머지는드라이버개발자 가필요한전용변수들을선언하면됩니다. 그림 28. NewMinimal.cpp #1 NewMinimal.cpp 의초반부입니다. CreateDevice 함수에전달되는변수가하나늘었습니다. 바로 uldevicenumber 입니다. 하나의드라이버는하나이상의디바이스를다룰수있습니다. 그러므로 uldevicenumber 변수는드라이버에서다룰디바이스를차례로참조할수있는매개체로써의역할을하게됩니다. 28
29 그림 29. NewMinimal.cpp #2 CreateDevice 에서는우선 PDEVICE_EXTENSION형 pdevext 변수가생긴것이눈에들어옵니다. 중간쯤에디바이스익스텐션구조체를초기화합니다. 디바이스의정보중 Device Name, Symbolic Link Name 등을저장하고있습니다. 추가로 status 의값에따른조건문하나를넣어놨습니다. 동일한이름의 Symbolic Link가존재할경우메시지를뿌립니다. NTSTATUS형이반환하는값은여러가지가정의되어있는데자세한것은 C: WINDDK inc ddk wxp ntstatus.h 파일을참고하시기바랍니다. 29
30 그림 30. NewMinimal.cpp #3 DriverUnload 부분은형태가조금틀려졌습니다. pnextobj 가마지막노드에도달할때까지, 즉생성 된모든디바이스에대하여차례로 Symbolic Link 와 Device 를삭제합니다.(Linked List 라고생각하시 면됩니다.) Symbolic Link Name 은디바이스익스텐션에저장되어있는값을사용하고있습니다. DbgView 화면입니다. 그림 31. Debug Message 이번에는마지막으로디스패치루틴을넣어보겠습니다. 앞에서이야기했던디바이스드라이버의기본 골격은이디스패치루틴이들어감으로써완성되게됩니다. 30
31 그림 32. LastMinimal.h 헤더파일입니다. 앞에서지저분한소스를좀고칠겸이쪽으로몇개뺐습니다. 그림 32 에서볼수있듯이디바이스익스텐션구조체를간단하게수정했고 DispatchDummy 라는함 수가추가되었습니다. 31
32 그림 33. LastMinimal.cpp #1 그림 33은 DriverEntry 부분입니다. 기존소스에서따로분리해놓았던 CreateDevice를합쳐놓았습니다. 디바이스익스텐션초기화가간략하게된것을중간쯤에서확인할수있습니다. 마지막부분에 Dispatch 초기화부분이새로이추가된것이보입니다. MajorFunction 테이블의모든디스패치루틴에대해 DispatchDummy 함수를지정하고있습니다. MajorFunction 테이블은특정 I/O 요청에대한디스패치루틴의함수포인터들을저장하고있으며이런 I/O 요청은 IRP_MJ_XXX 형태의심볼로서정의되어있습니다. 실제로는상수값을가지고있는심볼입니다. Ntddk.h 또는 WDM.h 파일을살펴보시면상세히기술되어있습니다. 32
33 그림 34. ntddk.h IRP 함수코드값중몇가지만나열해보면아래와같습니다. IRP_MJ_CREATE : 핸들을요청합니다. CreateFile에대응됩니다. IRP_MJ_CLENUP : 핸들을닫을때지연된 IRP를취소시킵니다. CloseHandle에대응됩니다. IRP_MJ_CLOSE : 핸들을닫습니다. CloseHandle에대응됩니다. IRP_MJ_READ : 디바이스로부터데이터를받습니다. ReadFile에대응됩니다. IRP_MJ_WRITE : 디바이스로데이터를보냅니다. WriteFile에대응됩니다. IRP_MJ_SHUTDOWN : 시스템이셧다운될때사용됩니다. InitateSystemShutdown에대응됩니다. - 출처 : 원리와예제로배워보는 Windows 2000 디바이스드라이버 - 33
34 그림 35. LastMinimal.cpp #2 그림 35의주석에도달려있지만실제 DispatchDummy 함수는아무일도하지않는함수입니다. 해당함수가호출되면 status를 STATUS_SUCCESS로대입하고 IoCompleteRequest API를호출한뒤 status를 return 합니다. IoCommpleteRequest API는이름에서도알수있듯이해당요청이완료되었음을알리는역할을합니다. 마지막으로 DriverUnload 부분은 Symbolic Link 이름을지정하는부분만추가되었습니다. 이것으로써디바이스드라이버의기본골격은다다루어보았습니다. 디바이스드라이버항목의마지 막예제로써디바이스하나를생성하여읽고쓰는작업을하는드라이버를소개할까했으나실제우 리가할 SSDT Hooking 시에디스패치루틴은사용되지않으므로패 ~ 쓰하도록하겠습니다. 34
35 5. SSDT Hook 멀고먼길을돌아드디어 SSDT Hook으로다시진입하게되었습니다. 자이제실제코드를작성하기전에관련내용들을알아보도록하겠습니다. System Service Dispatcher, 즉 KiSystemService는 SSDT(System Service Dispatch Table) 을참고하여적절한 System Service를실행하게됩니다. 하지만이 SSDT, 즉 KiServiceTable은커널에의해익스포트되지않은구조체이므로원칙적으로는내부구조를알수없습니다. 하지만 KeServiceDescriptorTable이라는 ntoskrnl.exe에의해익스포트된구조체 (Service Descriptor Table) 내에 KiServiceTable에대한정보가들어있습니다. KeServiceDescriptorTable 구조체는아래와같습니다. typedef struct ServiceDescriptorTable { SDE ServiceDescriptor[4]; } SDT; SDT 구조체는아래와같습니다. typedef struct ServiceDescriptorEntry { PDWORD KiServiceTable; PDWORD CounterTableBase; DWORD ServiceLimit; PBYTE ArgumentTable; } SDE; KiServiceTable 에는서비스테이블의시작주소가들어있습니다. 이주소로부터 4바이트단위로각 System Service들의주소가들어가있습니다. 세번째필드 ServiceLimit는 SDT에등록되어있는 System Service의개수가들어있습니다. 마지막필드인 ArgumentTable에는각 System Service마다전달되는파라미터가몇바이트인지기록되어있습니다. 이주소로부터 1바이트단위로전달되는파라미터의바이트수가기록되어있습니다. ( 이를 SSPT-System Service Parameter Table라고합니다.) 아래는 KeServiceDescriptorTable 을 WinDBG 에서 Dump 한화면입니다. 그림 36. KeServiceDescriptorTable Dump(d) 35
36 그림 36에서 4바이트마다 SDE 구조체의구성요소를나타냅니다. 처음 4바이트 0x 이바로 ServiceDescriptor[0] 의내용을나타내며이주소는 KiServiceTable의주소를가리키고있습니다. 다음화면부터는편의를위해바이트순서가읽기쉽게표시되도록하였습니다.(dd 명령어를사용하면됩니다. 다시원래의화면으로보시길원한다면 db 명령어를사용하면됩니다.) 그림 37. KeServiceDescriptorTable Dump(dd) 그림 37 에서각줄은 SDE 구조체배열의구성요소들입니다. 그리고빨간색으로표시된부분이바로 KiServiceTable 의주소입니다. WinDBG 로해당주소의메모리를덤프하면아래와같은화면이나옵니다 그림 38. Dump Address of KiServiceTable 그림 38 에서빨간색으로표시한부분처럼각부분은 KiServiceTable 에저장된 System Service 들의주 소를나타냅니다. 0x8059a47e 주소의메모리를덤프하면아래와같습니다. 그림 39. Dump Address of NtAcceptConnectPort 첫번째줄을살펴보면 NtAcceptConnectPort 라는 API 임을확인할수있습니다. 동일한방법을이 용하여 ServiceLimit 개의 System Service 를확인할수있습니다. 자다시처음으로돌아가서위에서확인한 NtAcceptConnectPort Api 로넘겨지는파라미터의크기는 아래의그림 40 에서빨간색상자로표시된주소에저장되어있습니다. 36
37 그림 40. KeServiceDescriptorTable Dump(dd) 해당주소를덤프하면그림 41 과같은화면이보이는데그중가장첫번째바이트가파라미터의크 기를나타내게됩니다. 여기에서 NtAcceptConnectPort API 의파라미터크기는 0x18 바이트가됩니다. 그림 41. Dump Address of SSPT 보통하나의파라미터는 4바이트를차지하기때문에 NtAcceptConnectPort API는총 6개의파라미터를가짐을추측할수있습니다. 위의그림에서두번째빨간색상자안의숫자 0x20은 NtAcceptConnectPort 다음에 SDT에저장되어있는 API의파라미터크기를나타냅니다. 즉그림 5-3 에서두번째 4바이트 805e7664 주소에저장되어있는 API의파라미터크기를나타냅니다. 이와같은방법을이용하여 KeServiceDescriptorTable 구조체를통해 KiServiceTable에설정되어있는모든 API를살펴볼수있습니다. 만약특정 API를찾고싶은경우일일이서비스테이블주소를찍어보는것은매우많은시간이요구됩니다. 2장 Native API에서살펴보았듯이각 Zw로시작하는함수들은 eax 레지스터로인덱스번호를넘기게됩니다. 그러므로해당 API가위치하는주소는 KeServiceDescriptorTable의 Base 주소 ( 여기서는 0x 입니다 ) 에인덱스 *4 를더한값이됩니다. 아래의그림 42 는 NtCreateFile API 를확인하는화면입니다. 그림 42. 인덱스로 0x25 를넘김 37
38 그림 43. 0x8056f136 이 NtCreateFile API 의주소 그림 44. NtCreateFile API 의주소임을확인 추가사항으로 SDT에는 KeServiceDescriptorTable 외에도 KeServiceDescriptorTableShaodw 라는배열이하나더포함됩니다. KeServiceDescriptorTable은 ntosrknl에서구현된서비스들을, KeServiceDescriptorTableShadow는 Win32k.sys에서구현된서비스들 (Windows USER, GDI) 을포함하고있습니다. 이를그림으로나타내면아래와같습니다. 38
39 그림 45. System Service Number to system service translation 출처 : Microsoft Windows Internals 4 th Edition 자이제본격적으로소스코드를보도록하겠습니다. 해당소스는 somma 1 님블로그에서제공된 bkdp3 소스와 HackerDefender 2 SDT Hooking 예제소스를 기반으로사알짝수정만가해진것임을미리알려드립니다. 먼저디바이스드라이버프로그램의골격을만듭니다. 위에서만들었던 LastMinimal을통째로복사해오면되겠습니다. 드라이버가로드되고가장처음해야할일이무엇일까요? 우리의목적은 SSDT에저장되어있는 API의주소를우리가만든함수로바꿔치기하는것입니다. 즉먼저 SSDT 에접근할수있어야만합니다. 그래야테이블내우리가후킹하기원하는 API의주소를바꿔쓸수있기때문입니다. 5장처음에서살펴보았듯이 Kernel에의해 export 된 KeServiceDescriptorTable 변수를통해 SSDT에접근할수있으므로다음과같이선언하면됩니다. 그림 46. KeServiceDescriptorTable 선언
40 그리고역시앞에서살펴보았던 SSDT 구조체의원형을선언해줍니다. 그림 47. SSDT 구조체추가 여기까지오면우리는 KeServiceDescriptorTable 이라는변수를통해 SSDT 구조체까지접근할수있게됩니다. 어떤 API를후킹할지는이제입맛에따라고르기만하면됩니다. 쉽게테스트해볼수있도록 ZwWriteFile을후킹해보도록하겠습니다. 짐작하시다시피파일쓰기를하면에러메세지를뱉어내도록할것입니다. ZwWriteFile이 SSDT에서몇번째테이블에저장되어있는지를먼저알아봅니다. 위의그림 43, 44에서살펴본것과동일한방법으로찾아보면 NtWriteFile의주소는 0x805730a0 임을알수있습니다. 이렇게... 무식하게하는방법이하나있고좀더코드가우아하게보이도록하려면아래와같이정의하여사용할수있습니다. 그림 48. SYSTEMSERVICE 매크로 자위의매크로를한번살짝뜯어보겠습니다. 40
41 먼저 SYSTEMSERVICE 매크로는함수이름을받아서해당함수가위치하는메모리의주소를반환합니다. 앞에서도살펴보았듯이 KeServiceDescriptorTable.ServiceTableBase[ 함수의인덱스번호 ], 이렇게함수의주소로접근할수있습니다.( 위에서넘겨주는함수는 ZwXXX, 리턴값은 NtXXX입니다 ) _func로 ZwCreateFile을넘겨주면해당 API가저장되어있는주소가넘겨집니다. 4장에서작성한디바이스드라이버예제에서 ZwCreateFile을 DbgPrint로찍어보시면확인할수있습니다. 아래그림 49는의심많은분들을위한확인화면입니다ㅎㅎ ; 그림 49. ZwCreateFile 의주소 [DbgPrint("ZwCreateFile Address : [%x] n n", ZwCreateFile)] ZwCreateFile 을찍어보면 0x804ff558 이나옵니다. 해당메모리의내용은아래와같습니다. 그림 50. 0x804ff558 메모리의내용 위의그림 50에서 ZwCreateFile이시작되는메모리는 move eax, 25h 라는내용을포함하고있는것을알수있습니다. 여기에서규칙적인패턴을발견할수있는데모든 ZwXXX의시작은 move eax, index가된다는것입니다. 그러므로매크로에서 ((PUCHAR)ZwWriteFile+1) 이부분은 ZwWriteFile의메모리시작주소의다음 4바이트, 즉 Index 값을가리키게됩니다.(PUCHAR은 unsigned char형입니다 ) 결국 SYSSTEMSERVICE 매크로는 KeServiceDescriptorTable.ServiceTableBase[*(PULONG)( 함수의인덱스 4바이트 )] 가되며 NtXXX 함수가저장되어있는주소를반환하게됩니다. 자그럼이렇게가정한이론이맞는지실제로값을출력해보겠습니다. DbgPrint("ZwCreateFile Address : [%x] n n", ZwCreateFile); DbgPrint("(PUCHAR)ZwCreateFile + 1 Address : [%x] n n", (PUCHAR)ZwCreateFile+1); DbgPrint("*(PULONG)(PUCHAR)ZwCreateFile + 1 Address : [%x] n n", *(PULONG)((PUCHAR)ZwCreateFile+1)); 41
42 그림 51. 매크로결과확인 그림 51 의두번째결과 0x804ff559 주소의내용은인덱스번호 (0x25) 임을알수있습니다. 그림 ff559 메모리덤프 SYSTEMSERVICE 매크로는 ZwXXXX 함수주소를입력받아 NtXXXX 함수의주소를반환한다는것이 증명되었습니다. 다음으로 SYSCALL_INDEX 매크로는함수이름을받아서해당함수의 SSDT 내인덱스번호를리턴합 니다. 그러므로 NtXXXX 함수의주소를얻기위해아래그림 53 처럼사용하는것이가능합니다. 그림 53. SYSTEMSERVICE 매크로사용법 자이제우리는 SSDT 안에저장되어있는 ZwWrite 의주소에접근할수있게되었습니다. 그주소를우리가작성한 API가저장된주소로바꿔치기만하면되는데 XP이상에서 SSDT는 Read Only로되어있습니다. 이것은 Windows의메모리보호를위해사용된기법으로써 Write Protection이라고합니다. 이부분을제거해야만 SSDT에바꿔칠주소를쓰는것이가능해집니다. Write Protection 기법을우회하는방법은여러가지가있는데이문서에서는 CR0 레지스터를이용하는방법과 MDL(Memory Descriptor List) 을이용하는방법에대해서만설명하도록하겠습니다. 먼저 CR0 레지스터를이용하는방법입니다. CR0에서 Write Protection을제거하는방법과관련한설명은 somma 님블로그에자세히설명되어있습니다. 저의설명이들어가면원래의뜻을제대로전달하지못할수도있다는생각에해당부분을염치없이죽긁어왔습니다. somma 님의양해를구합니다. cr0 레지스터를이용한 Write Protection 제거 42
43 [ 그림 x86 의 Control register] 컨트롤레지스터는현재수행중인태스크의특성과프로세스의동작모드를결정짓는특별한레지스 터이다. 32 비트와 32 비트호환아키텍쳐에서이레지스터들은 32 비트이고, 64 비트에서는 64 비트 다. mov CRn 인스트럭션으로이레지스터들을건드릴수있고.. CR3 레지스터는페이지디렉토리를찾아가기위한레지스터이고.. 나머지는.. RTFM! CR0 는 CPU 의 operating mode 와상태를제어하는플래그를포함하고있다. 오홋.. ^^ PG, CD 등... 중요한플래그들이많지만일단관심대상은아니고.. ^^ WP Write Protect (bit 16 of CR0) Inhibits supervisor-level procedures from writing into user-level read-only pages when set; allows supervisor-level procedures to write into user-level read-only pages when clear. This flag facilitates implementation of the copy-on-write method of creating a new process (forking) used by operating systems such as UNIX*. Copy-On-Write 매커니즘과관련있는넘이었군.. 결국이플래그를조작하면 write protection 속성을바꿔치기할수있다는거다. 43
44 // // 콘트롤레지스터관련 (IA-32 manual vol3, ch 2.5 // CR0 (Control Register Zero) 레지스터의 WP 비트 (16) 는쓰기속성제어에사용됨 // #define CR0_WP_MASK 0x0FFFEFFFF VOID ClearWriteProtect(VOID) { asm { push eax; mov and mov pop eax, cr0; eax, CR0_WP_MASK; // WP 클리어 cr0, eax; eax; } } VOID SetWriteProtect(VOID) { asm { push eax; mov or mov pop eax, cr0; eax, not CR0_WP_MASK; // WP 비트세팅 cr0, eax; eax; } } 더자세한내용은 IA-32 메뉴얼의 4.1 섹션을참고하면된다. 요는페이지레벨의프로텍션을 en/disable 하기위해서는 PDE, PTE 의플래그와 CR0 의 WP 비트 를조작한단거다. Clear the WP flag in control register CR0. 44
45 Set the read/write (R/W) and user/supervisor (U/S) flags for each page-directory and pagetable entry. - 출처 : 윈도우쪼물딱거리기 ( 두번째방법으로 MDL을이용하는방법입니다. MDL은 Direct I/O를이용해 buffer에접근할때에사용되는구조체입니다. 일반적으로사용자 buffer 와디바이스간의데이터를교환하는방법에는 Neither I/O, Buffered I/O, Direct I/O의세가지방법이있습니다. Neither I/O는직접찾아보시고 Buffered I/O는 I/O Manager가사용자 buffer와동일한 buffer를 nonpaged pool에할당한후데이터를 Swap 하는방법이고 Direct I/O는중간단계의 buffer 생성이생략되는것이라고할수있습니다. 즉 Buffered I/O에서는메모리복사가일어나고 (buffer에데이터를 swap), Direct I/O에서는일어나지않습니다. 드라이버는사용자 buffer가 page 되지않도록 lock을건후 MDL에기술된정보 ( 사용자 buffer의물리적주소 ) 를참고해서사용자 buffer에접근하게됩니다. 그림 54와 55는두방식의차이를그림으로표현한것입니다. 그림 54. Buffered I/O 45
46 그림 55. Direct I/O 우리가할일은 nonpaged pool 에 MDL 을생성하여그것이 SSDT 를가리키게하는것입니다. 물론생 성된 MDL 은쓰기가능하게설정되어있으므로해당 MDL 이가리키는실제물리적메모리영역, 즉 원래 SSDT 에도쓰는것이가능하게되는것입니다. MDL 의구조는아래그림 56 과같습니다. 그림 56. MDL 구조 MDL 의구조체는아래와같으며 ntddk.h 에정의되어있습니다. 46
47 그림 57. MDL 구조체의원형 MDL 을이용하여 SSDT 의 Write-Protection 을제거하는코드는아래와같습니다. 그림 58. MDL 을이용한 Write Protection 제거 위의소스를살펴보면먼저 MDL 구조체포인터변수를선언한뒤 (g_pmdsystemcall) 새로운 MDL을만들어서가리키게합니다. MmCreateMdl 1 이라는 API는이름에서도알수있듯이 MDL을생성하는기능을합니다. MSDN에서살펴보면해당 API는없어지고기존에제작된 Driver 바이너리를위해지원용도로만사용되고있으므로 IoAllocateMdl 2 라는 API를사용할것을권장하고있습니다. 그러나! 귀찮기때문에소스에서는그냥 MmCreateMdl을사용하도록하겠습니다. IoAllocateMdl의사용예제는여기 3 에서확인하실수있습니다. 다시소스로돌아가서 MmCreateMdl API로만들어진새로운 MDL을 nonpaged pool 메모리영역에생성하기위해 MmBuildMdlForNonPagedPool 4 API를사용합니다. 여기까지오면 nonpaged pool 메모리영역에 SSDT를가리키는, 마치심볼릭링크같은것이하나생성되게됩니다. 이제 MdlFlags에 MDL_MAPPED_TO_SYSTEM을추가함으로써쓰기가가능하게되었 1 MmCreateMdl : 2 IoAllocateMdl : 3 여기 : 4 MmBuildMdlForNonPagedPool : 47
48 습니다. MDL_MAPPED_TO_SYSTEM 은구글님께물어봐도속시원한대답이없어서그냥쓰기가능 하게해주는변수인가보다.. 라고생각하고넘어가겠습니다. -_-; 마지막으로 MmLockedPages 1 API 로생성된 MDL 의물리메모리주소를얻어옵니다. 두번째인수로 는 KernelMode, UserMode가있는데 MSDN에도자세한설명이없고그냥 대부분의드라이버에서는 KernelMode를사용한다 라고만되어있습니다. 두번째인수 AccessMode가 KernelMode일경우 MDL이가리키고있는메모리의유저모드공간주소를구할때, UserMode는그반대의경우일때사용됩니다. 여기까지오면이제우리는 MDL을통해시스템의 SSDT를읽고쓰기가능하게됩니다. 이제후킹하기원하는임의의 API를우리가만든 API의주소로바꿔치기하는과정만이남았습니다. 그림 59. InterlockedExchange 그림 59 에서볼수있듯이 InterlockedExchange 2 라는 API 가사용되었습니다. 원래 InterlockedXXX 함수들은멀티스레드환경에서동기화를위해사용되는함수들인데 InterlockedExchange API의경우인수로전달받은두값을비교하여같지않다면첫번째인수 Target의값을두번째인수 value로바꿉니다. 그리고리턴값으로 Target의값을반환합니다. 그림 59는 ZwWriteFile라는원래의 API를 NewZwWriteFile, 즉우리가작성한 API로바꿔치기하는코드입니다. 마지막으로 NewZwWriteFile을살펴보겠습니다. 1 MmLockedPages : 2 InterlockedExchange : 48
49 그림 60. NewZwWriteFile NewZwWriteFile 의기능은단순합니다. 원래의 ZwWriteFile 를호출하여정상적으로기능이작동하도록하는데만약 FDel.exe 라는프로그램이 ZwWriteFile 을발생시켰다면특정디버그메시지를출력하도록하였습니다. ZwWriteFile 을발생시킨프로세스의이름확인을위해 PsGetCurrentProcess 1 API 를이용하여현재프 로세스의 _EPROCESS 구조체를얻어온후 ImageFileName 필드를참조하여프로세스의이름을알아냅니다. _EPROCESS 구조체는프로세스를나타내는구조체인데, 설명하려면약간복잡합니다. 따로찾아보시길바랍니다. 해당구조체를포함시키기위해 IFS에서사용되는 ntifs.h 헤더파일을포함시켰습니다. 해당헤더파일에이미 SSDT에대한구조체가정의되어있어컴파일시중복에러를발생시킵니다. ntifs.h 헤더파일에서해당부분을주석처리하면이상없이컴파일이됩니다. 아래는 Fdel.exe 프로그램을실행시켰을때디버그메시지가찍히는것을캡춰한것입니다. Fdel.exe 프로그램은 CreateFile, WriteFile, DeleteFile 을이용해서단순히파일을생성, 삭제하는예제프로그램입니다. 1 PsGetCurrentProcess : 49
50 그림 61. ZwWriteFile Hooking Message CR0 레지스터를이용한 SSDT Hooking 은 somma 님의 bkdp3 소스를참고하시기바랍니다. 작성된모든프로그램은아래링크에서다운받으실수있습니다. 코드 : ( 코드중 FileDeleteSample 은바이너리파일이름을 FDel.exe 로변경하시기바랍니다 ) 50
51 6. 추가 SSDT Hooking 에관한흥미로운주제가몇가지있습니다. 1. SSDT Hooking이모든스레드를 Hooking 할수있는것은아닙니다. 각스레드는자신의서비스테이블에대한포인터를가집니다. 그러므로새로운서비스테이블을생성하여그것을가리키게할경우 SSDT Hooking은더이상쓸모가없어지게됩니다. 선경렬님의 ksthb 1 프로그램또는 Dual 님의 saruengang 2 프로그램으로실제확인해볼수있습 니다. 소스가궁금하시다면위의프로그램외 Dual 님이공개하신 HyperOlly 3 과 Dual s ksthb 4 를 보시면많은도움이될것입니다. 2. SDT Restore SSDT 의상태를검사해서원래대로복원시켜버리는프로그램이있습니다. SIG 5 라는회사에서공 개한프로그램인데요해당프로그램을사용하면역시 SSDT Hooking 은무용지물이됩니다. 해당프로그램에대한내용은아래의링크에서확인하시기바랍니다. SDT Restore : 3. Microsft는 2007년 1월 Windows Vista를출시하였습니다. Vista에서는기존의방법대로후킹을하는것이불가능해집니다. 현재수많은해커들에의해분석이시도되고있으며많지는않지만그결과물로 Vista의 Unexported Kernel Symbol이발표되었습니다. 아래의링크에서확인하시기바랍니다. 현재마이크로소프트는 Windows Driver Kit 이라는새로운형태의 Framework 를제공하고있으며커널 모드 Driver Framework(KMDF), User Mode Driver Framework(UDMF) 로서구현하고있습니다. 1 Ksthb : 2 Saruen Gang : 寫輪眼 -100-Official-Release 3 HyperOlly : 4 Dual s ksthb : 5 Security and Information InteGrity : 51
52 7. 참고자료 Documents) 1. Rootkits: Subverting the Windows Kernel, Greg Hoglund 1. Inside Windows Rootkits 2. Windows Driver Model2, Microsoft Press 3. Attack Native API, Devguru 4. Rootkit을이용하는악성코드, 사이버시큐리티 2005년 11월호 5. ROOTKITS, Greg Hoglund, James Butler 6. Defeating Kernel Native API Hookers by Direct Service Dispatch Table Restoration, Chew Keong TAN 7. 원리와예제로배우는 Windows 2000 디바이스드라이버, 인포북 8. Windows Internals, Microsoft Press 9. 64비트윈도우커널분석 AMD64, Micro Software 2005년 10월호 Web) 1. Hooking Windows NT System Services 2. Windows Global API Hooking 3. Window 쪼물딱거리기 4. How Do Windows NT System Calls REALLY Work? 5. System Call Optimization with the SYSENTER Instruction 6. Hooking the kernel directly 7. That s Just the Way It Is How NT Describes I/O Requests 52
53 8. MSDN 9. 드라이버온라인 53
SSDT Hooking
SSDT Hooking Last Update : 2006 년 11 월 10 일 Written by Jerald Lee Contact Me : lucid78@gmail.com 본문서는커널모드후킹기술중의하나인 SSDT 후킹에대해정리한것입니다. 제가알고있는지식이너무짧아가급적이면다음에언제봐도쉽게이해할수있을정도로쉽게쓸려고노력하였습니다. 제가작성하였던기존의 Windows
More informationMicrosoft Word - [Windows Hook] 6.HideProcess.doc
Hide Process Last Update : 2007 년 6 월 11 일 Written by Jerald Lee Contact Me : lucid78@gmail.com 본문서는 SSDT Hook을이용한프로세스를감추는기술에대해정리한것입니다. 제가알고있는지식이너무짧아가급적이면다음에언제보아도쉽게이해할수있도록쓸려고노력하였습니다. 기존에나와있는여러훌륭한문서들을토대로짜집기의형태로작성되었으며기술하지못한원문저자들에게매우죄송할따름입니다.
More information임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과
임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과 System call table and linkage v Ref. http://www.ibm.com/developerworks/linux/library/l-system-calls/ - 2 - Young-Jin Kim SYSCALL_DEFINE 함수
More informationMicrosoft PowerPoint - chap02-C프로그램시작하기.pptx
#include int main(void) { int num; printf( Please enter an integer "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); return 0; } 1 학습목표 을 작성하면서 C 프로그램의
More informationMicrosoft Word - ntasFrameBuilderInstallGuide2.5.doc
NTAS and FRAME BUILDER Install Guide NTAS and FRAME BUILDER Version 2.5 Copyright 2003 Ari System, Inc. All Rights reserved. NTAS and FRAME BUILDER are trademarks or registered trademarks of Ari System,
More informationInstall stm32cubemx and st-link utility
STM32CubeMX and ST-LINK Utility for STM32 Development 본문서는 ST Microelectronics 의 ARM Cortex-M 시리즈 Microcontroller 개발을위해제공되는 STM32CubeMX 와 STM32 ST-LINK Utility 프로그램의설치과정을설명합니다. 본문서는 Microsoft Windows 7
More informationMicrosoft PowerPoint - o8.pptx
메모리보호 (Memory Protection) 메모리보호를위해 page table entry에 protection bit와 valid bit 추가 Protection bits read-write / read-only / executable-only 정의 page 단위의 memory protection 제공 Valid bit (or valid-invalid bit)
More informationA Hierarchical Approach to Interactive Motion Editing for Human-like Figures
단일연결리스트 (Singly Linked List) 신찬수 연결리스트 (linked list)? tail 서울부산수원용인 null item next 구조체복습 struct name_card { char name[20]; int date; } struct name_card a; // 구조체변수 a 선언 a.name 또는 a.date // 구조체 a의멤버접근 struct
More information슬라이드 1
마이크로컨트롤러 2 (MicroController2) 2 강 ATmega128 의 external interrupt 이귀형교수님 학습목표 interrupt 란무엇인가? 기본개념을알아본다. interrupt 중에서가장사용하기쉬운 external interrupt 의사용방법을학습한다. 1. Interrupt 는왜필요할까? 함수동작을추가하여실행시키려면? //***
More information임베디드시스템설계강의자료 6 system call 1/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과
임베디드시스템설계강의자료 6 system call 1/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과 시스템호출개요 리눅스에서는사용자공간과커널공간을구분 사용자프로그램은사용자모드, 운영체제는커널모드에서수행 커널공간에대한접근은커널 ( 특권, priviledged) 모드에서가능 컴퓨팅자원 (CPU, memory, I/O 등 ) 을안전하게보호 커널수행을안전하게유지
More informationChapter #01 Subject
Device Driver March 24, 2004 Kim, ki-hyeon 목차 1. 인터럽트처리복습 1. 인터럽트복습 입력검출방법 인터럽트방식, 폴링 (polling) 방식 인터럽트서비스등록함수 ( 커널에등록 ) int request_irq(unsigned int irq, void(*handler)(int,void*,struct pt_regs*), unsigned
More informationMicrosoft Word - windows server 2003 수동설치_non pro support_.doc
Windows Server 2003 수동 설치 가이드 INDEX 운영체제 설치 준비과정 1 드라이버를 위한 플로피 디스크 작성 2 드라이버를 위한 USB 메모리 작성 7 운영체제 설치 과정 14 Boot Sequence 변경 14 컨트롤러 드라이버 수동 설치 15 운영체제 설치 17 운영체제 설치 준비 과정 Windows Server 2003 에는 기본적으로
More information<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>
연습문제해답 5 4 3 2 1 0 함수의반환값 =15 5 4 3 2 1 0 함수의반환값 =95 10 7 4 1-2 함수의반환값 =3 1 2 3 4 5 연습문제해답 1. C 언어에서의배열에대하여다음중맞는것은? (1) 3차원이상의배열은불가능하다. (2) 배열의이름은포인터와같은역할을한다. (3) 배열의인덱스는 1에서부터시작한다. (4) 선언한다음, 실행도중에배열의크기를변경하는것이가능하다.
More information버퍼오버플로우-왕기초편 10. 메모리를 Hex dump 뜨기 앞서우리는버퍼오버플로우로인해리턴어드레스 (return address) 가변조될수있음을알았습니다. 이제곧리턴어드레스를원하는값으로변경하는실습을해볼것인데요, 그전에앞서, 메모리에저장된값들을살펴보는방법에대해배워보겠습
앞서우리는버퍼오버플로우로인해리턴어드레스 (return address) 가변조될수있음을알았습니다. 이제곧리턴어드레스를원하는값으로변경하는실습을해볼것인데요, 그전에앞서, 메모리에저장된값들을살펴보는방법에대해배워보겠습니다. 여러분모두 Windows 에서 hex editor(hex dump, hex viewer) 라는것을사용해보셨을겁니다. 바로바이너리파일을 16 진수
More informationMicrosoft PowerPoint - chap01-C언어개요.pptx
#include int main(void) { int num; printf( Please enter an integer: "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); return 0; } 1 학습목표 프로그래밍의 기본 개념을
More information<B1E2BCFAB9AEBCAD28C0CCB5BFBCF6295F F6F6B696E672E687770>
SSDT HOOKING을이용한프로세스와파일숨기기 이동수 alonglog@is119.jnu.ac.kr 개 요 기존에만들었던메시지후킹프로그램을숨겨보고싶어서 SSDT후킹을공부하였다. 그리고그결과를정리하여이문서를작성하였다. 프로세스를숨기고파일을숨기기위해서 Native API를후킹했다. 메시지후킹과다르게 SSDT후킹은커널모드에서후킹을해야하므로디바이스드라이버로프로그램이작성되어있다.
More informationMicrosoft PowerPoint - chap06-2pointer.ppt
2010-1 학기프로그래밍입문 (1) chapter 06-2 참고자료 포인터 박종혁 Tel: 970-6702 Email: jhpark1@snut.ac.kr 한빛미디어 출처 : 뇌를자극하는 C프로그래밍, 한빛미디어 -1- 포인터의정의와사용 변수를선언하는것은메모리에기억공간을할당하는것이며할당된이후에는변수명으로그기억공간을사용한다. 할당된기억공간을사용하는방법에는변수명외에메모리의실제주소값을사용하는것이다.
More information<4D F736F F F696E74202D20BBB7BBB7C7D15F FBEDFB0A3B1B3C0B05FC1A638C0CFC2F72E BC8A3C8AF20B8F0B5E55D>
뻔뻔한 AVR 프로그래밍 The Last(8 th ) Lecture 유명환 ( yoo@netplug.co.kr) INDEX 1 I 2 C 통신이야기 2 ATmega128 TWI(I 2 C) 구조분석 4 ATmega128 TWI(I 2 C) 실습 : AT24C16 1 I 2 C 통신이야기 I 2 C Inter IC Bus 어떤 IC들간에도공통적으로통할수있는 ex)
More informationISP and CodeVisionAVR C Compiler.hwp
USBISP V3.0 & P-AVRISP V1.0 with CodeVisionAVR C Compiler http://www.avrmall.com/ November 12, 2007 Copyright (c) 2003-2008 All Rights Reserved. USBISP V3.0 & P-AVRISP V1.0 with CodeVisionAVR C Compiler
More information1
초보자를위한 Kernel based windows rootkit -1 부 - By Beist Security Study Group (http://beist.org) 요약 : 이문서는윈도우 2000/XP/2003 환경에서의커널루트킷에대한개요와윈도우와하드웨어간의커넥션에대해다룹니다. 그리고실습을위해커널레벨에서 CR0 레지스터를변경하여 SSDT 의 read-only
More information<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202839C1D6C2F7207E203135C1D6C2F >
10주차 문자 LCD 의인터페이스회로및구동함수 Next-Generation Networks Lab. 5. 16x2 CLCD 모듈 (HY-1602H-803) 그림 11-18 19 핀설명표 11-11 번호 분류 핀이름 레벨 (V) 기능 1 V SS or GND 0 GND 전원 2 V Power DD or V CC +5 CLCD 구동전원 3 V 0 - CLCD 명암조절
More information<B1E2BCFAB9AEBCAD28C0CCB5BFBCF6295F494454486F6F6B696E672E687770>
IDT Hooking을 이용한 Simple KeyLogger 이동수 alonglog@is119.jnu.ac.kr 개 요 커널 Hooking에 관하여 공부하는 중에 IDT Hooking에 관하여 알게 되었다. 이전에 공부하 였던 SSDT Hooking과는 다른 요소가 많다. IDT Hooking을 공부하면서 컴퓨터의 인터럽트 과정을 이해할 수 있는 좋은 계기가
More information목차 윈도우드라이버 1. 매뉴얼안내 운영체제 (OS) 환경 윈도우드라이버준비 윈도우드라이버설치 Windows XP/Server 2003 에서설치 Serial 또는 Parallel 포트의경우.
소프트웨어매뉴얼 윈도우드라이버 Rev. 3.03 SLP-TX220 / TX223 SLP-TX420 / TX423 SLP-TX400 / TX403 SLP-DX220 / DX223 SLP-DX420 / DX423 SLP-DL410 / DL413 SLP-T400 / T403 SLP-T400R / T403R SLP-D220 / D223 SLP-D420 / D423
More informationPowerPoint 프레젠테이션
KeyPad Device Control - Device driver Jo, Heeseung HBE-SM5-S4210 에는 16 개의 Tack Switch 를사용하여 4 행 4 열의 Keypad 가장착 4x4 Keypad 2 KeyPad 를제어하기위하여 FPGA 내부에 KeyPad controller 가구현 KeyPad controller 16bit 로구성된
More informationMicrosoft PowerPoint Android-SDK설치.HelloAndroid(1.0h).pptx
To be an Android Expert 문양세강원대학교 IT 대학컴퓨터학부 Eclipse (IDE) JDK Android SDK with ADT IDE: Integrated Development Environment JDK: Java Development Kit (Java SDK) ADT: Android Development Tools 2 JDK 설치 Eclipse
More information커알못의 커널 탐방기 이 세상의 모든 커알못을 위해서
커알못의 커널 탐방기 2015.12 이 세상의 모든 커알못을 위해서 개정 이력 버전/릴리스 0.1 작성일자 2015년 11월 30일 개요 최초 작성 0.2 2015년 12월 1일 보고서 구성 순서 변경 0.3 2015년 12월 3일 오탈자 수정 및 글자 교정 1.0 2015년 12월 7일 내용 추가 1.1 2015년 12월 10일 POC 코드 삽입 및 코드
More information<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>
리눅스 오류처리하기 2007. 11. 28 안효창 라이브러리함수의오류번호얻기 errno 변수기능오류번호를저장한다. 기본형 extern int errno; 헤더파일 라이브러리함수호출에실패했을때함수예 정수값을반환하는함수 -1 반환 open 함수 포인터를반환하는함수 NULL 반환 fopen 함수 2 유닉스 / 리눅스 라이브러리함수의오류번호얻기 19-1
More informationPoison null byte Excuse the ads! We need some help to keep our site up. List 1 Conditions 2 Exploit plan 2.1 chunksize(p)!= prev_size (next_chunk(p) 3
Poison null byte Excuse the ads! We need some help to keep our site up. List 1 Conditions 2 Exploit plan 2.1 chunksize(p)!= prev_size (next_chunk(p) 3 Example 3.1 Files 3.2 Source code 3.3 Exploit flow
More information슬라이드 1
-Part3- 제 4 장동적메모리할당과가변인 자 학습목차 4.1 동적메모리할당 4.1 동적메모리할당 4.1 동적메모리할당 배울내용 1 프로세스의메모리공간 2 동적메모리할당의필요성 4.1 동적메모리할당 (1/6) 프로세스의메모리구조 코드영역 : 프로그램실행코드, 함수들이저장되는영역 스택영역 : 매개변수, 지역변수, 중괄호 ( 블록 ) 내부에정의된변수들이저장되는영역
More informationLab 3. 실습문제 (Single linked list)_해답.hwp
Lab 3. Singly-linked list 의구현 실험실습일시 : 2009. 3. 30. 담당교수 : 정진우 담당조교 : 곽문상 보고서제출기한 : 2009. 4. 5. 학과 : 학번 : 성명 : 실습과제목적 : 이론시간에배운 Singly-linked list를실제로구현할수있다. 실습과제내용 : 주어진소스를이용해 Singly-linked list의각함수를구현한다.
More informationSSDT(System Service Descriptor Table) Hooking Written by 백구 Contack Me : 목차 가. 이문서의목적... 2 나. 유저모드와커널모드... 2 다. Windows API 흐름..
SSDT(System Service Descriptor Table) Hooking Written by 백구 Contack Me : whiteexplod@naver.com 목차 가. 이문서의목적... 2 나. 유저모드와커널모드... 2 다. Windows API 흐름... 2 1. User Level... 2 2-1. 소프트웨어인터럽트 0x2E에의한커널모드짂입방식...
More informationPowerPoint 프레젠테이션
System Software Experiment 1 Lecture 5 - Array Spring 2019 Hwansoo Han (hhan@skku.edu) Advanced Research on Compilers and Systems, ARCS LAB Sungkyunkwan University http://arcs.skku.edu/ 1 배열 (Array) 동일한타입의데이터가여러개저장되어있는저장장소
More information<41736D6C6F D20B9AEBCADBEE7BDC42E687770>
IDA Remote Debugging 2007. 01. 이강석 / certlab@gmail.com http://www.asmlove.co.kr - 1 - Intro IDA Remote debugging에대해알아봅시다. 이런기능이있다는것을잘모르시는분들을위해문서를만들었습니다. IDA 기능중에분석할파일을원격에서디버깅할수있는기능이있는데먼저그림과함께예를들어설명해보도록하겠습니다.
More informationMicrosoft Word - 3부A windows 환경 IVF + visual studio.doc
Visual Studio 2005 + Intel Visual Fortran 9.1 install Intel Visual Fortran 9.1 intel Visual Fortran Compiler 9.1 만설치해서 DOS 모드에서실행할수있지만, Visual Studio 2005 의 IDE 를사용하기위해서는 Visual Studio 2005 를먼저설치후 Integration
More informationMicrosoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100
2015-1 프로그래밍언어 9. 연결형리스트, Stack, Queue 2015 년 5 월 4 일 교수김영탁 영남대학교공과대학정보통신공학과 (Tel : +82-53-810-2497; Fax : +82-53-810-4742 http://antl.yu.ac.kr/; E-mail : ytkim@yu.ac.kr) 연결리스트 (Linked List) 연결리스트연산 Stack
More information11장 포인터
누구나즐기는 C 언어콘서트 제 9 장포인터 이번장에서학습할내용 포인터이란? 변수의주소 포인터의선언 간접참조연산자 포인터연산 포인터와배열 포인터와함수 이번장에서는포인터의기초적인지식을학습한다. 포인터란? 포인터 (pointer): 주소를가지고있는변수 메모리의구조 변수는메모리에저장된다. 메모리는바이트단위로액세스된다. 첫번째바이트의주소는 0, 두번째바이트는 1, 변수와메모리
More informationMicrosoft Word - FunctionCall
Function all Mechanism /* Simple Program */ #define get_int() IN KEYOARD #define put_int(val) LD A val \ OUT MONITOR int add_two(int a, int b) { int tmp; tmp = a+b; return tmp; } local auto variable stack
More informationJVM 메모리구조
조명이정도면괜찮조! 주제 JVM 메모리구조 설미라자료조사, 자료작성, PPT 작성, 보고서작성. 발표. 조장. 최지성자료조사, 자료작성, PPT 작성, 보고서작성. 발표. 조원 이용열자료조사, 자료작성, PPT 작성, 보고서작성. 이윤경 자료조사, 자료작성, PPT작성, 보고서작성. 이수은 자료조사, 자료작성, PPT작성, 보고서작성. 발표일 2013. 05.
More information금오공대 컴퓨터공학전공 강의자료
C 프로그래밍프로젝트 Chap 14. 포인터와함수에대한이해 2013.10.09. 오병우 컴퓨터공학과 14-1 함수의인자로배열전달 기본적인인자의전달방식 값의복사에의한전달 val 10 a 10 11 Department of Computer Engineering 2 14-1 함수의인자로배열전달 배열의함수인자전달방식 배열이름 ( 배열주소, 포인터 ) 에의한전달 #include
More informationPowerPoint 프레젠테이션
Web server porting 2 Jo, Heeseung Web 을이용한 LED 제어 Web 을이용한 LED 제어프로그램 web 에서데이터를전송받아타겟보드의 LED 를조작하는프로그램을작성하기위해다음과같은소스파일을생성 2 Web 을이용한 LED 제어 LED 제어프로그램작성 8bitled.html 파일을작성 root@ubuntu:/working/web# vi
More informationAPI 매뉴얼
PCI-DIO12 API Programming (Rev 1.0) Windows, Windows2000, Windows NT and Windows XP are trademarks of Microsoft. We acknowledge that the trademarks or service names of all other organizations mentioned
More information지난시간에... 우리는 kernel compile을위하여 cross compile 환경을구축했음. UBUNTU 12.04에서 arm-2009q3를사용하여 간단한 c source를빌드함. 한번은 intel CPU를위한 gcc로, 한번은 ARM CPU를위한 gcc로. AR
Configure Kernel Build Environment And kernel & root file system Build 2018-09-27 VLSI Design Lab 1 지난시간에... 우리는 kernel compile을위하여 cross compile 환경을구축했음. UBUNTU 12.04에서 arm-2009q3를사용하여 간단한 c source를빌드함.
More informationKEY 디바이스 드라이버
KEY 디바이스드라이버 임베디드시스템소프트웨어 I (http://et.smu.ac.kr et.smu.ac.kr) 차례 GPIO 및 Control Registers KEY 하드웨어구성 KEY Driver 프로그램 key-driver.c 시험응용프로그램 key-app.c KEY 디바이스드라이버 11-2 GPIO(General-Purpose Purpose I/O)
More informationPCServerMgmt7
Web Windows NT/2000 Server DP&NM Lab 1 Contents 2 Windows NT Service Provider Management Application Web UI 3 . PC,, Client/Server Network 4 (1),,, PC Mainframe PC Backbone Server TCP/IP DCS PLC Network
More informationLab 4. 실습문제 (Circular singly linked list)_해답.hwp
Lab 4. Circular singly-linked list 의구현 실험실습일시 : 2009. 4. 6. 담당교수 : 정진우 담당조교 : 곽문상 보고서제출기한 : 2009. 4. 12. 학과 : 학번 : 성명 : 실습과제목적 : 이론시간에배운 Circular Singly-linked list를실제로구현할수있다. 실습과제내용 : 주어진소스를이용해 Circular
More informationMicrosoft Word - Armjtag_문서1.doc
ARM JTAG (wiggler 호환 ) 사용방법 ( IAR EWARM 에서 ARM-JTAG 로 Debugging 하기 ) Test Board : AT91SAM7S256 IAR EWARM : Kickstart for ARM ARM-JTAG : ver 1.0 ( 씨링크테크 ) 1. IAR EWARM (Kickstart for ARM) 설치 2. Macraigor
More information1. Execution sequence 첫번째로 GameGuard 의실행순서는다음과같습니다 오전 10:10:03 Type : Create 오전 10:10:03 Parent ID : 0xA 오전 10:10:03 Pro
#44u61l5f GameGuard 에대한간단한분석. By Dual5651 (http://dualpage.muz.ro) 요약 : 이문서는분석자의입장에서 GameGuard의동작을모니터링한것에대한것입니다. 실제 GameGuard의동작방식과는다소차이가있을수있습니다. 이문서에등장하는모든등록상표에대한저작권은해당저작권자에게있습니다. 1. Execution sequence
More information슬라이드 1
/ 유닉스시스템개요 / 파일 / 프로세스 01 File Descriptor file file descriptor file type unix 에서의파일은단지바이트들의나열임 operating system 은파일에어떤포맷도부과하지않음 파일의내용은바이트단위로주소를줄수있음 file descriptor 는 0 이나양수임 file 은 open 이나 creat 로 file
More information<C1A4C8B8BFF8C6F2B0A15FB1E2BCFAB9AEBCAD5F444B4F4D5FC0CCB5BFBCF62E687770>
DKOM을이용한은닉기법 이동수 alonglog@is119.jnu.ac.kr 개 요 유저모드에서프로세스나디바이스드라이버등을확인할수없도록만드는기법중하나가커널 Hooking과 DKOM 기법이있다. DKOM 기법은 Hooking과다르게커널개체를직접변경한다. 이는 Hooking보다훨씬강력하고탐지가힘들다. 이문서에서는 DKOM에대해서다룰것이다. DKOM 기법을통해다양한효과를얻을수있다.
More informationMicrosoft PowerPoint SDK설치.HelloAndroid(1.5h).pptx
To be an Android Expert 문양세강원대학교 IT 대학컴퓨터학부 개발환경구조및설치순서 JDK 설치 Eclipse 설치 안드로이드 SDK 설치 ADT(Androd Development Tools) 설치 AVD(Android Virtual Device) 생성 Hello Android! 2 Eclipse (IDE) JDK Android SDK with
More informationKNK_C_05_Pointers_Arrays_structures_summary_v02
Pointers and Arrays Structures adopted from KNK C Programming : A Modern Approach 요약 2 Pointers and Arrays 3 배열의주소 #include int main(){ int c[] = {1, 2, 3, 4}; printf("c\t%p\n", c); printf("&c\t%p\n",
More informationWindows 8에서 BioStar 1 설치하기
/ 콘텐츠 테이블... PC에 BioStar 1 설치 방법... Microsoft SQL Server 2012 Express 설치하기... Running SQL 2012 Express Studio... DBSetup.exe 설정하기... BioStar 서버와 클라이언트 시작하기... 1 1 2 2 6 7 1/11 BioStar 1, Windows 8 BioStar
More informationhlogin2
0x02. Stack Corruption off-limit Kernel Stack libc Heap BSS Data Code off-limit Kernel Kernel : OS Stack libc Heap BSS Data Code Stack : libc : Heap : BSS, Data : bss Code : off-limit Kernel Kernel : OS
More informationDE1-SoC Board
실습 1 개발환경 DE1-SoC Board Design Tools - Installation Download & Install Quartus Prime Lite Edition http://www.altera.com/ Quartus Prime (includes Nios II EDS) Nios II Embedded Design Suite (EDS) is automatically
More informationSBR-100S User Manual
( 1 / 13 ) SBR-100S 모델에 대한 사용자 펌웨어 업그레이드 방법을 안내해 드립니다. SBR-100S 는 신규 펌웨어가 있을시 FOTA(자동업데이트) 기능을 통하여 자동 업그레이드가 되며, 필요시 사용자가 신규 펌웨어를 다운받아 수동으로 업그레이드 할 수 있습니다. 1. 준비하기 1.1 연결 장치 준비 펌웨어 업그레이드를 위해서는 SBR-100S
More information다른 JSP 페이지호출 forward() 메서드 - 하나의 JSP 페이지실행이끝나고다른 JSP 페이지를호출할때사용한다. 예 ) <% RequestDispatcher dispatcher = request.getrequestdispatcher(" 실행할페이지.jsp");
다른 JSP 페이지호출 forward() 메서드 - 하나의 JSP 페이지실행이끝나고다른 JSP 페이지를호출할때사용한다. 예 ) RequestDispatcher dispatcher = request.getrequestdispatcher(" 실행할페이지.jsp"); dispatcher.forward(request, response); - 위의예에서와같이 RequestDispatcher
More information[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi
2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Function) 1. 함수의개념 입력에대해적절한출력을발생시켜주는것 내가 ( 프로그래머 ) 작성한명령문을연산, 처리, 실행해주는부분 ( 모듈 ) 자체적으로실행되지않으며,
More informationMicrosoft Word - src.doc
IPTV 서비스탐색및콘텐츠가이드 RI 시스템운용매뉴얼 목차 1. 서버설정방법... 5 1.1. 서비스탐색서버설정... 5 1.2. 컨텐츠가이드서버설정... 6 2. 서버운용방법... 7 2.1. 서비스탐색서버운용... 7 2.1.1. 서비스가이드서버실행... 7 2.1.2. 서비스가이드정보확인... 8 2.1.3. 서비스가이드정보추가... 9 2.1.4. 서비스가이드정보삭제...
More informationRealDSP UT 프로그램 메뉴얼
Motorola Programmer ( 모델명 : MDProg16) 사용설명서 UUU 리얼시스 (RealSYS) Web: www.realsys.co.kr Tel: 031-420-4326 Fax: 031-420-4329-1 - 1. Motorola Programmer 프로그램특징 A. JTAG & OnCE 기능을이용한 Motorola 의내부플래시메모리 Writing
More informationDeok9_Exploit Technique
Exploit Technique CodeEngn Co-Administrator!!! and Team Sur3x5F Member Nick : Deok9 E-mail : DDeok9@gmail.com HomePage : http://deok9.sur3x5f.org Twitter :@DDeok9 > 1. Shell Code 2. Security
More informationMicrosoft PowerPoint - ch07 - 포인터 pm0415
2015-1 프로그래밍언어 7. 포인터 (Pointer), 동적메모리할당 2015 년 4 월 4 일 교수김영탁 영남대학교공과대학정보통신공학과 (Tel : +82-53-810-2497; Fax : +82-53-810-4742 http://antl.yu.ac.kr/; E-mail : ytkim@yu.ac.kr) Outline 포인터 (pointer) 란? 간접참조연산자
More informationPowerPoint 프레젠테이션
Text-LCD Device Control - Device driver Jo, Heeseung M3 모듈에장착되어있는 Tedxt LCD 장치를제어하는 App 을개발 TextLCD 는영문자와숫자일본어, 특수문자를표현하는데사용되는디바이스 HBE-SM5-S4210 의 TextLCD 는 16 문자 *2 라인을 Display 할수있으며, 이 TextLCD 를제어하기위하여
More informationRHEV 2.2 인증서 만료 확인 및 갱신
2018/09/28 03:56 1/2 목차... 1 인증서 확인... 1 인증서 종류와 확인... 4 RHEVM CA... 5 FQDN 개인 인증서... 5 레드햇 인증서 - 코드 서명 인증서... 6 호스트 인증... 7 참고사항... 8 관련링크... 8 AllThatLinux! - http://allthatlinux.com/dokuwiki/ rhev_2.2_
More informationPathEye 공식 블로그 다운로드 받으세요!! 지속적으로 업그래이드 됩니다. 여러분의 의견을 주시면 개발에 반영하겠 습니다.
PathEye Mobile Ver. 0.71b 2009. 3. 17 By PathEye 공식 블로그 다운로드 받으세요!! http://blog.patheye.com 지속적으로 업그래이드 됩니다. 여러분의 의견을 주시면 개발에 반영하겠 습니다. PathEye 설치 1/3 최종 배포 버전을 다 운로드 받습니다. 다운로드된 파일은 CAB 파일입니다. CAB 파일에는
More informationMicrosoft PowerPoint - chap10-함수의활용.pptx
#include int main(void) { int num; printf( Please enter an integer: "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); return 0; } 1 학습목표 중 값에 의한 전달 방법과
More informationMicrosoft PowerPoint - 02_Linux_Fedora_Core_8_Vmware_Installation [호환 모드]
리눅스 설치 Vmware를 이용한 Fedora Core 8 설치 소프트웨어실습 1 Contents 가상 머신 실습 환경 구축 Fedora Core 8 설치 가상 머신 가상 머신 가상 머신의 개념 VMware의 설치 VMware : 가상 머신 생성 VMware의 특징 실습 환경 구축 실습 환경 구축 Fedora Core 8 설치 가상 머신의 개념 가상 머신 (Virtual
More informationWindows Server 2012
Windows Server 2012 Shared Nothing Live Migration Shared Nothing Live Migration 은 SMB Live Migration 방식과다른점은 VM 데이터파일의위치입니다. Shared Nothing Live Migration 방식은 Hyper-V 호스트의로컬디스크에 VM 데이터파일이위치합니다. 반면에, SMB
More information<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202834C1D6C2F7207E2038C1D6C2F729>
8주차중간고사 ( 인터럽트및 A/D 변환기문제및풀이 ) Next-Generation Networks Lab. 외부입력인터럽트예제 문제 1 포트 A 의 7-segment 에초시계를구현한다. Tact 스위치 SW3 을 CPU 보드의 PE4 에연결한다. 그리고, SW3 을누르면하강 에지에서초시계가 00 으로초기화된다. 동시에 Tact 스위치 SW4 를 CPU 보드의
More informationJAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각
JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( http://java.sun.com/javase/6/docs/api ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각선의길이를계산하는메소드들을작성하라. 직사각형의가로와세로의길이는주어진다. 대각선의길이는 Math클래스의적절한메소드를이용하여구하라.
More informationAPOGEE Insight_KR_Base_3P11
Technical Specification Sheet Document No. 149-332P25 September, 2010 Insight 3.11 Base Workstation 그림 1. Insight Base 메인메뉴 Insight Base Insight Insight Base, Insight Base Insight Base Insight Windows
More information게시판 스팸 실시간 차단 시스템
오픈 API 2014. 11-1 - 목 차 1. 스팸지수측정요청프로토콜 3 1.1 스팸지수측정요청프로토콜개요 3 1.2 스팸지수측정요청방법 3 2. 게시판스팸차단도구오픈 API 활용 5 2.1 PHP 5 2.1.1 차단도구오픈 API 적용방법 5 2.1.2 차단도구오픈 API 스팸지수측정요청 5 2.1.3 차단도구오픈 API 스팸지수측정결과값 5 2.2 JSP
More information학습목차 2.1 다차원배열이란 차원배열의주소와값의참조
- Part2- 제 2 장다차원배열이란무엇인가 학습목차 2.1 다차원배열이란 2. 2 2 차원배열의주소와값의참조 2.1 다차원배열이란 2.1 다차원배열이란 (1/14) 다차원배열 : 2 차원이상의배열을의미 1 차원배열과다차원배열의비교 1 차원배열 int array [12] 행 2 차원배열 int array [4][3] 행 열 3 차원배열 int array [2][2][3]
More information설계란 무엇인가?
금오공과대학교 C++ 프로그래밍 jhhwang@kumoh.ac.kr 컴퓨터공학과 황준하 6 강. 함수와배열, 포인터, 참조목차 함수와포인터 주소값의매개변수전달 주소의반환 함수와배열 배열의매개변수전달 함수와참조 참조에의한매개변수전달 참조의반환 프로그래밍연습 1 /15 6 강. 함수와배열, 포인터, 참조함수와포인터 C++ 매개변수전달방법 값에의한전달 : 변수값,
More informationSharing Memory Between Drivers and Applications
본컬럼에대한모든저작권은 DevGuru에있습니다. 컬럼을타사이트등에기재및링크또는컬럼내용을인용시반드시출처를밝히셔야합니다. 컬럼들을 CD나기타매체로배포하고자할경우 DevGuru에동의를얻으셔야합니다. c DevGuru Corporation. All rights reserved 기타자세한질문사항들은웹게시판이나 support@devguru.co.kr 으로 문의하기바랍니다.
More information금오공대 컴퓨터공학전공 강의자료
C 프로그래밍프로젝트 Chap 13. 포인터와배열! 함께이해하기 2013.10.02. 오병우 컴퓨터공학과 13-1 포인터와배열의관계 Programming in C, 정재은저, 사이텍미디어. 9 장참조 ( 교재의 13-1 은읽지말것 ) 배열이름의정체 배열이름은 Compile 시의 Symbol 로서첫번째요소의주소값을나타낸다. Symbol 로서컴파일시에만유효함 실행시에는메모리에잡히지않음
More informationOnTuneV3_Manager_Install
OnTuneV3.1 Manager 설치하기 # 사전준비사항 - Manager Version 3.1.6-2010-06-21 TeemStone 1. OnTune Manager를설치할 NT 서버 - Windows 2000, Windows 2003, Windows 2008, Windows XP, Windows Vista, Windows 7 등 Windows 2000이후모든
More informationORANGE FOR ORACLE V4.0 INSTALLATION GUIDE (Online Upgrade) ORANGE CONFIGURATION ADMIN O
Orange for ORACLE V4.0 Installation Guide ORANGE FOR ORACLE V4.0 INSTALLATION GUIDE...1 1....2 1.1...2 1.2...2 1.2.1...2 1.2.2 (Online Upgrade)...11 1.3 ORANGE CONFIGURATION ADMIN...12 1.3.1 Orange Configuration
More informationView Licenses and Services (customer)
빠른 빠른 시작: 시작: 라이선스, 라이선스, 서비스 서비스 및 주문 주문 이력 이력 보기 보기 고객 가이드 Microsoft 비즈니스 센터의 라이선스, 서비스 및 혜택 섹션을 통해 라이선스, 온라인 서비스, 구매 기록 (주문 기록)을 볼 수 있습니다. 시작하려면, 비즈니스 센터에 로그인하여 상단 메뉴에서 재고를 선택한 후 내 재고 관리를 선택하십시오. 목차
More informationA Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning
C Programming Practice (II) Contents 배열 문자와문자열 구조체 포인터와메모리관리 구조체 2/17 배열 (Array) (1/2) 배열 동일한자료형을가지고있으며같은이름으로참조되는변수들의집합 배열의크기는반드시상수이어야한다. type var_name[size]; 예 ) int myarray[5] 배열의원소는원소의번호를 0 부터시작하는색인을사용
More informationMicrosoft PowerPoint - e pptx
Import/Export Data Using VBA Objectives Referencing Excel Cells in VBA Importing Data from Excel to VBA Using VBA to Modify Contents of Cells 새서브프로시저작성하기 프로시저실행하고결과확인하기 VBA 코드이해하기 Referencing Excel Cells
More informationSRC PLUS 제어기 MANUAL
,,,, DE FIN E I N T R E A L L O C E N D SU B E N D S U B M O TIO
More information<4D F736F F F696E74202D203137C0E55FBFACBDC0B9AEC1A6BCD6B7E7BCC72E707074>
SIMATIC S7 Siemens AG 2004. All rights reserved. Date: 22.03.2006 File: PRO1_17E.1 차례... 2 심벌리스트... 3 Ch3 Ex2: 프로젝트생성...... 4 Ch3 Ex3: S7 프로그램삽입... 5 Ch3 Ex4: 표준라이브러리에서블록복사... 6 Ch4 Ex1: 실제구성을 PG 로업로드하고이름변경......
More informationAdobe Flash 취약점 분석 (CVE-2012-0754)
기술문서 14. 08. 13. 작성 GNU C library dynamic linker $ORIGIN expansion Vulnerability Author : E-Mail : 윤지환 131ackcon@gmail.com Abstract 2010 년 Tavis Ormandy 에 의해 발견된 취약점으로써 정확한 명칭은 GNU C library dynamic linker
More information지도상 유의점 m 학생들이 어려워하는 낱말이 있으므로 자세히 설명해주도록 한다. m 버튼을 무리하게 조작하면 고장이 날 위험이 있으므로 수업 시작 부분에서 주의를 준다. m 활동지를 보고 어려워하는 학생에게는 영상자료를 접속하도록 안내한다. 평가 평가 유형 자기 평가
수업주제 경찰 출동! (버튼, LED, 버저 사용하기) 9 / 12 차시 수업의 주제와 목표 본 수업에서는 이전 차시에 배웠던 블록들의 기능을 복합적으로 활용한다. 스위치 기능을 가진 버튼을 활용하여 LED와 버저를 동시에 작동시키도록 한다. 각 블록들을 함께 사용하는 프로젝트를 통해 각각의 기능을 익히고 보다 다양한 활용 방법을 구상할 수 있다. 교수 학습
More informationMicrosoft Word doc
2. 디바이스드라이버 [ DIO ] 2.1. 개요 타겟보드의데이터버스를이용하여 LED 및스위치동작을제어하는방법을설명하겠다. 2.2. 회로도 2.3. 준비조건 ARM 용크로스컴파일러가설치되어있어야한다. 하드웨어적인점검을하여정상적인동작을한다고가정한다. NFS(Network File System) 를사용할경우에는 NFS가마운트되어있어야한다. 여기서는소스전문을포함하지않았다.
More information비디오 / 그래픽 아답터 네트워크 만약에 ArcGolbe를 사용하는 경우, 추가적인 디스크 공간 필요. ArcGlobe는 캐시파일을 생성하여 사용 24 비트 그래픽 가속기 Oepn GL 2.0 이상을 지원하는 비디오카드 최소 64 MB 이고 256 MB 이상을 메모리
ArcGIS for Desktop 10.4 Single Use 설치가이드 Software: ArcGIS for Desktop 10.4 Platforms: Windows 10, 8.1, 7, Server 2012, Server 2008 ArcGIS for Desktop 10.4 시스템 요구사항 1. 지원 플랫폼 운영체제 최소 OS 버전 최대 OS 버전 Windows
More informationSharing Memory Between Drivers and Applications
본컬럼에대한모든저작권은 DevGuru에있습니다. 컬럼을타사이트등에기재및링크또는컬럼내용을인용시반드시출처를밝히셔야합니다. 컬럼들을 CD나기타매체로배포하고자할경우 DevGuru에동의를얻으셔야합니다. c DevGuru Corporation. All rights reserved 기타자세한질문사항들은웹게시판이나 support@devguru.co.kr 으로 문의하기바랍니다.
More informationMF5900 Series MF Driver Installation Guide
한국어 MF 드라이버설치설명서 사용자소프트웨어 CD-ROM................................................ 1.................................................................... 1..............................................................................
More informationSQL Developer Connect to TimesTen 유니원아이앤씨 DB 기술지원팀 2010 년 07 월 28 일 문서정보 프로젝트명 SQL Developer Connect to TimesTen 서브시스템명 버전 1.0 문서명 작성일 작성자
SQL Developer Connect to TimesTen 유니원아이앤씨 DB 팀 2010 년 07 월 28 일 문서정보 프로젝트명 SQL Developer Connect to TimesTen 서브시스템명 버전 1.0 문서명 작성일 2010-07-28 작성자 김학준 최종수정일 2010-07-28 문서번호 20100728_01_khj 재개정이력 일자내용수정인버전
More informationPowerPoint 프레젠테이션
7-SEGMENT DEVICE CONTROL - DEVICE DRIVER Jo, Heeseung 디바이스드라이버구현 : 7-SEGMENT HBE-SM5-S4210 의 M3 Module 에는 6 자리를가지는 7-Segment 모듈이아래그림처럼실장 6 Digit 7-Segment 2 디바이스드라이버구현 : 7-SEGMENT 6-Digit 7-Segment LED
More informationAPI 매뉴얼
PCI-TC03 API Programming (Rev 1.0) Windows, Windows2000, Windows NT, Windows XP and Windows 7 are trademarks of Microsoft. We acknowledge that the trademarks or service names of all other organizations
More informationCisco FirePOWER 호환성 가이드
Cisco 호환성가이드 Cisco 호환성 이문서에서는 Cisco 소프트웨어와하드웨어의호환성및요건을다룹니다. 추가 릴리스또는제품정보는다음을참조하십시오. 설명서로드맵 : http://www.cisco.com/c/en/us/td/docs/security/firesight/ roadmap/firesight-roadmap.html Cisco ASA 호환성가이드 : http://www.cisco.com/c/en/us/td/docs/security/asa/compatibility/
More informationchap 5: Trees
5. Threaded Binary Tree 기본개념 n 개의노드를갖는이진트리에는 2n 개의링크가존재 2n 개의링크중에 n + 1 개의링크값은 null Null 링크를다른노드에대한포인터로대체 Threads Thread 의이용 ptr left_child = NULL 일경우, ptr left_child 를 ptr 의 inorder predecessor 를가리키도록변경
More informationMicrosoft PowerPoint APUE(Intro).ppt
컴퓨터특강 () [Ch. 1 & Ch. 2] 2006 년봄학기 문양세강원대학교컴퓨터과학과 APUE 강의목적 UNIX 시스템프로그래밍 file, process, signal, network programming UNIX 시스템의체계적이해 시스템프로그래밍능력향상 Page 2 1 APUE 강의동기 UNIX 는인기있는운영체제 서버시스템 ( 웹서버, 데이터베이스서버
More informationSIGIL 완벽입문
누구나 만드는 전자책 SIGIL 을 이용해 전자책을 만들기 EPUB 전자책이 가지는 단점 EPUB이라는 포맷과 제일 많이 비교되는 포맷은 PDF라는 포맷 입니다. EPUB이 나오기 전까지 전 세계에서 가장 많이 사용되던 전자책 포맷이고, 아직도 많이 사 용되기 때문이기도 한며, 또한 PDF는 종이책 출력을 위해서도 사용되기 때문에 종이책 VS
More informationMango220 Android How to compile and Transfer image to Target
Mango220 Android How to compile and Transfer image to Target http://www.mangoboard.com/ http://cafe.naver.com/embeddedcrazyboys Crazy Embedded Laboratory www.mangoboard.com cafe.naver.com/embeddedcrazyboys
More informationEndpoint Protector - Active Directory Deployment Guide
Version 1.0.0.1 Active Directory 배포가이드 I Endpoint Protector Active Directory Deployment Guide 목차 1. 소개...1 2. WMI 필터생성... 2 3. EPP 배포 GPO 생성... 9 4. 각각의 GPO 에해당하는 WMI 연결... 12 5.OU 에 GPO 연결... 14 6. 중요공지사항
More informationFrama-C/JESSIS 사용법 소개
Frama-C 프로그램검증시스템소개 박종현 @ POSTECH PL Frama-C? C 프로그램대상정적분석도구 플러그인구조 JESSIE Wp Aorai Frama-C 커널 2 ROSAEC 2011 동계워크샵 @ 통영 JESSIE? Frama-C 연역검증플러그인 프로그램분석 검증조건추출 증명 Hoare 논리에기초한프로그램검증도구 사용법 $ frama-c jessie
More informationPowerPoint 프레젠테이션
7-Segment Device Control - Device driver Jo, Heeseung HBE-SM5-S4210 의 M3 Module 에는 6 자리를가지는 7-Segment 모듈이아래그림처럼실장 6 Digit 7-Segment 2 6-Digit 7-Segment LED controller 16비트로구성된 2개의레지스터에의해제어 SEG_Sel_Reg(Segment
More information