Я закодировал 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;
}
Может кто-то помочь мне понять, что я делаю неправильно?
Не удается скомпилировать или не выполнить отладку/запуск? «Сбой при компиляции» выглядит как странная ситуация без сообщения об ошибке. –
Не уверен в вашей проблеме, но с первого взгляда вы вызываете ['CloseHandle()'] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms724211 (v = vs.85)) .aspx) дважды в 'SetDebugPriviledge()', который не рекомендуется. –
В какой строке он падает? –