繁体   English   中英

如何编辑受保护的进程 memory?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM