Как я могу решить ошибку 5 из WriteProcessMemory? - PullRequest
0 голосов
/ 23 апреля 2020

Я запрашиваю SE_DEBUG_NAME и все еще не могу использовать WriteProcessMemory () для записи в lsass.exe. Я запускаю свою программу как администратор (изменил манифест на «requireAdministrator»). Я попробовал свою программу, и она пишет в svchost.exe, explorer.exe и chrome .exe, но только не в lsass.exe.

#include <windows.h> 
#include <iostream> 


BOOL SetPrivilege(
    HANDLE hToken,          // access token handle
    LPCTSTR lpszPrivilege,  // name of privilege to enable/disable
    BOOL bEnablePrivilege   // to enable or disable privilege
)
{
    TOKEN_PRIVILEGES tp;
    LUID luid;

    if (!LookupPrivilegeValue(
        NULL,            // lookup privilege on local system
        lpszPrivilege,   // privilege to lookup 
        &luid))        // receives LUID of privilege
    {
        printf("LookupPrivilegeValue error: %u\n", GetLastError());
        return FALSE;
    }

    tp.PrivilegeCount = 1;
    tp.Privileges[0].Luid = luid;
    if (bEnablePrivilege)
        tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    else
        tp.Privileges[0].Attributes = 0;

    // Enable the privilege or disable all privileges.

    if (!AdjustTokenPrivileges(
        hToken,
        FALSE,
        &tp,
        sizeof(TOKEN_PRIVILEGES),
        (PTOKEN_PRIVILEGES)NULL,
        (PDWORD)NULL))
    {
        printf("AdjustTokenPrivileges error: %u\n", GetLastError());
        return FALSE;
    }

    if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)

    {
        printf("The token does not have the specified privilege. \n");
        return FALSE;
    }

    return TRUE;
}
void write()
{
    std::string writing = "lmaoxd";
    auto writing_size = sizeof(writing);

    DWORD pID = 696;
    HANDLE hToken;

    OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken);
    SetPrivilege(hToken, SE_DEBUG_NAME, TRUE);
    CloseHandle(hToken);

    HANDLE pHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pID);
    WriteProcessMemory(pHandle, (LPVOID)0x1d72000391e, &writing, writing_size, 0);
    CloseHandle(pHandle);

    DWORD error = GetLastError();
    std::cout << "Error: " << error << std::endl;
}

int main()
{
    write();
    system("pause");
}

Что я могу сделать, чтобы решить ошибку 5?

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

Lsass защищен, это не процесс администратора, а системный процесс. Запись в него должна быть возможна только (если это вообще возможно) из другого системного процесса. Установите флажок SysInternals psexe c, чтобы начать процесс как системный, если это действительно необходимо.

https://docs.microsoft.com/en-us/sysinternals/downloads/psexec

0 голосов
/ 24 апреля 2020

Попробуйте следующий код, чтобы получить базовый адрес, и используйте VirtualProtectEx , чтобы изменить защиту страницы в блоке памяти.

Пример кода: (у меня работает)

#include <windows.h> 
#include <iostream> 
#include <tlhelp32.h>
#include <psapi.h>

DWORD_PTR GetProcessBaseAddress(DWORD processID)
{
    DWORD_PTR   baseAddress = 0;
    HANDLE      processHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processID);
    HMODULE* moduleArray;
    LPBYTE      moduleArrayBytes;
    DWORD       bytesRequired;

    if (processHandle)
    {
        if (EnumProcessModules(processHandle, NULL, 0, &bytesRequired))
        {
            if (bytesRequired)
            {
                moduleArrayBytes = (LPBYTE)LocalAlloc(LPTR, bytesRequired);

                if (moduleArrayBytes)
                {
                    unsigned int moduleCount;

                    moduleCount = bytesRequired / sizeof(HMODULE);
                    moduleArray = (HMODULE*)moduleArrayBytes;

                    if (EnumProcessModules(processHandle, moduleArray, bytesRequired, &bytesRequired))
                    {
                        baseAddress = (DWORD_PTR)moduleArray[0];
                    }

                    LocalFree(moduleArrayBytes);
                }
            }
        }

        CloseHandle(processHandle);
    }

    return baseAddress;
}

BOOL SetPrivilege(
    HANDLE hToken,          // access token handle
    LPCTSTR lpszPrivilege,  // name of privilege to enable/disable
    BOOL bEnablePrivilege   // to enable or disable privilege
)
{
    TOKEN_PRIVILEGES tp;
    LUID luid;

    if (!LookupPrivilegeValue(
        NULL,            // lookup privilege on local system
        lpszPrivilege,   // privilege to lookup 
        &luid))        // receives LUID of privilege
    {
        printf("LookupPrivilegeValue error: %u\n", GetLastError());
        return FALSE;
    }

    tp.PrivilegeCount = 1;
    tp.Privileges[0].Luid = luid;
    if (bEnablePrivilege)
        tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    else
        tp.Privileges[0].Attributes = 0;

    // Enable the privilege or disable all privileges.

    if (!AdjustTokenPrivileges(
        hToken,
        FALSE,
        &tp,
        sizeof(TOKEN_PRIVILEGES),
        (PTOKEN_PRIVILEGES)NULL,
        (PDWORD)NULL))
    {
        printf("AdjustTokenPrivileges error: %u\n", GetLastError());
        return FALSE;
    }

    if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)

    {
        printf("The token does not have the specified privilege. \n");
        return FALSE;
    }

    return TRUE;
}
void write()
{
    char writing[] = "lmaoxd";
    int writing_size = sizeof(writing);

    DWORD pID = 1092;  //pid of lsass.exe
    HANDLE hToken;

    OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken);
    SetPrivilege(hToken, SE_DEBUG_NAME, TRUE);
    CloseHandle(hToken);

    HANDLE pHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pID);

    DWORD h =  GetProcessBaseAddress(pID);
    SetLastError(0);
    DWORD oldProtect;
    BOOL ret = VirtualProtectEx(pHandle, (LPVOID)h, writing_size, PAGE_READWRITE, &oldProtect);
    DWORD error = GetLastError();
    SetLastError(0);
    ret = WriteProcessMemory(pHandle, (LPVOID)h, writing, writing_size, 0);
    error = GetLastError();
    std::cout << "Error: " << error << std::endl;
    CloseHandle(pHandle);


}

int main()
{
    write();
    system("pause");
}

Примечание. Убедитесь, что VS TOOL запущен от имени администратора и отлажен с x64.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...