BOOL
PreventDebug::Check_ZwSetInformationObject()
{
HANDLE
v3;
HANDLE
TargetHandle;
typedef
NTSTATUS(__stdcall* NTSETINFORMATIONOBJECT)(
HANDLE
objhandle,
int
objinforClass,
PVOID
objinfo,
ULONG
Length);
NTSETINFORMATIONOBJECT pZwSetInformationObject;
typedef
BOOL
(__stdcall* SETHANDLEINFORMATION)(_In_
HANDLE
hObject, _In_
DWORD
dwMask, _In_
DWORD
dwFlags);
SETHANDLEINFORMATION pSetHandleInformation;
typedef
BOOL
(__stdcall* DUPLICATEHANDLE)(
_In_
HANDLE
hSourceProcessHandle,
_In_
HANDLE
hSourceHandle,
_In_
HANDLE
hTargetProcessHandle,
_Outptr_
LPHANDLE
lpTargetHandle,
_In_
DWORD
dwDesiredAccess,
_In_
BOOL
bInheritHandle,
_In_
DWORD
dwOptions
);
DUPLICATEHANDLE pDuplicateHandle;
HMODULE
hModule_1 = g_pfnLoadLibraryA(
"kernel32.dll"
);
pSetHandleInformation = (SETHANDLEINFORMATION)g_pfnGetProcAddress(hModule_1,
"SetHandleInformation"
);
pDuplicateHandle = (DUPLICATEHANDLE)g_pfnGetProcAddress(hModule_1,
"DuplicateHandle"
);
HMODULE
hModule = g_pfnLoadLibraryA(
"ntdll.dll"
);
pZwSetInformationObject = (NTSETINFORMATIONOBJECT)g_pfnGetProcAddress(hModule,
"ZwSetInformationObject"
);
pDuplicateHandle((
HANDLE
)-1, (
HANDLE
)-1, (
HANDLE
)-1, &TargetHandle, 0, 0, 0);
pZwSetInformationObject(TargetHandle, 4, &TargetHandle, 2);
pSetHandleInformation(TargetHandle, 2, 2);
pDuplicateHandle((
HANDLE
)-1, TargetHandle, (
HANDLE
)-1, &v3, 0, 0, 1);
#ifdef _WIN64
return
!v3 || v3 == (
HANDLE
)0xCCCCCCCCCCCCCCCC;
#endif // _WIN64
return
!v3 || v3 == (
HANDLE
)0xCCCCCCCC;
}
typedef
struct
tagPROCESSENTRY32or64
{
DWORD
dwSize;
DWORD
cntUsage;
DWORD
th32ProcessID;
ULONG_PTR
th32DefaultHeapID;
DWORD
th32ModuleID;
DWORD
cntThreads;
DWORD
th32ParentProcessID;
LONG
pcPriClassBase;
DWORD
dwFlags;
#ifdef UNICODE
WCHAR
szExeFile[MAX_PATH];
#else
CHAR
szExeFile[MAX_PATH];
#endif // UNICODE
} PROCESSENTRY32or64, * LPPROCESSENTRY32or64;
#define TH32CS_SNAPPROCESS 0x00000002
bool
PreventDebug::GetProcessIdByName(
TCHAR
* szProcessName)
{
typedef
int
(__stdcall* LSTRCMP_)(
#ifdef UNICODE
_In_
LPCWSTR
lpString1, _In_
LPCWSTR
lpString2
#else
_In_
LPCSTR
lpString1, _In_
LPCSTR
lpString2
#endif // UNICODE
);
LSTRCMP_ plstrcmpi;
typedef
HANDLE
(__stdcall* CREATETOOLHELP32SNAPSHOT)(
DWORD
dwFlags,
DWORD
th32ProcessID);
CREATETOOLHELP32SNAPSHOT pCreateToolhelp32Snapshot;
typedef
BOOL
(__stdcall* PROCESS32FIRST)(
HANDLE
hSnapshot, LPPROCESSENTRY32or64 lppe);
PROCESS32FIRST pProcess32First;
typedef
BOOL
(__stdcall* PROCESS32NEXT)(
HANDLE
hSnapshot, LPPROCESSENTRY32or64 lppe);
PROCESS32NEXT pProcess32Next;
HMODULE
hModule_1 = g_pfnLoadLibraryA(
"kernel32.dll"
);
pCreateToolhelp32Snapshot = (CREATETOOLHELP32SNAPSHOT)g_pfnGetProcAddress(hModule_1,
"CreateToolhelp32Snapshot"
);
#ifdef UINCODE
plstrcmpi = (LSTRCMP_)g_pfnGetProcAddress(hModule_1,
"lstrcmpiW"
);
pProcess32First = (PROCESS32FIRST)g_pfnGetProcAddress(hModule_1,
"Process32FirstW"
);
pProcess32Next = (PROCESS32NEXT)g_pfnGetProcAddress(hModule_1,
"Process32NextW"
);
#else
plstrcmpi = (LSTRCMP_)g_pfnGetProcAddress(hModule_1,
"lstrcmpiA"
);
pProcess32First = (PROCESS32FIRST)g_pfnGetProcAddress(hModule_1,
"Process32First"
);
pProcess32Next = (PROCESS32NEXT)g_pfnGetProcAddress(hModule_1,
"Process32Next"
);
#endif // UINCODE
HANDLE
hSnapProcess = pCreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if
(hSnapProcess == NULL)
{
return
FALSE;
}
PROCESSENTRY32or64 pe32 = { 0 };
pe32.dwSize =
sizeof
(pe32);
BOOL
bRet = pProcess32First(hSnapProcess, &pe32);
while
(bRet)
{
if
(plstrcmpi(pe32.szExeFile, szProcessName) == 0)
{
return
TRUE;
}
bRet = pProcess32Next(hSnapProcess, &pe32);
}
return
FALSE;
}