You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何编辑Windows受保护进程lsass.exe的内存?

绕过LSASS进程内存保护的方法及代码问题分析

首先,你遇到的核心问题是LSASS.exe是Windows的Protected Process Light (PPL) 进程——从Windows 8开始,微软就给LSASS加上了这个保护机制,目的是防止恶意程序窃取系统凭证。普通的用户态进程哪怕拥有管理员权限和SE_DEBUG特权,都无法对PPL进程执行OpenProcess(带写入权限)或者WriteProcessMemory这类操作,因为PPL会强制限制只有同等或更高保护级别的进程才能访问它。

先说说你代码里的几个关键问题(虽不是核心原因,但会导致你无法定位错误)

  1. 缺少API调用的返回值检查
    • 针对PPL进程,OpenProcess会直接返回NULL,但你没有判断hProcess是否有效就继续执行写入操作,根本不知道这一步已经失败。
    • WriteProcessMemory的返回值也未做检查,无法确认写入是否成功。
  2. 字符串传递错误
    DeleteString函数中,你传递的&writingstd::string对象本身的地址,而非字符串内容的地址,应该改用writing.c_str()来获取字符串的指针。
  3. 地址类型不匹配64位系统
    你用DWORD存储进程ID和内存地址,但DWORD是32位类型,64位系统下LSASS的内存地址是64位的,用DWORD存储会截断地址,导致无效。建议改用DWORD_PTRuintptr_t这类适配架构的类型。

修改后的DeleteString示例(添加错误检查):

void DeleteString(DWORD processID, DWORD_PTR address) {
    HANDLE hProcess = OpenProcess(PROCESS_VM_WRITE | PROCESS_VM_OPERATION, FALSE, processID);
    if (hProcess == NULL) {
        cout << "OpenProcess failed. Error: " << GetLastError() << endl;
        return;
    }
    const string writing = "Vape Lite.exe";
    SIZE_T bytesWritten;
    BOOL success = WriteProcessMemory(hProcess, (LPVOID)address, writing.c_str(), writing.size(), &bytesWritten);
    if (!success) {
        cout << "WriteProcessMemory failed. Error: " << GetLastError() << endl;
    } else {
        cout << "Successfully wrote " << bytesWritten << " bytes." << endl;
    }
    CloseHandle(hProcess);
}

绕过PPL保护编辑LSASS内存的可行方法

以下方法按合法性和实用性排序:

  • 临时禁用LSASS的PPL保护(合法,但降低系统安全性)
    通过修改注册表关闭PPL保护:

    1. 打开注册表编辑器,定位到HKLM\SYSTEM\CurrentControlSet\Control\Lsa
    2. 创建或修改DWORD类型键RunAsPPL,设置值为0
    3. 重启系统
      重启后LSASS不再是PPL进程,你的管理员权限代码就能正常编辑其内存。调试完成后建议改回1恢复保护,避免系统暴露在风险中。
  • 使用内核级驱动(合法,适合开发场景)
    PPL限制仅在用户态生效,内核模式下可直接绕过。你可以编写内核驱动,通过MmCopyVirtualMemory这类内核API读写LSASS内存。注意:

    • 内核驱动需要签名,Windows 10及以上版本需EV代码签名证书,或开启测试模式(bcdedit /set testsigning on)加载未签名驱动。
    • 编写内核驱动需要熟悉Windows内核编程,复杂度高于用户态代码。
  • 启用内核调试(合法,适合调试场景)
    若仅为调试目的,可开启系统内核调试模式:

    1. 管理员权限运行命令提示符,执行bcdedit /debug on后重启系统
    2. 用WinDbg等内核调试器连接系统,即可在调试器中读写LSASS内存。但这种方式无法通过用户态代码直接操作,仅支持调试器交互。
  • 利用漏洞(不推荐,非法且不安全)
    部分内核漏洞可让普通进程提权并绕过PPL保护,但这类漏洞会被微软快速修复,且使用漏洞可能违反系统使用条款甚至触犯法律,强烈不推荐。


内容的提问来源于stack exchange,提问作者EpicDreamz Plays

火山引擎 最新活动