mirror of https://github.com/x64dbg/TitanEngine
Merged in Mattiwatti/titanengine/native-debug-init (pull request #12)
Add InitNativeDebug API
This commit is contained in:
commit
0f5566b1db
|
|
@ -823,6 +823,8 @@ __declspec(dllexport) long TITCALL LengthDisassembleEx(HANDLE hProcess, LPVOID D
|
||||||
__declspec(dllexport) long TITCALL LengthDisassemble(LPVOID DisassmAddress);
|
__declspec(dllexport) long TITCALL LengthDisassemble(LPVOID DisassmAddress);
|
||||||
__declspec(dllexport) void* TITCALL InitDebug(char* szFileName, char* szCommandLine, char* szCurrentFolder);
|
__declspec(dllexport) void* TITCALL InitDebug(char* szFileName, char* szCommandLine, char* szCurrentFolder);
|
||||||
__declspec(dllexport) void* TITCALL InitDebugW(const wchar_t* szFileName, const wchar_t* szCommandLine, const wchar_t* szCurrentFolder);
|
__declspec(dllexport) void* TITCALL InitDebugW(const wchar_t* szFileName, const wchar_t* szCommandLine, const wchar_t* szCurrentFolder);
|
||||||
|
__declspec(dllexport) void* TITCALL InitNativeDebug(char* szFileName, char* szCommandLine, char* szCurrentFolder);
|
||||||
|
__declspec(dllexport) void* TITCALL InitNativeDebugW(const wchar_t* szFileName, const wchar_t* szCommandLine, const wchar_t* szCurrentFolder);
|
||||||
__declspec(dllexport) void* TITCALL InitDebugEx(const char* szFileName, const char* szCommandLine, const char* szCurrentFolder, LPVOID EntryCallBack);
|
__declspec(dllexport) void* TITCALL InitDebugEx(const char* szFileName, const char* szCommandLine, const char* szCurrentFolder, LPVOID EntryCallBack);
|
||||||
__declspec(dllexport) void* TITCALL InitDebugExW(const wchar_t* szFileName, const wchar_t* szCommandLine, const wchar_t* szCurrentFolder, LPVOID EntryCallBack);
|
__declspec(dllexport) void* TITCALL InitDebugExW(const wchar_t* szFileName, const wchar_t* szCommandLine, const wchar_t* szCurrentFolder, LPVOID EntryCallBack);
|
||||||
__declspec(dllexport) void* TITCALL InitDLLDebug(const char* szFileName, bool ReserveModuleBase, const char* szCommandLine, const char* szCurrentFolder, LPVOID EntryCallBack);
|
__declspec(dllexport) void* TITCALL InitDLLDebug(const char* szFileName, bool ReserveModuleBase, const char* szCommandLine, const char* szCurrentFolder, LPVOID EntryCallBack);
|
||||||
|
|
|
||||||
|
|
@ -677,6 +677,8 @@ __declspec(dllimport) long TITCALL LengthDisassembleEx(HANDLE hProcess, LPVOID D
|
||||||
__declspec(dllimport) long TITCALL LengthDisassemble(LPVOID DisassmAddress);
|
__declspec(dllimport) long TITCALL LengthDisassemble(LPVOID DisassmAddress);
|
||||||
__declspec(dllimport) void* TITCALL InitDebug(char* szFileName, char* szCommandLine, char* szCurrentFolder);
|
__declspec(dllimport) void* TITCALL InitDebug(char* szFileName, char* szCommandLine, char* szCurrentFolder);
|
||||||
__declspec(dllimport) void* TITCALL InitDebugW(wchar_t* szFileName, wchar_t* szCommandLine, wchar_t* szCurrentFolder);
|
__declspec(dllimport) void* TITCALL InitDebugW(wchar_t* szFileName, wchar_t* szCommandLine, wchar_t* szCurrentFolder);
|
||||||
|
__declspec(dllimport) void* TITCALL InitNativeDebug(char* szFileName, char* szCommandLine, char* szCurrentFolder);
|
||||||
|
__declspec(dllimport) void* TITCALL InitNativeDebugW(wchar_t* szFileName, wchar_t* szCommandLine, wchar_t* szCurrentFolder);
|
||||||
__declspec(dllimport) void* TITCALL InitDebugEx(char* szFileName, char* szCommandLine, char* szCurrentFolder, LPVOID EntryCallBack);
|
__declspec(dllimport) void* TITCALL InitDebugEx(char* szFileName, char* szCommandLine, char* szCurrentFolder, LPVOID EntryCallBack);
|
||||||
__declspec(dllimport) void* TITCALL InitDebugExW(wchar_t* szFileName, wchar_t* szCommandLine, wchar_t* szCurrentFolder, LPVOID EntryCallBack);
|
__declspec(dllimport) void* TITCALL InitDebugExW(wchar_t* szFileName, wchar_t* szCommandLine, wchar_t* szCurrentFolder, LPVOID EntryCallBack);
|
||||||
__declspec(dllimport) void* TITCALL InitDLLDebug(char* szFileName, bool ReserveModuleBase, char* szCommandLine, char* szCurrentFolder, LPVOID EntryCallBack);
|
__declspec(dllimport) void* TITCALL InitDLLDebug(char* szFileName, bool ReserveModuleBase, char* szCommandLine, char* szCurrentFolder, LPVOID EntryCallBack);
|
||||||
|
|
|
||||||
|
|
@ -1491,6 +1491,10 @@ public:
|
||||||
{
|
{
|
||||||
return (const PROCESS_INFORMATION*)UE::InitDebug((char*)szFileName, (char*)szCommandLine, (char*)szCurrentFolder);
|
return (const PROCESS_INFORMATION*)UE::InitDebug((char*)szFileName, (char*)szCommandLine, (char*)szCurrentFolder);
|
||||||
}
|
}
|
||||||
|
static const PROCESS_INFORMATION* InitNativeDebug(const char* szFileName, const char* szCommandLine, const char* szCurrentFolder)
|
||||||
|
{
|
||||||
|
return (const PROCESS_INFORMATION*)UE::InitNativeDebug((char*)szFileName, (char*)szCommandLine, (char*)szCurrentFolder);
|
||||||
|
}
|
||||||
static const PROCESS_INFORMATION* InitDebugEx(const char* szFileName, const char* szCommandLine, const char* szCurrentFolder, DebuggerX::fBreakPointCallback EntryCallBack)
|
static const PROCESS_INFORMATION* InitDebugEx(const char* szFileName, const char* szCommandLine, const char* szCurrentFolder, DebuggerX::fBreakPointCallback EntryCallBack)
|
||||||
{
|
{
|
||||||
return (const PROCESS_INFORMATION*)UE::InitDebugEx((char*)szFileName, (char*)szCommandLine, (char*)szCurrentFolder, (void*)EntryCallBack);
|
return (const PROCESS_INFORMATION*)UE::InitDebugEx((char*)szFileName, (char*)szCommandLine, (char*)szCurrentFolder, (void*)EntryCallBack);
|
||||||
|
|
@ -1513,6 +1517,10 @@ public:
|
||||||
{
|
{
|
||||||
return (const PROCESS_INFORMATION*)UE::InitDebugW((wchar_t*)szFileName, (wchar_t*)szCommandLine, (wchar_t*)szCurrentFolder);
|
return (const PROCESS_INFORMATION*)UE::InitDebugW((wchar_t*)szFileName, (wchar_t*)szCommandLine, (wchar_t*)szCurrentFolder);
|
||||||
}
|
}
|
||||||
|
static const PROCESS_INFORMATION* InitNativeDebug(const wchar_t* szFileName, const wchar_t* szCommandLine, const wchar_t* szCurrentFolder)
|
||||||
|
{
|
||||||
|
return (const PROCESS_INFORMATION*)UE::InitNativeDebugW((wchar_t*)szFileName, (wchar_t*)szCommandLine, (wchar_t*)szCurrentFolder);
|
||||||
|
}
|
||||||
static const PROCESS_INFORMATION* InitDebugEx(const wchar_t* szFileName, const wchar_t* szCommandLine, const wchar_t* szCurrentFolder, DebuggerX::fBreakPointCallback EntryCallBack)
|
static const PROCESS_INFORMATION* InitDebugEx(const wchar_t* szFileName, const wchar_t* szCommandLine, const wchar_t* szCurrentFolder, DebuggerX::fBreakPointCallback EntryCallBack)
|
||||||
{
|
{
|
||||||
return (const PROCESS_INFORMATION*)UE::InitDebugExW((wchar_t*)szFileName, (wchar_t*)szCommandLine, (wchar_t*)szCurrentFolder, (void*)EntryCallBack);
|
return (const PROCESS_INFORMATION*)UE::InitDebugExW((wchar_t*)szFileName, (wchar_t*)szCommandLine, (wchar_t*)szCurrentFolder, (void*)EntryCallBack);
|
||||||
|
|
|
||||||
|
|
@ -507,6 +507,7 @@ const
|
||||||
function LengthDisassembleEx(hProcess:THandle; DisassmAddress:Pointer):LongInt; stdcall; external 'TitanEngine.dll' name 'LengthDisassembleEx';
|
function LengthDisassembleEx(hProcess:THandle; DisassmAddress:Pointer):LongInt; stdcall; external 'TitanEngine.dll' name 'LengthDisassembleEx';
|
||||||
function LengthDisassemble(DisassmAddress:Pointer):LongInt; stdcall; external 'TitanEngine.dll' name 'LengthDisassemble';
|
function LengthDisassemble(DisassmAddress:Pointer):LongInt; stdcall; external 'TitanEngine.dll' name 'LengthDisassemble';
|
||||||
function InitDebug(szFileName,szCommandLine,szCurrentFolder:PAnsiChar): Pointer; stdcall; external 'TitanEngine.dll' name 'InitDebug';
|
function InitDebug(szFileName,szCommandLine,szCurrentFolder:PAnsiChar): Pointer; stdcall; external 'TitanEngine.dll' name 'InitDebug';
|
||||||
|
function InitNativeDebug(szFileName,szCommandLine,szCurrentFolder:PAnsiChar): Pointer; stdcall; external 'TitanEngine.dll' name 'InitNonWin32Debug';
|
||||||
function InitDebugEx(szFileName,szCommandLine,szCurrentFolder:PAnsiChar; EntryCallBack:Pointer): Pointer; stdcall; external 'TitanEngine.dll' name 'InitDebugEx';
|
function InitDebugEx(szFileName,szCommandLine,szCurrentFolder:PAnsiChar; EntryCallBack:Pointer): Pointer; stdcall; external 'TitanEngine.dll' name 'InitDebugEx';
|
||||||
function InitDLLDebug(szFileName:PAnsiChar; ReserveModuleBase:boolean; szCommandLine,szCurrentFolder:PAnsiChar; EntryCallBack:Pointer): Pointer; stdcall; external 'TitanEngine.dll' name 'InitDLLDebug';
|
function InitDLLDebug(szFileName:PAnsiChar; ReserveModuleBase:boolean; szCommandLine,szCurrentFolder:PAnsiChar; EntryCallBack:Pointer): Pointer; stdcall; external 'TitanEngine.dll' name 'InitDLLDebug';
|
||||||
function StopDebug(): Boolean; stdcall; external 'TitanEngine.dll' name 'StopDebug';
|
function StopDebug(): Boolean; stdcall; external 'TitanEngine.dll' name 'StopDebug';
|
||||||
|
|
|
||||||
|
|
@ -783,6 +783,9 @@ PROCESS_INFORMATION = alien.defstruct{
|
||||||
-- __declspec(dllexport) void* __stdcall InitDebug(char* szFileName, char* szCommandLine, char* szCurrentFolder);
|
-- __declspec(dllexport) void* __stdcall InitDebug(char* szFileName, char* szCommandLine, char* szCurrentFolder);
|
||||||
TitanEngine.InitDebug:types {"string","string","string",abi="stdcall",ret="pointer"}
|
TitanEngine.InitDebug:types {"string","string","string",abi="stdcall",ret="pointer"}
|
||||||
TE_InitDebug = TitanEngine.InitDebug
|
TE_InitDebug = TitanEngine.InitDebug
|
||||||
|
-- __declspec(dllexport) void* __stdcall InitNativeDebug(char* szFileName, char* szCommandLine, char* szCurrentFolder);
|
||||||
|
TitanEngine.InitNativeDebug:types {"string","string","string",abi="stdcall",ret="pointer"}
|
||||||
|
InitNativeDebug = TitanEngine.InitNativeDebug
|
||||||
-- __declspec(dllexport) void* __stdcall InitDebugEx(char* szFileName, char* szCommandLine, char* szCurrentFolder, LPVOID EntryCallBack);
|
-- __declspec(dllexport) void* __stdcall InitDebugEx(char* szFileName, char* szCommandLine, char* szCurrentFolder, LPVOID EntryCallBack);
|
||||||
TitanEngine.InitDebugEx:types {"string","string","string","callback",abi="stdcall",ret="pointer"}
|
TitanEngine.InitDebugEx:types {"string","string","string","callback",abi="stdcall",ret="pointer"}
|
||||||
TE_InitDebugEx = TitanEngine.InitDebugEx
|
TE_InitDebugEx = TitanEngine.InitDebugEx
|
||||||
|
|
|
||||||
|
|
@ -560,6 +560,8 @@ LengthDisassembleEx proto stdcall :HANDLE, :LPVOID
|
||||||
LengthDisassemble proto stdcall :LPVOID
|
LengthDisassemble proto stdcall :LPVOID
|
||||||
InitDebug proto stdcall :ptr SBYTE, :ptr SBYTE, :ptr SBYTE
|
InitDebug proto stdcall :ptr SBYTE, :ptr SBYTE, :ptr SBYTE
|
||||||
InitDebugW proto stdcall :ptr WORD, :ptr WORD, :ptr WORD
|
InitDebugW proto stdcall :ptr WORD, :ptr WORD, :ptr WORD
|
||||||
|
InitNativeDebug proto stdcall :ptr SBYTE, :ptr SBYTE, :ptr SBYTE
|
||||||
|
InitNativeDebugW proto stdcall :ptr WORD, :ptr WORD, :ptr WORD
|
||||||
InitDebugEx proto stdcall :ptr SBYTE, :ptr SBYTE, :ptr SBYTE, :LPVOID
|
InitDebugEx proto stdcall :ptr SBYTE, :ptr SBYTE, :ptr SBYTE, :LPVOID
|
||||||
InitDebugExW proto stdcall :ptr WORD, :ptr WORD, :ptr WORD, :LPVOID
|
InitDebugExW proto stdcall :ptr WORD, :ptr WORD, :ptr WORD, :LPVOID
|
||||||
InitDLLDebug proto stdcall :ptr SBYTE, :bool, :ptr SBYTE, :ptr SBYTE, :LPVOID
|
InitDLLDebug proto stdcall :ptr SBYTE, :bool, :ptr SBYTE, :ptr SBYTE, :LPVOID
|
||||||
|
|
|
||||||
|
|
@ -648,6 +648,8 @@ TE.ThreaderGetThreadInfo.restype = POINTER(THREAD_ITEM_DATA)
|
||||||
|
|
||||||
TE.InitDebug.restype = POINTER(PROCESS_INFORMATION)
|
TE.InitDebug.restype = POINTER(PROCESS_INFORMATION)
|
||||||
TE.InitDebugW.restype = POINTER(PROCESS_INFORMATION)
|
TE.InitDebugW.restype = POINTER(PROCESS_INFORMATION)
|
||||||
|
TE.InitNativeDebug.restype = POINTER(PROCESS_INFORMATION)
|
||||||
|
TE.InitNativeDebugW.restype = POINTER(PROCESS_INFORMATION)
|
||||||
TE.InitDebugEx.restype = POINTER(PROCESS_INFORMATION)
|
TE.InitDebugEx.restype = POINTER(PROCESS_INFORMATION)
|
||||||
TE.InitDebugExW.restype = POINTER(PROCESS_INFORMATION)
|
TE.InitDebugExW.restype = POINTER(PROCESS_INFORMATION)
|
||||||
TE.InitDLLDebug.restype = POINTER(PROCESS_INFORMATION)
|
TE.InitDLLDebug.restype = POINTER(PROCESS_INFORMATION)
|
||||||
|
|
|
||||||
|
|
@ -99,6 +99,307 @@ __declspec(dllexport) void* TITCALL InitDebugW(wchar_t* szFileName, wchar_t* szC
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
__declspec(dllexport) void* TITCALL InitNativeDebug(char* szFileName, char* szCommandLine, char* szCurrentFolder)
|
||||||
|
{
|
||||||
|
wchar_t* PtrUniFileName = NULL;
|
||||||
|
wchar_t uniFileName[MAX_PATH] = {};
|
||||||
|
wchar_t* PtrUniCommandLine = NULL;
|
||||||
|
wchar_t uniCommandLine[MAX_PATH] = {};
|
||||||
|
wchar_t* PtrUniCurrentFolder = NULL;
|
||||||
|
wchar_t uniCurrentFolder[MAX_PATH] = {};
|
||||||
|
|
||||||
|
if(szFileName != NULL)
|
||||||
|
{
|
||||||
|
MultiByteToWideChar(CP_ACP, NULL, szFileName, lstrlenA(szFileName) + 1, uniFileName, sizeof(uniFileName) / (sizeof(uniFileName[0])));
|
||||||
|
MultiByteToWideChar(CP_ACP, NULL, szCommandLine, lstrlenA(szCommandLine) + 1, uniCommandLine, sizeof(uniCommandLine) / (sizeof(uniCommandLine[0])));
|
||||||
|
MultiByteToWideChar(CP_ACP, NULL, szCurrentFolder, lstrlenA(szCurrentFolder) + 1, uniCurrentFolder, sizeof(uniCurrentFolder) / (sizeof(uniCurrentFolder[0])));
|
||||||
|
if(szFileName != NULL)
|
||||||
|
{
|
||||||
|
PtrUniFileName = &uniFileName[0];
|
||||||
|
}
|
||||||
|
if(szCommandLine != NULL)
|
||||||
|
{
|
||||||
|
PtrUniCommandLine = &uniCommandLine[0];
|
||||||
|
}
|
||||||
|
if(szCurrentFolder != NULL)
|
||||||
|
{
|
||||||
|
PtrUniCurrentFolder = &uniCurrentFolder[0];
|
||||||
|
}
|
||||||
|
return(InitNativeDebugW(PtrUniFileName, PtrUniCommandLine, PtrUniCurrentFolder));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
__declspec(dllexport) void* TITCALL InitNativeDebugW(wchar_t* szFileName, wchar_t* szCommandLine, wchar_t* szCurrentFolder)
|
||||||
|
{
|
||||||
|
typedef
|
||||||
|
NTSTATUS
|
||||||
|
(NTAPI *
|
||||||
|
t_RtlCreateProcessParametersEx)(
|
||||||
|
_Out_ PRTL_USER_PROCESS_PARAMETERS * pProcessParameters,
|
||||||
|
_In_ PUNICODE_STRING ImagePathName,
|
||||||
|
_In_opt_ PUNICODE_STRING DllPath,
|
||||||
|
_In_opt_ PUNICODE_STRING CurrentDirectory,
|
||||||
|
_In_opt_ PUNICODE_STRING CommandLine,
|
||||||
|
_In_opt_ PVOID Environment,
|
||||||
|
_In_opt_ PUNICODE_STRING WindowTitle,
|
||||||
|
_In_opt_ PUNICODE_STRING DesktopInfo,
|
||||||
|
_In_opt_ PUNICODE_STRING ShellInfo,
|
||||||
|
_In_opt_ PUNICODE_STRING RuntimeData,
|
||||||
|
_In_ ULONG Flags
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
NTSTATUS
|
||||||
|
(NTAPI *
|
||||||
|
t_NtCreateUserProcess)(
|
||||||
|
_Out_ PHANDLE ProcessHandle,
|
||||||
|
_Out_ PHANDLE ThreadHandle,
|
||||||
|
_In_ ACCESS_MASK ProcessDesiredAccess,
|
||||||
|
_In_ ACCESS_MASK ThreadDesiredAccess,
|
||||||
|
_In_opt_ POBJECT_ATTRIBUTES ProcessObjectAttributes,
|
||||||
|
_In_opt_ POBJECT_ATTRIBUTES ThreadObjectAttributes,
|
||||||
|
_In_ ULONG ProcessFlags,
|
||||||
|
_In_ ULONG ThreadFlags,
|
||||||
|
_In_ PRTL_USER_PROCESS_PARAMETERS ProcessParameters,
|
||||||
|
_Inout_ PPS_CREATE_INFO CreateInfo,
|
||||||
|
_In_ PPS_ATTRIBUTE_LIST AttributeList
|
||||||
|
);
|
||||||
|
|
||||||
|
HMODULE Ntdll = GetModuleHandleW(L"ntdll.dll");
|
||||||
|
t_RtlCreateProcessParametersEx fnRtlCreateProcessParametersEx =
|
||||||
|
(t_RtlCreateProcessParametersEx)GetProcAddress(Ntdll, "RtlCreateProcessParametersEx");
|
||||||
|
t_NtCreateUserProcess fnNtCreateUserProcess =
|
||||||
|
(t_NtCreateUserProcess)GetProcAddress(Ntdll, "NtCreateUserProcess");
|
||||||
|
|
||||||
|
// NtCreateUserProcess requires Vista or higher
|
||||||
|
if(fnRtlCreateProcessParametersEx == NULL || fnNtCreateUserProcess == NULL)
|
||||||
|
{
|
||||||
|
RtlSetLastWin32Error(ERROR_NOT_SUPPORTED);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
RtlZeroMemory(&dbgProcessInformation, sizeof(PROCESS_INFORMATION));
|
||||||
|
HANDLE ProcessHandle = NULL, ThreadHandle = NULL;
|
||||||
|
UNICODE_STRING CommandLine = { 0 };
|
||||||
|
PUNICODE_STRING PtrCurrentDirectory = NULL;
|
||||||
|
|
||||||
|
// Convert the application path to its NT equivalent
|
||||||
|
UNICODE_STRING ImagePath, NtImagePath;
|
||||||
|
RtlInitUnicodeString(&ImagePath, szFileName);
|
||||||
|
if(!RtlDosPathNameToNtPathName_U(ImagePath.Buffer,
|
||||||
|
&NtImagePath,
|
||||||
|
NULL,
|
||||||
|
NULL))
|
||||||
|
{
|
||||||
|
RtlSetLastWin32Error(ERROR_PATH_NOT_FOUND);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Enable SE_DEBUG if needed
|
||||||
|
const LONG SE_DEBUG_PRIVILEGE = 20L;
|
||||||
|
BOOLEAN SeDebugWasEnabled = FALSE;
|
||||||
|
NTSTATUS Status = STATUS_SUCCESS;
|
||||||
|
if(engineEnableDebugPrivilege)
|
||||||
|
{
|
||||||
|
Status = RtlAdjustPrivilege(SE_DEBUG_PRIVILEGE,
|
||||||
|
TRUE,
|
||||||
|
FALSE,
|
||||||
|
&SeDebugWasEnabled);
|
||||||
|
DebugRemoveDebugPrivilege = true;
|
||||||
|
}
|
||||||
|
if(!NT_SUCCESS(Status))
|
||||||
|
goto finished;
|
||||||
|
|
||||||
|
// Convert command line and directory to UNICODE_STRING if present
|
||||||
|
SIZE_T ArgumentsLength = szCommandLine != NULL ? lstrlenW(szCommandLine) : 0;
|
||||||
|
SIZE_T BufferSize = ImagePath.Length + ((ArgumentsLength + 4) * sizeof(wchar_t));
|
||||||
|
CommandLine.Buffer = (PWSTR)RtlAllocateHeap(RtlProcessHeap(), HEAP_ZERO_MEMORY, BufferSize * 10);
|
||||||
|
CommandLine.MaximumLength = (USHORT)BufferSize;
|
||||||
|
RtlAppendUnicodeToString(&CommandLine, L"\"");
|
||||||
|
RtlAppendUnicodeStringToString(&CommandLine, &ImagePath);
|
||||||
|
RtlAppendUnicodeToString(&CommandLine, L"\"");
|
||||||
|
if(ArgumentsLength > 0)
|
||||||
|
{
|
||||||
|
RtlAppendUnicodeToString(&CommandLine, L" ");
|
||||||
|
RtlAppendUnicodeToString(&CommandLine, szCommandLine);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(szCurrentFolder != NULL && lstrlenW(szCurrentFolder) > 0)
|
||||||
|
{
|
||||||
|
UNICODE_STRING WorkingDirectory;
|
||||||
|
RtlInitUnicodeString(&WorkingDirectory, szCurrentFolder);
|
||||||
|
PtrCurrentDirectory = &WorkingDirectory;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create the process parameter block
|
||||||
|
PRTL_USER_PROCESS_PARAMETERS ProcessParameters = NULL;
|
||||||
|
PRTL_USER_PROCESS_PARAMETERS OwnParameters = NtCurrentPeb()->ProcessParameters;
|
||||||
|
Status = fnRtlCreateProcessParametersEx(&ProcessParameters,
|
||||||
|
&ImagePath,
|
||||||
|
NULL, // Create a new DLL path
|
||||||
|
PtrCurrentDirectory,
|
||||||
|
&CommandLine,
|
||||||
|
NULL, // If null, a new environment will be created
|
||||||
|
&ImagePath, // Window title is the exe path - needed for console apps
|
||||||
|
&OwnParameters->DesktopInfo, // Copy our desktop name
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
RTL_USER_PROCESS_PARAMETERS_NORMALIZED);
|
||||||
|
if(!NT_SUCCESS(Status))
|
||||||
|
goto finished;
|
||||||
|
|
||||||
|
// Clear the current directory because we're not inheriting handles
|
||||||
|
ProcessParameters->CurrentDirectory.Handle = NULL;
|
||||||
|
|
||||||
|
// Default to CREATE_NEW_CONSOLE behaviour
|
||||||
|
ProcessParameters->ConsoleHandle = HANDLE_CREATE_NEW_CONSOLE;
|
||||||
|
ProcessParameters->ShowWindowFlags = STARTF_USESHOWWINDOW | SW_SHOWDEFAULT;
|
||||||
|
|
||||||
|
// Create a debug port object
|
||||||
|
OBJECT_ATTRIBUTES ObjectAttributes;
|
||||||
|
InitializeObjectAttributes(&ObjectAttributes, NULL, 0, NULL, NULL);
|
||||||
|
HANDLE DebugPort = NULL;
|
||||||
|
Status = NtCreateDebugObject(&DebugPort,
|
||||||
|
DEBUG_ALL_ACCESS,
|
||||||
|
&ObjectAttributes,
|
||||||
|
DEBUG_KILL_ON_CLOSE);
|
||||||
|
if(!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
RtlDestroyProcessParameters(ProcessParameters);
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Store the debug port handle in our TEB. The kernel uses this field
|
||||||
|
NtCurrentTeb()->DbgSsReserved[1] = DebugPort;
|
||||||
|
|
||||||
|
// Initialize the PS_CREATE_INFO structure
|
||||||
|
PS_CREATE_INFO CreateInfo;
|
||||||
|
RtlZeroMemory(&CreateInfo, sizeof(CreateInfo));
|
||||||
|
CreateInfo.Size = sizeof(CreateInfo);
|
||||||
|
CreateInfo.State = PsCreateInitialState;
|
||||||
|
CreateInfo.InitState.u1.s1.WriteOutputOnExit = TRUE;
|
||||||
|
CreateInfo.InitState.u1.s1.DetectManifest = TRUE;
|
||||||
|
CreateInfo.InitState.u1.s1.ProhibitedImageCharacteristics = 0; // Normally: IMAGE_FILE_DLL (disallow executing DLLs)
|
||||||
|
CreateInfo.InitState.AdditionalFileAccess = FILE_READ_ATTRIBUTES | FILE_READ_DATA;
|
||||||
|
|
||||||
|
// Initialize the PS_ATTRIBUTE_LIST that contains the process creation attributes
|
||||||
|
const SIZE_T NumAttributes = 3;
|
||||||
|
const SIZE_T AttributesSize = sizeof(SIZE_T) + NumAttributes * sizeof(PS_ATTRIBUTE);
|
||||||
|
PPS_ATTRIBUTE_LIST AttributeList = reinterpret_cast<PPS_ATTRIBUTE_LIST>(
|
||||||
|
RtlAllocateHeap(RtlProcessHeap(),
|
||||||
|
HEAP_ZERO_MEMORY, // Not optional
|
||||||
|
AttributesSize));
|
||||||
|
AttributeList->TotalLength = AttributesSize;
|
||||||
|
|
||||||
|
// In: NT style absolute image path. This is the only required attribute
|
||||||
|
ULONG N = 0;
|
||||||
|
AttributeList->Attributes[N].Attribute = PS_ATTRIBUTE_IMAGE_NAME;
|
||||||
|
AttributeList->Attributes[N].Size = NtImagePath.Length;
|
||||||
|
AttributeList->Attributes[N].Value = reinterpret_cast<ULONG_PTR>(NtImagePath.Buffer);
|
||||||
|
|
||||||
|
// In: debug port
|
||||||
|
N++;
|
||||||
|
AttributeList->Attributes[N].Attribute = PS_ATTRIBUTE_DEBUG_PORT;
|
||||||
|
AttributeList->Attributes[N].Size = sizeof(HANDLE);
|
||||||
|
AttributeList->Attributes[N].Value = reinterpret_cast<ULONG_PTR>(DebugPort);
|
||||||
|
|
||||||
|
// Out: client ID
|
||||||
|
N++;
|
||||||
|
CLIENT_ID Cid;
|
||||||
|
PCLIENT_ID ClientId = &Cid;
|
||||||
|
AttributeList->Attributes[N].Attribute = PS_ATTRIBUTE_CLIENT_ID;
|
||||||
|
AttributeList->Attributes[N].Size = sizeof(CLIENT_ID);
|
||||||
|
AttributeList->Attributes[N].Value = reinterpret_cast<ULONG_PTR>(ClientId);
|
||||||
|
|
||||||
|
// Set process and thread flags
|
||||||
|
ULONG NtProcessFlags = PROCESS_CREATE_FLAGS_NO_DEBUG_INHERIT; // Same as DEBUG_ONLY_THIS_PROCESS. DEBUG_PROCESS is implied by the debug port
|
||||||
|
ULONG NtThreadFlags = THREAD_CREATE_FLAGS_CREATE_SUSPENDED; // Always set this, because we need to do some bookkeeping before resuming
|
||||||
|
|
||||||
|
// Create the process
|
||||||
|
Status = fnNtCreateUserProcess(&ProcessHandle,
|
||||||
|
&ThreadHandle,
|
||||||
|
MAXIMUM_ALLOWED,
|
||||||
|
MAXIMUM_ALLOWED,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NtProcessFlags,
|
||||||
|
NtThreadFlags,
|
||||||
|
ProcessParameters,
|
||||||
|
&CreateInfo,
|
||||||
|
AttributeList);
|
||||||
|
|
||||||
|
RtlFreeHeap(RtlProcessHeap(), 0, AttributeList);
|
||||||
|
RtlDestroyProcessParameters(ProcessParameters);
|
||||||
|
|
||||||
|
if(!NT_SUCCESS(Status))
|
||||||
|
goto finished;
|
||||||
|
|
||||||
|
// Success. Convert what we got back to a PROCESS_INFORMATION structure
|
||||||
|
dbgProcessInformation.hProcess = ProcessHandle;
|
||||||
|
dbgProcessInformation.hThread = ThreadHandle;
|
||||||
|
dbgProcessInformation.dwProcessId = HandleToULong(ClientId->UniqueProcess);
|
||||||
|
dbgProcessInformation.dwThreadId = HandleToULong(ClientId->UniqueThread);
|
||||||
|
|
||||||
|
finished:
|
||||||
|
RtlFreeHeap(RtlProcessHeap(), 0, NtImagePath.Buffer);
|
||||||
|
|
||||||
|
if(CommandLine.Buffer != NULL)
|
||||||
|
RtlFreeHeap(RtlProcessHeap(), 0, CommandLine.Buffer);
|
||||||
|
|
||||||
|
if(ProcessHandle != NULL)
|
||||||
|
{
|
||||||
|
// Close the file and section handles we got back from the kernel
|
||||||
|
NtClose(CreateInfo.SuccessState.FileHandle);
|
||||||
|
NtClose(CreateInfo.SuccessState.SectionHandle);
|
||||||
|
|
||||||
|
// If we failed, terminate the process
|
||||||
|
if(!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
BOOLEAN CloseDebugPort = DebugPort != NULL &&
|
||||||
|
((NtThreadFlags & PROCESS_CREATE_FLAGS_NO_DEBUG_INHERIT) != 0);
|
||||||
|
|
||||||
|
if(CloseDebugPort)
|
||||||
|
{
|
||||||
|
NtRemoveProcessDebug(ProcessHandle, DebugPort);
|
||||||
|
NtClose(DebugPort);
|
||||||
|
NtCurrentTeb()->DbgSsReserved[1] = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
NtTerminateProcess(ProcessHandle, Status);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Otherwise resume the process now
|
||||||
|
NtResumeThread(ThreadHandle, NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Release SE_DEBUG if we acquired it previously
|
||||||
|
if(engineEnableDebugPrivilege && !SeDebugWasEnabled)
|
||||||
|
RtlAdjustPrivilege(SE_DEBUG_PRIVILEGE,
|
||||||
|
FALSE,
|
||||||
|
FALSE,
|
||||||
|
&SeDebugWasEnabled);
|
||||||
|
|
||||||
|
if(!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
// Set error status
|
||||||
|
ULONG Win32Error = RtlNtStatusToDosError(Status);
|
||||||
|
RtlSetLastWin32Error(Win32Error);
|
||||||
|
DebugRemoveDebugPrivilege = false;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
DebugAttachedToProcess = false;
|
||||||
|
DebugAttachedProcessCallBack = NULL;
|
||||||
|
|
||||||
|
return &dbgProcessInformation;
|
||||||
|
}
|
||||||
|
|
||||||
__declspec(dllexport) void* TITCALL InitDebugEx(char* szFileName, char* szCommandLine, char* szCurrentFolder, LPVOID EntryCallBack)
|
__declspec(dllexport) void* TITCALL InitDebugEx(char* szFileName, char* szCommandLine, char* szCurrentFolder, LPVOID EntryCallBack)
|
||||||
{
|
{
|
||||||
DebugExeFileEntryPointCallBack = EntryCallBack;
|
DebugExeFileEntryPointCallBack = EntryCallBack;
|
||||||
|
|
|
||||||
|
|
@ -189,7 +189,7 @@ __declspec(dllexport) ULONG_PTR TITCALL HandlerGetHandleDetails(HANDLE hProcess,
|
||||||
OBJECT_BASIC_INFORMATION ObjectBasicInfo;
|
OBJECT_BASIC_INFORMATION ObjectBasicInfo;
|
||||||
char HandleFullData[0x1000] = {0};
|
char HandleFullData[0x1000] = {0};
|
||||||
LPVOID HandleNameData = VirtualAlloc(NULL, 0x1000, MEM_COMMIT, PAGE_READWRITE);
|
LPVOID HandleNameData = VirtualAlloc(NULL, 0x1000, MEM_COMMIT, PAGE_READWRITE);
|
||||||
PPUBLIC_OBJECT_TYPE_INFORMATION pObjectTypeInfo = (PPUBLIC_OBJECT_TYPE_INFORMATION)HandleFullData;
|
POBJECT_TYPE_INFORMATION pObjectTypeInfo = (POBJECT_TYPE_INFORMATION)HandleFullData;
|
||||||
bool DontFreeStringMemory = false;
|
bool DontFreeStringMemory = false;
|
||||||
ULONG_PTR ReturnData = NULL;
|
ULONG_PTR ReturnData = NULL;
|
||||||
|
|
||||||
|
|
@ -608,7 +608,7 @@ __declspec(dllexport) long TITCALL HandlerEnumerateOpenMutexes(HANDLE hProcess,
|
||||||
char HandleFullData[0x1000] = {0};
|
char HandleFullData[0x1000] = {0};
|
||||||
char HandleNameDataB[0x1000] = {0};
|
char HandleNameDataB[0x1000] = {0};
|
||||||
LPVOID HandleNameData = HandleNameDataB;
|
LPVOID HandleNameData = HandleNameDataB;
|
||||||
PPUBLIC_OBJECT_TYPE_INFORMATION pObjectTypeInfo = (PPUBLIC_OBJECT_TYPE_INFORMATION)HandleFullData;
|
POBJECT_TYPE_INFORMATION pObjectTypeInfo = (POBJECT_TYPE_INFORMATION)HandleFullData;
|
||||||
|
|
||||||
DynBuf hinfo;
|
DynBuf hinfo;
|
||||||
if(!NtQuerySysHandleInfo(hinfo))
|
if(!NtQuerySysHandleInfo(hinfo))
|
||||||
|
|
@ -725,7 +725,7 @@ __declspec(dllexport) long TITCALL HandlerGetProcessIdWhichCreatedMutexW(wchar_t
|
||||||
PNTDLL_QUERY_HANDLE_INFO HandleInfo;
|
PNTDLL_QUERY_HANDLE_INFO HandleInfo;
|
||||||
char HandleFullData[0x1000] = {0};
|
char HandleFullData[0x1000] = {0};
|
||||||
char HandleNameData[0x1000] = {0};
|
char HandleNameData[0x1000] = {0};
|
||||||
PPUBLIC_OBJECT_TYPE_INFORMATION pObjectTypeInfo = (PPUBLIC_OBJECT_TYPE_INFORMATION)HandleFullData;
|
POBJECT_TYPE_INFORMATION pObjectTypeInfo = (POBJECT_TYPE_INFORMATION)HandleFullData;
|
||||||
char ObjectNameInfo[0x2000] = {0};
|
char ObjectNameInfo[0x2000] = {0};
|
||||||
POBJECT_NAME_INFORMATION pObjectNameInfo = (POBJECT_NAME_INFORMATION)ObjectNameInfo;
|
POBJECT_NAME_INFORMATION pObjectNameInfo = (POBJECT_NAME_INFORMATION)ObjectNameInfo;
|
||||||
wchar_t RealMutexName[512] = L"\\BaseNamedObjects\\";
|
wchar_t RealMutexName[512] = L"\\BaseNamedObjects\\";
|
||||||
|
|
|
||||||
|
|
@ -82,6 +82,8 @@ FixHeaderCheckSum
|
||||||
FixHeaderCheckSumW
|
FixHeaderCheckSumW
|
||||||
InitDebug
|
InitDebug
|
||||||
InitDebugW
|
InitDebugW
|
||||||
|
InitNativeDebug
|
||||||
|
InitNativeDebugW
|
||||||
InitDebugEx
|
InitDebugEx
|
||||||
InitDebugExW
|
InitDebugExW
|
||||||
InitDLLDebug
|
InitDLLDebug
|
||||||
|
|
|
||||||
|
|
@ -107,7 +107,7 @@
|
||||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<AdditionalDependencies>$(ProjectDir)scylla_wrapper_x86.lib;$(ProjectDir)distorm_x86.lib;Imagehlp.lib;psapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>$(ProjectDir)ntdll_x86.lib;$(ProjectDir)scylla_wrapper_x86.lib;$(ProjectDir)distorm_x86.lib;Imagehlp.lib;psapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
<ModuleDefinitionFile>$(ProjectDir)TitanEngine.def</ModuleDefinitionFile>
|
<ModuleDefinitionFile>$(ProjectDir)TitanEngine.def</ModuleDefinitionFile>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
|
<LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
|
||||||
|
|
@ -136,7 +136,7 @@
|
||||||
<ExceptionHandling>Sync</ExceptionHandling>
|
<ExceptionHandling>Sync</ExceptionHandling>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<AdditionalDependencies>$(ProjectDir)scylla_wrapper_x86.lib;$(ProjectDir)distorm_x86.lib;Imagehlp.lib;psapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>$(ProjectDir)ntdll_x86.lib;$(ProjectDir)scylla_wrapper_x86.lib;$(ProjectDir)distorm_x86.lib;Imagehlp.lib;psapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
<ModuleDefinitionFile>$(ProjectDir)TitanEngine.def</ModuleDefinitionFile>
|
<ModuleDefinitionFile>$(ProjectDir)TitanEngine.def</ModuleDefinitionFile>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
|
<LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
|
||||||
|
|
@ -165,7 +165,7 @@
|
||||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<AdditionalDependencies>$(ProjectDir)scylla_wrapper_x64.lib;$(ProjectDir)distorm_x64.lib;Imagehlp.lib;psapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>$(ProjectDir)ntdll_x64.lib;$(ProjectDir)scylla_wrapper_x64.lib;$(ProjectDir)distorm_x64.lib;Imagehlp.lib;psapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
<OutputFile>$(OutDir)TitanEngine.dll</OutputFile>
|
<OutputFile>$(OutDir)TitanEngine.dll</OutputFile>
|
||||||
<IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
|
<IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
|
||||||
<ModuleDefinitionFile>$(ProjectDir)TitanEngine.def</ModuleDefinitionFile>
|
<ModuleDefinitionFile>$(ProjectDir)TitanEngine.def</ModuleDefinitionFile>
|
||||||
|
|
@ -203,7 +203,7 @@
|
||||||
<ExceptionHandling>false</ExceptionHandling>
|
<ExceptionHandling>false</ExceptionHandling>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<AdditionalDependencies>$(ProjectDir)scylla_wrapper_x64.lib;$(ProjectDir)distorm_x64.lib;Imagehlp.lib;psapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>$(ProjectDir)ntdll_x64.lib;$(ProjectDir)scylla_wrapper_x64.lib;$(ProjectDir)distorm_x64.lib;Imagehlp.lib;psapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
<OutputFile>$(OutDir)TitanEngine.dll</OutputFile>
|
<OutputFile>$(OutDir)TitanEngine.dll</OutputFile>
|
||||||
<IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
|
<IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
|
||||||
<ModuleDefinitionFile>$(ProjectDir)TitanEngine.def</ModuleDefinitionFile>
|
<ModuleDefinitionFile>$(ProjectDir)TitanEngine.def</ModuleDefinitionFile>
|
||||||
|
|
|
||||||
|
|
@ -160,6 +160,8 @@ __declspec(dllexport) long TITCALL LengthDisassembleEx(HANDLE hProcess, LPVOID D
|
||||||
__declspec(dllexport) long TITCALL LengthDisassemble(LPVOID DisassmAddress);
|
__declspec(dllexport) long TITCALL LengthDisassemble(LPVOID DisassmAddress);
|
||||||
__declspec(dllexport) void* TITCALL InitDebug(char* szFileName, char* szCommandLine, char* szCurrentFolder);
|
__declspec(dllexport) void* TITCALL InitDebug(char* szFileName, char* szCommandLine, char* szCurrentFolder);
|
||||||
__declspec(dllexport) void* TITCALL InitDebugW(wchar_t* szFileName, wchar_t* szCommandLine, wchar_t* szCurrentFolder);
|
__declspec(dllexport) void* TITCALL InitDebugW(wchar_t* szFileName, wchar_t* szCommandLine, wchar_t* szCurrentFolder);
|
||||||
|
__declspec(dllexport) void* TITCALL InitNativeDebug(char* szFileName, char* szCommandLine, char* szCurrentFolder);
|
||||||
|
__declspec(dllexport) void* TITCALL InitNativeDebugW(wchar_t* szFileName, wchar_t* szCommandLine, wchar_t* szCurrentFolder);
|
||||||
__declspec(dllexport) void* TITCALL InitDebugEx(char* szFileName, char* szCommandLine, char* szCurrentFolder, LPVOID EntryCallBack);
|
__declspec(dllexport) void* TITCALL InitDebugEx(char* szFileName, char* szCommandLine, char* szCurrentFolder, LPVOID EntryCallBack);
|
||||||
__declspec(dllexport) void* TITCALL InitDebugExW(wchar_t* szFileName, wchar_t* szCommandLine, wchar_t* szCurrentFolder, LPVOID EntryCallBack);
|
__declspec(dllexport) void* TITCALL InitDebugExW(wchar_t* szFileName, wchar_t* szCommandLine, wchar_t* szCurrentFolder, LPVOID EntryCallBack);
|
||||||
__declspec(dllexport) void* TITCALL InitDLLDebug(char* szFileName, bool ReserveModuleBase, char* szCommandLine, char* szCurrentFolder, LPVOID EntryCallBack);
|
__declspec(dllexport) void* TITCALL InitDLLDebug(char* szFileName, bool ReserveModuleBase, char* szCommandLine, char* szCurrentFolder, LPVOID EntryCallBack);
|
||||||
|
|
|
||||||
9359
TitanEngine/ntdll.h
9359
TitanEngine/ntdll.h
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
|
|
@ -12,6 +12,10 @@
|
||||||
|
|
||||||
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
|
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
|
||||||
|
|
||||||
|
// Allow including Windows.h without bringing in a redefined and outdated subset of NTSTATUSes.
|
||||||
|
// To get NTSTATUS defines, #undef WIN32_NO_STATUS after Windows.h and then #include <ntstatus.h>
|
||||||
|
#define WIN32_NO_STATUS
|
||||||
|
|
||||||
// Windows Header Files:
|
// Windows Header Files:
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue