Метод, с которым я больше всего знаком, был описан Джеффри Рихтером в Программирование приложений для Microsoft Windows . Я упоминаю об этом, потому что, даже если вы не попадаете в руки самой книги, возможно, существует пример кода. Я думаю, что он, возможно, также написал некоторые статьи журнала. Он также упоминает пару альтернативных подходов, из которых я опишу только один, по памяти. Он также, возможно, написал несколько статей MSJ / MSDN, которые имеют отношение к делу.
В любом случае, основная идея состоит в том, чтобы заставить процесс, который вы хотите загрузить, в DLL вызвать вызов <a href="http://msdn.microsoft.com/en-us/library/ms684175(VS.85).aspx" rel="nofollow noreferrer">LoadLibrary</a>
. Это делается с помощью <a href="http://msdn.microsoft.com/en-us/library/ms682437(VS.85).aspx" rel="nofollow noreferrer">CreateRemoteThread</a>
с адресом LoadLibary
для lpStartAddress
и адресом строки, в которой указана ваша DLL, для lpParameter
. Организация и поиск строки выполняется с помощью <a href="http://msdn.microsoft.com/en-us/library/aa366890(VS.85).aspx" rel="nofollow noreferrer">VirtualAllocEx</a>
для выделения некоторой памяти в удаленном процессе и <a href="http://msdn.microsoft.com/en-us/library/ms681674(v=VS.85).aspx" rel="nofollow noreferrer">WriteProcessMemory</a>
для заполнения ее строкой.
КОД PSEUDO:
void InjectDllIntoProcess(DWORD processId, char *dllName)
{
HANDLE hRemoteProcess = OpenProcess(
// Assumes that dll and function addresses are the same in different processes
// on the same system. I think that this is true even with ASLR, only issue I
// can think of is to make sure that the source and target process are both 32
// or both 64 bit, not a mixture.
// Note that it is asking for the ASCII version
HMODULE hDll = LoadLibrary(_T("Kernel32.dll"));
void *loadLibAddr = GetProcAddress(hDll, _T("LoadLibraryA"));
// Inject the DLL name
char * remoteAddr =
(char *)VirtualAllocEx(hRemoteProcess, NULL, strlen(dllName) + 1, ...
WriteProcessMemory(hRemoteProcess, remoteAddr, dllName, strlen(dllName) + 1 ...
CreateRemoteThread(hRemoteProcess, ??, 0, loadLibAddr, remoteAddr, ...
}