Windows — C ++ Injector работает, но не вводит DLL

Я использую Visual Studio 2017 на Windows 10, и я написал программу на C ++, чтобы открыть дескриптор процесса. Программа запускается и открывает процесс. Я запустил программу в отладчике, и похоже, что все функции переданы. Однако я знаю, что DLL не вводит, потому что когда я запускаю это приложение в 32-битной игре. Я могу удалить test.dll, который я использовал, что означает, что он не используется. Любые предложения о том, почему это работает нормально, но не вводит?

PS remThread — это значение 0x0000011c

// DLL Injector.cpp : Defines the entry point for the console application.

#include "stdafx.h"int InjectDLL(DWORD, string*);
int getDLLpath(string*);
int getPID(int*);
int getProc(HANDLE*, DWORD);
void enableSeDebug();

int main()
{
//Escalate privlege
enableSeDebug();

system("title Dll Injector");
string dllPath = "";
int PID = -1;

getDLLpath(&dllPath);
getPID(&PID);InjectDLL(PID, &dllPath);
system("pause");
return 0;
}

int getDLLpath(string* dllPath)
{
cout << "Please enter the path to your DLL file\n";
cin >> *dllPath;
return 1;
}

int getPID(int* PID)
{
cout << "Please enter the PID to your target process\n";
cin >> *PID;
return 1;
}

int getProc(HANDLE* handleToProc, DWORD pid)
{

//Create a handle to the process
*handleToProc = OpenProcess(PROCESS_ALL_ACCESS, false, pid);
if (*handleToProc != 0)
{
cout << "Unable to open process.\n";
return -1;
}
else
{
cout << "process opened.\n";
return 1;
}
}int InjectDLL(DWORD PID, string* dllPath)
{

HANDLE handleToProc;
LPVOID LoadLibAddr;
LPVOID baseAddr;
HANDLE remThread;

//Get handle to process
if (getProc(&handleToProc, PID) < 0)
return -1;

//Load kernel32 library
LoadLibAddr = (LPVOID)GetProcAddress(GetModuleHandleA("kernel32.dll"), "LoadLibraryA");

if (!LoadLibAddr)
return -1;

//Allocate memory for DLL injection
baseAddr = VirtualAllocEx(handleToProc, NULL, dllPath->length(), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);

if (!baseAddr)
return -1;

//Write dll path
if (!WriteProcessMemory(handleToProc, baseAddr, dllPath, dllPath->length(), NULL))
return -1;

//Create remote thread
remThread = CreateRemoteThread(handleToProc, NULL, NULL, (LPTHREAD_START_ROUTINE)LoadLibAddr, baseAddr, 0, NULL);

if (!remThread)
return -1;

//Wait untill DLL exits then deallocate memmory
WaitForSingleObject(remThread, INFINITE);

//Freing memmory
VirtualFreeEx(handleToProc, baseAddr, dllPath->length(), MEM_RELEASE);

//Closing handles
if (CloseHandle(remThread) == 0)
{
cout << "Failed to close handle to remote thread.\n";
return -1;
}

if (CloseHandle(handleToProc) == 0)
{
cout << "Failed to close handle to target process.\n";
return -1;
}

return 1;
}void enableSeDebug()
{
/////////////////////////////////////////////////////////
//   Note: Enabling SeDebugPrivilege adapted from sample
//     MSDN @ http://msdn.microsoft.com/en-us/library/aa446619%28VS.85%29.aspx
// Enable SeDebugPrivilege
HANDLE hToken = NULL;
TOKEN_PRIVILEGES tokenPriv;
LUID luidDebug;
if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken) != FALSE)
{
if (LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luidDebug) != FALSE)
{
tokenPriv.PrivilegeCount = 1;
tokenPriv.Privileges[0].Luid = luidDebug;
tokenPriv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if (AdjustTokenPrivileges(hToken, FALSE, &tokenPriv, 0, NULL, NULL) != FALSE)
{
// Always successful, even in the cases which lead to OpenProcess failure
cout << "SUCCESSFULLY CHANGED TOKEN PRIVILEGES" << endl;
}
else
{
cout << "FAILED TO CHANGE TOKEN PRIVILEGES, CODE: " << GetLastError() << endl;
}
}
}
CloseHandle(hToken);
// Enable SeDebugPrivilege
}

Приведенный выше код может открыть 32-разрядный процесс и работает без сбоя вызова функции, но DLL не вводит?

-2

Решение

Я смог решить мою проблему. При проверке getProc мне нужно было сделать

int getProc(HANDLE* handleToProc, DWORD pid)
{

//Create a handle to the process
*handleToProc = OpenProcess(PROCESS_ALL_ACCESS, false, pid);
if (*handleToProc == NULL) //I changed this line to check for NULL
{
cout << "Unable to open process.\n";
return -1;
}
else
{
cout << "process opened.\n";
return 1;
}
}

Вторая часть, которую мне нужно было изменить, была моя dllPath, которая была строкой, которая должна была быть char *. Поэтому, когда я писал строку DLL, это была другая кодировка. Исправлено использование указателя char *, и теперь инжектор работает.

1

Другие решения

Я думаю, что тест в getProc должно быть:

if (*handleToProc == 0)
...

Плюс, что другие сказали в комментариях о тестировании и отчетности GetLastError,

Могут быть и другие проблемы, я только снял код

0

Здесь Вам пришлось переписать его на более «правильный» код. (Не pro tho). У вас были проблемы с проверкой состояния. У меня все работает.

#include <windows.h>
#include <iostream>
#include <tlhelp32.h>
#include <string>
using namespace std;

void getPID(DWORD&);
int  getProc(HANDLE&, DWORD);

int main()
{
cout << "title Dll Injector" << endl;
string dllPath = "";
DWORD PID = NULL;
HANDLE handleToProc = nullptr;

getPID(PID);

if (getProc(handleToProc, PID) < 0)
return -1;//Lets check is the handle valid
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
if (hSnapshot) {
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(PROCESSENTRY32);
if (Process32First(hSnapshot, &pe32)) {
do {
if (pe32.th32ProcessID == GetProcessId(handleToProc))
{
wstring name = wstring(pe32.szExeFile);
wcout << "Process id: " << pe32.th32ProcessID << ", Exe filename: " << name << endl;
}
} while (Process32Next(hSnapshot, &pe32));
}
CloseHandle(hSnapshot);
}

//Cleanup is a must!
CloseHandle(handleToProc);
return 0;
}

//Create a handle to process
int getProc(HANDLE& handleToProc, DWORD pid)
{
//Create a handle to the process
handleToProc = OpenProcess(PROCESS_ALL_ACCESS, false, pid);
if (handleToProc == nullptr)
{
DWORD error = GetLastError();

cout << "Unable to open process. Error: " << error << "\n";
return -1;
}
else
{
cout << "process opened.\n";
return 0;
}
}

//Get PID from user
void getPID(DWORD& PID)
{
cout << "Please enter the PID to your target process\n";
cin >> PID;
}

Проблема была с указателем на присвоение дескриптора, а затем с последующей проверкой действительного дескриптора.

-1
По вопросам рекламы [email protected]