mirror of
https://github.com/Cr4sh/KernelForge
synced 2026-06-08 10:43:38 +00:00
311 lines
8.2 KiB
C++
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
|