What The Loader Does

Một phần của tài liệu tìm hiểu, phân tích virus (Trang 30 - 33)

Khi m t file th c thi ch y, trình windows loader s t o ra m t không gian a ch o cho process và ánh x executalble module t a vào trong không gian a ch c a process. Nó c g ng n p image t i a ch c s c u tiên và ánh x các section vào trong b nh (memory). Trình loader s xem xét t m section table và ánh x m i section t i a ch c tính toán b ng cách công thêm RVA c a section v i

a ch c s .Các page attributes c thi t l p theo s yêu c u c i m c a section. Sau khi ánh x các section vào trong b nh , trình loader th c hi n b trí các relocation n u a ch n p không b ng v i a ch c s c u tiên trong ImageBase.

B ng import table sau ó c ki m tra và b t kì file DLLs nào c yêu c u s c ánh x vào trong không gian a ch c a process.Sau ó t t c DLL modules c nh v và ánh x vào, trình loader ki m

N u nh symbol không t n t i ( ây là tr ng h p r t hi m g p), trình loader s thông báo l i. M t khi t t c các module c yêu c u ã c n p s thi hành c chuy n t i entry point c a ng d ng.

Ph n quan tr ng c a thích trong RCE ó chính là vi c loading các file DLLs và gi i quy t các imports. Process này b làm ph c t p b i r t nhi u các hàm internal (forwarded) và các routines t p trung trong file ntdll.dll mà không h c ch ng minh b ng t i li u b i Micro$oft.Nh chúng ta ã nói ph n tr c function forwarding là 1 cách cho M$ expose m t t p Win32 API thông d ng, ph bi n và che d u các hàm c p th p mà có th khác nhau i v i t ng phiên b n c a h i u hành. Nhi u hàm kernel32 quen thu c ví d nh hàm GetProcAddress n gi n ch bao b c xung quanh các ntdll.dll exports ví d nh LdrGetProcAddress (mà hàm này th c hi n công vi c chính).

có th th y rõ nh ng i u này b n c n cài t ch ng trình Windbg và Windows Symbol Package (

c cung c p b i M$) ho c m t ch ng trình kernel-mode debugger gi ng nh SoftIce. B n ch có th xem nh ng hàm này trong Olly n u nh b n c u hình Olly s d ng M$ symbolserver, n u không thì t t c nh ng gì b n quan sát th y ch là các pointers và các a ch b nh mà không có tên c a các hàm. Tuy nhiên Olly là m t trình debugger trên user-mode và nó s ch cho các b n th y c nh ng gì ang x y ra khi ng d ng c a b n c n p và nó s không cho phép b n quan sát th y loading process. M c dù ch c n ng c a ch ng trình Windbg còn h n ch không th so sánh v i Olly nh ng nó t ng thích t t v i h i u hành và s cho ta th y c quá trình loading process :

Nh các b n th y có r t nhi u hàm APIs c liên k t cùng v i quá trình n p m t file th c thi, t t c t p

trung trên hàm LoadLibraryExW trong kernel32.dll mà l n l t d n n hàm n i t i LdrpLoadDll trong ntdll.dll. Hàm này tr c ti p g i 6 subroutines n a là LdrpCheckForLoadedDll, LdrpMapDll,

LdrpWalkImportDescriptor, LdrpUpdateLoadCount, LdrpRunInitializeRoutines, và LdrpClearLoadInProgress th c hi n nh ng nhi m v sau :

1. Ki m tra xem n u module ã s n sàng n p vào. 2. Ánh x module và các thông tin h tr vào trong b nh .

3. D o qua b ng import descriptor table c a module (find other modules this one is importing) . 4. Update the module's load count as well as any others brought in by this DLL

5. Kh i t o module

6. Xóa some sort of flag, indicating that the load has finished

M t DLL có th import các module khác mà b t u m t t ng c a th vi n thêm vào. Trình loader s c n ph i l p l i t u n cu i m i module , ki m tra xem n u nó c n c n p và sau ó ki m tra nh ng ph thu c c a nó. ó là lý do có s xu t hi n c a LdrpWalkImportDescriptor ây.

LdrpWalkImportDescriptor có hai subroutines ó là : LdrpLoadImportModule và LdrpSnapIAT.

u tiên nó b t u b ng hai l i g i t i RtlImageDirectoryEntryToData xác nh v trí Bound Imports Descriptor và các b ng Import Descriptor. Chú ý r ng trình loader s ki m tra bound imports u tiên- m t ng d ng khi th c thi nh ng không có m t import directory có th có các bound imports thay th .

Ti p theo LdrpLoadImportModule xây d ng m t Unicode string cho m i DLL c tìm th y trong

Import Directory và sau ó giao cho LdrpCheckForLoadedDll nh n ra if they have already been loaded.

Ti p n a LdrpSnapIAT routine ki m tra m i DLL c tham chi u t i trong Import Directory thay th cho 1 giá tr -1 (ie again checks for bound imports first). Sau ó nó thay i memory protection c a IAT thành PAGE_READWRITE và ti n hành ki m tra m i entry trong IAT tr c khi chuy n t i

LdrpSnapThunk subroutine.

LdrpSnapThunk s d ng m t ch s c a hàm xác nh a ch c a nó và quy t nh nó có c

forward hay là không. M t khác nó g i LdrpNameToOrdinal s d ng m t phép tìm ki m nh phân trên

export table xác nh ch s m t cách nhanh chóng. N u hàm không c tìm th y thì nó tr v STATUS_ENTRYPOINT_NOT_FOUND, ng c l i n u tìm th y thì nó thay th entry trong IAT b ng

entry point c a API và tr v cho LdrpSnapIAT khôi ph c l i memory protection nó ã thay i t i lúc b t u công vi c c a nó, g i NtFlushInstructionCache b t bu c m t cache refresh trên memory

block có ch a IAT, và sau ó tr v l i cho LdrpWalkImportDescriptor.

ó là m t khác bi t c bi t gi a các h i u hành Window mà trong ó Win2k nh n m nh r ng ntdll.dll c n p gi ng nh m t bound import ho c trong import directory bình th ng tr c khi cho phép m t

file th c thi c n p, nh ng ng c l i h i u hành Win9x hay XP s cho phép môt ng d ng không có imports nào c n p

Ph n khái quát ng n g n này ã c n gi n hóa i r t nhi u nh ng v n minh h a c làm th nào m t l i g i t i LoadLibrary làm t ng lên m t t ng c a vi c n các subroutines n i t iwhich are deeply nested and recursive in places. Trình loader ph i ki m tra m i API c imported tính toán m t a ch th c trong b nh và ki m tra n u m t API ã c imported. M i DLL c imported có th d n n các modules thêm vào và process s b l p l i h t l n này n l n khác cho t i khi t t c các ph thu c

u ã c ki m tra.

Một phần của tài liệu tìm hiểu, phân tích virus (Trang 30 - 33)

Tải bản đầy đủ (PDF)

(75 trang)