2010-01-23 4 views
3

previous question (참조 용으로 만 연결됨)을 도와 주신 분들께 감사드립니다.정적으로 libmagic 컴파일 (c/C++ 파일 유형 감지)

파일에 fileTypeTest.cpp, libmagic.amagic을 넣을 수 있으며, g++ -lmagic fileTypeTest.cpp fileTypeTest으로 컴파일 할 수 있습니다. 나중에 MinGW로 컴파일 된 Windows에서 실행되는지 테스트 할 것입니다.

작은 GUI 응용 프로그램에서 libmagic을 사용할 계획이며 배포 용으로 정적으로 컴파일하고 싶습니다. 내 문제는 libmagic이 외부 파일 magic을 필요로하는 것 같습니다. (필자는 실제로 단축 된 컴파일 된 버전 인 magic_short.mgc를 사용하고 있습니다.)

해킹 된 해결책은 파일을 응용 프로그램에 코딩하여 필요에 따라 외부 파일을 작성 (삭제)하는 것입니다. 어떻게 이것을 피할 수 있습니까?

magic 다른 파일 형식의 속성을 설명하는 텍스트 파일입니다 :

는 명확성을 위해 추가. 파일을 확인하라는 메시지가 표시되면 libmagicmagic을 통해 검색합니다. 더 빨리 작동하는 컴파일 된 버전 magic.mgc이 있습니다. 내 응용 프로그램은 파일 형식을 결정하기 전에 소수의 파일 형식 만 식별해야하므로 내 magic_short 파일을 사용하여 magic_short.mgc을 만듭니다.

답변

5

이 까다 롭습니다, 나는 그런데 ... 당신이 이런 식으로 할 수있는 가정, 나는 libmagic 소스를 다운로드하고 ... 그것을보고하는 것은

거기에 기능이있어왔다

당신의 끝)/etc 디렉토리에서 발견되는합니다 (magic 파일을 추가 할 수 있습니다 (이는 외부 파일에서 읽고 어디 sourceforge에서 다운로드 한 순수한 바닐라 소스입니다. minifile.cmagic_read_entries라고 티 같은 라이브러리 코드 s cat magic >> libmagic.a. 내 시스템에서 magic은 474443 바이트이고, libmagic.a은 38588 바이트입니다.

magic.c 파일에서이 데이터를 끌어 오기 위해 라이브러리 자체의 오프셋 (offset)에서 읽을 수있는 함수 자체를 줄 magic_read_entries을 추가, 함수의 끝에서, magichandle_t* magic_init(unsigned flags) 기능을 변경해야하고 수정할 것, 치료 char (char **)에 대한 포인터를 가리키는 포인터로 사용하고 파일에서 읽는 대신이를 사용합니다. 읽는 데 라이브러리 데이터에 어느 정도 오프셋이 있는지 알기 때문에 그렇게 어렵지는 않습니다.

이제는 파일에서 더 이상 읽지 않으므로 magic_read_entries 기능이 더 이상 사용되지 않습니다. `magichandle_t * magic_init (unsigned flags) '함수는 엔트리를 로딩하는 것을 처리 할 것이고 여러분은 거기에 있어야한다. 도움이 더 필요하면 알려

, 편집

: 여기 sourceforge.net에서 이전 'libmagic'를 사용하고있다 내가 무슨 짓을 :

  1. 은을 추출 아카이브를 내 홈 디렉토리에 다운로드 한 경우 아카이브 압축을 해제/해제하면 libmagic이라는 폴더가 생성됩니다.
  2. libmagic 내에서 폴더를 만들고 전화 테스트
  3. 복사합니다 원래 magic.c테스트
  4. minifile.c의 차이를 강조 동봉은 diff 출력을 사용하여,에 적용 magic.c 소스.
     
    48a49,51 
    > #define MAGIC_DATA_OFFSET  0x971C 
    > #define MAGIC_STAT_LIB_NAME "libmagic.a" 
    > 
    125a129,130 
    >  /* magic_read_entries is obsolete... */ 
    >  magic_read_entries(mh, MAGIC_STAT_LIB_NAME); 
    251c256,262 
    < 
    --- 
    > 
    >  if (!fseek(fp, MAGIC_DATA_OFFSET, SEEK_SET)){ 
    >    if (ftell(fp) != MAGIC_DATA_OFFSET) return 0; 
    >  }else{ 
    >    return 0; 
    >  } 
    > 
    
그런 다음 cat magic >> libmagic.a의 libmagic.a 파일로 연결됩니다
  • (슬랙웨어 리눅스 12.2에서 나는 등/복사) 마법의 파일을 실행합니다. 마법에 대한 SHA 체크섬은 (4abf536f2ada050ce945fbba796564342d6c9a61 마술), 입니다. 발견 된대로 마법 (-rw-r-r-- 1 루트 루트 474443 2007-06-03 00:52/etc/file/magic)에 대한 정확한 데이터는 여기에 있습니다. 내 시스템에.
  • 가 여기에 minifile.c 소스에 대한 DIFF의, 다시을 실행하여 minifile 실행 파일을 적용하고 다시 빌드합니다.
  •  
    40c40 
    <  magic_read_entries(mh,"magic"); 
    --- 
    >  /*magic_read_entries(mh,"magic");*/ 
    
    

    그런 다음 작동합니다. 그렇지 않은 경우 MAGIC_DATA_OFFSET을 수정하여 읽을 라이브러리의 오프셋을 조정해야합니다. 원한다면 나는 마술 데이터 파일을 붙여 넣을 수 있습니다. 알려줘.

    호프가 도움이 되었으면 안녕하세요, 탐.

    +0

    나는 libmagic의 소스도 사용하고 수정하는 것에 대해 생각했기 때문에 sourceforge 버전도 찾았지만 우분투 레보의 libmagic-dev와 같지는 않다. 'man libmagic' 또는 http://linux.die.net/include/magic.h를 확인하면 타임 스탬프는 2003입니다. SF에서 가져온 파일은 2000입니다 (http://sourceforge.net/projects/libmagic/files). /). 그렇지 않으면, 이것이 좋은 해결책이 될 것이라고 상상해 봅니다. 어떻게 풀어 낼지 생각할 수 있습니다. – Kache

    +0

    최신 libmagic 5.03의 'magic' 항목이 이전 libmagic alpha와 호환되지 않는 것처럼 보입니다. libmagic 5.03은 (man 파일, ftp.astron.com/pub/file/file-5.04.tar.gz에서) 5.03 파일에 포함되어있는 것처럼 보입니다. 내가 그 지점에 도달하면, 나는 appending & pointer offset을하려고 노력하는 것을 멈추게 될지도 모른다고 생각한다. – Kache

    +0

    어느 쪽이든, 제 도움이 필요하시면 주저하지 말고 답장하십시오. ;) – t0mm13b

    1

    정적으로 라이브러리를 컴파일하는 방법을 알려줄 수 있습니다. g ++ 명령의 끝에 .a 파일 경로를 전달하기 만하면됩니다. -a 파일은 컴파일 된 객체 (.o)의 아카이브입니다. "ldd fileTypeTest"를 사용하면 동적으로 링크 된 라이브러리 인 $ {libdir} /libmagic.so가 표시되지 않습니다.

    외부 데이터 파일로 연결하는 방법은 ... 잘 모르겠습니다 - 애플리케이션 (.deb | .rpm | .tar.bz2)을 패키징 할 수 있습니까? Windows에서는 NSIS를 사용하여 설치 프로그램을 작성합니다.

    0

    과거에는 자동 압축 풀림 보관 기능을 내장했습니다. 기본적으로 .zip 아카이브와 압축을 해제하는 코드로 구성된 .exe 파일입니다. .exe를 다운로드하고 실행하십시오. 당신은 당신이 원하는만큼 많은 파일을 가질 수 있습니다.

    http://en.wikipedia.org/wiki/Self-extracting_archive