Files
2021-05-17 00:36:08 +07:00

311 lines
8.2 KiB
C++

#include "stdafx.h"
//--------------------------------------------------------------------------------------
char *GetNameFromFullPath(char *lpszPath)
{
char *lpszName = lpszPath;
for (size_t i = 0; i < strlen(lpszPath); i++)
{
if (lpszPath[i] == '\\' || lpszPath[i] == '/')
{
lpszName = lpszPath + i + 1;
}
}
return lpszName;
}
//--------------------------------------------------------------------------------------
BOOL ReadFromFile(HANDLE hFile, PVOID *pData, PDWORD pdwDataSize)
{
BOOL bRet = FALSE;
DWORD dwDataSizeHigh = 0;
DWORD dwDataSize = GetFileSize(hFile, &dwDataSizeHigh);
if (dwDataSize > 0)
{
if (dwDataSizeHigh != 0)
{
DbgMsg(__FILE__, __LINE__, __FUNCTION__"() ERROR: File is too large\n");
return FALSE;
}
PVOID Data = M_ALLOC(dwDataSize);
if (Data)
{
DWORD dwReaded = 0;
SetFilePointer(hFile, 0, NULL, FILE_BEGIN);
if (ReadFile(hFile, Data, dwDataSize, &dwReaded, NULL))
{
*pData = Data;
*pdwDataSize = dwDataSize;
bRet = TRUE;
}
else
{
DbgMsg(__FILE__, __LINE__, "ReadFile() ERROR %d\n", GetLastError());
M_FREE(Data);
}
}
else
{
DbgMsg(__FILE__, __LINE__, "M_ALLOC() ERROR %d\n", GetLastError());
}
}
else
{
DbgMsg(__FILE__, __LINE__, __FUNCTION__"(): File is empty\n");
}
return bRet;
}
BOOL ReadFromFile(LPCTSTR lpszFileName, PVOID *pData, PDWORD pdwDataSize)
{
BOOL bRet = FALSE;
// open file for reading
HANDLE hFile = CreateFile(
lpszFileName, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
NULL, OPEN_EXISTING, 0, NULL
);
if (hFile != INVALID_HANDLE_VALUE)
{
if (pData == NULL || pdwDataSize == NULL)
{
// just check for existing file
bRet = TRUE;
}
else
{
// read data from the file
bRet = ReadFromFile(hFile, pData, pdwDataSize);
}
CloseHandle(hFile);
}
else
{
DbgMsg(__FILE__, __LINE__, "CreateFile() ERROR %d\n", GetLastError());
}
return bRet;
}
//--------------------------------------------------------------------------------------
BOOL DumpToFile(HANDLE hFile, PVOID Data, DWORD dwDataSize)
{
BOOL bRet = FALSE;
DWORD dwWritten = 0;
// write starting from the beginning of the file
SetFilePointer(hFile, 0, NULL, FILE_BEGIN);
if (WriteFile(hFile, Data, dwDataSize, &dwWritten, NULL))
{
SetEndOfFile(hFile);
bRet = TRUE;
}
else
{
DbgMsg(__FILE__, __LINE__, "WriteFile() ERROR %d\n", GetLastError());
}
return bRet;
}
BOOL DumpToFile(char *lpszFileName, PVOID Data, DWORD dwDataSize)
{
BOOL bRet = FALSE;
// open file for writing
HANDLE hFile = CreateFile(lpszFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
if (hFile != INVALID_HANDLE_VALUE)
{
// write data to the file
bRet = DumpToFile(hFile, Data, dwDataSize);
CloseHandle(hFile);
}
else
{
DbgMsg(__FILE__, __LINE__, "CreateFile() ERROR %d\n", GetLastError());
}
return bRet;
}
//--------------------------------------------------------------------------------------
int LoadPrivileges(char *lpszName)
{
BOOL bRet = FALSE;
HANDLE hToken = NULL;
TOKEN_PRIVILEGES Privs;
LUID Luid;
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
{
DbgMsg(__FILE__, __LINE__, "OpenProcessToken() ERROR %d\n", GetLastError());
goto _end;
}
if (!LookupPrivilegeValueA(NULL, lpszName, &Luid))
{
DbgMsg(__FILE__, __LINE__, "LookupPrivilegeValue() ERROR %d\n", GetLastError());
goto _end;
}
Privs.PrivilegeCount = 1;
Privs.Privileges[0].Luid = Luid;
Privs.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if (!AdjustTokenPrivileges(hToken, FALSE, &Privs, sizeof (Privs), NULL, NULL))
{
DbgMsg(__FILE__, __LINE__, "AdjustTokenPrivileges() ERROR %d\n", GetLastError());
goto _end;
}
bRet = TRUE;
_end:
if (hToken)
{
CloseHandle(hToken);
}
return bRet;
}
//--------------------------------------------------------------------------------------
PVOID GetSystemInformation(SYSTEM_INFORMATION_CLASS InfoClass)
{
NTSTATUS Status = 0;
ULONG RetSize = 0, Size = 0x100;
PVOID Info = NULL;
GET_NATIVE(NtQuerySystemInformation);
if (f_NtQuerySystemInformation == NULL)
{
DbgMsg(__FILE__, __LINE__, "ERROR: Unable to obtain needed functions\n");
return NULL;
}
while (true)
{
RetSize = 0;
// allocate memory for system information
if ((Info = M_ALLOC(Size)) == NULL)
{
DbgMsg(__FILE__, __LINE__, "M_ALLOC() ERROR %d\n", GetLastError());
return NULL;
}
// query information
if ((Status = f_NtQuerySystemInformation(InfoClass, Info, Size, &RetSize)) == STATUS_INFO_LENGTH_MISMATCH)
{
// buffer is too small
M_FREE(Info);
// allocate more memory and try again
Size = RetSize + 0x100;
}
else
{
break;
}
}
if (!NT_SUCCESS(Status))
{
DbgMsg(__FILE__, __LINE__, "NtQuerySystemInformation() ERROR 0x%.8x\n", Status);
if (Info)
{
// cleanup
M_FREE(Info);
}
return NULL;
}
return Info;
}
//--------------------------------------------------------------------------------------
DWORD GetThreadState(DWORD dwProcessId, DWORD dwThreadId)
{
DWORD Ret = -1;
// query processes and threads information
PSYSTEM_PROCESS_INFORMATION ProcessInfo =
(PSYSTEM_PROCESS_INFORMATION)GetSystemInformation(SystemProcessInformation);
if (ProcessInfo)
{
PSYSTEM_PROCESS_INFORMATION Info = ProcessInfo;
while (true)
{
// check for desired process
if (Info->UniqueProcessId == (HANDLE)dwProcessId)
{
// enumerate treads
for (DWORD i = 0; i < Info->NumberOfThreads; i += 1)
{
// check for desired thread
if (Info->Threads[i].ClientId.UniqueThread == (HANDLE)dwThreadId)
{
Ret = Info->Threads[i].ThreadState;
goto _end;
}
}
break;
}
if (Info->NextEntryOffset == 0)
{
// end of the list
break;
}
// go to the next process info entry
Info = (PSYSTEM_PROCESS_INFORMATION)RVATOVA(Info, Info->NextEntryOffset);
}
_end:
M_FREE(ProcessInfo);
}
return Ret;
}
//--------------------------------------------------------------------------------------
PVOID GetObjectAddress(HANDLE hObject)
{
PVOID Ret = NULL;
// query all system handles information
PSYSTEM_HANDLE_INFORMATION HandleInfo =
(PSYSTEM_HANDLE_INFORMATION)GetSystemInformation(SystemHandleInformation);
if (HandleInfo)
{
for (DWORD i = 0; i < HandleInfo->NumberOfHandles; i += 1)
{
// lookup for pointer to the our object
if (HandleInfo->Handles[i].UniqueProcessId == GetCurrentProcessId() &&
HandleInfo->Handles[i].HandleValue == (USHORT)hObject)
{
Ret = HandleInfo->Handles[i].Object;
break;
}
}
M_FREE(HandleInfo);
}
return Ret;
}
//--------------------------------------------------------------------------------------
// EoF