HOWTO Извикване на функция в друг процес
Автор: Сергей Холодилов
Групата RSDN
Източник: Списание RSDN № 4-2004

Ако инжектираната DLL създаде своя собствена нишка, проблемът с взаимодействието се решава лесно, тъй като в този случай можете да използвате всякакви IPC методи: съобщения, сокети, именувани тръби, ..., ако желаете, можете дори да направите COM сървър:)
Описанието на DllMain казва, че някои функции, включително CreateThread, не могат да бъдат извикани от него. Обяснението "защо казват, че е невъзможно" може да се намери в Рихтер (в руското четвърто издание това е главата "DLL: по-сложни методи за програмиране", раздел "Как системата нарежда DllMain повиквания"), той също казва че всъщност е възможно, ако внимавате.:) Просто когато създавате нишка, не забравяйте, че нейното изпълнение ще започне не по-рано, отколкото текущата нишка напусне DllMain.
Идеята е тривиална. Алгоритъмът се състои само от четири стъпки (плюс още една по избор):
Така или иначе означава, че DLL може да се зарежда по всякакъв начин. Например, това може да бъде advapi32.DLL, който процесът на жертвата зарежда сам. Ако искате вашият код да се изпълни, най-вероятно ще трябва да инжектирате DLL. За описание на DLL инжектиране вижте допълнителни ресурси в края на статията.
Защо се нуждаем от DLL?
Ограничения
Има очевидни ограничения за използването на CreateRemoteThread:
- Поддържа се само линия Windows NT/2000/XP.
Има платена реализация на CreateRemoteThread за Windows 9x, вижте сайта http://www.apihooks.com раздел "PrcHelp".
- Прототипът на извиканата функция трябва да съвпада с прототипа на поточната функция.
Освен това трябва да имате солидни права за достъп до процеса на жертва:
Най-лесният начин да получите всички тези права е чрез създаване на процес, но като доста привилегирован потребител, можете да получите необходимия достъп до съществуващ процес.
Тези функции са част от API за състояние на процеса (PSAPI) и ще работят само на линията Windows NT/2000/XP. Но тъй като вече използваме CreateRemoteThread, няма какво да губим.
Лесният начин
Простият начин се основава на факта, че изместването на началото на функцията от началото на DLL е постоянна стойност, независима от процеса. Това означава, че ако:
На това се основава технологията за инжектиране на DLL чрез обаждане на LoadLibrary в друг процес.