Witam,
Chce otworzyć pewien proces, by odczytać pewną wartość z pamięci.
Otwarcie procesu z flagą PROCESS_VM_READ jest niemożliwe.
Jednak wyczytałem w MSDN, że można taki proces otworzyć nakładając mu przywilej SeDebugPrivilege.
Jednego pojąć nie moge.
Do funkcji OpenProcessToken musze przekazać HANDLE procesu, którego nie mogę otworzyć.
http://msdn.microsoft.com/en-us/library/aa379295(VS.85).aspx
Oczywiście wystarczy ten proces otworzyć z flagą PROCESS_QUERY_INFORMATION i taki HANDLE przekazać do OpenProcessToken. Jednak również OpenProcess dla mojego procesu daje False.
Czy coś w kodzie namieszałem, czy mam jakiś super zabezpieczony proces?
#include <windows.h>
#include <iostream>
#include <conio.h>
LPCWSTR lpstrWindowName = L"WindowName";
HWND hWindow;
DWORD dwProcess;
HANDLE hProcess;
int value = 0;
DWORD* pointer = (DWORD*)0x00540240;
HANDLE hToken;
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;
}
int main()
{
if (!(hWindow = FindWindow(NULL, lpstrWindowName)))
printf ("Window not found\n");
if (!GetWindowThreadProcessId(hWindow, &dwProcess))
printf ("Process not found\n");
if (!(hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, false, dwProcess)))
printf ("Cant open process! \n");
if(!OpenProcessToken(hProcess,/*TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY*/TOKEN_ADJUST_PRIVILEGES,&hToken))
printf ("Cannot open process token\n");
SetPrivilege(hToken, SE_DEBUG_NAME, true);
if (!ReadProcessMemory(hProcess, pointer, &value, 4, NULL))
{
printf ("Cant read in: 0x00%X \n", pointer);
printf ("Error: %d\n", GetLastError());
}
else
{
printf ("Memory: %s \n", value);
}
getch();
return 0;
}
Cant open process!
Cannot open process token
AdjustTokenPrivileges error: 6
Cant read in: 0x00740240
Error: 6