c++ - WriteProcessMemory 到启用了 SeDebugPrivilege 的 SYSTEM 进程。 (三、远景)

标签 c++ windows winapi dll windows-vista

我有兴趣将 DLL 注入(inject)到我的 Vista 机器上的 SYSTEM 拥有的进程中。我将使用传统方法 VirtualAllocEx、WriteProcessMemory 和 CreateRemoteThread 来解决这个问题。但是,因为这将在 SYSTEM 进程上运行,所以我在打开目标进程之前在注入(inject)进程上启用了 SeDebugPivilege。


int EnableDebugPriv(LPCTSTR name) {
    HANDLE hToken;
    LUID luid;
    TOKEN_PRIVILEGES tkp;

    if(!OpenProcessToken(GetCurrentProcess(),
                         /*TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY*/
                         TOKEN_ALL_ACCESS,
                         &hToken))
        return 0;

    if(!LookupPrivilegeValue(NULL,name,&luid))
        return 0;

    tkp.PrivilegeCount=1;
    tkp.Privileges[0].Luid=luid;
    tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;

    if(!AdjustTokenPrivileges(hToken,false,&tkp,sizeof(tkp),NULL,NULL))
    {
        printf("!AdjustTokenPrivileges - %d\n",GetLastError());
        return 0;
    }
    if(GetLastError()==ERROR_NOT_ALL_ASSIGNED)
    {
        return 0;
    }

    CloseHandle(hToken);
    return 1;
}

其中 SE_DEBUG_NAME 常量作为名称传递。

启用SeDebugPrivilege后,我经历了打开目标进程、定位LoadLibrary、分配空间、将DLL路径写入内存、创建线程(沿途检查所有返回值)的过程:


if(NULL==(p=OpenProcess(PROCESS_ALL_ACCESS,FALSE,(DWORD)pid)))
...
if(NULL==(loadLib=(LPVOID)GetProcAddress(GetModuleHandle("kernel32.dll"), 
                                         "LoadLibraryA")))
...
if(NULL==(dllBuff=(LPVOID)VirtualAllocEx(p,
                                         NULL,
                                         strlen(dllPath)+1,
                                         MEM_RESERVE|MEM_COMMIT,
                                         PAGE_READWRITE)))
...
if(NULL==WriteProcessMemory(p,
                            (LPVOID)dllBuff,
                            dllPath,
                            strlen(dllPath),
                            &written))
...
if(!CreateRemoteThread(p,
                       NULL,
                       NULL,
                       (LPTHREAD_START_ROUTINE)loadLib,
                       (LPVOID)dllBuff,
                       NULL,
                       NULL))
...

dllPath 是 DLL 路径的 char*(显然),pid 是目标进程的 PID。这两个值都通过命令行获取并在使用前进行验证。

我遇到的问题是,在 CreateRemoteThread 返回 8(“存储空间不足”)之前,没有任何内容返回错误。但是,WriteProcessMemory 不会向进程写入任何字节。调用后写入的变量始终为 0。没有字节被写入,但函数没有失败。我不确定为什么会这样。我查看了其他权限,比如 SeRestorePrivilege,它 promise 对所有进程进行写访问,但没有任何效果。

我正在以管理员权限执行此程序。

注意:这个 WriteProcessMemory 和 CreateRemoteThread 问题只发生在我对更高权限的用户(SYSTEM、LOCAL SERVICE 等)运行这个程序时。它完全适用于我拥有的程序(相同权限)。

编辑:这里是整个来源的链接。 http://pastebin.com/m77110d8e除了基本的错误检查之外,没有太多其他内容,但也许它会有所帮助?

最佳答案

这与 Vista 或更高版本的 Windows 中的 session 隔离有关。查看 Cain 和 Abel 等声称具有 Vista 功能的密码转储工具的源代码或反汇编。本质上过程是相同的,但您将为 CreateRemoteThread 调用不同的函数(抱歉,我不认为该函数已导出,您只需要找到它,因此最好的办法是反汇编工作软件)。

关于c++ - WriteProcessMemory 到启用了 SeDebugPrivilege 的 SYSTEM 进程。 (三、远景),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1135057/

相关文章:

windows - 批处理文件,用于执行带计时器的文件夹中的所有 .exe

c++ - Windows.h 或 StdAfx.h,Petzold 书中的第一个窗口示例 "Programming Windows"

c++ - 迭代器与下标

c - GetSystemMetrics() 在 RDP session 上报告错误的鼠标值

windows - Windows 7 上的 Internet Explorer 11 之后是什么? ES2016 在企业中的支持情况如何?

c++ - 用VS2008编译的C++应用程序在其他电脑上运行不起来

delphi - 在 Windows XP/7 中,我能否收到有关我未生成的进程正在关闭的通知?

C++ 预期类名在 '{' 标记之前。遗产

c++ - Brox 密集光流跟踪器错误 'EFilterIncompatibleSize'

c++ - 在 24 核 CPU 中增加线程数超过 4 会导致性能下降