2013-05-15 4 views
3

Хорошо, поэтому я сделал инжектор DLL в VB.net некоторое время назад. Он отлично работает с любой DLL, кроме моей. Поэтому я знаю, что проблема связана с DLL. Вот код инжектора:C++ DLL не выполняет функцию после инъекции

Private Function Inject(ByVal pID As Integer, ByVal dllLocation As String) As Boolean 
    Dim hProcess As Integer = OpenProcess(&H1F0FFF, 1, pID) 
    If hProcess = 0 Then 
     Return False 
     MessageBox.Show("Could not open process!") 
    End If 
    Dim dllBytes As Byte() = System.Text.Encoding.ASCII.GetBytes(dllLocation) 
    Dim allocAddress As Integer = VirtualAllocEx(hProcess, 0, dllBytes.Length, &H1000, &H4) 
    If allocAddress = Nothing Then 
     Return False 
     MessageBox.Show("Could not allocate the address!") 
    End If 
    Dim kernelMod As Integer = GetModuleHandle("kernel32.dll") 
    Dim loadLibAddr = GetProcAddress(kernelMod, "LoadLibraryA") 
    If (kernelMod = 0) Then 
     MessageBox.Show("Could not get the Module") 
     Return False 
    End If 
    If (loadLibAddr = 0) Then 
     MessageBox.Show("get the Process address!") 
     Return False 
    End If 
    WriteProcessMemory(hProcess, allocAddress, dllBytes, dllBytes.Length, 0) 
    Dim libThread As Integer = CreateRemoteThread(hProcess, 0, 0, loadLibAddr, allocAddress, 0, 0) 

    If libThread = 0 Then 
     Return False 
     MessageBox.Show("Error Creating thread!") 
    Else 
     WaitForSingleObject(libThread, 5000) 
     CloseHandle(libThread) 
    End If 
    CloseHandle(hProcess) 
    Threading.Thread.Sleep(1000) 
    Return True 
End Function 

Это записывает память процесса и создает удаленный поток.

Теперь мой проект имеет два файла: заголовок и файл CPP.

Заголовок:

#ifdef MAINLIB_EXPORTS 
#define MAINLIB_API __declspec(dllexport) 
#else 
#define MAINLIB_API __declspec(dllexport) 
#endif 

extern "C" MAINLIB_API DWORD TestFunction(); 

И CPP:

#define WIN32_LEAN_AND_MEAN 

#include <windows.h> 
#include <stdio.h> 
#include "dll.h" 
#include "Urlmon.h" 

BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) 
{ 
     hModule; 
     lpReserved; 

    switch (ul_reason_for_call) 
     { 
       case DLL_PROCESS_ATTACH: 
       case DLL_THREAD_ATTACH: 
       case DLL_THREAD_DETACH: 
       case DLL_PROCESS_DETACH: 
         break; 
    } 

    return TRUE; 
} 

DWORD TestFunction() 
{  
     MessageBox(0, TEXT("LOL"), TEXT("LMAO"), MB_OK); 
     return 1; 
} 

Из того, что я понимаю, что это должно работать на инъекции функции теста. Но это не так. Любые решения/полезные страницы, которые я мог бы использовать?

ответ

3

В коде отсутствует ни одной цифры, указывающей TestFunction. Когда DLL привязана к процессу, вызываются только DllMain и глобальные объекты, требующие инициализации. Вы должны позвонить TestFunction при обработке DLL_PROCESS_ATTACH.

DWORD TestFunction(); 

BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) 
{ 
    hModule; 
    lpReserved; 

    switch (ul_reason_for_call) 
    { 
    case DLL_PROCESS_ATTACH: 
     TestFunction(); // < call TestFunction ONCE when dll is loaded 
     break; 

    case DLL_THREAD_ATTACH: 
    case DLL_THREAD_DETACH: 
    case DLL_PROCESS_DETACH: 
     break; 
    } 

    return TRUE; 
} 

DWORD TestFunction() 
{  
     MessageBox(0, TEXT("LOL"), TEXT("LMAO"), MB_OK); 
     return 1; 
} 
Смежные вопросы