Hai m ng song song , t ng ng c g i b i các tên khác nhau nh ng cái tên chung nh t là Import
Address Table ( cho m t c tr b i FirstThunk) và Import Name Table hay Import Lookup Table
(cho m t c tr b i OriginalFirstThunk).
T i sao l i có hai m ng t ng ng c a các con tr t i nh ng c u trúc IMAGE_IMPORT_BY_NAME
? Các Import Name Table c nguyên và không bao gi c ch nh s a.Các Import Address
Table c vi t l i v i nh ng a ch hàm th c s b i trình loader. Trình loader l p l i thông qua m i con tr t i các hàm và tìm ki m a ch c a hàm mà m i c u trúc tham chi u t i. Trình loader sau ó s vi t
l i con tr t i IMAGE_IMPORT_BY_NAME b ng a ch c a hàm. Các m ng c a nh ng RVAs trong
Import Name Tables gi nguyên không b thay i vì v y n u c n thi t tìm tên c a các hàm imported , trình PE loader có th v n tìm th y chúng.
M c dù IAT c tr t i b i entry number 12 trong Data Directory , m t vài ch ng trình linkers không thi t l p danh sách th m c này và tuy nhiên trình ng d ng s ch y. Trình loader ch s d ng i u này
ánh d u m t cách t m th i IAT khi read-write trong lúc import resolution và có th gi i quy t các import mà không c n nó.
ó là cách th c mà trình Windows loader có th vi t l i IAT khi nó hi n có trong m t section ch c (readonly section). T i th i i m n p h th ng thi t l p m t cách t m th i các thu c tính c a các trang ch a d li u import c ho c ghi.Khi import table c kh i t o các trang c thi t l p tr l i v i các thu c tính c b o v nguyên b n c a chúng.
Các l i g i t i các hàm c import x y ra thông qua m t con tr hàm trong IAT. L y ví d , hãy t ng t ng r ng a ch 00405030 tham chi u t i 1 hàm c a danh sác trong m ng FirstThunk mà ã c vi t l i b i trình loader b ng a c a hàm GetMessage trong file USER32.DLL.
Cách th c hi u qu g i hàm GetMessage gi ng nh d i ây : 0040100C CALL DWORD PTR [00405030 ] Còn cách th c kém hi u qu là nh sau : 0040100C CALL [00402200] ... ... 00402200 JMP DWORD PTR [00405030]
L y ví d , ph ng pháp th hai c ng thu c m t k t qu t ng t nh ng s d ng 5 byte thêm vào c a code và m t th i gian lâu h n th c thì b i vì extra jump.
T i sao các l i g i t i hàm c imported l i c th c hi n theo cách này? Ch ng trình biên d ch có th không phân bi t gi a các l i g i hàm thông th ng trong cùng m t module và các hàm c imported cho ra cùng m t u ra gi ng nhau : CALL [XXXXXXXX]
T i ây thì XXXXXXXX ph i là m t a ch code th c s (không ph i là m t con tr ) c i n vào sau ó b i ch ng trình linker. Trình linker không bi t a ch c a hàm c imported và vì v y ph i cung c p ph n thay th c a o n mã (code) The jump stub seen above.
Cách t i u c s d ng là cách s d ng trình the _declspec(dllimport) modifier thông báo cho ch ng trình biên d ch r ng hàm hi n có bên trong m t file DLL. Nó s có k t qu là CALL DWORD PTR [XXXXXXXX].
N u nh _declspec(dllimport) không c s d ng khi biên d ch m t file th c thi thì s có m t t p h p l n c a các jump stubs cho các hàm c imported xác nh l n nhau n m âu trong o n mã l nh.
i u này c bi t b i các tên khác nhau ví d nh "transfer area", "trampoline" or "jump thunk table".