【发布时间】:2018-08-19 00:16:39
【问题描述】:
我在 Windows 10 上使用 Visual Studios 2017,我编写了一个 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没有注入?
【问题讨论】:
-
不知道为什么 - 从
GetLastError()开始 -
if (!handleToProc == 0)测试总是正确的,因为handleToProc是一个有效的指针。你的意思是检查*handleToProc? -
我将条件更改为 *handleToProc != 0 并且它仍然打印“无法打开进程”。我也使用了 if(handleToProc) 和相同的结果。
-
0xcccccccc表示未初始化的堆栈内存:stackoverflow.com/questions/127386/… -
你还没有调用GetLastError
标签: c++ windows winapi window-handles