2010-05-02 2 views
0

Я смотрел, как ввести dll в программу (exe, dll и т. Д.). я был googleing dll, но я не нашел ничего, что очень полезно :(я не работал с dlls, поэтому я не уверен, что делать, я действительно мог бы использовать некоторую помощь по этому поводу.как использовать инъекцию dll?

uhh единственное, что я действительно нашел это SetWindowsHookEx, но я не могу найти какие-либо примеры для него, и я не знаю, как использовать его. любые вопросы, просто спросите и я постараюсь помочь.

EDIT эй я был похож на googling, и это похоже на что-то о инъекции dll, на которое стоит посмотреть, но я не могу получить код для запуска: \ (How to hook external process with SetWindowsHookEx and WH_KEYBOARD)

ответ

0

Метод, которым я больше всего знаком, был w как описано Джеффери Рихтером в Programming Applications for Microsoft Windows. Я упоминаю об этом, потому что, даже если вы не получите доступ к самой книге, вероятно, есть образец кода, плавающий вокруг. Я думаю, он, возможно, также написал несколько журнальных статей. Он также упоминает пару альтернативных подходов, о которых я опишу только один, из памяти. Он также, возможно, написал некоторые статьи MSJ/MSDN, которые имеют отношение к делу.

В любом случае, основная идея состоит в том, чтобы вызвать процесс, который вы хотите загрузить в DLL, для вызова вызова LoadLibrary. Это делается с использованием CreateRemoteThread с адресом LoadLibary для lpStartAddress и адресом строки, назвавшей вашу DLL для lpParameter. Организация и определение строки выполняется с помощью VirtualAllocEx для выделения некоторой памяти в удаленном процессе и WriteProcessMemory, чтобы заполнить ее строкой.

псевдокод:

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, ... 
} 
+0

ИТАК, если он загружает мой DLL он будет работать мой код, как если бы это был его собственным? – blood

+0

Все, что будет, это загрузить библиотеку. Это означает, что он будет вызывать DLL DllMain для инициализации. Оттуда вы можете сделать все, что вам нужно. Поток, который вы создаете для вызова LoadLibrary, умрет после вызова вызова LoadLibrary. – torak

+0

Хм хороший xD тоже все это в этой книге? http://www.amazon.com/Programming-Applications-Microsoft-Windows-General/dp/1572319968 Я мог бы купить его, если у него все это, что еще у него есть? – blood

Смежные вопросы