웹
|
|
- 태성 국
- 5 years ago
- Views:
Transcription
1 FAT32 기반의 USB 복구프로그램 (ver. 01) by
2 Contents 1. 개요 FAT 수행일정 / 수행인원 FAT 32 이론및분석실습 실습환경 MBR FAT 32 파일시스템의구조 FAT 32 세부구조 Boot Record FAT 32 세부구조 Reserved Area FAT 32 세부구조 FAT Area FAT 32 세부구조 Data Area FAT 32 세부구조 LFNS 파일생성 / 복구의이해 파일생성 파일복구 FAT32 기반의 USB 복구프로그램제작 Source Code Excuting Program 향후계획 페이지
3 1. 개요 1.1. FAT 32 File Allocation Table 이라는파일시스템으로 Windows 기반의주로작은용량의 HDD 에서 사용되었던간단한파일시스템이다. 하지만현재는 NTFS 등이등장하면서 FAT 파일시스템은 USB 등의이동식저장장치등과같은 용량이작은장치의파일시스템으로사용이되고있다. 본프로젝트에서는 USB 복구프로그램제작과정을통해 FAT 32 FileSystem 에대한이해도를 높이고자한다 수행일정 / 수행인원 본모의해킹은 2014 년 8 월 11 일부터 ~ 2014 년 8 월 27 일까지진행이되며, 총 1M/M 가 투입됩니다. Task 별자세한일정은아래표와같습니다. 8 월 11 일 ( 월 ) 8 월 12 일 ( 화 ) 8 월 13 일 ( 수 ) 8 월 14 일 ( 목 ) 8 월 15 일 ( 금 ) 파일시스템이론정리 파일시스템이론정리 FAT 16 이론정리 FAT 16 기반의파일시스템분석 FAT 16 기반의파일시스템분석 8 월 18 일 ( 월 ) 8 월 19 일 ( 화 ) 8 월 20 일 ( 수 ) 8 월 21 일 ( 목 ) 8 월 22 일 ( 금 ) FAT 32 이론정리 FAT 32 기반의파일시스템분석 FAT 32 기반의파일시스템분석 FAT 32 기반의파일시스템분석 get_partition get_bpb_info show_dir show_del_dir print_longname 구현 8 월 25 일 ( 월 ) 8 월 26 일 ( 화 ) 8 월 27 일 ( 수 ) rec_file 구현 rec_dir 구현최종보고서작성 [ 표 1-1] 제작일정 2 페이지
4 2. FAT 32 이론및분석실습 2.1. 실습환경 실습환경은 [ 표 2-1] 과같으며실제실습및프로그램구현은 Guest PC 에서진행되었다. Host PC Windows 7 64 bit Guest PC Windows xp sp3 Hex Editor HxD Coding Tool Visual Stdio 2008 Version [ 표 2-1] 실습환경 2.2. MBR MBR 이란? 파티션이여러개인다중파티션의경우각파티션의첫번째섹터에존재하는 BR 만으로는 어떤파티션을부팅으로사용할지알수없다. 이때문에 BR(Boot Record) 중에서메인격인 MBR(Master Boot Record) 를두어이역할을제공하였다. [ 그림 2-1] MBR 의구조 - Boot Flag : 해당파티션의부팅가능여부 (0x80 : 부팅가능파티션, 0x00 : 부팅불가능파티션 ) 3 페이지
5 - CHS Starting Address : CHS 방식의시작주소 - Partition Type : 해당파티션의종류를의미 (0x0B : CHS 모드의 FAT32, 0x0C : LBA 모드의 FAT32) - CHS Ending Address : CHS 방식의종료주소 - LBA Start Address : LBA 방식의시작주소 - Size in Sector : LBA 의총개수 각어플리케이션에따라파티션이 CHS 주소를사용할지 LBA 주소를사용할지에대해 결정되기때문에분석시에는우선 Partition Type 를확인하고그에맞는주소값을확인해야한다 MBR 분석 기존에알아본정보를토대로실제 HDD 의 MBR 을분석해보도록하겠다. [ 그림 2-2] HDD 파티션할당확인 [ 그림 2-2] 와같이현재 HDD 의분석하고자하는파티션을확인한다. [ 그림 2-3] HxD 를활용한 HDD 접근 [ 그림 2-3] 과같이 HxD 를활용하여 [ 그림 2-2] 에서확인한 HDD 에접근한다. 그후 MBR 은각저장장치의 0 번섹터에온다는사실을염두에두고분석을시작해야한다. 4 페이지
6 [ 그림 2-4] HDD 02 s MBR 전체구조확인 HDD 02 의 MBR 전체구조는 [ 그림 2-4] 와같이 Boot Code 와 4 개의 Partiton Table, 마지막으로 signature 로이루어져있다. 하지만현재 Partition 01 과 Partition 02 만이사용하고있다는것을알수있으며이제부터이두개의파티션테이블을분석해보도록하겠다. Partition 01 : B FE BF 7C 3F FE 25 9C 00 - Boot Flag : 00, 부팅불가파티션 - CHS Starting Address : 0x00, 0x01, 0x01 - Partition Type : 0x0B, CHS 방식의 FAT32 - CHS Ending Address : 0x7C, 0xBF, 0xFE Partition 02 : D 0C FE FF FF 3D 26 9C 00 9C BF A Boot Flag : 0x00, 부팅불가파티션 - Partition : 0x0C, LBA 방식의 FAT32 - LBA Starting Address : 0x009C263D, 10,233,405 5 페이지
7 - Size Of Sector : 0x00A3BF9C, 10,731,420 => LBA 블록 1 개 : 512Byte, 파티션총용량 : Sector * 512Byte = 5,494,487,040Byte 마지막으로실제부팅이가능한파티션에대한분석을해보고 MBR 을정리하고자한다. [ 그림 2-3] 에서이번엔하드디스크 1 을선택한다. [ 그림 2-5] HDD 1 분석 하드디스크 1 을 HxD 를통해열면 [ 그림 2-5] 와같으며 HDD 1 내에서도 Partition 1 부분만 따로떼어분석해보도록하겠다. Partition 1 : FE FF FF 3F B AC FF 09 - Boot Flag : 0x80, 부팅가능 - Partition Type : 0x07, NTFS - CHS Starting Address : 0x00 0x01 0x01 - CHS Ending Address : 0xFF 0xFF 0xFE - LBA Starting Address : 0x F, 63 - Size in Sector : 0x09FFAC0B, 167,750,667 => 파티션총용량 : 167,750,667 * 512 Byte = 85,888,341,504 Byte = 79GB 6 페이지
8 2.3. FAT 32 파일시스템의구조 [ 그림 2-6] FAT 32 파일시스템의구조 - Boot Record : Boot Record 는볼륨의첫번째섹터이자 Reserved Area 의첫번째섹터이다. 이영역에는부팅하기위한 Boot Code 와함께 FAT 파일시스템의값들이저장되어있으며 BIOS Parameter Block (BPB) 라고도한다. - Reserved Area : 나중을위해비워둔예약된공간이다. - FAT #1 / FAT #2 : 클러스터를관리하기위한테이블이모여있는공간이다. 이공간은 HDD 내의파일들과연결된클러스터에대한정보들이있으므로만약손상이되면해당파일을사용할수없다. 이때문에 FAT #1 과동일한정보를 FAT #2 에백업하게된다. - Root Directory : Data Area 내의아무곳에나존재해도관계없으며그위치를 Boot Record 에기록한다. 하지만 FAT 32 이전의파일시스템즉 FAT 16 등에는 FAT 영역바로다음에 Root Directory 가존재하였으므로일반적으로는 FAT 32 에서역시 FAT 영역바로뒤에둔다. - Data Area : 파일또는디렉토리가저장되어있는영역으로이전영역과의차이는이전영역의경우 Sector 단위로읽기쓰기를하지만 Data Area 의경우 Cluster 단위로읽기와쓰기를진행한다 FAT 32 세부구조 BOOT RECORD Boot Record 이론정리 [ 그림 2-7] Boot Record 의구조 7 페이지
9 FAT 32 의구조는 [ 그림 2-7] 과같으며 36 Bytes 는 FAT 16 과공통적인부분이고 FAT 32 에만포함되는영역은그이후에존재한다. - Jump Boot Code : Boot Code 로점프하기위한코드 - OEM Name : OEM 회사를나타내는문자열이들어있음 - Bytes per Sector : 한개섹터를구성하는바이트수 - Sector per Cluster : 한개클러스터를구성하는섹터수 => Sector Per Cluster * Bytes Per Sector = Cluster 의크기 - Reserved Sector Count : [ 그림 3-1] 의 Reserved Area 의섹터개수 - Number of FATs : 해당볼륨에존재하는 FAT 영역의개수 - Root Directory Entry Count : Root Directory 내에몇개의파일 / 디렉토리를수용할지에대해기록하는항목으로반드시 Bytes Per Sector 의짝배수로구성이되어야한다. 하지만 FAT 32 에서는반드시 0 으로채워져야한다. - Total Sector 16 : FAT 16 에해당되는항목으로 FAT 32 에서는 0 으로채워진다. - Media : 해당볼륨에어떤미디어가저장되어있는지기록되며플로피디스크를제외한모든 장치의경우 0xF8 로기록이된다. - FAT Size 16 : FAT 영역의섹터수를저장하는부분으로 FAT 32 에서는 0 으로채워진다. - Sector Per Track : Track 당 Sector 의개수를의미하는데 Window 계열에서는더이상이값을참조하지않는다. - Number Of Heads : 해당저장장치의헤더수를의미하며 Window 계열에서는더이상이값을참조하지않는다. - Hidden Sector : 해당볼륨앞의숨겨진섹터수를의미하며 Window 계열에서는더이상이값을참조하지않는다. - Total Sector 32 : 해당볼륨상의총섹터수를의미한다. - FAT Size 32 : FAT 영역의섹터수를의미하는데이수는 FAT #1 과 FAT #2 의합산이아닌한 개의 FAT 영역의섹터수를의미한다. - Ext Flags : FAT 테이블의사용여부등의여러가지설정값을기록한다. 8 페이지
10 - File System Version : FAT32 의버전정보로상위 1Byte 는주, 하위 1Byte 는부버전을의미한다. 하지만실제로는특정값이적히지않고 0x00 으로기록된다. - Root Directory Cluster : FAT32 는이전버전들과는달리 Root Directory 가 Data Area 내아무위치에나와도상관없기때문에그시작위치를 Root Directory Cluster 에기록한다. - File System Information : File System 구조체의위치가기록되나. - Boot Record Backup Sector : Boot Record 를백업한위치를기록하는것으로일반적으로는 6 번 섹터를이용한다. 만약이위치에 0 이기록되어있다면백업을하지않았음을의미한다. - Reserved : 예약된영역으로항상 0 으로채워진다. - Dirve Number : Window 계열에서는더이상참조하지않는다. - Reserved1 : Windows NT 계열에서사용하려고만든예약된영역이며 0 으로채워져있다. - Boot Signature : 확장부트서명으로 0x29 라는값이들어간다.( 이후에 3 가지항목이더 존재함을의미 ). - Volume ID : 볼륨의시리얼번호 - Volume Label : 볼륨레이블을적어준다. - File System Type : 항상 FAT32 로적혀있다. 이러한내용을토대로실제 FAT 32 를사용하는 Partition 의 Boot Record 를분석해보도록하겠다 Boot Record 분석실습 [ 그림 2-8] Partition 2 의 Boot Record Area 찾아가기 9 페이지
11 Boot Record 영역의분석을위해서는이전에분석했던 MBR 영역에서 Partition 2 의 Boot record 영역을찾아가야한다. 일반적으로 Boot Record 의경우예약된영역의첫번째섹터, 해당볼륨의첫번째섹터에존재하기때문에이를이용하면해당파티션의첫번째섹터를찾아간다고생각하면된다. [MBR - Partition Table - LBA Starting Address] -> 10진수변환 -> 이동위의방법대로 MBR 의 Partition Table 내에존재하는 LBA Startin Address 를찾아보니 0x009C263D 임을확인할수있다. 이를 10 진수로변환하면 이며이단위는섹터이므로 HxD 에서 번째섹터를찾아가면 [ 그림 2-8] 과같이 Partition 2 의 Boot Record 를확인할수있다. [ 그림 2-9] Partition 2 의 Boot Record Partition 2 의 BR Area 영역은 [ 그림 2-9] 와같은데이를상세히분석해보도록하겠다. EB D F E F F 00 FF 00 3D 26 9C 00 9C BF A3 00 DC E D8 6B F8 4E 4F 20 4E 41 4D Jump Boot Code : 0x9058EB - OEM Name : 0x302E35534F44534D - Bytes per Sector : 0x0200, 512Byte - Sector per Cluster : 0x08, 1 Cluster == 8 Sector, Cluster Size : 512 * 8 = 4096 Byte 10 페이지
12 - Reserved Sector Count : 0x0020, 32 Sector - Number of FATs : 0x02, FAT #1, FAT #2 2 개 FAT 영역보유 - Root Directory Entry Count : 0x Total Sector 16 : 0x Media : 0xF8, 고정식디스크 - FAT Size 16 : 0x Sector Per Track : 0x003F - Number Of Heads : 0x00FF - Hidden Sector : 0x009C263D - Total Sector 32 : 0x00A3BF9C, Sector - FAT Size 32 : 0x000028DC, Sector - Ext Flags : 0x File System Version : 0x Root Directory Cluster : 0x , Cluster 2 - File System Information : 0x0001, Sector 1 - Boot Record Backup Sector : 0x0006, Sector 6 - Reserved : 0x Dirve Number : 0x80 - Reserved1 : 0x00 - Boot Signature : 0x29 - Volume ID : 0x D - Volume Label : 0x E204F4EF86BD88E - File System Type : 0x , FAT32 11 페이지
13 2.5. FAT 32 세부구조 RESERVED AREA Reserved Area 이론 예약된영역의첫번째섹터는 Boot Record 로바로이전에분석한내용이다. 그리고나머지 영역은비어야하지만일반적으로는 Boot Record 에기록된것과같이 Sector 1 와 Sector 6 에는 File System Information 구조체와 Boot Record Backup 이각각기록되어있다. [ 그림 2-10] Reserved Area(FS Info 구조체 ) 구조 - Lead Signature : FSInfo 구조체가기록된섹터임을알려준다. 0x 로고정되어있다. - Reserved 1 : 예약영역으로해당섹터의대부분을차지하고있으며 (479Byte) 전부 0 으로채워져있다. - Struct Signature : 실제 FSInfo 구조체의시작을알려주는항목으로 0x 로고정되어있다. - Free Cluster Count : 볼륨상에존재하는빈클러스터의수 - Next Free Cluster : 가장마지막에할당된클러스터의값이저장되며이바로뒤에오는 클러스터는비어있는클러스터라고할수있다. - Reserved 2 : 이역시예약된영역이며 0 으로채워진다. - Trail Signature : FS Info 구조체섹터의끝을알려주며 0xAA 로고정되어있다. 이내용을토대로실제 Partition 2 의 Reserved Area 를분석해보도록하겠다. 12 페이지
14 Reserved Area 분석 [ 그림 2-11] Partition 2 의 Reserved Area Boot Record 에서 FS Info 구조체의위치는 Sector 1 로나와있었다. 하지만이는섹터번호가 0 부터시작하기때문에첫번째섹터가아니라해당파티션의두번째 섹터를의미하게된다. 위에서확인한것과같이섹터의시작은 0x 로채워져있다 B7 6D AA - Struct Signature : 0x Free Cluster Count : 0x00146DB7, 개클러스터가비어있다. - Next Free Cluster : 0x , Cluster 3 번이가장마지막에채워진클러스터이다. - Trail Signature : 0xAA 페이지
15 2.6. FAT 32 세부구조 FAT AREA FAT Area 이론 FAT 영역은 FAT 파일시스템에서주요정보를담고있다. 그중에는파일 / 디렉토리의할당에 대한정보를클러스터단위로관리한다. [ 그림 2-12] FAT Area 의구조 [ 그림 2-12] 는 FAT Area 의구조로최소 8Byte 를제외하고는전부클러스터단위로파일을관리하는것을확인할수있다. Cluster 2 부터시작하는이유는이전에 Cluster 0 과 Cluster 1 는이미다른용도로사용되었기때문인데이는차후에알아보도록하겠다. 이때각클러스터를관리하는 4Byte 단위의항목들을 FAT Entry 라고하며각각은다음클러스터번호가기록된다. 이를분석하기에앞서알아둬야할점은 FAT Area 는단일링크드리스트방식으로데이터를저장했다는것인데이를이용하여각클러스터는한개클러스터로해당파일 / 디렉토리를저장할수없는경우에한개의클러스터를더할당하고이두번째클러스터의번호를첫번째클러스터에기록하게된다. 그리고마지막클러스터에는 0x0FFFFFFF 를기록하여마지막을표시한다. 단순설명으로는이해가되지않기때문에예제를들어이해를돕도록하겠다. FAT Area 영역의경우 Reserved Area 바로다음에오게되어있는데 Partition 2 의 Reserved Area 크기는 32 Sector 로이루어져있음을이전에분석해주었기때문에 Reserved Area 의시작위치에서 32 Sector 만큼이동하면 [ 그림 2-13] 과같이 FAT Area 로이동하게된다. 14 페이지
16 FAT Area 분석 [ 그림 2-13] Partition 2 의 FAT Area [ 그림 2-13] 은 FAT Entry 의 Cluster 단위파일 / 디렉토리관리에대한예제이다. 한개클러스터 영역으로저장이가능한클러스터 2 와클러스터 3 과는달리클러스터 4 에저장된파일의경우 용량이큰지다음클러스터번호가적혀있다. [ 그림 2-14] Partition 2 의 FAT Entry [ 그림 2-13] 을통해 Cluster 4 에서시작된파일은 Cluster 16 까지연결되는것을확인할수있으며이를그림으로그려보면 [ 그림 2-14] 와같다. Cluster 16 에서는 0x0FFFFFFF 을기록하여파일의끝을알렸고이를 EOC(End Of Cluster) 라고한다 FAT 32 세부구조 DATA AREA Data Area 이론 Data Area 는실제데이터들이저장되는영역을말한다. 데이터는클러스터단위로저장이되는데데이터가한개클러스터보다크게되면클러스터를더할당하여저장하게된다. 이경우만약저장후클러스터의공간이남아있다하더라도이미사용한클러스터이기때문에다른파일 / 디렉토리의데이터를저장할수없다. 실제데이터를저장할때는파일이냐디렉토리냐에따라저장방식에차이가있는데만약파일이라면클러스터에파일의내용이직접적으로저장이되며 15 페이지
17 디렉토리라면 Directory Entry 라는구조체형식으로저장이된다. [ 그림 2-15] Directory Entry 구조 - Name : 파일 / 디렉토리의이름, 대문자로최대 8 자까지넣을수있으며남는공간은 0x20 으로채워진다. 단만약해당파일 / 디렉토리가지워진경우에는최고상위 bit 가 0xE5 로채워진다. - Extender : 확장자, 대문자로최대 3 자리까지입력이가능하며이역시남는공간은 0x20 으로채워지는데디렉토리의경우에도이공간이 0x20 으로채워진다. - Attribute : 해당 Directory Entry 의용도를기록하는항목으로 System File 은 0x04 로, 서브디렉토리의경우 0x10, 일반파일은 0x20, LFN 이적용되었다면 0xF0 로채워진다. - NT Resource : Windows NT 의예약된공간으로항상 0 으로채워져있다. - Create Time Tenth : 파일이생성된시간을 1/10 초단위로기록하는항목. - Create Time : 파일생성시간으로상위 5bit 는초, 다음 6bit 는분, 마지막 5bit 는시를의미한다. 다른값은일반적으로식별하는시간이맞으나초의경우값이 1 증가할때마다 2 초씩증가한다. - Create Date : 생성날짜로상위 5bit 는일, 다음 4bit 는월, 마지막 7bit 는년을의미한다. 단년도의경우 1980 년으로부터의오프셋인데만약 11 이라면 =1991 년을의미한다. - Last Access Date : 가장최근의읽기 / 쓰기를한날자를의미한다. - First Cluster High 2Byte : 파일의첫번째클러스터번호의상위 2Byte 를말한다. - Write Time : 최근파일수정시간을말하며파일생성역시쓰기로간주하기때문에파일최소 생성시에는이 Write Time 과 Create Time 이일치한다. - Write Date : 최근수정일자로파일최초생성시에는 Create Date 와일치한다. - First Cluster Low 2Byte : 파일의첫번째클러스터의하위 2Byte 를말한다. - File Size : 파일의크기를의미하며단위는 Byte 이다. 만약디렉토리라면이항목은 0 으로 채워진다. 16 페이지
18 Data Area 분석 [ 그림 2-16] Partition 2 Directory Entry 분석예제 [ 그림 2-16] 과같이 F:\ 로명명된 Partition 2 의 Root Directory 에는 dirtest 라는디렉토리가 있으며그내부에는 test04.txt 라는파일을갖고있다. 지금부터 Root Directory Entry 부터이 test04.txt 라는파일을찾아가보도록하겠다. [ 그림 2-17] Partition 2 Root Directory Entry [ 그림 2-17] 은 Partition 2 의 Root Directory Entry 로최상위디렉토리를의미하는데이곳에 있는 Directory 중 Attribute 항목이디렉토리로, 즉 0x10 으로표기된항목을찾으면가장하위에 있는것을확인할수있다. 이를상세분석해보도록하자 A 페이지
19 - Name : 0x , 파일명 DIRTEST - Extender : 0x202020, Directory - Attribute : 0x10, Directory - NT Resource : 0x08 - Create Time Tenth : 0x2A - Create Time : 0x8917, => 17 시 8 분 46 초 - Create Date : 0x4503, => 2014 년 8 월 3 일 - Last Access Date : 0x4503, 2014 년 8 월 3 일 - First Cluster High 2 Byte : 0x Write Time : 0x8918, => 17 시 8 분 48 초 - Write Date : 0x4503, 2014 년 8 월 3 일 - First Cluster Low 2Byte : 0x0007 => High + Low = 0x => Cluster 7 - File Size : 0x , Directory 분석중 Dirtest Directory 의위치는 7 번클러스터라는것을알게되었으므로해당클러스터로 이동한다. 한개클러스터는 8 Sector 이므로 (7-2) * 8 = 40 Sector 만큼이동한다. 현재 2 번클러스터라는것을기억하고계산해야한다. [ 그림 2-18] DIRTEST Directory 의 DirectoryEntry "DIRTEST" Directory 의클러스터를찾아가면 [ 그림 2-18] 과같은데이곳에서도 Attribute 항목에 0x20, 즉일반파일을찾아서확인해보면 TEST4.txt 의 Directory Entry 를찾을수있다. 18 페이지
20 그후 TEST4.txt 의데이터위치를확인하려면이 Directory Entry 를상세분석해야한다 C F name : 0x , 파일명 TEST4 - Extender : 0x545854, 확장자 TXT - Attribute : 0x20, Archive File - Create Time Tenth : 0x Create Time : 0x891C, => 17 시 8 분 56 초 - Create Date : 0x4503, 2014 년 8 월 3 일 - Last Access Date : 0x4503, 2014 년 8 월 3 일 - First Cluster High 2Byte : 0x Write Time : 0x8922, => 17 시 9 분 4 초 - Write Date : 0x4503, 2014 년 8 월 3 일 - First Cluster Low 2Byte : 0x000F => High + Low = 0x F => Cluster 15 - File Size : 0x 분석결과로 TEST4.TXT 의데이터위치는 15 번클러스터로확인되었으므로 (15-2) * 8 = 104 Sector 만큼이동해야한다. [ 그림 2-19] TEST04.TXT 내용확인 해당섹터로이동하여파일의내용을확인해보면실제파일의내용과일치하는것을확인할수 있다. 19 페이지
21 2.8. FAT 32 세부구조 LFNS LFNs(Long File Name Entrys) 이론 Long File Name Entrys 란기존의파일작명방식은이름 8 자확장자 3 자의한계를보완하기위해생겨난작명방법이다. 이 LFNs 방식은 UTF-16 인코딩을사용하여다국어지원이가능해졌으며최대 255 자까지작명이가능하게되었다. [ 그림 2-20] LFNs 구조 - Order : LFNs 의순서를기록하는항목으로가장처음은 0x01 로시작되며가장마지막은 0x40 과 OR 연산을한값으로넣는다. 자세한사항은실습에서설명하도록하겠다. - Name 1 : 1~5 번째문자열 - Attribute : 항상 0x0F 으로고정되어있다. - Type : 일반적으로 0x00 으로채워진다. - Checksum : 해당 LFNs 과대응되는 Short Directory Entry 의 Checksum 을저장한다. - Name 2 : 6~11 번째문자열 - First Cluster Low : 반드시 0 이들어간다. - Name 3 : 12~13 번째문자열 이를토대로실제 Partition 2 의 LFNs 를사용하는파일을분석해보도록하겠다. 20 페이지
22 LFNs(Long File Name Entrys) 분석 [ 그림 2-21] LFNs 실습을위한파일명 / 내용확인 [ 그림 2-21] 과같이 F:\LFN Test\thislfntestfile 이라는파일을분석하여 LFNs 에대해확인하고자한다. 파일명은 thisislfntestfile 이며확장자를빼고도 16 개문자로이루어져있기때문에기존의 Short Directory Entry 로는저장할수없다. [ 그림 2-22] Partition 2 LFNs 확인 Test File 의 Directory Entry 로이동해보면 THISIS~1TXT 로파일명과확장자가표현된것을 확인할수있는데그윗쪽을살펴보니 Attribute 가 0x0F 로되어있는 2 개의 Entry 가보인다. 이는해당 Test File 의 LFNs 임을알수있다 C E 00 0F FF FF FF FF FF FF FF FF F C E 페이지
23 LFNs 에대해서만상세히분석해보고자하는데우선 2 개의 Order 를확인해보면가장처음은 01 로그다음에는 42 로시작하는것을확인할수있다. 이는 0x40 0x02 의결과로해당 LFNs 가가장마지막 LFNs 임을의미한다. 그러므로 1 번 Entry 의 Name 1 부터 Name 3 까지읽고그다음 2 번 Entry 의 Name 1 부터 Name 3 까지읽으면 thisislfntestfiletxt 로정확히파일명과일치하는것을알수있다. 22 페이지
24 3. 파일생성 / 복구의이해 3.1. 파일생성 복구방식을이해하기위해서는우선적으로파일이어떤방식으로생성되는지에대해알고있어야하기때문에먼저이에대해이해하고넘어가고자한다. FAT 파일시스템은 FAT Table, Directory Entry, File 내용등을기록함으로써파일을생성하는데지금부터이방식을설명하며직접파일을생성해보도록하겠다 FAT Table -> 빈클러스터확인. [ 그림 3-1] 파일의생성을위한빈클러스터번호확인 [ 그림 3-1] 과같이기존실습에서활용했던 Partition 1 의 FAT 영역으로이동하여빈클러스터 번호인 16 번클러스터를확인하였다 Data Area -> Step 1 에서확인한빈클러스터에파일내용기록. [ 그림 3-2] 빈클러스터에파일내용기록 기존 Data Area 에서 16 번클러스터를찾아가야하므로 (16-2)*8 = Sector 가 나온다. 이를찾아가서원하는내용을기록하면 [ 그림 3-2] 와같다 FAT Table -> Step 2 에서기록한파일크기에따라클러스터할당. [ 그림 3-3] Cluster 할당 23 페이지
25 [ 그림 3-3] 과같이 FAT Area 에서 16 번 FAT Entry 에파일이기록되었음을표시해야하는데해당파일의내용이한개클러스터의용량을넘지않기때문에 EOC 를의미하는 0x0FFFFFFF 을적어준다 Root Directory Entry -> File 정보기록 [ 그림 3-4] Directory Entry 에생성파일정보기록 이제파일의정보를상위디렉토리의 Directory Entry 에기록해야하는데이때주의할점은다른 날짜와파일명은임의로기록해도되지만해당파일의클러스터번호는정확히적어주어야한다 파일생성결과확인 [ 그림 3-5] 파일생성결과확인 해당내용을저장한후재부팅하면 [ 그림 5-5] 와같이파일이생성되었고내용역시정확히입력 되어있는것을확인할수있다. 24 페이지
26 3.2. 파일복구 실제복구에앞서간단히순서를살펴보자면우선 Data Area 에서지워진 Directory Entry 에서지워지기전에해당파일이사용하던클러스터번호를확인한다. 그후 FAT Area 에확인한클러스터번호에맞는 FAT Entry 와연결시켜주고마지막으로 Directory Entry 의 NAME 의항목에서 0xE5 로되어있는부분을수정한다. 본문서에서는삭제된디렉토리를복구하고그안에들어있는파일까지복구하는식으로실습을진행하도록하겠다 삭제된파일확인 [ 그림 3-6] 삭제파일확인 우선타겟으로할삭제된 Directory 를찾아야하는데 [ 그림 3-6] 과같이 ATTEST 라는디렉토리가삭제된흔적이보인다. 이디렉토리를우선적으로복구하기위해서속성값을확인한결과 0x000B, 즉삭제되기전에 11 번클러스터를사용했다는것을알수있다 FAT Entry 할당 [ 그림 3-7] FAT Area 에서의삭제파일 FAT Entry 확인 25 페이지
27 11 번클러스터에대한 FAT Entry 를확인하여만약사용하지않음으로되어있다면사용하는 클러스터사이즈에맞게설정해주도록하자 지워진파일의 Signature 변경 (0xE5) [ 그림 3-8] FATTEST 디렉토리복구를위한속성값변경 [ 그림 3-6] 에서삭제된파일 / 디렉토리를의미하는 0xE5 로되어있던 NAME[0] 을 [ 그림 3-8] 과같이다른값으로변경시켜주고저장후재부팅해보도록하자 Root Directory Entry 복구결과확인 [ 그림 3-9] FATTEST 디렉토리복구결과확인 재부팅을한후에확인해보니 [ 그림 3-9] 와같이디렉토리가복구된것을확인할수있다. 하지만현재디렉토리만복구되었을뿐내부의파일은아직복구되지않았기때문에 FATTEST 디렉토리내용이담긴 11 번클러스터로이동해서내용을확인하자 Sub Directory Entry 복구 26 페이지
28 [ 그림 3-10] E:\FATTEST\ 내용확인 11 번클러스터위치 : (11-2)*8 FATTEST 디렉토리내의삭제된파일을보면 [ 그림 3-10] 과같은데이중에서마지막에있는 ECTEST.TXT 파일을복구해보도록하겠다. 22 번클러스터를사용하므로 [ 그림 3-7] 을통해 FAT Area 의 FAT Entry 를확인하고이역시 0xE5 를다른문자로대체한후재부팅을진행하자 Sub Directory Entry 복구결과확인 [ 그림 3-11] RECTEST.TXT 파일복구결과확인 재부팅을하게되면 [ 그림 3-11] 과같이내용까지정상복구되었음을확인할수있다. 4. FAT32 기반의 USB 복구프로그램제작 4.1. SOURCE CODE #include <stdio.h> #include <windows.h> #include <stdlib.h> #define U8 unsigned char #define S8 char #define U16 unsigned short #define U32 unsigned int #define U64 unsigned int64 #define PARTITION_TBL_POS 0x1BE // MBR 영역에서 0~446 Byte 이후에실제 Partition Table이등장하므로따로기록 /* * 구조체설명 * PARTITION : partition 의정보를담기위한구조체 * FAT32_BPB : BPB 의정보를담기위한구조체 27 페이지
29 * VolStruct : FAT32_BPB 에서필요한정보를추출하기위한구조체 * DitEntry : Directory Entry 의정보를저장하기위한구조체 * LongDirEntry : LFN의 Directory Entry를저장하기위한구조체 */ #pragma pack(1) // 컴파일러의구조체패딩을막기위한선언 typedef struct _PARTITION /* * 구조체변수설명 * BootFlag : 파티션의부팅가능여부확인 0x80 부팅가능, 0x00 부팅불가능 * CHS_Start : CHS 방식의파티션시작섹터 * Type : 파티션종류 * CHS_End : CHS 방식의파티션종료섹터 * LBA_Start : LBA 방식의파티션시작섹터 * length : 볼륨내총섹터수 * */ U8 BootFlag; U8 CHS_Start[3]; U8 type; U8 CHS_End[3]; U32 LBA_Start; U32 length; PARTITION, *PPARTITION; #pragma pack() #pragma pack(1) typedef struct _FAT32_BPB_struct /* * 구조체변수설명 * 1. BPB 공통영역 (1) * JmpBoot[3] : 부트코드로점프하기위한주소 * OEMName[8] : OEM 회사이름 * BytesPerSec : 섹터당바이트수 * SecPerClus : 클러스터당섹터수 * RsvdSecCnt : 예약된영역의섹터수 * NumFATs : 볼륨내의FAT 영역의갯수로일반적으로 2개 * RootEntCnt : FAT32 에서는 '0' * TotSec16 : FAT32 에서는 '0' * Media : 0xF8 * FATs16 : FAT32 에서는 '0' * SecPerTrk : '0' 더이상참조하지않는다 * NumHeads : '0' 더이상참조하지않는다 * HiddSec : '0' 더이상참조하지않는다 * TotSec32 : 볼륨상에존재하는총섹터수 28 페이지
30 * 2. BPB FAT32 영역 * FATs32 : FAT 영역의섹터수 * ExtFlags : FAT Table 에대한설정값, 일반적으로0x00 * FileSysVer : FAT32 의버전정보, 0x00 * RootDirClus : 루트디렉토리클러스터의위치 * FileSysInfo : FSInfo 구조체의위치로일반적으로볼륨의 1번섹터에위치 * BootBakSec : BR 의백업클러스터위치 * Reserved[12] : 예약된영역으로 0으로채워진다 * DirNum : 참조하지않는다 * Reserv1 : 0 으로채워진다 * BootSign : 0x29 로고정 * VolID : 볼륨의시리얼번호 * vollabel[11] : 해당파티션의볼륨레이블 * FileSysType[8] : FAT32 라는문자열이들어간다 * 3. BPB 공통영역 (2) * BootCodeArea : BootCode 들어있다. * Signature : BR 의손상여부확인을위해 0xAA55 로고정 * */ U8 JmpBoot[3]; U8 OEMName[8]; U16 BytesPerSec; U8 SecPerClus; U16 RsvdSecCnt; U8 NumFATs; U16 RootEntCnt; U16 TotSec16; U8 Media; U16 FATs16; U16 SecPerTrk; U16 NumHeads; U32 HiddSec; U32 TotSec32; // BPB 공통영역 U32 FATs32; U16 ExtFlags; U16 FileSysVer; U32 RootDirClus; U16 FileSysInfo; U16 BootBakSec; U8 Reserved[12]; U8 DirNum; U8 Reserv1; U8 BootSign; U32 VolID; U8 vollabel[11]; 29 페이지
31 U8 FileSysType[8]; // BPB FAT32 영역 U8 BootCodeArea[420]; U16 Signature; FAT32_BPB; #pragma pack() #pragma pack(1) typedef struct _VOL_struct /* * 구조체변수설명 * Drive * VolBeginSec * FirstDataSec : 첫번째데이터섹터 * RootDirSec : Root Directory의시작섹터 * RootDirSecCnt : Root Directory의총섹터수 * RootEntCnt : Root Directory의 Directory Entry 개수 * FATSize : FAT 영역의섹터수 * FATStartSec : FAT 영역시작점 * TotalClusCnt : 볼륨의총클러스터수 * TotalSec : 볼륨의총섹터 * DataSecSize : 데이터영역의섹터수 * ClusterSize : 클러스터크기 * SecPerClus : 한개클러스터의섹터수 * */ U32 Drive; U32 VolBeginSec; U32 FirstDataSec; U32 RootDirSec; U32 RootEntCnt; U32 RootDirSecCnt; U32 FATSize; U32 FATStartSec; U32 TotalClusCnt; U32 TotalSec; U32 DataSecSize; U32 ClusterSize; U32 SecPerClus; VolStruct; #pragma pack() #pragma pack(1) typedef struct _DIR_struct /* * 구조체변수설명 페이지
32 * Name[11] : 파일 / 디렉토리명 + 확장자 * Attr : 파일종류 ex) 0x04 시스템, 0x10 Directory 0x20 Archive File 0xF0 LFNs * NTRes : 0 고정 * CrtTimeTenth : 생성시간 * CrtTime : 생성시간 * CrtDate : 생성일자 * LstAccDate : 접근날짜 * FstClusHi : 파일 / 디렉토리의첫번째클러스터의상위 2Byte * WriteTime : 수정시간 * WriteDate : 수정일자 * FstClustLow : 파일 / 디렉토리의첫번째클러스터의하위 2Byte * FileSize : 파일크기 * */ U8 Name[11]; U8 Attr; U8 NTRes; U8 CrtTimeTenth; U16 CrtTime; U16 CrtDate; U16 LstAccDate; U16 FstClusHi; U16 WriteTime; U16 WriteDate; U16 FstClustLow; U32 FileSize; DirEntry; #pragma pack() #pragma pack(1) typedef struct _LONG_DIR_struct /* * 구조체변수설명 * Order : LFN 순번저장 * Name1+Name2+Name3 : 파일명 * Attr : 0x0F 고정 * Type : 예약으로 0 rhwjd * chksum : Short Directory Entry 의 Checksum 저장 & FstClusLo : 0 고정 * */ U8 Order; U8 Name1[10]; U8 Attr; U8 Type; U8 chksum; 31 페이지
33 U8 Name2[12]; U16 FstClusLo; U8 Name3[4]; LongDirEntry; #pragma pack() /* * 함수설명 * HDD_read : 저장장치로부터섹터를읽어와메모리에담기위한함수 * HDD_write : 저장장치의섹터에데이터를쓰기위한함수 * HexDump : Dump된 Memory를 Hex로보여주기위한함수 ( 점검용 ) * get_partition : 파티션정보및 BPB 시작주소의획득을위한함수 * get_bpb_info : BPB 의정보를구조체에저장하기위한함수 * print_longname : LFNs를출력하기위한함수 * show_dir : Root Directory Entry를출력하기위한함수 ( 점검용 ) * show_del_dir : 삭제된 Directory Entry를출력하기위한함수 * rec_file : 파일복구를위한함수 * rec_dir : 디렉토리복구를위한함수 * */ U32 HDD_read(U8 drv, U32 SecAddr, U32 blocks, U8* buf); U32 HDD_write(U8 drv, U32 SecAddr, U32 blocks, U8* buf); void HexDump (U8 *addr, U32 len); void get_partition(ppartition ppartition, U8 psecbuf[512]); U32 get_bpb_info(fat32_bpb* BPB, VolStruct* pvol); void print_longname(longdirentry* plongdir, U32 EntryNum); U32 show_dir(direntry* pdir); U32 show_del_dir(direntry* pdir); U32 rec_file(direntry* pdir,u32 rec_entry, U32* fat_entry, U32 Flag, U32 upclus); U32 rec_dir(direntry* pdir, U32 useclus); VolStruct gvol; int main() /* * 변수설명 * mbr_buf : mbr 영역의덤프를위한버퍼 * bpb_buf : bpb 영역의덤프를위한버퍼 * fat_buf : fat 영역의덤프를위한버퍼 * ppartition_arr : 파티션정보저장을위한구조체변수 * root_buf : Root Directory Entry 영역의덤프를위한버퍼 * sel_m_menu : 메인메뉴에서의선택을위한변수 * sel_rec_entry : 복구하고자하는디렉토리엔트리입력변수 * 페이지
34 */ U32 sel_m_menu; U32 sel_rec_entry; U8 mbr_buf[512]; U8 bpb_buf[512]; U32 fat_buf[128]; U8* root_buf; PARTITION ppartition_arr[50]; gvol.drive = 0x2; gvol.volbeginsec = 0x0; // 초기 HDD 덤프를위한장치번호와시작섹터초기화 if(hdd_read(gvol.drive, gvol.volbeginsec, 1, mbr_buf)== 0) printf( "Boot Sector Read Failed \n" ); return 1; // mbr 영역의덤프를위한 HDD_read 함수호출 get_partition(ppartition_arr, mbr_buf); // mbr 덤프를이용한파티션정보습득을위한 get_partition 함수호출 gvol.volbeginsec = ppartition_arr->lba_start; // 시작위치를 Partition의시작섹터로변경 if(hdd_read(gvol.drive, gvol.volbeginsec, 1, bpb_buf)==0) printf( "BPB Sector Read Failed \n"); return 1; // BPB 영역의덤프를위한 HDD_read 함수호출 if(get_bpb_info((fat32_bpb *)bpb_buf, &gvol) == 0) printf( "It is not FAT32 File System \n" ); return 1; // BPB 영역의정보를구조체에저장하기위한 get_bpb_info 함수호출 gvol.rootdirseccnt = 10; gvol.rootentcnt = 100; // Root Directory Entry 내섹터를읽어오기위한변수설정 /* * 개선해야할사항 페이지
35 * 단고정된값이아니라가변적인값으로처리할방법을구상해야함 * */ root_buf = (U8*)malloc(gVol.RootDirSecCnt*512); // Root Directory Entry 공간만큼의동적할당 if(hdd_read(gvol.drive, gvol.rootdirsec, gvol.rootdirseccnt, root_buf)==0) printf("root Directory Read Failed \n"); return 1; printf("============= USB Recovery Tool Ver.FAT32 =============\n"); printf("1. Analyze USB \n"); printf("2. Exit \n"); printf("select 1 or 2 : "); scanf("%d", &sel_m_menu); // 메인메뉴출력및변수입력 switch(sel_m_menu) case 1: show_del_dir((direntry*)root_buf); break; case 2: exit(1); // 메인메뉴입력변수에따른분기를위한 switch 문 // 1 : 지워진파일 / 디렉토리출력 // 2 : 프로그램종료 printf("\n\n============= Recovery Mode =============\n"); printf(" 복구하고자하는파일의 Entry Number를입력하세요 : "); scanf("%d", &sel_rec_entry); // 복구모드출력및복구할 Directory Entry 선택 if(hdd_read(gvol.drive,gvol.fatstartsec, 1, fat_buf)==0) printf( "FAT Sector Read Failed \n"); return 1; // FAT 영역의덤프를위한 HDD_read 함수호출 rec_file((direntry*)root_buf,sel_rec_entry,fat_buf, 0, 0); // 데이터의복구를위한 rec_file 함수호출 34 페이지
36 return 0; U32 HDD_read(U8 drv, U32 SecAddr, U32 blocks, U8* buf) /* * 변수설명 * drv : 접근하고자하는물리장치 * SecAddr : 시작섹터설정을위한변수 * blocks : 읽어올섹터수 * buf : 해당섹터에대한 dumpdata * ret : 해당장치의존재유무반환용변수 * ldistancelow : 하위23bit 저장 * ldistancehigh : 상위9bit 저장 * dwpointer : 시작섹터 * bytestoread : 파일을읽을단위설정 * numread : 읽은바이트수 * cur_drv : 접근하고자하는드라이브명 ex) \\.\PhysicalDrive0 * g_hdevice : 파일핸들 * */ U32 ret; U32 ldistancelow, ldistancehigh, dwpointer, bytestoread, numread; char cur_drv[100]; HANDLE g_hdevice; sprintf(cur_drv, "\\\\.\\PhysicalDrive%d",(U32)drv); // CreateFIle 을통한 PhysicalDrive 로의접근을위한문자열생성 g_hdevice = CreateFile(cur_drv, GENERIC_READ, FILE_SHARE_READ FILE_SHARE_WRITE, NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); // CreateFile을활용한PhysicalDrive 접근용파일핸들생성 if(g_hdevice==invalid_handle_value) return 0; // 해당디바이스존재여부에따른분기 ldistancelow = SecAddr << 9; ldistancehigh = SecAddr >> (32-9); // ldistancelow 하위 9 bit, ldistancehigh 상위 23 bit 저장 dwpointer = SetFilePointer(g_hDevice, ldistancelow, ( long *)&ldistancehigh, FILE_BEGIN); // 시작섹터설정 35 페이지
37 if(dwpointer!= 0xFFFFFFFF) bytestoread = blocks * 512; // 읽어올데이터길이 ret = ReadFile(g_hDevice, buf, bytestoread, ( unsigned long*)&numread, NULL); if(ret) ret = 1; else ret = 0; CloseHandle(g_hDevice); // 핸들종료 return ret; U32 HDD_write(U8 drv, U32 SecAddr, U32 blocks, U8* buf) /* * 변수설명 * drv : 접근하고자하는물리장치 * SecAddr : 시작섹터설정을위한변수 * blocks : 읽어올섹터수 * buf : 해당섹터에대한 dumpdata * ret : 해당장치의존재유무반환용변수 * ldistancelow : 하위23bit 저장 * ldistancehigh : 상위9bit 저장 * dwpointer : 시작섹터 * bytestoread : 파일을읽을단위설정 * numread : 읽은바이트수 * cur_drv : 접근하고자하는드라이브명 ex) \\.\PhysicalDrive0 * g_hdevice : 파일핸들 * */ U32 ret = 0; U32 ldistancelow, ldistancehigh, dwpointer, bytestoread, numread; char cur_drv[100]; HANDLE g_hdevice; sprintf(cur_drv, "\\\\.\\PhysicalDrive%d",(U32)drv); // CreateFIle 을통한 PhysicalDrive 로의접근을위한문자열생성 g_hdevice = CreateFile(cur_drv, GENERIC_WRITE, FILE_SHARE_READ FILE_SHARE_WRITE, NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); // CreateFile을활용한PhysicalDrive 접근용파일핸들생성 if(g_hdevice==invalid_handle_value) return 0; 36 페이지
38 // 해당디바이스존재여부에따른분기 ldistancelow = SecAddr << 9; ldistancehigh = SecAddr >> (32-9); dwpointer = SetFilePointer(g_hDevice, ldistancelow, ( long *)&ldistancehigh, FILE_BEGIN); // 시작섹터설정 if(dwpointer!= 0xFFFFFFFF) bytestoread = blocks * 512; // 읽어올데이터길이 ret = WriteFile(g_hDevice, buf, bytestoread, ( unsigned long*)&numread, NULL); if(ret) ret = 1; else ret = 0; CloseHandle(g_hDevice); // 핸들종료 return ret; void HexDump (U8 *addr, U32 len) U8 U32 *s=addr, *endptr=(u8*)((u32)addr+len); i, remainder=len%16; printf( "\n Offset Hex Value Ascii value\n" ); // print out 16 byte blocks. while (s+16<=endptr) // offset 출력 printf( "0x%08lx ", (long)(s-addr)); // 16 bytes 단위로내용출력 for (i=0; i<16; i++) printf( "%02x ", s[i]); printf( " "); for (i=0; i<16; i++) if (s[i]>=32 && s[i]<=125)printf("%c", s[i]); else printf("." ); s += 16; printf( "\n"); 37 페이지
39 // Print out remainder. if (remainder) // offset 출력 printf( "0x%08lx ", (long)(s-addr)); // 16 bytes 단위로출력하고남은것출력 for (i=0; i<remainder; i++) printf( "%02x ", s[i]); for (i=0; i<(16-remainder); i++) printf( " " ); return; // HexDump. printf( " "); for (i=0; i<remainder; i++) if (s[i]>=32 && s[i]<=125) printf("%c", s[i]); else printf("."); for (i=0; i<(16-remainder); i++) printf( " "); printf( "\n"); void get_partition(ppartition ppartition, U8 psecbuf[512]) memcpy(ppartition, (psecbuf + PARTITION_TBL_POS), sizeof(partition)); // Partition 추출 U32 get_bpb_info(fat32_bpb* BPB, VolStruct* pvol) if(bpb->rootentcnt!= 0 BPB->Signature!= 0xAA55) return 0; // Root Directory & Signature 의이상유무를판단하여분기 pvol->totalsec = BPB->TotSec32; // Get Total Sector pvol->fatsize = BPB->FATs32; // Get FAT Size pvol->fatstartsec = pvol->volbeginsec + BPB->RsvdSecCnt; // Get FAT Start Sector 38 페이지
40 pvol->rootentcnt = BPB->RootEntCnt; //Get Root Directory Entry Count pvol->rootdirsec = pvol->volbeginsec + BPB->RsvdSecCnt + (BPB->NumFATs * BPB->FATs32); //Get Root Directory Sector pvol->firstdatasec = pvol->volbeginsec + BPB->RsvdSecCnt + (BPB->NumFATs * pvol->fatsize) + pvol- >RootDirSecCnt; // Get FAT Start Sector pvol->datasecsize = pvol->totalsec - (BPB->RsvdSecCnt + (BPB->NumFATs * pvol->fatsize) + pvol- >RootDirSecCnt); // Get Size Of Data Area pvol->totalcluscnt = pvol->datasecsize / BPB->SecPerClus; //Get Total Cluster Count pvol->clustersize = BPB->SecPerClus * BPB->BytesPerSec; //Get Size Of Cluster pvol->secperclus = BPB->SecPerClus; // Get Sector Per Cluster return 1; U32 show_dir(direntry* pdir) /* * 변수설명 * i,j : 반복변수 * LongEntryEn : LFNs 검출용변수 * */ U32 i, j, LongEntryEn=0; for(i=0;i<=gvol.rootentcnt;i++) switch((u8) pdir[i].name[0]) case 0x00: // End Of Entry return 1; case 0xE5 : // delete of Entry continue; // Directory Entry 의상태확인 if(pdir[i].attr == 0x0F) LongEntryEn = 1; 39 페이지
41 // Long File Name Entry continue; // LFNs Directory Entry 구분 printf(" Entry Number %d \n",i); if(pdir[i].attr == 0x10) printf("directory Name : "); else printf("file Name : "); // Directory or File Name is if(longentryen == 1) print_longname((longdirentry*)pdir, i-1); LongEntryEn = 0; // LFNs 인경우의파일 / 디렉토리이름출력 else for(j=0;j<11;j++) printf("%c",pdir[i].name[j]); // Short Name 출력 printf("\n"); return 1; printf("file Size : %d\n",pdir[i].filesize); printf("start Cluster : %d\n",(pdir[i].fstclustlow pdir[i].fstclushi << 16)); // First Cluster Low/High 를전체출력 void print_longname(longdirentry* plongdir, U32 EntryNum) /* * 변수설명 * filename : LFNs 파일명으로합치기위한배열 (Name1 + Name2 + Name3) * final : filename을유니코드방식으로변경한최종파일명 * nameoffset : LFNs Entry 에서의 Name%d 이동을위한변수 * */ wchar_t filename[512]; char final[512]; U32 nameoffset = 0; do 40 페이지
42 memcpy(&filename[nameoffset],plongdir[entrynum].name1, 10); // Name1에저장된이름문자열복사 nameoffset += 5; // Name1 속성에서 Name2 속성으로이동 memcpy(&filename[nameoffset],plongdir[entrynum].name2, 12); // Name2에저장된이름문자열복사 nameoffset += 6; // Name2 속성에서 Name3 속성으로이동 memcpy(&filename[nameoffset],plongdir[entrynum].name3, 4); // Name3에저장된이름문자열복사 nameoffset += 2; while((plongdir[entrynum--].order & 0x40)==0); // 0x40 과 or 연산한것이가장마지막 LFNs filename[nameoffset] = 0x0000; // 문자열의끝을알리는 0x0000 저장 wcstombs(final,filename, 512); // 유니코드 -> 아스키코드로변환 printf("%s",final); U32 show_del_dir(direntry* pdir) /* * 변수설명 * i,j : 반복변수 * LongEntryEn : LFNs 검출용변수 * */ U32 i, j, LongEntryEn=0; for(i=0;i<=gvol.rootentcnt;i++) if((u8) pdir[i].name[0] == 0x00) return 1; else if((u8) pdir[i].name[0]!= 0xE5) continue; // Directory Entry 의상태확인 if(pdir[i].attr == 0x0F) LongEntryEn = 1; // Long File Name Entry 41 페이지
43 continue; // LFNs Directory Entry 구분 printf(" Entry Number %d \n",i); //if(pdir[i].attr!= 0x04 if(pdir[i].attr == 0x10) printf("directory Name : "); else printf("file Name : "); // Directory or File Name is if(longentryen == 1) print_longname((longdirentry*)pdir, i-1); LongEntryEn = 0; // LFNs 인경우의파일 / 디렉토리이름출력 else for(j=0;j<11;j++) printf("%c",pdir[i].name[j]); // Short Name 출력 printf("\n"); return 1; printf("file Size : %d\n",pdir[i].filesize); printf("start Cluster : %d\n",(pdir[i].fstclustlow pdir[i].fstclushi << 16)); // First Cluster Low/High 를전체출력 U32 rec_file(direntry* rdata, U32 rec_entry, U32* fat_entry, U32 Flag, U32 upclus) /* * 변수설명 * i : 반복변수 * useclus : 빈클러스터 * reset_buf : 빈클러스터초기화용버퍼 * rec_buf : 파일내용백업용버퍼 * dir_buf : 디렉토리를복구할경우의서브디렉토리의 Directory Entry 덤프를위한버퍼 * FstClustNum : 첫번째클러스터를저장하기위한변수 * StartSec : 복구시작섹터저장을위한변수 -> 최초에는 Root Directory Sector에서복구가진행되지만 * 그이후부터는 Sub Directory에서진행되기때문에고정값 X * Flag : 0 -> Root Directory, 1 -> Sub Directory * upclus : 상위디렉토리의클러스터번호 42 페이지
44 * */ U32 i, useclus; U8 reset_buf[4096]; U8 rec_buf[4096]; U8 dir_buf[4096]; U32 FstClustNum; U32 StartSec; memset(reset_buf, 0x00, sizeof(reset_buf)); // 초기화용메모리제작 (0x00 으로전체초기화시킴 ) memset(rec_buf, 0x00, sizeof(rec_buf)); // 복제메모리초기화 FstClustNum = rdata[rec_entry].fstclustlow rdata[rec_entry].fstclushi << 16; // First Cluster Total 저장 HDD_read(gVol.Drive, gvol.rootdirsec + (FstClustNum - 2)*gVol.SecPerClus, 8, rec_buf); // 파일내용복사 for(i=0;;i++) if(fat_entry[i] == 0x ) useclus = i; // 빈클러스터발견시해당클러스터번호 useclus에저장 break; // for(;;) // FAT 영역에서의빈클러스터검색 // 삭제파일복구 ( 적용 X) fat_entry[useclus] = 0x0FFFFFFF; // 빈클러스터를사용클러스터로변경 rdata[rec_entry].name[0] = 'R'; // 삭제시그니쳐 0xE5 -> R 문자열로변경 // 삭제파일복구 ( 적용 X) // 복구내용적용구간 HDD_write(gVol.Drive, gvol.rootdirsec + (useclus-2)*gvol.secperclus, 8, reset_buf); // 사용할클러스터초기화 if(flag == 0) StartSec = gvol.rootdirsec; Flag = 1; 43 페이지
45 else StartSec = gvol.rootdirsec + (upclus - 2 ) * gvol.secperclus; // Root Directory와 Sub Directory 에따른 Directory Entry 의시작주소변경을위한분기 rdata[rec_entry].fstclustlow = useclus; // 삭제이전클러스터 -> 사용할클러스터 HDD_write(gVol.Drive, gvol.rootdirsec + (useclus-2)*gvol.secperclus, 8, rec_buf); // 백업해둔파일내용새로운클러스터에복사 HDD_write(gVol.Drive, StartSec, 8, rdata); // 삭제시그니쳐 -> R 시그니처적용 HDD_write(gVol.Drive, gvol.fatstartsec, 8, fat_entry); // 빈클러스터 -> 사용클러스터변경내용적용 // 복구내용적용구간 /* * 개선해야할사항 * 해당파일의크기가 1 Cluster 를넘어갈때의복구 * */ if(rdata[rec_entry].attr == 0x10) StartSec = gvol.rootdirsec + (FstClustNum - 2 ) * gvol.secperclus; // Sub Directory Entry 의시작위치 HDD_read(gVol.Drive, StartSec, 8, dir_buf); // Sub Directory Entry Dump rec_dir(dir_buf, Flag, useclus); // Directory 에대한복구를위한 rec_dir 함수호출 // 해당 Directory Entry가 Directory 일경우의복구 printf("%s 이 / 가복구완료되었습니다. \n", rdata[rec_entry].name); // 복구된파일 / 디렉토리명과완료메세지출력 return 0; U32 rec_dir(direntry* pdir, U32 Flag, U32 useclus) /* * 변수설명 * i : 반복변수 * pdir : Sub Directory 의 Dump 를담는버퍼 * U32 Flag : 0 -> Root Directory, 1 -> Sub Directory * useclus : 현재디렉토리의클러스터번호 * FstClustNum : 해당 Directory Entry 가사용하는클러스터번호 (!= useclus) * fat_buf : fat Table Entry를담기위한버퍼 44 페이지
46 * */ U32 i; U32 FstClustNum; U32 fat_buf[128]; for(i=0;pdir[i].name[0]!=0x00;i++) FstClustNum = pdir[i].fstclustlow pdir[i].fstclushi << 16; if(fstclustnum == 0x pdir[i].name[0]!= 0xE5) continue; // 클러스터할당여부확인 else if(hdd_read(gvol.drive,gvol.fatstartsec, 1, fat_buf)==0) printf( "FAT Sector Read Failed \n"); return 1; // FAT 영역의덤프를위한 HDD_read 함수호출 rec_file(pdir, i, fat_buf, Flag, useclus); return 0; 4.2. EXCUTING PROGRAM Main Menu [ 그림 4-1] Main Menu 프로그램의메인메뉴는 [ 그림 4-1] 과같으며 1. Analyze USB 메뉴를선택하면 USB 에대한 분석이시작된다 Directory Entry 확인 45 페이지
47 [ 그림 4-2] 분석결과 분석결과는 [ 그림 4-2] 와같은데분석결과는삭제된파일 / 디렉토리목록을출력해준다. 이중에서살리고자하는 Entry Number 를입력하되만약디렉토리라면내부의파일 / 디렉토리가 전부복구된다. [ 그림 4-3] 복구모드 복구모드의결과로복구된파일 / 디렉토리목록을출력해준다 복구결과확인 [ 그림 4-4] 복구결과확인 [ 그림 4-4] 와같이 Dirtest 디렉토리를포함하여그내부의 filetest.txt 파일까지복구되는것을 확인할수있다. 46 페이지
48 4.3. 향후계획 - 일정량이상의 Cluster 크기를할당받아야하는파일 / 디렉토리에대한복구구현 47 페이지
Outline 1. FAT12/16/32 ü Introduction ü Internals ü Directory Structure ü Example
FAT12/16/32 File System Twitter : @pr0neer Blog : Email : proneer@gmail.com Kim Jinkook Outline 1. FAT12/16/32 ü Introduction ü Internals ü Directory Structure ü Example FAT12/16/32 Introduction Security
More information제목을 입력하세요
기술문서 13. 10. 31. 작성 320 사이버대란복구 2013-04-30 fatapple 목차 1. 개요...3 2. 복구...4 2.1 MBR... 4 2.2 VBR... 9 2.3 복구 Tool...13 3. 결론... 16 4. 참고문헌... 17 2 1. 개요 이번 320 사이버대란에서주관심사는손실된저장매체의 Data였다. 피해를입은여러기업의 PC들의
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 informationMicrosoft PowerPoint - [#4-2] File System Forensic Analysis.pptx
File System Forensic Analysis Twitter : @pr0neer Blog : f Email : proneer@gmail.com Kim Jinkook Outline 1. File System Forensic Analysis (FAT/NTFS) Recovery for Deleted Files (FAT/NTFS) Unallocated Cluster
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 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<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>
#include "stdafx.h" #include "Huffman.h" 1 /* 비트의부분을뽑아내는함수 */ unsigned HF::bits(unsigned x, int k, int j) return (x >> k) & ~(~0
More informationPowerPoint Presentation
FORENSICINSIGHT SEMINAR SQLite Recovery zurum herosdfrc@google.co.kr Contents 1. SQLite! 2. SQLite 구조 3. 레코드의삭제 4. 삭제된영역추적 5. 레코드복원기법 forensicinsight.org Page 2 / 22 SQLite! - What is.. - and why? forensicinsight.org
More information슬라이드 1
휴지통포렌식 JK Kim @pr0neer proneer@gmail.com 개요 1. 휴지통 2. 휴지통파일구조 3. 휴지통파일카빙 4. 휴지통파일분석 2 휴지통 Security is a people problem 3 휴지통 휴지통이란? 휴지통소개 윈도우에서파일을삭제할경우, 기본적으로삭제된파일은휴지통 (Recycle Bin) 영역으로이동 휴지통우회방법 SHIFT
More information버퍼오버플로우-왕기초편 10. 메모리를 Hex dump 뜨기 앞서우리는버퍼오버플로우로인해리턴어드레스 (return address) 가변조될수있음을알았습니다. 이제곧리턴어드레스를원하는값으로변경하는실습을해볼것인데요, 그전에앞서, 메모리에저장된값들을살펴보는방법에대해배워보겠습
앞서우리는버퍼오버플로우로인해리턴어드레스 (return address) 가변조될수있음을알았습니다. 이제곧리턴어드레스를원하는값으로변경하는실습을해볼것인데요, 그전에앞서, 메모리에저장된값들을살펴보는방법에대해배워보겠습니다. 여러분모두 Windows 에서 hex editor(hex dump, hex viewer) 라는것을사용해보셨을겁니다. 바로바이너리파일을 16 진수
More informationMicrosoft PowerPoint - chap03-변수와데이터형.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 informationThe Pocket Guide to TCP/IP Sockets: C Version
인터넷프로토콜 5 장 데이터송수신 (3) 1 파일전송메시지구성예제 ( 고정크기메시지 ) 전송방식 : 고정크기 ( 바이너리전송 ) 필요한전송정보 파일이름 ( 최대 255 자 => 255byte 의메모리공간필요 ) 파일크기 (4byte 의경우최대 4GB 크기의파일처리가능 ) 파일내용 ( 가변길이, 0~4GB 크기 ) 메시지구성 FileName (255bytes)
More information슬라이드 1
-Part3- 제 4 장동적메모리할당과가변인 자 학습목차 4.1 동적메모리할당 4.1 동적메모리할당 4.1 동적메모리할당 배울내용 1 프로세스의메모리공간 2 동적메모리할당의필요성 4.1 동적메모리할당 (1/6) 프로세스의메모리구조 코드영역 : 프로그램실행코드, 함수들이저장되는영역 스택영역 : 매개변수, 지역변수, 중괄호 ( 블록 ) 내부에정의된변수들이저장되는영역
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 - 알고리즘_1주차_2차시.pptx
Chapter 2 Secondary Storage and System Software References: 1. M. J. Folk and B. Zoellick, File Structures, Addison-Wesley. 목차 Disks Storage as a Hierarchy Buffer Management Flash Memory 영남대학교데이터베이스연구실
More informationK&R2 Reference Manual 번역본
typewriter structunion struct union if-else if if else if if else if if if if else else ; auto register static extern typedef void char short int long float double signed unsigned const volatile { } struct
More informationMicrosoft PowerPoint - chap05-제어문.pptx
int num; printf( Please enter an integer: "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); 1 학습목표 제어문인,, 분기문에 대해 알아본다. 인 if와 switch의 사용 방법과 사용시 주의사항에 대해 알아본다.
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 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 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 informationBMP 파일 처리
BMP 파일처리 김성영교수 금오공과대학교 컴퓨터공학과 학습내용 영상반전프로그램제작 2 Inverting images out = 255 - in 3 /* 이프로그램은 8bit gray-scale 영상을입력으로사용하여반전한후동일포맷의영상으로저장한다. */ #include #include #define WIDTHBYTES(bytes)
More informationMicrosoft PowerPoint - chap13-입출력라이브러리.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<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 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 information휠세미나3 ver0.4
andromeda@sparcs:/$ ls -al dev/sda* brw-rw---- 1 root disk 8, 0 2014-06-09 18:43 dev/sda brw-rw---- 1 root disk 8, 1 2014-06-09 18:43 dev/sda1 brw-rw---- 1 root disk 8, 2 2014-06-09 18:43 dev/sda2 andromeda@sparcs:/$
More informationMicrosoft PowerPoint - [#3-2] FAT File System - exFAT.pptx
exfat (Extended FAT) File System Twitter : @pr0neer Blog : f Email : proneer@gmail.com Kim Jinkook Outline 1. exfat File System Introduction Internals Directory Structure Example exfat Introduction Security
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 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 informationuntitled
while do-while for break continue while( ) ; #include 0 i int main(void) int meter; int i = 0; while(i < 3) meter = i * 1609; printf("%d %d \n", i, meter); i++; return 0; i i< 3 () 0 (1)
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 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 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 informationMicrosoft PowerPoint - chap06-2pointer.ppt
2010-1 학기프로그래밍입문 (1) chapter 06-2 참고자료 포인터 박종혁 Tel: 970-6702 Email: jhpark1@snut.ac.kr 한빛미디어 출처 : 뇌를자극하는 C프로그래밍, 한빛미디어 -1- 포인터의정의와사용 변수를선언하는것은메모리에기억공간을할당하는것이며할당된이후에는변수명으로그기억공간을사용한다. 할당된기억공간을사용하는방법에는변수명외에메모리의실제주소값을사용하는것이다.
More information금오공대 컴퓨터공학전공 강의자료
C 프로그래밍프로젝트 Chap 14. 포인터와함수에대한이해 2013.10.09. 오병우 컴퓨터공학과 14-1 함수의인자로배열전달 기본적인인자의전달방식 값의복사에의한전달 val 10 a 10 11 Department of Computer Engineering 2 14-1 함수의인자로배열전달 배열의함수인자전달방식 배열이름 ( 배열주소, 포인터 ) 에의한전달 #include
More information8.파일시스템과 파일 복구
SeoulTech 2012-2 nd 컴퓨터보안 박종혁교수 Tel: 970-6702 Email: jhpark1@snut.ac.kr 학습목표 디지털포렌식에서기본단위는파일의추출과분석을통해이루어지므로, 파일의저장및관리를책임지는파일시스템의이해는필수적이다. 먼저파일시스템의이해와구조를파악하고, 윈도우시스템에서가장널리쓰이는 FAT, NTFS 파일시스템에대해학습한다. 학습내용
More information11장 포인터
Dynamic Memory and Linked List 1 동적할당메모리의개념 프로그램이메모리를할당받는방법 정적 (static) 동적 (dynamic) 정적메모리할당 프로그램이시작되기전에미리정해진크기의메모리를할당받는것 메모리의크기는프로그램이시작하기전에결정 int i, j; int buffer[80]; char name[] = data structure"; 처음에결정된크기보다더큰입력이들어온다면처리하지못함
More informationC 언어 프로그래밊 과제 풀이
과제풀이 (1) 홀수 / 짝수판정 (1) /* 20094123 홍길동 20100324 */ /* even_or_odd.c */ /* 정수를입력받아홀수인지짝수인지판정하는프로그램 */ int number; printf(" 정수를입력하시오 => "); scanf("%d", &number); 확인 주석문 가필요한이유 printf 와 scanf 쌍
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 information3. FAT32 파일시스템의구조 1) 마스터부트레코드 (MBR) 하드디스크의첫번째섹터를 MBR 이라고하며, 512 바이트의크기입니다. MBR 에서는해당디스크의파티션에대한정보를담고있으며, 아래 < 그림1 > 과같은구조를갖습니다. < 그림1. 마스터부트레코드구조 > MBR
1. FAT 파일시스템이란? FAT(File Allocation Table, ' 파일할당테이블') 는 MS ' 社 의 MS-DOS의파일시스템에서하드디스크의 파일의위치정보등을기록하기위한영역을말합니다. 나중에윈도우에도들어가면서 FAT는파일시스템 그자체를가리키게되었습니다. FAT는 FAT12, FAT16, FAT32 총 3 종류가있으며, FAT 뒤의숫자는각파일에대한클러스터의위치와
More informationMicrosoft PowerPoint - chap06-1Array.ppt
2010-1 학기프로그래밍입문 (1) chapter 06-1 참고자료 배열 박종혁 Tel: 970-6702 Email: jhpark1@snut.ac.kr 한빛미디어 출처 : 뇌를자극하는 C프로그래밍, 한빛미디어 -1- 배열의선언과사용 같은형태의자료형이많이필요할때배열을사용하면효과적이다. 배열의선언 배열의사용 배열과반복문 배열의초기화 유연성있게배열다루기 한빛미디어
More informationuntitled
int i = 10; char c = 69; float f = 12.3; int i = 10; char c = 69; float f = 12.3; printf("i : %u\n", &i); // i printf("c : %u\n", &c); // c printf("f : %u\n", &f); // f return 0; i : 1245024 c : 1245015
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 information이번장에서학습할내용 동적메모리란? malloc() 와 calloc() 연결리스트 파일을이용하면보다많은데이터를유용하고지속적으로사용및관리할수있습니다. 2
제 17 장동적메모리와연결리스트 유준범 (JUNBEOM YOO) Ver. 2.0 jbyoo@konkuk.ac.kr http://dslab.konkuk.ac.kr 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다. 이번장에서학습할내용 동적메모리란? malloc() 와 calloc() 연결리스트 파일을이용하면보다많은데이터를유용하고지속적으로사용및관리할수있습니다.
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 informationMicrosoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt
변수와상수 1 변수란무엇인가? 변수 : 정보 (data) 를저장하는컴퓨터내의특정위치 ( 임시저장공간 ) 메모리, register 메모리주소 101 번지 102 번지 변수의크기에따라 주로 byte 단위 메모리 2 기본적인변수형및변수의크기 변수의크기 해당컴퓨터에서는항상일정 컴퓨터마다다를수있음 short
More information<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>
리눅스 오류처리하기 2007. 11. 28 안효창 라이브러리함수의오류번호얻기 errno 변수기능오류번호를저장한다. 기본형 extern int errno; 헤더파일 라이브러리함수호출에실패했을때함수예 정수값을반환하는함수 -1 반환 open 함수 포인터를반환하는함수 NULL 반환 fopen 함수 2 유닉스 / 리눅스 라이브러리함수의오류번호얻기 19-1
More information1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 #define _CRT_SECURE_NO_WARNINGS #include #include main() { char ch; printf(" 문자 1개를입력하시오 : "); scanf("%c", &ch); if (isalpha(ch))
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(Asynchronous Mode) ( 1, 5~8, 1~2) & (Parity) 1 ; * S erial Port (BIOS INT 14H) - 1 -
(Asynchronous Mode) - - - ( 1, 5~8, 1~2) & (Parity) 1 ; * S erial Port (BIOS INT 14H) - 1 - UART (Univ ers al As y nchronous Receiver / T rans mitter) 8250A 8250A { COM1(3F8H). - Line Control Register
More informationchap7.key
1 7 C 2 7.1 C (System Calls) Unix UNIX man Section 2 C. C (Library Functions) C 1975 Dennis Ritchie ANSI C Standard Library 3 (system call). 4 C?... 5 C (text file), C. (binary file). 6 C 1. : fopen( )
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 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 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 information02장.배열과 클래스
---------------- DATA STRUCTURES USING C ---------------- CHAPTER 배열과구조체 1/20 많은자료의처리? 배열 (array), 구조체 (struct) 성적처리프로그램에서 45 명의성적을저장하는방법 주소록프로그램에서친구들의다양한정보 ( 이름, 전화번호, 주소, 이메일등 ) 를통합하여저장하는방법 홍길동 이름 :
More information8.파일시스템과 파일 복구
박종혁교수 Tel: 970-6702 Email: jhpark1@seoultech.ac.kr 학습목표 디지털포렌식에서기본단위는파일의추출과분석을통해이루어지므로, 파일의저장및관리를책임지는파일시스템의이해는필수적이다. 먼저파일시스템의이해와구조를파악하고, 윈도우시스템에서가장널리쓰이는 FAT, NTFS 파일시스템에대해학습한다. 학습내용 파일시스템의이해 파일시스템분석 FAT
More information5.스택(강의자료).key
CHP 5: https://www.youtube.com/watch?v=ns-r91557ds ? (stack): (LIFO:Last-In First-Out):. D C B C B C B C B (element) C (top) B (bottom) (DT) : n element : create() ::=. is_empty(s) ::=. is_full(s) ::=.
More information<4D F736F F F696E74202D20C1A63132B0AD20B5BFC0FB20B8DEB8F0B8AEC7D2B4E7>
제14장 동적 메모리 할당 Dynamic Allocation void * malloc(sizeof(char)*256) void * calloc(sizeof(char), 256) void * realloc(void *, size_t); Self-Referece NODE struct selfref { int n; struct selfref *next; }; Linked
More information중간고사
중간고사 예제 1 사용자로부터받은두개의숫자 x, y 중에서큰수를찾는알고리즘을의사코드로작성하시오. Step 1: Input x, y Step 2: if (x > y) then MAX
More information제 14 장포인터활용 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.
제 14 장포인터활용 유준범 (JUNBEOM YOO) Ver. 2.0 jbyoo@konkuk.ac.kr http://dslab.konkuk.ac.kr 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다. 이번장에서학습할내용 이중포인터란무엇인가? 포인터배열 함수포인터 다차원배열과포인터 void 포인터 포인터는다양한용도로유용하게활용될수있습니다. 2 이중포인터
More informationOCW_C언어 기초
초보프로그래머를위한 C 언어기초 4 장 : 연산자 2012 년 이은주 학습목표 수식의개념과연산자및피연산자에대한학습 C 의알아보기 연산자의우선순위와결합방향에대하여알아보기 2 목차 연산자의기본개념 수식 연산자와피연산자 산술연산자 / 증감연산자 관계연산자 / 논리연산자 비트연산자 / 대입연산자연산자의우선순위와결합방향 조건연산자 / 형변환연산자 연산자의우선순위 연산자의결합방향
More information<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CC0E7B0EDB0FCB8AE5C53746F636B5F4D616E D656E74732E637070>
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include "QuickSort.h" 7 using namespace std; 8 9 10 Node* Queue[100]; // 추가입력된데이터를저장하기위한 Queue
More informationUI TASK & KEY EVENT
T9 & AUTOMATA 2007. 3. 23 PLATFORM TEAM 정용학 차례 T9 개요 새로운언어 (LDB) 추가 T9 주요구조체 / 주요함수 Automata 개요 Automata 주요함수 추후세미나계획 질의응답및토의 T9 ( 2 / 30 ) T9 개요 일반적으로 cat 이라는단어를쓸려면... 기존모드 (multitap) 2,2,2, 2,8 ( 총 6번의입력
More informationÀ©µµ³×Æ®¿÷ÇÁ·Î±×·¡¹Ö4Àå_ÃÖÁ¾
P a 02 r t Chapter 4 TCP Chapter 5 Chapter 6 UDP Chapter 7 Chapter 8 GUI C h a p t e r 04 TCP 1 3 1 2 3 TCP TCP TCP [ 4 2] listen connect send accept recv send recv [ 4 1] PC Internet Explorer HTTP HTTP
More information금오공대 컴퓨터공학전공 강의자료
C 프로그래밍프로젝트 Chap 13. 포인터와배열! 함께이해하기 2013.10.02. 오병우 컴퓨터공학과 13-1 포인터와배열의관계 Programming in C, 정재은저, 사이텍미디어. 9 장참조 ( 교재의 13-1 은읽지말것 ) 배열이름의정체 배열이름은 Compile 시의 Symbol 로서첫번째요소의주소값을나타낸다. Symbol 로서컴파일시에만유효함 실행시에는메모리에잡히지않음
More information슬라이드 1
/ 유닉스시스템개요 / 파일 / 프로세스 01 File Descriptor file file descriptor file type unix 에서의파일은단지바이트들의나열임 operating system 은파일에어떤포맷도부과하지않음 파일의내용은바이트단위로주소를줄수있음 file descriptor 는 0 이나양수임 file 은 open 이나 creat 로 file
More information11장 포인터
누구나즐기는 C 언어콘서트 제 9 장포인터 이번장에서학습할내용 포인터이란? 변수의주소 포인터의선언 간접참조연산자 포인터연산 포인터와배열 포인터와함수 이번장에서는포인터의기초적인지식을학습한다. 포인터란? 포인터 (pointer): 주소를가지고있는변수 메모리의구조 변수는메모리에저장된다. 메모리는바이트단위로액세스된다. 첫번째바이트의주소는 0, 두번째바이트는 1, 변수와메모리
More information< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>
Chap #2 펌웨어작성을위한 C 언어 I http://www.smartdisplay.co.kr 강의계획 Chap1. 강의계획및디지털논리이론 Chap2. 펌웨어작성을위한 C 언어 I Chap3. 펌웨어작성을위한 C 언어 II Chap4. AT89S52 메모리구조 Chap5. SD-52 보드구성과코드메모리프로그래밍방법 Chap6. 어드레스디코딩 ( 매핑 ) 과어셈블리어코딩방법
More informationuntitled
Step Motor Device Driver Embedded System Lab. II Step Motor Step Motor Step Motor source Embedded System Lab. II 2 open loop, : : Pulse, 1 Pulse,, -, 1 +5%, step Step Motor (2),, Embedded System Lab. II
More information歯9장.PDF
9 Hello!! C printf() scanf() getchar() putchar() gets() puts() fopen() fclose() fprintf() fscant() fgetc() fputs() fgets() gputs() fread() fwrite() fseek() ftell() I/O 2 (stream) C (text stream) : `/n'
More information컴파일러
YACC 응용예 Desktop Calculator 7/23 Lex 입력 수식문법을위한 lex 입력 : calc.l %{ #include calc.tab.h" %} %% [0-9]+ return(number) [ \t] \n return(0) \+ return('+') \* return('*'). { printf("'%c': illegal character\n",
More information쉽게 풀어쓴 C 프로그래밍
제 13 장파일처리 1. 스트림의개념을이해한다. 2. 객체지향적인방법을사용하여파일입출력을할수있다. 3. 텍스트파일과이진파일의차이점을이해한다. 4. 순차파일과임의접근파일의차이점을이해한다. 이번장에서만들어볼프로그램 스트림 (stream) 스트림 (stream) 은 순서가있는데이터의연속적인흐름 이다. 스트림은입출력을물의흐름처럼간주하는것이다. 입출력관련클래스들 파일쓰기
More informationPowerPoint 프레젠테이션
C 언어포인터정복하기 16 강. 포인터로자료구조화하기 TAE-HYONG KIM COMPUTER ENG, KIT 2 학습내용 구조체멤버와구조체포인터멤버 다른구조체 ( 변수 ) 를가리키는구조체 ( 변수 ) 연결된리스트 의구성및관리 포인터로 연결된리스트 탐색하기 3 중첩구조체에자료저장하기 중첩된구조체변수에값저장하기 struct person { char PRID[15];
More informationC# Programming Guide - Types
C# Programming Guide - Types 최도경 lifeisforu@wemade.com 이문서는 MSDN 의 Types 를요약하고보충한것입니다. http://msdn.microsoft.com/enus/library/ms173104(v=vs.100).aspx Types, Variables, and Values C# 은 type 에민감한언어이다. 모든
More informationMicrosoft PowerPoint - chap11-포인터의활용.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슬라이드 1
마이크로컨트롤러 2 (MicroController2) 2 강 ATmega128 의 external interrupt 이귀형교수님 학습목표 interrupt 란무엇인가? 기본개념을알아본다. interrupt 중에서가장사용하기쉬운 external interrupt 의사용방법을학습한다. 1. Interrupt 는왜필요할까? 함수동작을추가하여실행시키려면? //***
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 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 informationadfasdfasfdasfasfadf
C 4.5 Source code Pt.3 ISL / 강한솔 2019-04-10 Index Tree structure Build.h Tree.h St-thresh.h 2 Tree structure *Concpets : Node, Branch, Leaf, Subtree, Attribute, Attribute Value, Class Play, Don't Play.
More information비트와바이트 비트와바이트 비트 (Bit) : 2진수값하나 (0 또는 1) 를저장할수있는최소메모리공간 1비트 2비트 3비트... n비트 2^1 = 2개 2^2 = 4개 2^3 = 8개... 2^n 개 1 바이트는 8 비트 2 2
비트연산자 1 1 비트와바이트 비트와바이트 비트 (Bit) : 2진수값하나 (0 또는 1) 를저장할수있는최소메모리공간 1비트 2비트 3비트... n비트 2^1 = 2개 2^2 = 4개 2^3 = 8개... 2^n 개 1 바이트는 8 비트 2 2 진수법! 2, 10, 16, 8! 2 : 0~1 ( )! 10 : 0~9 ( )! 16 : 0~9, 9 a, b,
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 information03_queue
Queue Data Structures and Algorithms 목차 큐의이해와 ADT 정의 큐의배열기반구현 큐의연결리스트기반구현 큐의활용 덱 (Deque) 의이해와구현 Data Structures and Algorithms 2 큐의이해와 ADT 정의 Data Structures and Algorithms 3 큐 (Stack) 의이해와 ADT 정의 큐는 LIFO(Last-in,
More information03장.스택.key
---------------- DATA STRUCTURES USING C ---------------- 03CHAPTER 1 ? (stack): (LIFO:Last-In First-Out) 2 : top : ( index -1 ),,, 3 : ( ) ( ) -> ->. ->.... 4 Stack ADT : (LIFO) : init():. is_empty():
More informationuntitled
if( ) ; if( sales > 2000 ) bonus = 200; if( score >= 60 ) printf(".\n"); if( height >= 130 && age >= 10 ) printf(".\n"); if ( temperature < 0 ) printf(".\n"); // printf(" %.\n \n", temperature); // if(
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 information<4D F736F F F696E74202D FB8DEB8F0B8AE20B8C5C7CE205BC8A3C8AF20B8F0B5E55D>
학습목표 통신프로그램이무엇인지이해한다. 을이용한 IPC 기법을이해한다. 함수를사용해프로그램을작성할수있다. IT CookBook, 유닉스시스템프로그래밍 2/20 목차 의개념 함수 해제함수 의보호모드변경 파일의크기확장 매핑된메모리동기화 데이터교환하기 의개념 파일을프로세스의메모리에매핑 프로세스에전달할데이터를저장한파일을직접프로세스의가상주소공간으로매핑 read, write
More information본교재는수업용으로제작된게시물입니다. 영리목적으로사용할경우저작권법제 30 조항에의거법적처벌을받을수있습니다. [ 실습 ] 스위치장비초기화 1. NVRAM 에저장되어있는 'startup-config' 파일이있다면, 삭제를실시한다. SWx>enable SWx#erase sta
[ 실습 ] 스위치장비초기화 1. NVRAM 에저장되어있는 'startup-config' 파일이있다면, 삭제를실시한다. SWx>enable SWx#erase startup-config Erasing the nvram filesystem will remove all configuration files Continue? [confirm] ( 엔터 ) [OK] Erase
More informationGNU/Linux 1, GNU/Linux MS-DOS LOADLIN DOS-MBR LILO DOS-MBR LILO... 6
GNU/ 1, qkim@pecetrirekr GNU/ 1 1 2 2 3 4 31 MS-DOS 5 32 LOADLIN 5 33 DOS- LILO 6 34 DOS- 6 35 LILO 6 4 7 41 BIOS 7 42 8 43 8 44 8 45 9 46 9 47 2 9 5 X86 GNU/LINUX 10 1 GNU/, GNU/ 2, 3, 1 : V 11, 2001
More informationMicrosoft Word - FS_ZigBee_Manual_V1.3.docx
FirmSYS Zigbee etworks Kit User Manual FS-ZK500 Rev. 2008/05 Page 1 of 26 Version 1.3 목 차 1. 제품구성... 3 2. 개요... 4 3. 네트워크 설명... 5 4. 호스트/노드 설명... 6 네트워크 구성... 6 5. 모바일 태그 설명... 8 6. 프로토콜 설명... 9 프로토콜 목록...
More information0. 표지에이름과학번을적으시오. (6) 1. 변수 x, y 가 integer type 이라가정하고다음빈칸에 x 와 y 의계산결과값을적으시오. (5) x = (3 + 7) * 6; x = 60 x = (12 + 6) / 2 * 3; x = 27 x = 3 * (8 / 4
Introduction to software design 2012-1 Final 2012.06.13 16:00-18:00 Student ID: Name: - 1 - 0. 표지에이름과학번을적으시오. (6) 1. 변수 x, y 가 integer type 이라가정하고다음빈칸에 x 와 y 의계산결과값을적으시오. (5) x = (3 + 7) * 6; x = 60 x
More informationPowerPoint 프레젠테이션
Chapter 15 고급프로그램을 만들기위한 C... 1. main( ) 함수의숨겨진이야기 2. 헤더파일 3. 전처리문과예약어 1. main( ) 함수의숨겨진이야기 main( ) 함수의매개변수 [ 기본 14-1] main( ) 함수에매개변수를사용한예 1 01 #include 02 03 int main(int argc, char* argv[])
More informationMicrosoft PowerPoint - [2009] 02.pptx
원시데이터유형과연산 원시데이터유형과연산 원시데이터유형과연산 숫자데이터유형 - 숫자데이터유형 원시데이터유형과연산 표준입출력함수 - printf 문 가장기본적인출력함수. (stdio.h) 문법 ) printf( Test printf. a = %d \n, a); printf( %d, %f, %c \n, a, b, c); #include #include
More information61 62 63 64 234 235 p r i n t f ( % 5 d :, i+1); g e t s ( s t u d e n t _ n a m e [ i ] ) ; if (student_name[i][0] == \ 0 ) i = MAX; p r i n t f (\ n :\ n ); 6 1 for (i = 0; student_name[i][0]!= \ 0&&
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 information다음 사항을 꼭 확인하세요! 도움말 안내 - 본 도움말에는 iodd2511 조작방법 및 활용법이 적혀 있습니다. - 본 제품 사용 전에 안전을 위한 주의사항 을 반드시 숙지하십시오. - 문제가 발생하면 문제해결 을 참조하십시오. 중요한 Data 는 항상 백업 하십시오.
메 뉴 다음 사항을 꼭 확인하세요! --------------------------------- 2p 안전을 위한 주의 사항 --------------------------------- 3p 구성품 --------------------------------- 4p 각 부분의 명칭 --------------------------------- 5p 제품의 규격
More information프로그래밍개론및실습 2015 년 2 학기프로그래밍개론및실습과목으로본내용은강의교재인생능출판사, 두근두근 C 언어수업, 천인국지음을발췌수정하였음
프로그래밍개론및실습 2015 년 2 학기프로그래밍개론및실습과목으로본내용은강의교재인생능출판사, 두근두근 C 언어수업, 천인국지음을발췌수정하였음 CHAPTER 9 둘중하나선택하기 관계연산자 두개의피연산자를비교하는연산자 결과값은참 (1) 아니면거짓 (0) x == y x 와 y 의값이같은지비교한다. 관계연산자 연산자 의미 x == y x와 y가같은가? x!= y
More information경우 1) 80GB( 원본 ) => 2TB( 복사본 ), 원본 80GB 는 MBR 로디스크초기화하고 NTFS 로포맷한경우 복사본 HDD 도 MBR 로디스크초기화되고 80GB 만큼포맷되고나머지영역 (80GB~ 나머지부분 ) 은할당되지않음 으로나온다. A. Window P
Duplicator 는기본적으로원본하드디스크를빠르게복사본하드디스크에복사하는기능을하는것입니다.. 복사본 하드디스크가원본하드디스크와똑같게하는것을목적으로하는것이어서저용량에서고용량으로복사시몇 가지문제점이발생할수있습니다. 하드디스크는사용하려면, 디스크초기화를한후에포맷을해야사용가능합니다. Windows PC는 MBR과 GPT 2 개중에 1개로초기화합니다. -Windows
More informationMicrosoft Word - [2017SMA][T8]OOPT_Stage_2040 ver2.docx
OOPT Stage 2040 - Design Feesual CPT Tool Project Team T8 Date 2017-05-24 T8 Team Information 201211347 박성근 201211376 임제현 201411270 김태홍 2017 Team 8 1 Table of Contents 1. Activity 2041. Design Real Use
More informationC 프로그래밊 개요
구조체 2009 년 5 월 19 일 김경중 강의계획수정 일자계획 Quiz 실습보강 5 월 19 일 ( 화 ) 구조체 Quiz ( 함수 ) 5 월 21 일 ( 목 ) 구조체저녁 6 시 5 월 26 일 ( 화 ) 포인터 5 월 28 일 ( 목 ) 특강 (12:00-1:30) 6 월 2 일 ( 화 ) 포인터 Quiz ( 구조체 ) 저녁 6 시 6 월 4 일 ( 목
More information2009년 상반기 사업계획
메모리매핑 IT CookBook, 유닉스시스템프로그래밍 학습목표 통신프로그램이무엇인지이해한다. 메모리매핑을이용한 IPC 기법을이해한다. 메모리매핑함수를사용해프로그램을작성할수있다. 2/20 목차 메모리매핑의개념 메모리매핑함수 메모리매핑해제함수 메모리매핑의보호모드변경 파일의크기확장 매핑된메모리동기화 데이터교환하기 3/20 메모리매핑의개념 메모리매핑 파일을프로세스의메모리에매핑
More information