DLL инжекция в модерни приложения на Metro

инжекция

Инжектиране на DLL е една от най-старите техники, използвани за изпълнение на вашия код в приложения на Windows. Обикновено този метод се използва за промяна на поведението по подразбиране на приложението или за добавяне на нова функционалност.

Инжектиране на DLL е една от най-старите техники, използвани за изпълнение на вашия код в приложения на Windows. Обикновено този метод се използва за промяна на поведението по подразбиране на приложението или за добавяне на нова функционалност.

Инжектирането на DLL в процес е относително проста задача: трябва да създадете отдалечена нишка, където ще бъде извикана LoadLibrary с помощта на метода CreateRemoteThread или NtCreateThreadEx. Нуждаете се от някои привилегии, за да получите достъп до инжектирания процес, но получаването им е извън обхвата на тази статия.

Когато се опитате да инжектирате библиотека в приложение на Metro на Windows 8, установявате, че докато инжектираният код работи правилно, вашата DLL НЯМА да се зареди. LoadLibrary ще върне FALSE, а GetLastError ще върне ERROR_ACCESS_DENIED.

Е, вие си мислите ... Съвременните приложения за потребителски интерфейс имат ограничен достъп до системни ресурси и работят в пясъчник, така че може да се очакват подобни проблеми.

Докато изследваме методи за добавяне на нова функционалност към приложението Windows Mail, което се доставя с Windows 8 и прихващане на функционалност в съвременните приложения на потребителския интерфейс чрез Deviare, трябва да разберем защо LoadLibrary връща FALSE.

Обратното инженерство излиза на сцената

Ще започнем с анализирането на метода LoadLibrary. Той извиква LoadLibraryEx с dwFlags = 0 и прави някои проверки. Първа спирка.

Ако искате да заредите пакет, трябва да използвате API на LoadPackagedLibrary. Ако искате да заредите обикновена DLL, трябва да използвате LoadLibrary [Ex]. Документацията на LoadPackagedLibrary гласи, че пътят не може да бъде абсолютен или да съдържа ".", но тези проверки се извършват предимно в метода LoadLibraryEx. Единствената разлика между LoadLibrary и LoadPackagedLibrary е в параметъра dwFlags, който е 4 или 0.

В допълнение, LoadLibraryEx ще генерира пътя за търсене за намиране на DLL и след това ще извика недокументирания метод LdrLoadDll. Тъй като искаме директно да посочим пътя към библиотеката, съответно веднага ще извикаме метода LdrLoadDll.