- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用“CreateRemoteThread & WriteProcessMemory”技术将我的 dll 注入(inject)另一个进程。我的代码在 Windows 7,8 上运行良好,但是 WriteProcessMemory 函数在 Windows XP(VirtualBox 机器)上运行时总是返回 FALSE(GetLastError = 6 - INVALID_HANDLE_VALUE)。你不能帮我吗?这是主要代码:
BOOL CHookDLL::DoHook(const DWORD dwProcessId, const CHAR* szDLLHookName)
{
CHAR szDllHookPath[1024] = "";
HANDLE hRemoteThread = NULL;
HMODULE hLib = 0;
LPVOID RemoteString = NULL;
LPVOID LoadLibAddy = NULL;
if (dwProcessId == NULL){
__OutputDebug("CHookDLL::DoHook\tpProcessId NULL");
return FALSE;
}
::GetFullPathNameA(szDLLHookName, MAX_PATH, szDllHookPath, NULL);
if (::PathFileExists((CString)szDllHookPath) == FALSE){
__OutputDebug("CHookDLL::DoHook\tPathFileExists FALSE");
return FALSE;
}
// enable SeDebugPrivilege
if (!SetPrivilege(m_hTokenSetPrivilege, SE_DEBUG_NAME, TRUE))
{
__OutputDebug("CHookDLL::DoHook\tSetPrivilege FAILED");
// close token handle
CloseHandle(m_hTokenSetPrivilege);
return FALSE;
}
m_hProcess = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId);
if (m_hProcess == NULL){
__OutputDebug("CHookDLL::DoHook\tOpenProcess FALSE: %d", GetLastError());
return FALSE;
}
LoadLibAddy = (LPVOID)::GetProcAddress(::GetModuleHandleA("kernel32.dll"), "LoadLibraryA");
if (LoadLibAddy == NULL){
__OutputDebug("CHookDLL::DoHook\tGetProcAddress NULL");
return FALSE;
}
// Allocate space in the process for our DLL
RemoteString = (LPVOID)VirtualAllocEx(m_hProcess, NULL, strlen(szDllHookPath) + 1,
MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
if (RemoteString == NULL){
__OutputDebug("CHookDLL::DoHook\tVirtualAllocEx NULL");
return FALSE;
}
// this line is return FALSE
if (WriteProcessMemory(m_hProcess, RemoteString, szDllHookPath, strlen(szDllHookPath) + 1, NULL) == FALSE)
{
__OutputDebug("CHookDLL::DoHook\tWriteProcessMemory FALSE: %d", GetLastError());
return FALSE;
}
hRemoteThread = ::CreateRemoteThread(m_hProcess, NULL, NULL,
(LPTHREAD_START_ROUTINE)LoadLibAddy,
(LPVOID)RemoteString, NULL, NULL);
::WaitForSingleObject(hRemoteThread, INFINITE);
// Get handle of the loaded module
::GetExitCodeThread(hRemoteThread, &m_hLibModule);
if (m_hLibModule == NULL){
__OutputDebug("CHookDLL::DoHook\tCreateRemoteThread NULL");
return FALSE;
}
// Clean up
::CloseHandle(hRemoteThread);
::VirtualFreeEx(m_hProcess, RemoteString,
strlen(szDllHookPath) + 1, MEM_RELEASE);
__OutputDebug("Hook OK");
return TRUE;
}
// Common function Output Debug String
static INT __OutputDebug(const CHAR* format, ...)
{
#ifndef DEBUG
return -1;
#endif // DEBUG
if (format[0] == 0) return -1;
CHAR szDebug[1024] = "";
va_list arglist;
va_start(arglist, format);
vsprintf_s(szDebug,format, arglist);
va_end(arglist);
strcat_s(szDebug, "\n");
OutputDebugStringA(szDebug);
return 1;
}
最佳答案
问题在于您的 OpenProcess
调用。来自这里:http://msdn.microsoft.com/en-us/library/windows/desktop/ms684880(v=vs.85).aspx ,在 PROCESS_ALL_ACCESS
访问权限下列出:
Windows Server 2003 and Windows XP: The size of the PROCESS_ALL_ACCESS flag increased on Windows Server 2008 and Windows Vista. If an application compiled for Windows Server 2008 and Windows Vista is run on Windows Server 2003 or Windows XP, the PROCESS_ALL_ACCESS flag is too large and the function specifying this flag fails with ERROR_ACCESS_DENIED. To avoid this problem, specify the minimum set of access rights required for the operation. If PROCESS_ALL_ACCESS must be used, set _WIN32_WINNT to the minimum operating system targeted by your application (for example, #define _WIN32_WINNT _WIN32_WINNT_WINXP). For more information, see Using the Windows Headers.
因此,可能是 PROCESS_VM_READ
和 PROCESS_VM_OPERATION
未设置,因此稍后出现无效句柄错误。我知道如果 OpenProcess
失败了,它真的应该返回一个错误代码 - 但事实并非如此 - 但如果这个标志真的溢出,我可以看到静默失败是如何发生的。
关于C++ WriteProcessMemory 错误 INVALID_HANDLE_VALUE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25346826/
这个问题已经存在: SIGSEV at while loop [closed] 已关闭 7 年前。 我的问题如下。我有 2 个函数,一个调用 WriteProcessMemory 并返回其结果,另一个
只是粘贴了必要的内容,即使我的日志显示 WriteProcessMemory() 成功,内存地址也没有被写入。另外,我已经仔细检查了我是否也有正确的内存地址。谢谢你的帮助。 char* offsets
所以我的程序基本上是在其他进程中搜索“指定的字符串” 内存,然后输出包含这些字符串的内存地址, 但我希望能够做一个 WriteProcessmemory 来替换所有这些 地址。 我只需要拥有所有返回的
我想用 int WriteProcessMemory 并再次执行此操作,使 int 成为负数。我知道如何在 VB.NET 中执行此操作;我试过同样的方法,但在 C++ 中,它不起作用。 WriteP
如何使用 WriteProcessMemory 更改当前弹药地址的弹药?我知道怎么读,只是不知道怎么写。是 SetAmmo 。我以为我做的一切都是正确的? 代码: #include #include
我有一个现有程序需要通过 IPC 进行通信。我可以修改它的一小部分,但不能添加任何花哨的解决方案,如共享内存、管道或套接字。所以我想与直接读取/写入程序地址空间的函数进行通信: process_vm_
我正在尝试使用 Qt 和 QtCreator 来写入进程内存。当我按下按钮时,它不写。如果有人可以提供帮助,这是我正在使用的代码。 #include "mainwindow.h" #include "
我需要一些帮助,我正在编写一个 dll,它可以修改应用程序中的某些值。但如果我卡住值应用程序崩溃(一段时间后停止工作)。 这是我的代码:这里我创建了一个更新地址的线程: CreateThread(ni
在内存中写入,以便在运行时用另一个类 (TEdit) 替换一个类 (TMyEdit) const vmtNewInstance = System.vmtNewInstance; var ACl
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 7 年前。 Improve this qu
我正在使用“CreateRemoteThread & WriteProcessMemory”技术将我的 dll 注入(inject)另一个进程。我的代码在 Windows 7,8 上运行良好,但是 W
我正在尝试读取另一个进程拥有的 Win32 ListView 中的数据。不幸的是,我的 WriteProcessMemory() 调用失败并出现错误“此系统不支持此功能”。当我在 VirtualAll
我想知道,如果 WriteProcessMemory 或 ReadProcessMemory 函数访问程序代码或数据。谢谢。 最佳答案 它可以访问两者。 程序文本和数据存在于相同的地址空间中,并且对于
我正在尝试写入另一个进程的内存,我以 38h(VM_OPERATION、VM_READ、VM_WRITE)权限打开它,然后我以 4h(PAGE_READWRITE)权限使用 VirtualProtec
标题几乎概括了它。我刚刚发现了这个功能,好吧,它的存在让我很惊讶,因为我立即想到了可能的安全后果。 为什么会有这样的功能?我知道调试这样的东西或多或少是必要的,但允许它用于所有进程似乎是一个很大的安全
由于这些 API,它在用户模式下简单明了。 如何从 Windows 内核模块读取/写入指定进程的用户空间内存? 驱动目标平台是windows xp/2003 最佳答案 使用 NtWriteVirtua
从另一个进程调用WriteProcessMemory时,调用当前进程中的哪个函数? 最佳答案 当前进程中没有处理WriteProcessMemory。它发生在操作系统内部——它将外部进程映射到当前进程
我想写一点 AntiHack,但其中一部分有问题。这个想法是通过从 NTDLL.DLL 中 Hook LdrLoadDll 来防止 dll 注入(inject)。我通过谷歌搜索找到了一个可以执行此操作
我知道有很多关于此的问题,但似乎没有一个能解决我的问题。 我正在研究 WriteProcessMemory 函数。一切看起来都很简单,但我在这里遇到了一个问题,似乎找不到解决方案。 我有什么: 1)“
我正在尝试编写一个简单的代码来使用 WPM 将程序中的字符串替换为另一个字符串,我能够使其工作,但只能部分工作。这是我用来获取结果的代码的一部分。 string strWrite; cin >> st
我是一名优秀的程序员,十分优秀!