NTFS – Atributos (continuação 2)

Atributo Residente e com Nome

Cabeçalho de Atributo Residente e com Nome

A estrutura do cabeçalho deste atributo é diferente das analisadas até aqui,  pelo que vamos  juntar uma tabela tipo para o cabeçalho dos atributos residentes e com nome na figura25.

Atributo $INDEX_ROOT

Figura-12-25
Figura 25

Como nos vamos apoiar no caso concreto do ficheiro de metadados . (ponto) do volume que temos em análise, vamos fazer a análise do cabeçalho dentro do próprio atributo, que refere os valores específicos desse ficheiro. Aproveitamos para referir que o nome deste ficheiro é mesmo um  .  (ponto). A designação que pomos entre parênteses é unicamente com o fim de não se fazer confusão com os pontos do texto.

$INDEX_ROOT é o nó raiz da árvore binária que implementa um índice e o seu layout é como segue:

  • Standard Index Header
  • Index Root
  • Index Header
  • Index Entries

Na figura 26 apresentamos a decomposição do atributo $INDEX_ROOT do ficheiro . (ponto) nos seus diversos componentes e layouts e campos que os compõem, para podermos acompanhar com a leitura da tabela.

Standard Index Header
Figura-12-26
Figura 26

Pela sua leitura  retiramos que:

  • O tipo do atributo é 90h ($INDEX_ROOT).
  • O comprimento total é de 58h (88 bytes) .
  • É residente.
  • O comprimento do nome é de 4 carateres.
  • O offset para o nome é 18h.
  • As flags indicam ficheiro normal.
  • Tem o ID =14h.
  • O comprimento do atributo é de 38h (56 bytes), portanto o cabeçalho terá 32 bytes.
  • O offset para o atributo é 18h+2xN=20h.

Neste caso o offset para o atributo é diferente do offset para o nome, pois o atributo tem nome e o seu comprimento em carateres deve ser adicionado ao início do nome com o número de bytes igual ao dobro dos carateres (a tal história dos pontos).

O nome, está a partir do offset 4540h+18h = 4558h e ocupará 2*N= 2*4=8 bytes. Assim, Os bytes de 4558h a 455Fh correspondem ao Nome. No nosso caso o nome é $I30.  O nome $I30 refere um Diretório.

Nos 38h (56) bytes seguintes encontra-se o atributo, que se vai ler de acordo com os layout que vamos indicar.

Index Root

Este é o primeiro layout, que é lido de acordo com a tabela da figura 27. Assim teremos, a partir de 4549h + 20h = 4560h:

Figura 12.27 - Layout Index Root do atributo $INDEX_ROOT.
Figura 27

Os bytes de 4560h a 4563hTipo do atributo.

No nosso caso 30h, que corresponde a um $FILE_NAME, tipo indicativo de que se trata de um diretório.

Os bytes de 4564h a 4567hCollation Rule.

Collation é a ação de juntar informação escrita de uma forma ordenada, de acordo com uma forma standard ou de acordo com uma regra (rule). No nosso caso a regra é 01 e corresponde à junção da informação ordenada por Filename.

As várias regras de junção ordenada de informação (Collation Rules) em NTFS são:

  • 00 – Binárias
  • 01 – Filename – Cadeias de Unicode.
  • 02 – Unicode – Igual, mas maiúsculas vêm primeiro.
  • 10 – ULONG – 32 bits, little endian.
  • 11 – SID – Identificador de segurança.
  • 12 – Mistura de Segurança – após, faz pelo SID.
  • 13 – ULONGS – Conjuntos de 32 bits little endian.

Os bytes 4568h a 456BhTamanho da entrada do índice de alocação. No nosso caso 1000h = 4.096 Bytes (1 Cluster).

O byte 456ChClusters Por Registo de índice. No nosso caso 01.

Os bytes 456Dh a 456FhPadding a múltiplo de 8 Bytes.

Index Header

Este é o segundo layout, que é lido de acordo com a tabela da figura 28. Assim:

Figura 12.28 - Tabela com descrição do Layout Index Header do atributo $INDEX_ROOT.
Figura 28

Os bytes 4570h a 4573hOffset para a primeira entrada de índice . No nosso caso 10h.

Os bytes 4574h a 4577hTamanho total das entradas de índice. No nosso caso 28h (40 bytes) incluindo este layout.

Os bytes 4578h a 457BhTamanho alocado para as entradas de índice.  No nosso caso 28h (40 bytes) incluindo este layout.

O byte 457ChFlags.

  • 00 – Pequeno índice – Cabe no Index Root.
  • 01 – Grande índice – É necessário alocação externa.

  No nosso caso é 01. Precisa alocação externa.

Os bytes 457Dh a 457FhPadding a múltiplo de 8 Bytes.

Index Entries

Passamos agora às entradas de índice,  que têm início no offset 4580h.

O campo que se segue só é válido se a última flag não tiver valor estabelecido, mas no nosso caso tem e é 01. Quando tem significa que o índice é alocado externamente e devemos passar à leitura do atributo seguinte.

No entanto vamos ler só para vermos o que diz.

Os bytes 4580h a 4587hReferência ao ficheiro. No nosso caso é 0 (não existe).

Os bytes 4588h e 4589hComprimento da entrada de índice. No nosso caso é 18h, precisamente todo o espaço alocado para as mesmas.

Passemos então à leitura do atributo seguinte, pois é ele que nos vai levar às entradas de índice do Diretório Raiz, o atributo $INDEX_ALLOCATION.

Atributo não residente e com nome

Cabeçalho de Atributo Não Residente e Com Nome

Na figura 30 juntamos uma tabela tipo para este cabeçalho.

Atributo $INDEX_ALLOCATION

Figura-12-30
Figura 30

Tal como no caso do atributo anterior, como nos vamos apoiar no caso concreto do ficheiro de metadados . (ponto) do nosso volume, vamos fazer a análise do cabeçalho dentro do próprio atributo, que refere os valores específicos desse ficheiro.

$INDEX_ALLOCATION é a componente base de toda a indexação. É ele que contém todos os subnós da árvore binária. A interpretação do seu cabeçalho diz-nos que:

  • Tem o comprimento de 50h = 80 Bytes,
  • Não é residente,
  • O seu nome tem 4 carateres,
  • O offset para o seu início é de 40h, portanto inicia-se no offset 4598h + 40h = 45D8h,
  • Tem ID = 16,
  • O offset para os data runs é 48h, iniciando-se aqueles portanto no offset 4598h + 48h = 45E0h,
  • Os tamanhos real, alocado e da corrente inicial de dados são de 1000h = 4.096 Bytes, 1 cluster.
  • O seu nome é $I30, o que indica tratar-se de um diretório,
  • Os data runs são 11 01 30 00 …, afinal um só, que nos diz que os dados no exterior ocupam 1 Cluster que se inicia após os primeiros 30h Clusters, ou seja 48 x 512 x 8 = 196.608, ou seja, no offset.
Figura-12-29
Figura 29

Na figura 29 apresentamos a decomposição do atributo $INDEX_ALLOCATION do ficheiro . (ponto) nos campos que os compõem, para podermos acompanhar com a leitura da tabela.

Viajando para esse offset (30000h), aí encontramos sossegadinho à nossa espera, o diretório raiz do nosso volume.

Mas não vamos ainda mexer-lhe, pois presentemente acabámos de analisar os atributos.

Há mais atributos, mas a sua análise não tem interesse para o nosso objetivo.

Como dissemos antes, os Ficheiros são definidos pelo Descritor de Ficheiro e por Atributos. Completa a análise destes elementos, estamos agora em condições de analisar e entender os ficheiros de metadados.