C++ 为什么赢了';我的程序没有正确地注入我的.dll吗?
制作一个(简单的)dll注入器已经有几个小时了,这个注入器将.dll文件和进程作为参数,然后将said.dll注入进程,我马上就要开始抓狂了 它不能正常工作,也没有明显的原因。dll不会加载到进程中,但不会显示任何错误消息。我做了完全相同的事情,但是使用了ANSI函数而不是Unicode,它工作起来很有魅力,经过一些测试后,我相信这可能是文件路径加载不正确的问题,但我不知道为什么 我在下面附上了我的全部源代码,并添加了一些注释,希望能有所澄清。就像我说的,如果我是对的,那么重要的部分应该从以下几点开始: //获取dll的完整路径并将其存储在变量中 帮助一个兄弟C++ 为什么赢了';我的程序没有正确地注入我的.dll吗?,c++,windows,winapi,dll,unicode,C++,Windows,Winapi,Dll,Unicode,制作一个(简单的)dll注入器已经有几个小时了,这个注入器将.dll文件和进程作为参数,然后将said.dll注入进程,我马上就要开始抓狂了 它不能正常工作,也没有明显的原因。dll不会加载到进程中,但不会显示任何错误消息。我做了完全相同的事情,但是使用了ANSI函数而不是Unicode,它工作起来很有魅力,经过一些测试后,我相信这可能是文件路径加载不正确的问题,但我不知道为什么 我在下面附上了我的全部源代码,并添加了一些注释,希望能有所澄清。就像我说的,如果我是对的,那么重要的部分应该从以下几
#include <iostream>
#include <Windows.h>
#include <TlHelp32.h>
using namespace std;
int main()
{
HANDLE hSnapshot, hProc = NULL;
PROCESSENTRY32 PE32;
PE32.dwSize = sizeof(PROCESSENTRY32);
WCHAR injProcName[100] = {NULL}, injDllName[100] = {NULL};
//Let user input options
cout << "Dll injector started!" << endl << "Please enter the name of the dll you would like to inject: ";
wcin >> injDllName;
cout << "Enter the name of the target process: ";
wcin >> injProcName;
//Create snapshot
hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
Process32First(hSnapshot, &PE32);
//Load the first process into PE32 and loop to see if target process is running
do {
if(wcscmp(PE32.szExeFile, injProcName) == 0) {
wcout << PE32.szExeFile << " found!" << endl;
wcout << "Attempting to open " << injProcName << ".." << endl;
hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, PE32.th32ProcessID);
if(!hProc)
{
cout << "Failed to open process!" << endl;
return 1;
}
break;
}
}
while(Process32Next(hSnapshot, &PE32));
if(!hProc) {
cout << "Unable to locate process!" << endl;
return 1;
}
cout << "Process successfully opened!" << endl;
//Get the full path of our dll and store it in a variable
WCHAR DllPath[MAX_PATH] = {NULL};
GetFullPathName(injDllName, MAX_PATH, DllPath, NULL);
wcout << DllPath << endl;
//Allocate memory in target process
cout << "Allocating memory.." << endl;
LPVOID DllMemAddr = VirtualAllocEx(hProc,
NULL,
wcslen(DllPath),
MEM_COMMIT|MEM_RESERVE,
PAGE_READWRITE);
//Write our path into target process memory
wcout << "Writing dll to target process.." << endl;
WriteProcessMemory(hProc,
DllMemAddr,
DllPath,
wcslen(DllPath),
NULL);
//Get the memory address of LoadLibraryW
LPVOID LoadAddr = GetProcAddress(GetModuleHandle(L"kernel32.dll"), "LoadLibraryW");
//Finally, start a new thread with the address of LoadLibraryW and our dll path as argument
cout << "Executing dll in remote process.." << endl;
CreateRemoteThread(hProc,
NULL,
NULL,
(LPTHREAD_START_ROUTINE)LoadAddr,
DllMemAddr,
NULL,
NULL);
cout << "Dll sucessfully injected!" << endl;
cin.get();
return 0;
}
#包括
#包括
#包括
使用名称空间std;
int main()
{
句柄hSnapshot,hProc=NULL;
PROCESSENTRY32 PE32;
PE32.dwSize=sizeof(PROCESSENTRY32);
WCHAR injProcName[100]={NULL},injDllName[100]={NULL};
//让用户输入选项
不能使用名称;
//创建快照
hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,NULL);
Process32First(hSnapshot和PE32);
//将第一个进程加载到PE32中并循环以查看目标进程是否正在运行
做{
如果(wcscmp(PE32.szExeFile,injProcName)==0){
wcoutwcslen
以wchar\u t
单位返回长度。但是VirtualAllocEx
和WriteProcessMemory
接收以字节
单位表示的长度。因此您只写入了字符串的一半,因为wchar\u t
有两个字节宽。并且您没有编写空终止符
您需要通过(wcslen(DllPath)+1)*sizeof(wchar\u t)
顺便说一句,您的ANSI代码可能也被破坏了,因为它可能也错过了空终止符。但您可能是碰巧侥幸逃脱了它
在我们查看您的代码时,进行一点错误检查是不可能的。当您调用GetFullPathName时,初始化DllPath
是毫无意义的。是的,这就是问题所在,非常感谢您,伙计。我不必为s在wcslen返回的值中添加一个字节但出于某种原因,把它乘以2。不,你需要加上1,就像我的答案一样。否则你就不会写空终止符。