2011-04-25 11 views
1

eCryptfs 파일의 헤더를 구문 분석하는 프로그램 (C가 아닌 Free Pascal 사용)을 작성 중입니다.이 고유 한 파일 헤더 '특수 표시'가 eCryptfs에 eCryptfs 파일임을 어떻게 알립니 까?

헤더의 값 중 하나는 바이트 7에서 시작하여 15 (8 바이트 값)로 끝납니다. 이 파일은 eCryptfs 파일로 고유하게 식별되는 값이기 때문에 나에게 유용합니다. 그래서 파일에서 이러한 값을 찾을 때 인식하도록 앱을 코딩하려고합니다.

그러나 마커 자체는 무작위로 생성 된 4 바이트 값 (X)을 0x3c81b7f5 (Y)의 다른 4 바이트 정적 16 진 값과 XOR 연산하여 생성됩니다. 생성 된 값은 4 바이트이며, Z.X + Z는 함께 8 바이트 특수 마커를 형성합니다. Y 자체는 파일 헤더에 저장되지 않습니다. 따라서 0x3c81b7f5 (Y) 값이 헤더에 저장되지 않는다는 것을 알기 위해 응용 프로그램을 코딩하여 다른 4 바이트가 하나의 정적 값과 다른 임의의 하나의 XOR 결과로 표시되도록 코딩 할 수 없습니다. , 나는 그것이 어떻게인지 알아낼 수 없다.

eCryptfs 프로그램이 eCryptfs Launchpad 사이트 (https://answers.launchpad.net/ecryptfs/+question/152821)에서이 값을 "eCryptfs 파일"로 인식하는 방법을 묻는 질문에 커뮤니티 중 한 명이 아래 링크 된 관련 C 소스 코드를 참조했습니다. C가 특수 마커를 인식하는 방법을 이해할만큼 충분히 이해할 수 있습니다. 누군가 내 응용 프로그램에 같은 종류의 인식 프로세스를 코딩 할 수 있도록 도와 줄 수 있습니까? 저는 소스 코드가 필요 없지만 누군가에게 설명하기를 원합니다. C 코드는 운동 방법 "아 그래, 그건 eCryptfs가 바로 거기 파일입니다!"나는 내가 할 수있는 내 응용 프로그램을 코딩 할 필요가 무엇인지 알 수 있도록.

http://fxr.watson.org/fxr/source/fs/ecryptfs/crypto.c?v=linux-2.6;im=excerpts#L1029

답변

4

m_1 = get_unaligned_be32(data); 
m_2 = get_unaligned_be32(data + 4); 
if ((m_1^MAGIC_ECRYPTFS_MARKER) == m_2) 
    return 1; 

get_unaligned_be32 기능은 단지 수 byte order 조정과 부호없는 네 바이트 정수로 data에서 4 바이트를 변환 : 당신이 정말 관심에 여기에이 부분이다. 와 가능성 (

[0][3][2][4][4][5][6][7] 
^   ^
data  data + 4 
m_1   m_2   /* After adjusting byte order */ 

그래서, 처음 두 행은 단지 data의 처음 8 바이트 중 두 개의 부호없는 정수를 끌어 : get_unaligned_be32 에 두 번째 호출에 data + 4은 4 바이트로 get_unaligned_be32까지 전달 된 주소를 이동 바이트 순서 수정). ^ 단지 XOR 연산자이며 MAGIC_ECRYPTFS_MARKER 그래서이 테스트는 단지 그것이 m_2 같으면보고 m_1 및 0x3c81b7f5 및 배타적 논리합된다 0x3c81b7f5이다

(m_1^MAGIC_ECRYPTFS_MARKER) == m_2 

;

그렇다면 우리는이 식을 이 비교가 맞다면 에 올바른 유형의 파일이 있습니다. 당신은 그들이 연결된 있다는 것을 의미한다 "X + Z가 함께 8 바이트 특수 마커를 형성"에 의한 경우

+0

그런 세부 사항을 자세히 설명해 주셔서 감사합니다. 그거 멋지 네, 고마워. 지금 코드를 이해합니다. –

1

, 당신은 다음이 : 이제

Y = 0x3c81b7f5 
X = some random value 

Z = X^Y (also a random value, due to X being random) 

, 당신은 파일 헤더에서 X와 Z가 .함께 xor하면 다음 관계가 성립됩니다.

X^Z = X^(X^Y) = Y 

따라서 0x3c81b7f5 값을 지정해야합니다.

+0

두 분 모두 고마워요. 이 답을 종합하면 나에게 도움이되었습니다. 다시 한번 감사드립니다. –