mirror of https://github.com/x64dbg/TitanEngine
- resolved issue #22 (dll debugging not working)
- resolved hanging functions in TitanEngine.PE.* - fixed issues with differences between debug and release builds (caused crashes)
This commit is contained in:
parent
c51b7ac6bb
commit
97e00e86a4
|
|
@ -35,6 +35,7 @@ DWORD DBGCode = DBG_CONTINUE;
|
||||||
bool engineFileIsBeingDebugged = false;
|
bool engineFileIsBeingDebugged = false;
|
||||||
ULONG_PTR engineFakeDLLHandle = NULL;
|
ULONG_PTR engineFakeDLLHandle = NULL;
|
||||||
LPVOID engineAttachedProcessDebugInfo = NULL;
|
LPVOID engineAttachedProcessDebugInfo = NULL;
|
||||||
|
wchar_t szDebuggerName[512];
|
||||||
|
|
||||||
// Global.Debugger.functions:
|
// Global.Debugger.functions:
|
||||||
long DebugLoopInSecondThread(LPVOID InputParameter)
|
long DebugLoopInSecondThread(LPVOID InputParameter)
|
||||||
|
|
|
||||||
|
|
@ -35,6 +35,7 @@ extern DWORD DBGCode;
|
||||||
extern bool engineFileIsBeingDebugged;
|
extern bool engineFileIsBeingDebugged;
|
||||||
extern ULONG_PTR engineFakeDLLHandle;
|
extern ULONG_PTR engineFakeDLLHandle;
|
||||||
extern LPVOID engineAttachedProcessDebugInfo;
|
extern LPVOID engineAttachedProcessDebugInfo;
|
||||||
|
extern wchar_t szDebuggerName[512];
|
||||||
|
|
||||||
long DebugLoopInSecondThread(LPVOID InputParameter);
|
long DebugLoopInSecondThread(LPVOID InputParameter);
|
||||||
void DebuggerReset();
|
void DebuggerReset();
|
||||||
|
|
|
||||||
|
|
@ -51,6 +51,7 @@ void EngineInit()
|
||||||
{
|
{
|
||||||
lstrcpyW(engineSzEngineGarbageFolder, engineSzEngineFolder);
|
lstrcpyW(engineSzEngineGarbageFolder, engineSzEngineFolder);
|
||||||
lstrcatW(engineSzEngineGarbageFolder, L"garbage\\");
|
lstrcatW(engineSzEngineGarbageFolder, L"garbage\\");
|
||||||
|
CreateDirectoryW(engineSzEngineGarbageFolder, 0);
|
||||||
}
|
}
|
||||||
EngineInitPlugins(engineSzEngineFolder);
|
EngineInitPlugins(engineSzEngineFolder);
|
||||||
}
|
}
|
||||||
|
|
@ -152,81 +153,54 @@ char* EngineExtractFileName(char* szFileName)
|
||||||
return(engineExtractedFileName);
|
return(engineExtractedFileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool EngineCreatePathForFile(char* szFileName)
|
void EngineCreatePathForFile(char* szFileName)
|
||||||
{
|
{
|
||||||
|
int len=lstrlenA(szFileName);
|
||||||
int i,j;
|
while(szFileName[len]!='\\' && len)
|
||||||
char szFolderName[2 * MAX_PATH] = {};
|
len--;
|
||||||
char szCreateFolder[2 * MAX_PATH] = {};
|
char szFolderName[MAX_PATH]="";
|
||||||
|
lstrcpyA(szFolderName, szFileName);
|
||||||
if(engineCreatePathForFiles)
|
if(len)
|
||||||
|
szFolderName[len+1]='\0';
|
||||||
|
else //just a filename
|
||||||
|
return;
|
||||||
|
lstrcatA(szFolderName, "\\");
|
||||||
|
len=lstrlenA(szFolderName);
|
||||||
|
char szCreateFolder[MAX_PATH]="";
|
||||||
|
for(int i=3; i<len; i++)
|
||||||
{
|
{
|
||||||
i = lstrlenA(szFileName);
|
if(szFolderName[i]=='\\')
|
||||||
while(szFileName[i] != '\\' && i > NULL)
|
|
||||||
{
|
{
|
||||||
i--;
|
lstrcpyA(szCreateFolder, szFolderName);
|
||||||
}
|
szCreateFolder[i]='\0';
|
||||||
if(i != NULL)
|
CreateDirectoryA(szCreateFolder, 0);
|
||||||
{
|
|
||||||
RtlMoveMemory(szFolderName, szFileName, i + 1);
|
|
||||||
if(!CreateDirectoryA(szFolderName, NULL))
|
|
||||||
{
|
|
||||||
if(GetLastError() != ERROR_ALREADY_EXISTS)
|
|
||||||
{
|
|
||||||
j = lstrlenA(szFolderName);
|
|
||||||
for(i = 4; i < j; i++)
|
|
||||||
{
|
|
||||||
if(szFileName[i] == '\\')
|
|
||||||
{
|
|
||||||
RtlZeroMemory(szCreateFolder, 2 * MAX_PATH);
|
|
||||||
RtlCopyMemory(szCreateFolder, szFileName, i + 1);
|
|
||||||
return !!CreateDirectoryA(szCreateFolder, NULL);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool EngineCreatePathForFileW(wchar_t* szFileName)
|
void EngineCreatePathForFileW(wchar_t* szFileName)
|
||||||
{
|
{
|
||||||
|
int len=lstrlenW(szFileName);
|
||||||
int i,j;
|
while(szFileName[len]!=L'\\' && len)
|
||||||
wchar_t szFolderName[MAX_PATH] = {};
|
len--;
|
||||||
wchar_t szCreateFolder[MAX_PATH] = {};
|
wchar_t szFolderName[MAX_PATH]=L"";
|
||||||
|
lstrcpyW(szFolderName, szFileName);
|
||||||
if(engineCreatePathForFiles)
|
if(len)
|
||||||
|
szFolderName[len+1]=L'\0';
|
||||||
|
else //just a filename
|
||||||
|
return;
|
||||||
|
len=lstrlenW(szFolderName);
|
||||||
|
wchar_t szCreateFolder[MAX_PATH]=L"";
|
||||||
|
for(int i=3; i<len; i++)
|
||||||
{
|
{
|
||||||
i = lstrlenW(szFileName);
|
if(szFolderName[i]=='\\')
|
||||||
while(szFileName[i] != '\\' && i > 0)
|
|
||||||
{
|
{
|
||||||
i--;
|
lstrcpyW(szCreateFolder, szFolderName);
|
||||||
}
|
szCreateFolder[i]='\0';
|
||||||
if(i != 0)
|
CreateDirectoryW(szCreateFolder, 0);
|
||||||
{
|
|
||||||
RtlCopyMemory(szFolderName, szFileName, (i * 2) + 2);
|
|
||||||
if(!CreateDirectoryW(szFolderName, NULL))
|
|
||||||
{
|
|
||||||
if(GetLastError() != ERROR_ALREADY_EXISTS)
|
|
||||||
{
|
|
||||||
j = lstrlenW(szFolderName);
|
|
||||||
for(i = 4; i < j; i++)
|
|
||||||
{
|
|
||||||
if(szFileName[i] == '\\')
|
|
||||||
{
|
|
||||||
RtlZeroMemory(szCreateFolder, 2 * MAX_PATH);
|
|
||||||
RtlCopyMemory(szCreateFolder, szFileName, (i * 2) + 1);
|
|
||||||
return !!CreateDirectoryW(szCreateFolder, NULL);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
wchar_t* EngineExtractFileNameW(wchar_t* szFileName)
|
wchar_t* EngineExtractFileNameW(wchar_t* szFileName)
|
||||||
{
|
{
|
||||||
|
|
@ -512,8 +486,7 @@ bool EngineExtractResource(char* szResourceName, wchar_t* szExtractedFileName)
|
||||||
{
|
{
|
||||||
ResourceSize = SizeofResource(engineHandle, hResource);
|
ResourceSize = SizeofResource(engineHandle, hResource);
|
||||||
ResourceData = LockResource(hResourceGlobal);
|
ResourceData = LockResource(hResourceGlobal);
|
||||||
if(EngineCreatePathForFileW(szExtractedFileName))
|
EngineCreatePathForFileW(szExtractedFileName);
|
||||||
{
|
|
||||||
hFile = CreateFileW(szExtractedFileName, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
|
hFile = CreateFileW(szExtractedFileName, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||||
if(hFile != INVALID_HANDLE_VALUE)
|
if(hFile != INVALID_HANDLE_VALUE)
|
||||||
{
|
{
|
||||||
|
|
@ -526,7 +499,6 @@ bool EngineExtractResource(char* szResourceName, wchar_t* szExtractedFileName)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -27,8 +27,8 @@ bool EngineIsThereFreeHardwareBreakSlot(LPDWORD FreeRegister);
|
||||||
bool EngineFileExists(char* szFileName);
|
bool EngineFileExists(char* szFileName);
|
||||||
char* EngineExtractPath(char* szFileName);
|
char* EngineExtractPath(char* szFileName);
|
||||||
char* EngineExtractFileName(char* szFileName);
|
char* EngineExtractFileName(char* szFileName);
|
||||||
bool EngineCreatePathForFile(char* szFileName);
|
void EngineCreatePathForFile(char* szFileName);
|
||||||
bool EngineCreatePathForFileW(wchar_t* szFileName);
|
void EngineCreatePathForFileW(wchar_t* szFileName);
|
||||||
wchar_t* EngineExtractFileNameW(wchar_t* szFileName);
|
wchar_t* EngineExtractFileNameW(wchar_t* szFileName);
|
||||||
bool EngineIsPointedMemoryString(ULONG_PTR PossibleStringPtr);
|
bool EngineIsPointedMemoryString(ULONG_PTR PossibleStringPtr);
|
||||||
int EnginePointedMemoryStringLength(ULONG_PTR PossibleStringPtr);
|
int EnginePointedMemoryStringLength(ULONG_PTR PossibleStringPtr);
|
||||||
|
|
|
||||||
|
|
@ -11,24 +11,17 @@ wchar_t engineSzEngineGarbageFolder[MAX_PATH];
|
||||||
// Global.Garbage.functions:
|
// Global.Garbage.functions:
|
||||||
bool CreateGarbageItem(void* outGargabeItem, int MaxGargabeStringSize)
|
bool CreateGarbageItem(void* outGargabeItem, int MaxGargabeStringSize)
|
||||||
{
|
{
|
||||||
|
|
||||||
bool Created = false;
|
|
||||||
wchar_t szGarbageItem[512];
|
wchar_t szGarbageItem[512];
|
||||||
wchar_t szGargabeItemBuff[128];
|
wchar_t szGargabeItemBuff[128];
|
||||||
|
|
||||||
while(!Created)
|
|
||||||
{
|
|
||||||
RtlZeroMemory(&szGarbageItem, sizeof szGarbageItem);
|
RtlZeroMemory(&szGarbageItem, sizeof szGarbageItem);
|
||||||
RtlZeroMemory(&szGargabeItemBuff, sizeof szGargabeItemBuff);
|
RtlZeroMemory(&szGargabeItemBuff, sizeof szGargabeItemBuff);
|
||||||
srand((unsigned int)time(NULL));
|
srand((unsigned int)time(NULL));
|
||||||
wsprintfW(szGargabeItemBuff, L"Junk-%08x\\", (rand() % 128 + 1) * (rand() % 128 + 1) + (rand() % 1024 + 1));
|
wsprintfW(szGargabeItemBuff, L"Junk-%08x\\", (rand() % 128 + 1) * (rand() % 128 + 1) + (rand() % 1024 + 1));
|
||||||
lstrcpyW(szGarbageItem, engineSzEngineGarbageFolder);
|
lstrcpyW(szGarbageItem, engineSzEngineGarbageFolder);
|
||||||
lstrcatW(szGarbageItem, szGargabeItemBuff);
|
lstrcatW(szGarbageItem, szGargabeItemBuff);
|
||||||
if(EngineCreatePathForFileW(szGarbageItem))
|
EngineCreatePathForFileW(szGarbageItem);
|
||||||
{
|
|
||||||
Created = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(lstrlenW(szGarbageItem) * 2 >= MaxGargabeStringSize)
|
if(lstrlenW(szGarbageItem) * 2 >= MaxGargabeStringSize)
|
||||||
{
|
{
|
||||||
RtlMoveMemory(outGargabeItem, &szGarbageItem, MaxGargabeStringSize);
|
RtlMoveMemory(outGargabeItem, &szGarbageItem, MaxGargabeStringSize);
|
||||||
|
|
|
||||||
|
|
@ -42,39 +42,8 @@ __declspec(dllexport) void TITCALL ForceClose()
|
||||||
StopDebug();
|
StopDebug();
|
||||||
}
|
}
|
||||||
RtlZeroMemory(&dbgProcessInformation, sizeof PROCESS_INFORMATION);
|
RtlZeroMemory(&dbgProcessInformation, sizeof PROCESS_INFORMATION);
|
||||||
/*if(DebugDebuggingDLL)
|
if(DebugDebuggingDLL)
|
||||||
{
|
|
||||||
RtlZeroMemory(&szTempName, sizeof szTempName);
|
|
||||||
RtlZeroMemory(&szTempFolder, sizeof szTempFolder);
|
|
||||||
if(GetTempPathW(MAX_PATH, szTempFolder) < MAX_PATH)
|
|
||||||
{
|
|
||||||
if(GetTempFileNameW(szTempFolder, L"DeleteTempFile", GetTickCount(), szTempName))
|
|
||||||
{
|
|
||||||
DeleteFileW(szTempName);
|
|
||||||
if(!MoveFileW(szDebuggerName, szTempName))
|
|
||||||
{
|
|
||||||
DeleteFileW(szDebuggerName);
|
DeleteFileW(szDebuggerName);
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DeleteFileW(szTempName);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
RtlZeroMemory(&szTempName, sizeof szTempName);
|
|
||||||
if(GetTempFileNameW(szTempFolder, L"DeleteTempFile", GetTickCount() + 1, szTempName))
|
|
||||||
{
|
|
||||||
DeleteFileW(szTempName);
|
|
||||||
if(!MoveFileW(szReserveModuleName, szTempName))
|
|
||||||
{
|
|
||||||
DeleteFileW(szReserveModuleName);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DeleteFileW(szTempName);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
DebugDebuggingDLL = false;
|
DebugDebuggingDLL = false;
|
||||||
DebugExeFileEntryPointCallBack = NULL;
|
DebugExeFileEntryPointCallBack = NULL;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,6 @@
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
static wchar_t szBackupDebuggedFileName[512];
|
static wchar_t szBackupDebuggedFileName[512];
|
||||||
static wchar_t szDebuggerName[512];
|
|
||||||
|
|
||||||
// TitanEngine.Debugger.functions:
|
// TitanEngine.Debugger.functions:
|
||||||
__declspec(dllexport) void* TITCALL InitDebug(char* szFileName, char* szCommandLine, char* szCurrentFolder)
|
__declspec(dllexport) void* TITCALL InitDebug(char* szFileName, char* szCommandLine, char* szCurrentFolder)
|
||||||
|
|
@ -150,17 +149,16 @@ __declspec(dllexport) void* TITCALL InitDLLDebugW(wchar_t* szFileName, bool Rese
|
||||||
}
|
}
|
||||||
lstrcpyW(szDebuggerName, szFileName);
|
lstrcpyW(szDebuggerName, szFileName);
|
||||||
i = lstrlenW(szDebuggerName);
|
i = lstrlenW(szDebuggerName);
|
||||||
while(szDebuggerName[i] != 0x5C && i >= NULL)
|
while(szDebuggerName[i] != '\\' && i)
|
||||||
{
|
{
|
||||||
i--;
|
i--;
|
||||||
}
|
}
|
||||||
if(i > NULL)
|
if(i)
|
||||||
{
|
{
|
||||||
szDebuggerName[i+1] = 0x00;
|
|
||||||
#ifdef _WIN64
|
#ifdef _WIN64
|
||||||
lstrcpyW(szDebuggerName, L"DLLLoader64.exe");
|
lstrcpyW(szDebuggerName+i+1, L"DLLLoader64.exe");
|
||||||
#else
|
#else
|
||||||
lstrcpyW(szDebuggerName, L"DLLLoader32.exe");
|
lstrcpyW(szDebuggerName+i+1, L"DLLLoader32.exe");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
@ -171,21 +169,10 @@ __declspec(dllexport) void* TITCALL InitDLLDebugW(wchar_t* szFileName, bool Rese
|
||||||
lstrcpyW(szDebuggerName, L"DLLLoader32.exe");
|
lstrcpyW(szDebuggerName, L"DLLLoader32.exe");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
//RtlZeroMemory(&szReserveModuleName, sizeof szReserveModuleName);
|
|
||||||
//lstrcpyW(szReserveModuleName, szFileName);
|
|
||||||
//lstrcatW(szReserveModuleName, L".module");
|
|
||||||
#if defined(_WIN64)
|
#if defined(_WIN64)
|
||||||
ReturnData = EngineExtractResource("LOADERx64", szDebuggerName);
|
ReturnData = EngineExtractResource("LOADERX64", szDebuggerName);
|
||||||
/*if(ReserveModuleBase)
|
|
||||||
{
|
|
||||||
EngineExtractResource("MODULEx64", szReserveModuleName);
|
|
||||||
}*/
|
|
||||||
#else
|
#else
|
||||||
ReturnData = EngineExtractResource("LOADERx86", szDebuggerName);
|
ReturnData = EngineExtractResource("LOADERX86", szDebuggerName);
|
||||||
/*if(ReserveModuleBase)
|
|
||||||
{
|
|
||||||
EngineExtractResource("MODULEx86", szReserveModuleName);
|
|
||||||
}*/
|
|
||||||
#endif
|
#endif
|
||||||
if(ReturnData)
|
if(ReturnData)
|
||||||
{
|
{
|
||||||
|
|
@ -195,24 +182,14 @@ __declspec(dllexport) void* TITCALL InitDLLDebugW(wchar_t* szFileName, bool Rese
|
||||||
{
|
{
|
||||||
i--;
|
i--;
|
||||||
}
|
}
|
||||||
/*j = lstrlenW(szReserveModuleName);
|
|
||||||
while(szReserveModuleName[j] != 0x5C && j >= NULL)
|
|
||||||
{
|
|
||||||
j--;
|
|
||||||
}*/
|
|
||||||
DebugDebuggingDLLBase = NULL;
|
DebugDebuggingDLLBase = NULL;
|
||||||
DebugDebuggingMainModuleBase = NULL;
|
DebugDebuggingMainModuleBase = NULL;
|
||||||
DebugDebuggingDLLFullFileName = szFileName;
|
DebugDebuggingDLLFullFileName = szFileName;
|
||||||
DebugDebuggingDLLFileName = &szFileName[i+1];
|
DebugDebuggingDLLFileName = &szFileName[i+1];
|
||||||
//DebugDebuggingDLLReserveFileName = &szReserveModuleName[j+1];
|
|
||||||
DebugModuleImageBase = (ULONG_PTR)GetPE32DataW(szFileName, NULL, UE_IMAGEBASE);
|
DebugModuleImageBase = (ULONG_PTR)GetPE32DataW(szFileName, NULL, UE_IMAGEBASE);
|
||||||
DebugReserveModuleBase = DebugModuleImageBase;
|
DebugReserveModuleBase = DebugModuleImageBase;
|
||||||
DebugModuleEntryPoint = (ULONG_PTR)GetPE32DataW(szFileName, NULL, UE_OEP);
|
DebugModuleEntryPoint = (ULONG_PTR)GetPE32DataW(szFileName, NULL, UE_OEP);
|
||||||
DebugModuleEntryPointCallBack = EntryCallBack;
|
DebugModuleEntryPointCallBack = EntryCallBack;
|
||||||
/*if(ReserveModuleBase)
|
|
||||||
{
|
|
||||||
RelocaterChangeFileBaseW(szReserveModuleName, DebugModuleImageBase);
|
|
||||||
}*/
|
|
||||||
return(InitDebugW(szDebuggerName, szCommandLine, szCurrentFolder));
|
return(InitDebugW(szDebuggerName, szCommandLine, szCurrentFolder));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
@ -221,12 +198,14 @@ __declspec(dllexport) void* TITCALL InitDLLDebugW(wchar_t* szFileName, bool Rese
|
||||||
}
|
}
|
||||||
return(NULL);
|
return(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
__declspec(dllexport) bool TITCALL StopDebug()
|
__declspec(dllexport) bool TITCALL StopDebug()
|
||||||
{
|
{
|
||||||
if(dbgProcessInformation.hProcess != NULL)
|
if(dbgProcessInformation.hProcess != NULL)
|
||||||
{
|
{
|
||||||
TerminateThread(dbgProcessInformation.hThread, NULL);
|
TerminateThread(dbgProcessInformation.hThread, NULL);
|
||||||
TerminateProcess(dbgProcessInformation.hProcess, NULL);
|
TerminateProcess(dbgProcessInformation.hProcess, NULL);
|
||||||
|
Sleep(10); //allow thread switching
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
||||||
|
|
@ -182,8 +182,7 @@ __declspec(dllexport) bool TITCALL ExtractOverlayW(wchar_t* szFileName, wchar_t*
|
||||||
hFile = CreateFileW(szFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
hFile = CreateFileW(szFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||||
if(hFile != INVALID_HANDLE_VALUE)
|
if(hFile != INVALID_HANDLE_VALUE)
|
||||||
{
|
{
|
||||||
if(EngineCreatePathForFileW(szExtactedFileName))
|
EngineCreatePathForFileW(szExtactedFileName);
|
||||||
{
|
|
||||||
hFileWrite = CreateFileW(szExtactedFileName, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
|
hFileWrite = CreateFileW(szExtactedFileName, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||||
if(hFileWrite != INVALID_HANDLE_VALUE)
|
if(hFileWrite != INVALID_HANDLE_VALUE)
|
||||||
{
|
{
|
||||||
|
|
@ -234,7 +233,6 @@ __declspec(dllexport) bool TITCALL ExtractOverlayW(wchar_t* szFileName, wchar_t*
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
VirtualFree(ueReadBuffer, NULL, MEM_RELEASE);
|
VirtualFree(ueReadBuffer, NULL, MEM_RELEASE);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -63,8 +63,7 @@ __declspec(dllexport) bool TITCALL ExtractSectionW(wchar_t* szFileName, wchar_t*
|
||||||
if(SectionNumber <= PEHeader32->FileHeader.NumberOfSections)
|
if(SectionNumber <= PEHeader32->FileHeader.NumberOfSections)
|
||||||
{
|
{
|
||||||
PESections = (PIMAGE_SECTION_HEADER)((ULONG_PTR)PESections + SectionNumber * IMAGE_SIZEOF_SECTION_HEADER);
|
PESections = (PIMAGE_SECTION_HEADER)((ULONG_PTR)PESections + SectionNumber * IMAGE_SIZEOF_SECTION_HEADER);
|
||||||
if(EngineCreatePathForFileW(szDumpFileName))
|
EngineCreatePathForFileW(szDumpFileName);
|
||||||
{
|
|
||||||
hFile = CreateFileW(szDumpFileName, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
|
hFile = CreateFileW(szDumpFileName, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||||
if(hFile != INVALID_HANDLE_VALUE)
|
if(hFile != INVALID_HANDLE_VALUE)
|
||||||
{
|
{
|
||||||
|
|
@ -84,7 +83,6 @@ __declspec(dllexport) bool TITCALL ExtractSectionW(wchar_t* szFileName, wchar_t*
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
UnMapFileEx(FileHandle, FileSize, FileMap, FileMapVA);
|
UnMapFileEx(FileHandle, FileSize, FileMap, FileMapVA);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
@ -94,8 +92,7 @@ __declspec(dllexport) bool TITCALL ExtractSectionW(wchar_t* szFileName, wchar_t*
|
||||||
if(SectionNumber <= PEHeader64->FileHeader.NumberOfSections)
|
if(SectionNumber <= PEHeader64->FileHeader.NumberOfSections)
|
||||||
{
|
{
|
||||||
PESections = (PIMAGE_SECTION_HEADER)((ULONG_PTR)PESections + SectionNumber * IMAGE_SIZEOF_SECTION_HEADER);
|
PESections = (PIMAGE_SECTION_HEADER)((ULONG_PTR)PESections + SectionNumber * IMAGE_SIZEOF_SECTION_HEADER);
|
||||||
if(EngineCreatePathForFileW(szDumpFileName))
|
EngineCreatePathForFileW(szDumpFileName);
|
||||||
{
|
|
||||||
hFile = CreateFileW(szDumpFileName, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
|
hFile = CreateFileW(szDumpFileName, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||||
if(hFile != INVALID_HANDLE_VALUE)
|
if(hFile != INVALID_HANDLE_VALUE)
|
||||||
{
|
{
|
||||||
|
|
@ -115,7 +112,6 @@ __declspec(dllexport) bool TITCALL ExtractSectionW(wchar_t* szFileName, wchar_t*
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
UnMapFileEx(FileHandle, FileSize, FileMap, FileMapVA);
|
UnMapFileEx(FileHandle, FileSize, FileMap, FileMapVA);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -45,8 +45,7 @@ __declspec(dllexport) bool TITCALL ResourcerExtractResourceFromFileEx(ULONG_PTR
|
||||||
{
|
{
|
||||||
ResourceSize = SizeofResource((HMODULE)FileMapVA, hResource);
|
ResourceSize = SizeofResource((HMODULE)FileMapVA, hResource);
|
||||||
ResourceData = LockResource(hResourceGlobal);
|
ResourceData = LockResource(hResourceGlobal);
|
||||||
if(EngineCreatePathForFile(szExtractedFileName))
|
EngineCreatePathForFile(szExtractedFileName);
|
||||||
{
|
|
||||||
hFile = CreateFileA(szExtractedFileName, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
|
hFile = CreateFileA(szExtractedFileName, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||||
if(hFile != INVALID_HANDLE_VALUE)
|
if(hFile != INVALID_HANDLE_VALUE)
|
||||||
{
|
{
|
||||||
|
|
@ -58,7 +57,6 @@ __declspec(dllexport) bool TITCALL ResourcerExtractResourceFromFileEx(ULONG_PTR
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|
|
||||||
|
|
@ -477,8 +477,7 @@ __declspec(dllexport) bool TITCALL StaticRawMemoryCopyW(HANDLE hFile, ULONG_PTR
|
||||||
ueCopyBuffer = VirtualAlloc(NULL, 0x1000, MEM_COMMIT, PAGE_READWRITE);
|
ueCopyBuffer = VirtualAlloc(NULL, 0x1000, MEM_COMMIT, PAGE_READWRITE);
|
||||||
if(ueCopyBuffer != NULL)
|
if(ueCopyBuffer != NULL)
|
||||||
{
|
{
|
||||||
if(EngineCreatePathForFileW(szDumpFileName))
|
EngineCreatePathForFileW(szDumpFileName);
|
||||||
{
|
|
||||||
hWriteFile = CreateFileW(szDumpFileName, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
|
hWriteFile = CreateFileW(szDumpFileName, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||||
if(hWriteFile != INVALID_HANDLE_VALUE)
|
if(hWriteFile != INVALID_HANDLE_VALUE)
|
||||||
{
|
{
|
||||||
|
|
@ -535,7 +534,6 @@ __declspec(dllexport) bool TITCALL StaticRawMemoryCopyW(HANDLE hFile, ULONG_PTR
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
EngineCloseHandle(hReadFile);
|
EngineCloseHandle(hReadFile);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -572,8 +570,7 @@ __declspec(dllexport) bool TITCALL StaticRawMemoryCopyExW(HANDLE hFile, DWORD Ra
|
||||||
ueCopyBuffer = VirtualAlloc(NULL, 0x1000, MEM_COMMIT, PAGE_READWRITE);
|
ueCopyBuffer = VirtualAlloc(NULL, 0x1000, MEM_COMMIT, PAGE_READWRITE);
|
||||||
if(ueCopyBuffer != NULL)
|
if(ueCopyBuffer != NULL)
|
||||||
{
|
{
|
||||||
if(EngineCreatePathForFileW(szDumpFileName))
|
EngineCreatePathForFileW(szDumpFileName);
|
||||||
{
|
|
||||||
hWriteFile = CreateFileW(szDumpFileName, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
|
hWriteFile = CreateFileW(szDumpFileName, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||||
if(hWriteFile != INVALID_HANDLE_VALUE)
|
if(hWriteFile != INVALID_HANDLE_VALUE)
|
||||||
{
|
{
|
||||||
|
|
@ -630,7 +627,6 @@ __declspec(dllexport) bool TITCALL StaticRawMemoryCopyExW(HANDLE hFile, DWORD Ra
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
EngineCloseHandle(hReadFile);
|
EngineCloseHandle(hReadFile);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|
@ -670,8 +666,7 @@ __declspec(dllexport) bool TITCALL StaticRawMemoryCopyEx64W(HANDLE hFile, DWORD6
|
||||||
ueCopyBuffer = VirtualAlloc(NULL, 0x1000, MEM_COMMIT, PAGE_READWRITE);
|
ueCopyBuffer = VirtualAlloc(NULL, 0x1000, MEM_COMMIT, PAGE_READWRITE);
|
||||||
if(ueCopyBuffer != NULL)
|
if(ueCopyBuffer != NULL)
|
||||||
{
|
{
|
||||||
if(EngineCreatePathForFileW(szDumpFileName))
|
EngineCreatePathForFileW(szDumpFileName);
|
||||||
{
|
|
||||||
hWriteFile = CreateFileW(szDumpFileName, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
|
hWriteFile = CreateFileW(szDumpFileName, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||||
if(hWriteFile != INVALID_HANDLE_VALUE)
|
if(hWriteFile != INVALID_HANDLE_VALUE)
|
||||||
{
|
{
|
||||||
|
|
@ -728,7 +723,6 @@ __declspec(dllexport) bool TITCALL StaticRawMemoryCopyEx64W(HANDLE hFile, DWORD6
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
EngineCloseHandle(hReadFile);
|
EngineCloseHandle(hReadFile);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,7 @@ BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
|
||||||
case DLL_PROCESS_DETACH:
|
case DLL_PROCESS_DETACH:
|
||||||
if(lpvReserved)
|
if(lpvReserved)
|
||||||
ExtensionManagerPluginReleaseCallBack();
|
ExtensionManagerPluginReleaseCallBack();
|
||||||
|
RemoveDirectoryW(engineSzEngineGarbageFolder);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,8 @@
|
||||||
typedef LONG NTSTATUS;
|
typedef LONG NTSTATUS;
|
||||||
typedef LONG KPRIORITY;
|
typedef LONG KPRIORITY;
|
||||||
|
|
||||||
typedef struct _CLIENT_ID {
|
typedef struct _CLIENT_ID
|
||||||
|
{
|
||||||
HANDLE UniqueProcess;
|
HANDLE UniqueProcess;
|
||||||
HANDLE UniqueThread;
|
HANDLE UniqueThread;
|
||||||
} CLIENT_ID, *PCLIENT_ID;
|
} CLIENT_ID, *PCLIENT_ID;
|
||||||
|
|
@ -53,7 +54,8 @@ typedef struct _PROCESS_BASIC_INFORMATION
|
||||||
} PROCESS_BASIC_INFORMATION;
|
} PROCESS_BASIC_INFORMATION;
|
||||||
typedef PROCESS_BASIC_INFORMATION *PPROCESS_BASIC_INFORMATION;
|
typedef PROCESS_BASIC_INFORMATION *PPROCESS_BASIC_INFORMATION;
|
||||||
|
|
||||||
typedef struct _THREAD_BASIC_INFORMATION {
|
typedef struct _THREAD_BASIC_INFORMATION
|
||||||
|
{
|
||||||
NTSTATUS ExitStatus;
|
NTSTATUS ExitStatus;
|
||||||
PVOID TebBaseAddress;
|
PVOID TebBaseAddress;
|
||||||
CLIENT_ID ClientId;
|
CLIENT_ID ClientId;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue