2015-05-14 2 views
0

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

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

#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; 
} 

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

+0

Не удается скомпилировать или не выполнить отладку/запуск? «Сбой при компиляции» выглядит как странная ситуация без сообщения об ошибке. –

+0

Не уверен в вашей проблеме, но с первого взгляда вы вызываете ['CloseHandle()'] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms724211 (v = vs.85)) .aspx) дважды в 'SetDebugPriviledge()', который не рекомендуется. –

+0

В какой строке он падает? –

ответ

0

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

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

1:

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

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

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

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

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

+0

LoadLibraryA на самом деле, вероятно, рассматривается как переменная для компилятора, потому что LoadLibrary преобразуется препроцессором в LoadLibraryA, если не Unicode. Хотя это должно быть исправлено, вероятно, это не проблема. –

+0

@David Ruhmann Это наоборот, LoadLibraryA также отображается препроцессором LoadLibrary. Во всяком случае, компилятор, безусловно, будет жаловаться на этот синтаксис (это: определение функции и присвоение значения ее имени). – CristiFati