raw device read 에서 컨트롤 정보를 제외시키고 읽는 방법?

you의 이미지

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>

#define BUFSIZE 1024
main()
{
int fd0, fd1, n;
char buf[BUFSIZE];

fd0=open("/dev/fd0", O_RDONLY);
fd1=open("./rawwr", O_WRONLY | O_CREAT);

if((n=read(fd0, buf, BUFSIZE))>0)
if(write(fd1, buf, n)!=n)
fprintf(stderr, "write error");
if(n<0)
fprintf(stderr, "read error");
}

보시면 아시겠지만 이 프로그램은
플로피디스크에서 1024바이트를 raw i/o로 읽어들여서
파일에 저장하는 프로그램입니다.

여기서 질문은
저장한 파일을 읽으면 컨트롤 정보까지 읽혀져서 그에 해당하는 파티션 정보를 파싱할 수가 없습니다.
울트라 에디트 같은데서 읽으면 순수 16진코드만 나오더군요
리눅스상에서 이렇게 읽어들일순 없을까요?
시스템콜이나 라이브러리 함수를 써서...
부탁드립니다.
[/list]

익명 사용자의 이미지

Floppy에있는 파일시스템은 대부분 FAT12이고

파티션 정보가 없습니다.

Floppy 에서 첫번째 512바이트는 Bootsector입니다. MBR이 아닙니다.

you의 이미지

minzkn wrote:
Floppy에있는 파일시스템은 대부분 FAT12이고

파티션 정보가 없습니다.

Floppy 에서 첫번째 512바이트는 Bootsector입니다. MBR이 아닙니다.

제가 질문을 애매모호하게 했나보네요^^
제가 원하는 답변은
플로피 디스크에 국한해서 플로피의 파일시스템을 논하자는게 아니라
예를들어
어떤 디스크 파티션에 파일시스템을 포맷한 뒤에(ext2이외의 FS)
그 파티션의 파일시스템 정보를 읽어들이고자 할때
아까 제 질문처럼
raw device read를 해서 읽어들인다 한다면
순수 이진정보가 아니라
여러 컨트롤 정보까지 섞여있기때문에
그 정보로는 파일시스템 정보를 분석하기 힘들다는 말입니다.
그 정보를 가지고 dumpe2fs와 같이 파일시스템 정보를 알고싶어서
질문을 올렸던 것입니다.
제가 파싱해야하는 FS정보는 ext2가 아니라서요...
혹시 raw device read해서
컨트롤 정보를 제외시키고 (울트라 에디터처럼...)
읽어들이는 방법 알고계시다면
부탁드립니다.
감사합니다.

익명 사용자의 이미지

총실린더, 총헤더, 총섹터, ECC, Disk description, LBA sector수
등을 말씀하시는건가요?

만약 그런거라면 Kernel의 해당 디바이스드라이버의 ioctl부분을 찾아보셔야
더 편하게 접근하실수 있을거구요.

콘트롤 정보란게 무엇을 의미하시는지.....

Partition이 어떻게 나뉘어져 있는지 알아내고 싶으신건가요?
만약 그렇다면 0x1be 옵셋부터 16바이트씩 4개가 파티션 정보이고요.
그에 대한 바이너리를 정보로 얻는 것을 원하신다면 다시 리플 달아주세요.
그리고 첫 512바이트를 읽으시면 마지막 2바이트는 0xaa55 일겁니다.
아니라면 부트섹터/MBR이 아닙니다.

you의 이미지

음...
제가 설명을 제대로 못했네요...-_-
일단은
어떤 파일시스템을 포맷하면
파티션에 FS정보들이 잡히짢아요?
superblock, inode, bitmap, etc...
제가 원하는건 이 정보들을 파일로 저장하고자 하는건데요.
위에 제가 작성한 raw device read로 읽어들이면

?<~P*a;OUIHC^@^B^A^A^@^BXX@^KXX^@^R^@^B^@^@^@^@^@^@^@^@^@^@^@);j~T?W2PFPB3_KO FAT12 ?3?Ž劇^@|^V^G?x^@6?7^^V^VS?>|XX^@宖XX^_?EXX~K^N^X|~HM?‰G^BXX>|濩^Sry3?9^F^S|t^H~K^N^S|~I^N |XX|?&^V|^C^F^\|^S^V^^|^C^F^N|~CXX?P|~I^VR|?I|~I^VK|? ^@?&^Q|~K^^^K|^C?H罷^A^FI|~C^VK|^@XX^E~K^VR|?P|?’^@r^]XX玉^@r^V~K鞋^K^@얏}且u

다음과 같이 이상한 문자들(컨트롤정보)이 섞여서 출력이 됩니다.
제가 원하는건
raw device read해서 파일로 저장할때
(예를 들어서...)
00 00 00 00 00 00 53 af cc cc ff ff ......
......

다음과 같이 출력이 되기를 원하는것입니다.(울트라 에디트로 읽으면 다음과 같이 출력됩니다. - 윈도우상에서...)

왜냐면 위의 정보로
tatal number of inodes, filesystem size in blocks, number of reserved blocks, free blocks counter, free inodes counter, etc...
와 같은 수퍼블락 정보 등 파일시스템 정보로 파싱하고자 하기 때문이죠...

만약 위에 작성한 소스(일단은 대충 짠거지만)
에서 FS정보를 저장한 파일(rawwr)을
fread로 rb 모드로 읽어들이면
파싱이 가능할까요?

답변 감사합니다.^^

afsadfsaf의 이미지

컨트롤 문자라는게 사실

만약 그걸 그대로 출력하게되면 화면이 막 이상하게 변하거나 하기 때문에(컨트롤 문자는 말 그대로 컨트롤에 쓰이는거라서 -_-)

\r\n 등으로 바뀌어서 출력이 되는겁니다.

컨트롤 문자가;; 읽힌다는건

you님께서 이용하신 어떤 함수(또는 프로그램)에서, 그 자료를 자료 그대로가 아닌, 텍스트 출력용으로변환했다는 이야기입니다.

한번 검토를 해 보심이..

L-System

익명 사용자의 이미지

그것을 printf로 그대로 찍으면 당연히 그게 제대로 나올리 없죠.
설마 했는데 그런문제로 고민하셨군요. 설마했는데.... :(

이것을 원하셨다면 질문하신분께 실망할거 같군요.
Binary와 ASCII의 차이를 모르신다는 의미일텐데... 설마 아니겠죠?

다음과 같이 하시면 되겠군요.

const int c_BufferSize = 512;
const int c_PrintLimit  = 1024; /* 출력을 얼마나 할지 */
const chr *c_Device = "/dev/fd0";

void MZ_Dump(void *s_Data, int s_Length)
{
 unsigned char s_Buffer[0x10 + 1];
 int s_Index = 0, s_SubIndex, s_Limit;
 if(s_Data == (void *)0)
 {
  fprintf(stdout, "%s: %s - [ERROR] s_Data is null !!!\n", __FILE__, __FUNCTION__);
  return;
 }
 while(s_Index < s_Length)
 {
  fprintf(stdout, "%08X ", s_Index);
  s_SubIndex = 0;  
  while(s_SubIndex < 0x10 && s_Index < s_Length)s_Buffer[s_SubIndex++] = *(((unsigned char *)s_Data) + (s_Index++));	  
  s_Buffer[s_SubIndex] = '\0';
  s_SubIndex = 0;
  s_Limit = (s_Index % 0x10);
  if(s_Limit == 0)s_Limit = 0x10;
  while(s_SubIndex < s_Limit) 
  {
   fprintf(stdout, "%02X ", s_Buffer[s_SubIndex]); 	  
   if(s_Buffer[s_SubIndex] < 0x20 || s_Buffer[s_SubIndex] >= 0x7f)s_Buffer[s_SubIndex] = '.'; 
   if(s_SubIndex == 7)
   {
    if(s_Limit == 8)fprintf(stdout, "  ");
    else fprintf(stdout, "| ");
   }
   s_SubIndex++;
  }
  while(s_SubIndex < 0x10)
  {
   fprintf(stdout, "   ");
   if(s_SubIndex++ == 7)fprintf(stdout, "  ");
  }
  fprintf(stdout, "[%-16s]\n", (char *)&s_Buffer[0]);
 }
}

int main(void)
{
 int s_Handle, s_Total;
 unsigned char s_Buffer[ c_BufferSize ];
 s_Handle = open(c_Device, O_RDONLY);
 if(s_Handle >= 0)
 {
   do
    {
     s_ReadBytes = read(s_Handle, &s_Buffer[0], sizeof(s_Buffer));
     if(s_ReadBytes > 0)
     {
       MZ_Dump(&s_Buffer[0], s_ReadBytes);
       s_Total += s_ReadBytes;
     }
   }while(s_ReadBytes == c_BufferSize && s_Total < c_PrintLimit);
   close(s_Handle);
 }
 return(0);
}
codebank의 이미지

혹시 'od -hc 파일이름' 또는 'od -ha 파일이름' 를 원하신게 아닌지...
od는 원하는 형태로 데이터를 출력시켜주는 역할을 합니다.
제가 질문을 읽어보니 이것(울트라 에디터의 16진수표시와 비슷한...)을
질문한것 같네요... 맞았으면 좋을텐데... :-)

------------------------------
좋은 하루 되세요.

cdpark의 이미지

:(

vim 등의 편집기로 파일 내용을 보는게 목적이라면 xxd 프로그램을 이용해보세요. (man xxd)

그리고 직접 편집하려면 bvi란 프로그램도 있습니다. ( http://bvi.sourceforge.net/ )

프로그램으로 파싱하려면 (당연히) 해당 파일시스템 관련 문서를 읽으셔야 하고요.

you의 이미지

아스키와 바이너리는 알고있습니다만
제가 헷깔려했던건
raw device read를 해서 읽어들인 데이터가
과연 바이너리로만 저장되는가?하는거였습니다.
실제로 스크린이나 파일상에 보여지는 데이터는
이상한 값이(위에 보여드렸던)보여지기 때문에
그게
화면에 보여질때는 텍스트로 변환되어서 보여주는것인지...
아님 실제론 바이너리로 저장되는데 거기에 다른 쓸데없는 값까지 추가되서 저장이 되는것인지...
하는거였습니다.
님들 말씀에 따르면
화면에 보여질때만 텍스트로 변환될뿐
실제 파일에 저장되는건 순수 바이너리 코드라는 말씀이시죠?
그렇다면
raw device read를 수행후
그걸 바로 파일에 저장해서
그 파일을 파싱해서 원하는 정보를 읽어들일수 있겠네요
어쨋든 이렇게 많은 답변 주셔서 정말 감사드립니다.

special thanks to : minzkn

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.