Инжектор DLL аварийно завершает работу

Я закодировал C++ DLL Injector, но он не внедряется и не работает должным образом. Он просто вылетает при компиляции в Visual Studio или code::blocks.

Вот мой полный исходный код:

#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
#include <shlwapi.h>
#include <tlhelp32.h>
#include <conio.h>

//prototypes 
BOOL InjectDLL(DWORD ID, const char* dll);
DWORD GetProcessId(IN PCHAR szExeName);
BOOL SetDebugPriviledge(BOOL State);

//Main codes
int main()
{
    char dll[MAX_PATH];

    GetFullPathName("DLLTest.dll",MAX_PATH,dll,NULL);
    DWORD ID = GetProcessId("Odesk.exe");

    SetDebugPriviledge(TRUE);

    if(!InjectDLL(ID,dll))
    {
        printf("Injection Failed, Reason :%s", GetLastError());
        Sleep(3000);
        exit(1);
    }
    else
    {
        printf("Success!");
        Sleep(3000);
        exit(1);
    }
    return 0;   
}

//Functions

DWORD GetProcessId(IN PCHAR szExeName)
{
    DWORD dwRet = 0;
    DWORD dwCount = 0;

    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (hSnapshot !=INVALID_HANDLE_VALUE)
    {
        PROCESSENTRY32 pe = {0};
        pe.dwSize = sizeof(PROCESSENTRY32);

        BOOL bRet = Process32First(hSnapshot, &pe);

        while(bRet)
        {
            if(!_stricmp(pe.szExeFile,szExeName))
            {
                dwCount++;
                dwRet = pe.th32ProcessID;
            }
            bRet = Process32Next(hSnapshot, &pe);
        }
        if(dwCount >1)
            dwRet = 0XFFFFFFFF;
        CloseHandle(hSnapshot);
    }
    return dwRet;
}

BOOL SetDebugPriviledge(BOOL State)
{
    HANDLE hToken;
    TOKEN_PRIVILEGES tp;
    DWORD dwSize;
    ZeroMemory(&tp,sizeof(tp));
    tp.PrivilegeCount =1;
    if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ALL_ACCESS, &hToken))
    {
        return FALSE;
    }
    if(!LookupPrivilegeValue(NULL, SE_DEBUG_NAME,&tp.Privileges[0].Luid))
    {
        CloseHandle(hToken);
    }
    if(State)
    {
        tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    }else
    {
        tp.Privileges[0].Attributes = SE_PRIVILEGE_REMOVED;
    }
    if(!AdjustTokenPrivileges(hToken,FALSE,&tp, 0, NULL, &dwSize))
    {
        CloseHandle(hToken);
    }
    return CloseHandle(hToken);
}

BOOL InjectDLL(DWORD ID, const char* dll)
{
    HANDLE hProcess;
    LPVOID Memory;
    LPVOID LoadLibrary;

    if(!ID)
    {
        return false;
    }   
    hProcess = OpenProcess(PROCESS_CREATE_THREAD|PROCESS_QUERY_INFORMATION|PROCESS_VM_READ|PROCESS_VM_WRITE|PROCESS_VM_OPERATION,FALSE,ID);
    if(!hProcess)
    {
        printf("Error, Reason: %s",GetLastError());
    }   
    LoadLibraryA = (LPVOID)GetProcAddress(GetModuleHandle("kernel32.dll"),"LoadLibraryA");
    if(!LoadLibraryA)
    {
        printf("Error, Reason: %s",GetLastError());
    } 
    Memory = (LPVOID)VirtualAllocEx(hProcess,NULL,strlen(dll)+1,MEM_RESERVE|MEM_COMMIT,PAGE_READWRITE);
    if(!Memory)
    {
        printf("Error, Reason: %s",GetLastError());
    } 
    if(!WriteProcessMemory(hProcess,(LPVOID)Memory, dll, strlen(dll)+1,NULL))
    {
        printf("Error, Reason: %s",GetLastError());
    }   
    if(!CreateRemoteThread(hProcess,NULL,NULL,(LPTHREAD_START_ROUTINE)LoadLibrary,(LPVOID)Memory,NULL,NULL))
    {
        printf("Error, Reason: %s",GetLastError());
    } 
    if(!CloseHandle(hProcess))
    {
        printf("Error, Reason: %s",GetLastError());
    }  
    return true; 
}

Может ли кто-нибудь помочь мне понять, что я делаю неправильно?


person gyno    schedule 14.05.2015    source источник
comment
Он не компилируется или не отлаживает/запускает? сбой при компиляции кажется странной ситуацией без сообщения об ошибке.   -  person David Ruhmann    schedule 14.05.2015
comment
Не уверен в вашей проблеме, но на первый взгляд вы звоните CloseHandle() дважды в SetDebugPriviledge(), что не рекомендуется.   -  person David Ruhmann    schedule 14.05.2015
comment
На какой строке происходит сбой?   -  person Harry Johnston    schedule 15.05.2015


Ответы (1)


Было бы полезно разместить ошибки.

Я вижу некоторые синтаксические ошибки (их может быть больше)

1:

LoadLibraryA = (LPVOID)GetProcAddress(GetModuleHandle("kernel32.dll"),"LoadLibraryA");

Вы можете присваивать значения только переменным. LoadLibraryA не является переменной, но ее имя уже есть в вашей программе (kernel32.dll загружается по умолчанию во время выполнения).

2: GetLastError возвращает DWORD,

printf("Error, Reason: %s",GetLastError());

поэтому вы должны заменить %s на %d.

person CristiFati    schedule 14.05.2015
comment
LoadLibraryA на самом деле, вероятно, рассматривается компилятором как переменная, потому что LoadLibrary преобразуется препроцессором в LoadLibraryA, если не используется Unicode. Хотя это должно быть исправлено, это, вероятно, не проблема. - person David Ruhmann; 14.05.2015
comment
@David Ruhmann Наоборот, LoadLibraryA также предоставляется препроцессором LoadLibrary. В любом случае, компилятор наверняка будет жаловаться на такой синтаксис (это: определение функции и присвоение значения ее имени). - person CristiFati; 15.05.2015