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.