Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 将Dll注入记事本时内存分配失败_Windows_Winapi - Fatal编程技术网

Windows 将Dll注入记事本时内存分配失败

Windows 将Dll注入记事本时内存分配失败,windows,winapi,Windows,Winapi,我正在尝试将我制作的dll注入记事本。 我已经编写了以下代码,其中我打开了记事本的一个进程,并将其与我的dll一起注入。 然而,由于某种原因,我的虚拟语言失败了。 在这件事上我真的很感激你的帮助。 代码: #包括 #包括 int main() { char-dllPath[125]; DWORD pathLen=GetFullPathNameA(“magsimfinalProject.dll”,160,dllPath,NULL); PVOID addrLoadLibrary=(PVOID)Get

我正在尝试将我制作的dll注入记事本。 我已经编写了以下代码,其中我打开了记事本的一个进程,并将其与我的dll一起注入。 然而,由于某种原因,我的虚拟语言失败了。 在这件事上我真的很感激你的帮助。 代码:

#包括
#包括
int main()
{
char-dllPath[125];
DWORD pathLen=GetFullPathNameA(“magsimfinalProject.dll”,160,dllPath,NULL);
PVOID addrLoadLibrary=(PVOID)GetProcAddress(GetModuleHandle(“notepad.exe”),“LoadLibraryA”);//也许我们需要文本而不是dllpath
HANDLE proc=OpenProcess(“PROCESS\u CREATE\u PROCESS”,FALSE,“6340”);
PVOID memAddr=(PVOID)VirtualAllocEx(proc,NULL,pathLen,MEM\u COMMIT,PAGE\u EXECUTE\u READWRITE);
if(NULL==memAddr)
{
printf(“无法分配内存”);
DWORD err=GetLastError();
返回0;
}
HANDLE hRemote=CreateRemoteThread(proc,NULL,0,memAddr,NULL,0,NULL);
if(NULL==hRemote)
{
printf(“无法创建线程”);
DWORD err=GetLastError();
返回0;
}
WaitForSingleObject(hRemote,无限);
布尔检查=闭合手柄(hRemote);
返回0;
}
我试着查找所有函数,确保它们都得到了正确的变量,并在youtube上查找了关于这一问题的教程,但没有结果。 编辑-正如第一条评论所建议的,我已经使用调试器查看了每一行,当我检查addrLoadLibrary时,它的值是:“标识符”addrLoadLibrary“未定义”。你知道为什么吗? 编辑2-首先,我在行完成后检查它的值(addrloadlibrary的值)。其次,正如有人提到的,proc实际上是一个问题,因为它总是空的。仍在试图找出它为什么不起作用 编辑3-通过删除引号修复了proc的问题,就像评论中有人告诉我的那样(很抱歉不记得名字,我在这方面很糟糕。)现在需要解决的是为什么addrLoadLibrary在第行之后仍然未定义
编辑4-重新阅读函数“getModuleHandle”的文档,并重新确定它应该获得dllpath变量。希望我没有错,因为我不是以英语为母语的人,文档对我来说尤其难以理解。

这段代码有很多错误。大多数API调用都是不正确的。您没有进行太多的错误检查。在创建远程线程之前,您没有将DLL路径复制到分配的内存中

请尝试类似以下内容:

#包括
#包括
int main(){
char dllPath[MAX_PATH];
DWORD pathLen=GetFullPathNameA(“magsimfinalProject.dll”,MAX_PATH,dllPath,NULL);
如果(!pathLen){
DWORD err=GetLastError();
printf(“无法获取DLL路径。错误:%u”,错误);
返回0;
}
PVOID addrLoadLibrary=GetProcAddress(GetModuleHandle(“kernel32.dll”),“LoadLibraryA”);
//TODO:使用CreateToolhelp32Snapshot()或EnumProcesses()查找正确的进程ID。。。
DWORD procID=6340;
HANDLE proc=OpenProcess(进程?创建?线程?进程?查询?信息?进程?虚拟机?操作?进程?虚拟机?写入?进程?虚拟机?读取,FALSE,procID);
如果(!proc){
DWORD err=GetLastError();
printf(“无法打开进程。错误:%u”,错误);
返回0;
}
PVOID memAddr=VirtualAllocEx(proc,NULL,pathLen+1,MEM\u COMMIT,PAGE\u READWRITE);
如果(!memAddr){
DWORD err=GetLastError();
关闭手柄(proc);
printf(“无法分配内存。错误:%u”,错误);
返回0;
}
if(!WriteProcessMemory(proc,memAddr,dllPath,pathLen+1,NULL)){
DWORD err=GetLastError();
VirtualFreeEx(proc、memAddr、0、MEM_发布);
关闭手柄(proc);
printf(“无法写入内存。错误:%u”,错误);
返回0;
} 
HANDLE hRemote=CreateRemoteThread(proc,NULL,0,addrLoadLibrary,memAddr,0,NULL);
如果(!hRemote){
DWORD err=GetLastError();
VirtualFreeEx(proc、memAddr、0、MEM_发布);
关闭手柄(proc);
printf(“无法创建线程。错误:%u”,错误);
返回0;
}
WaitForSingleObject(hRemote,无限);
闭合手柄(hRemote);
VirtualFreeEx(proc、memAddr、0、MEM_发布);
关闭手柄(proc);
返回0;
}

“标识符”addrLoadLibrary“由于某些原因未定义”。你知道为什么吗?我认为您在执行该行之前检查了该值。
handleproc=OpenProcess(“PROCESS\u CREATE\u PROCESS”,FALSE,“6340”)
proc的值是否有效?根据文档,看起来您错误地调用了该函数:第一个和第三个参数应该是
DWORD
,但您传递的是字符串文本。在youtube上查找有关此问题的教程,我建议不要这样做。请阅读文档。我建议您添加错误检查并调试程序的注释已删除。如果能给这个询问者的最重要的建议被删除了,我不知道我们在做什么。
#include <Windows.h>
#include <stdio.h>
int main()
{
    char dllPath[125];
    DWORD pathLen = GetFullPathNameA("MagshimimFinalProject.dll" ,160 , dllPath, NULL);
    PVOID addrLoadLibrary = (PVOID)GetProcAddress(GetModuleHandle("notepad.exe"), "LoadLibraryA"); // maybee we need text instead of the dllpath
    HANDLE proc = OpenProcess("PROCESS_CREATE_PROCESS",FALSE, "6340");
    PVOID memAddr = (PVOID)VirtualAllocEx(proc, NULL,pathLen,MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    if (NULL == memAddr)
    {
        printf("Couldn't allocate memory");
        DWORD err = GetLastError();
        return 0;
    }
    HANDLE hRemote = CreateRemoteThread(proc,NULL,0,memAddr, NULL,0,NULL );
    if (NULL == hRemote)
    {
        printf("Couldn't create thread");
        DWORD err = GetLastError();
        return 0;
    }
    WaitForSingleObject(hRemote, INFINITE);
    BOOL check = CloseHandle(hRemote);
    return 0;
}