Offset (informatyka)

Offset (z ang. „przesunięcie”) – informacja o pozycji danego pola, nagłówka lub innych danych w pliku lub w pamięci operacyjnej, względem wybranego punktu odniesienia. Punktem odniesienia najczęściej jest początek pliku, początek rozważanej struktury lub, rzadziej, początek pamięci (w tym wypadku jednak najczęściej używa się określenia „adres”). Zwyczajowo offset jest wyrażony w jednostkach zgodnych z najmniejszą, bezpośrednio adresowalną jednostką danych w rozważanym medium – najczęściej są to bajty.

Przykłady użycia

Termin „offset” jest używany najczęściej w jednym z poniższych kontekstów:

Pozycja w pliku

Rozważamy następujący plik PE:

00000000  4d 5a 90 00 03 00 00 00  04 00 00 00 ff ff 00 00  |MZ..............|
00000010  b8 00 00 00 00 00 00 00  40 00 00 00 00 00 00 00  |........@.......|
00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000030  00 00 00 00 00 00 00 00  00 00 00 00 80 00 00 00  |................|
00000040  0e 1f ba 0e 00 b4 09 cd  21 b8 01 4c cd 21 54 68  |........!..L.!Th|
00000050  69 73 20 70 72 6f 67 72  61 6d 20 63 61 6e 6e 6f  |is program canno|
00000060  74 20 62 65 20 72 75 6e  20 69 6e 20 44 4f 53 20  |t be run in DOS |
00000070  6d 6f 64 65 2e 0d 0d 0a  24 00 00 00 00 00 00 00  |mode....$.......|
00000080  50 45 00 00 4c 01 08 00  88 db 61 54 00 1e 00 00  |PE..L.....aT....|
00000090  00 00 00 00 e0 00 0f 03  0b 01 02 16 00 0c 00 00  |................|
000000a0  00 1a 00 00 00 02 00 00  6c 12 00 00 00 10 00 00  |........l.......|

W tym przypadku możemy powiedzieć, iż:

  • Nagłówek IMAGE_DOS_HEADER[1] (rozpoczynający się od liter MZ) znajduje się na offsecie 0.
  • String „This program cannot be run in DOS mode” znajduje się na offsecie 0x4E (stosując zapis heksadecymalny) lub 78 (stosując zapis dziesiętny).
  • Nagłówek IMAGE_NT_HEADERS[2] (rozpoczynający się od liter PE) znajduje się na offsecie 0x80 lub 128.

Pozycja w strukturze i tablicy

Rozważmy następującą strukturę w języku C:

struct coords_t {
  int x;
  int y;
};

Zakładając, że typ int jest wielkości czterech bajtów, możemy powiedzieć, że:

  • Pole x jest na offsecie 0 (względem początku struktury).
  • Pole y jest na offsecie 4.

Analogicznie jest w przypadku tablic:

int array[4] = { 0, 10, 20, 30 };

W tym wypadku możemy powiedzieć, że wartość 20 znajduje się pod indeksem 2, ale pod offsetem 8 od początku tablicy (ponieważ oba poprzednie pola tablicy zajęły po cztery bajty). W przypadku dopowiedzenia, że offset zostanie wyrażony w 32-bitowych blokach, poprawnym będzie również powiedzenie, że wartość 20 znajduje się pod offsetem 2.

Przypisy

  1. Kris Stanton: Exploring pe file headers using managed code (ang.). MSDN Blogs. [dostęp 2014-11-11].
  2. Microsoft: IMAGE_NT_HEADERS structure (ang.). MSDN. [dostęp 2014-11-11].