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
[edytuj | edytuj kod]Termin „offset” jest używany najczęściej w jednym z poniższych kontekstów:
Pozycja w pliku
[edytuj | edytuj kod]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 literMZ
) 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 literPE
) znajduje się na offsecie 0x80 lub 128.
Pozycja w strukturze i tablicy
[edytuj | edytuj kod]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
[edytuj | edytuj kod]- ↑ Kris Stanton: Exploring pe file headers using managed code. MSDN Blogs. [dostęp 2014-11-11]. (ang.).
- ↑ Microsoft: IMAGE_NT_HEADERS structure. MSDN. [dostęp 2014-11-11]. (ang.).