[英]How do I edit protected process memory?
我正在尝试制作一个内存编辑程序。 目前,我正在尝试编辑 lsass.exe 的 memory。 但是,我没有看到任何更改,这意味着我的代码无法成功编辑 memory。 lsass.exe 是受 Windows 保护的进程,因此它不允许我编辑它的 memory。 有没有办法解决这个问题? (我知道我的代码在编辑 explorer.exe 的内存时确实编辑了 memory)
我试过以管理员身份运行,在 x64 和 x84 上运行,但没有运气。 我也试过通过代码获取调试权限,还是不行。 有什么方法可以编辑受保护进程的 memory 吗?
#include <iostream>
#include <string>
#include <windows.h>
#include <tlhelp32.h>
using namespace std;
bool GetDebugPrivilege();
DWORD FindProcessId(string process);
void DeleteString(DWORD processID, DWORD address);
void ScanAndDelete(DWORD processID, string ScanAndDelete);
bool GetDebugPrivilege()
{
TOKEN_PRIVILEGES TokenPriv;
LUID luid;
HANDLE ThisToken;
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &ThisToken))
{
if (GetLastError() == ERROR_NO_TOKEN)
{
ImpersonateSelf(SecurityImpersonation);
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &ThisToken))
return FALSE;
}
}
if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid))
return FALSE;
TokenPriv.PrivilegeCount = 1;
TokenPriv.Privileges[0].Luid = luid;
TokenPriv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(ThisToken, false, &TokenPriv, sizeof(TOKEN_PRIVILEGES), NULL, NULL);
CloseHandle(ThisToken);
if (GetLastError() != ERROR_SUCCESS)
return false;
return true;
}
int main()
{
GetDebugPrivilege();
Sleep(100);
DeleteString(FindProcessId("lsass.exe"), 0x7fffc41fab58);
}
void DeleteString(DWORD processID, DWORD address)
{
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processID);
string writing = "Vape Lite.exe";
auto writingSize = writing.size();
WriteProcessMemory(hProcess, (LPVOID)address, &writing, writingSize, NULL);
CloseHandle(hProcess);
}
void ScanAndDelete(DWORD processID, string ScanAndDelete)
{
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processID);
}
DWORD FindProcessId(string process)
{
wstring processName(process.begin(), process.end());
PROCESSENTRY32 processInfo;
processInfo.dwSize = sizeof(processInfo);
HANDLE processesSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
if (processesSnapshot == INVALID_HANDLE_VALUE)
return 0;
Process32First(processesSnapshot, &processInfo);
if (!processName.compare(processInfo.szExeFile))
{
CloseHandle(processesSnapshot);
return processInfo.th32ProcessID;
}
while (Process32Next(processesSnapshot, &processInfo))
{
if (!processName.compare(processInfo.szExeFile))
{
CloseHandle(processesSnapshot);
return processInfo.th32ProcessID;
}
}
CloseHandle(processesSnapshot);
return 0;
}
作为 Windows 安全性的一部分,您不能像 lsass.exe 那样编辑以 SYSTEM 运行的进程的 memory。
为了编辑 lsass.exe,您至少需要通过获取 SYSTEM 令牌以 SYSTEM 身份运行。 但由于 Windows 8.1 lsass.exe 是受保护的进程轻 (PPL) 进程,因此不再那么容易。
您可以在Alex Ionescu 的博客上阅读更多相关信息
此外,您的 WriteProcessMemory 调用将无法正常工作,因为您使用 std::string 作为源参数调用它。 您将需要使用 std::string::c_str() 以便正确索引容器所代表的实际 c 字符串。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.