2015-06-30 5 views
1

Я пытался выяснить, что случилось так долго. Я видел, что некоторые люди назначения:DLL-инъекция с использованием удаленной нити ничего не делает при выполнении

GetProcAddress(GetModuleHandle("KERNEL32.dll"), "LoadLibraryA") 

И мне интересно, если это то, что я должен делать, но я просто не понимаю, что эта строка кода делает именно. Это не имеет никакого отношения к функции MY dll, поэтому зачем загружать ее?

Main (консольное приложение A.K.A инжектор):

#include <iostream> 
#include <windows.h> 
#include <TlHelp32.h> 

char* dllPath = "C:\\Users\\Kalist\\Desktop\\Projects\\DLL\\bin\\Debug\\DLL.dll"; 
typedef DWORD (WINAPI *pThreadFunc)(); 
char* ProcToInject = "calc.exe"; 

int main(){ 
    PROCESSENTRY32 pe32; 
    pe32.dwSize = sizeof(PROCESSENTRY32); 
    HANDLE procSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
    DWORD procID; 

    if(procSnap){ 
     if(Process32First(procSnap, &pe32)){ 
      do{ 
       if(!strcmp(pe32.szExeFile, ProcToInject)){ 
        procID = pe32.th32ProcessID; 
        break; 
       } 
      }while(Process32Next(procSnap, &pe32)); 
     } 
     CloseHandle(procSnap); 
    } 
    HANDLE procAccess = OpenProcess(PROCESS_ALL_ACCESS, false, procID); 
    void* memSpace = VirtualAllocEx(procAccess, NULL, strlen(dllPath)+1, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); 
    WriteProcessMemory(procAccess, memSpace, dllPath, strlen(dllPath)+1, NULL); 
    HINSTANCE getLibadd = LoadLibrary(dllPath); 
    pThreadFunc pThreadFuncVar = (pThreadFunc)GetProcAddress(getLibadd, "threadFunc"); 

    CreateRemoteThread(procAccess, NULL, 0, (LPTHREAD_START_ROUTINE)pThreadFuncVar, memSpace, 0, NULL); 

    CloseHandle(procAccess); 
} 

DLL удаленный процесс:

#include <iostream> 
#include <windows.h> 

extern "C" DWORD WINAPI threadFunc(){ 
    MessageBox(0, "Injection worked!", "Injection message", MB_OK); 
    return 0; 
} 

ответ

3

Проблема с кодом, что pThreadFuncVar содержит адрес ThreadFunc в вашем процессе инжектора. Однако ваш Dll.dll даже не загружен в целевой процесс. Даже если ваша dll была загружена, она, скорее всего, не будет загружена по тому же адресу, поэтому адрес pThreadFuncVar все равно будет бессмысленным в целевом процессе.

Только несколько базовых модулей, таких как KERNEL32, загружаются по одному и тому же адресу в каждом процессе. Таким образом, если вы используете адрес LoadLibraryA для CreateRemoteThread, он будет загружать DLL из пути, который вы скопировали в память целевого процесса. Это, в свою очередь, вызовет процедуру dll attach вашей DLL, в которую вы хотите поместить вызов MessageBox.

+0

Ну, вы не должны называть MessageBox из DllMain. Но вы можете запустить поток, который вызывает MessageBox. –

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

  • Нет связанных вопросов^_^