Skip to content

Commit 1a9eb48

Browse files
Detect if a process is using a VEH.
1 parent f895c9a commit 1a9eb48

7 files changed

Lines changed: 50 additions & 5 deletions

File tree

WinArk/MainFrame.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,8 @@ void CMainFrame::InitProcessTable() {
6161
{19,"Process Name",0},
6262
{19,"Process ID",0},
6363
{9,"Session",0},
64-
{20,"User Name",0},
64+
{32,"User Name",0},
65+
{9,"Has VEH",0},
6566
{20,"EPROCESS",0},
6667
{12,"Priority",0},
6768
{9,"Threads",0},

WinArk/ProcessInfoEx.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,4 +201,8 @@ int ProcessInfoEx::GetImageIndex(CImageList images) const {
201201
_image = images.AddIcon(hIcon);
202202
}
203203
return _image;
204+
}
205+
206+
bool ProcessInfoEx::HasVEH(HANDLE hProcess) const {
207+
return _process->HasVEH(hProcess);
204208
}

WinArk/ProcessInfoEx.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ class ProcessInfoEx {
3737
const std::wstring& GetCompanyName() const;
3838
const std::wstring& GetDescription() const;
3939
const std::wstring& GetVersion() const;
40+
bool HasVEH(HANDLE hProcess) const;
4041

4142
int GetBitness() const;
4243
const WinSys::Process* GetProcess() const {

WinArk/ProcessTable.cpp

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,14 @@ int CProcessTable::ParseTableEntry(CString& s, char& mask, int& select, std::sha
8383
break;
8484
case ProcessColumn::Eprocess:
8585
s.Format(L"0x%p", info->EProcess);
86+
break;
87+
case ProcessColumn::HasVEH:
88+
{
89+
auto hProcess = DriverHelper::OpenProcess(info->Id, PROCESS_VM_READ | PROCESS_QUERY_INFORMATION);
90+
s.Format(L"%s", px.HasVEH(hProcess) ? L"Yes" : L"No");
91+
::CloseHandle(hProcess);
92+
}
93+
8694
break;
8795
default:
8896
break;
@@ -275,7 +283,7 @@ LRESULT CProcessTable::OnProcessKill(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*
275283
auto& p = m_Table.data.info[selected];
276284

277285
CString text;
278-
text.Format(L"杀死进程:%u (%ws)?", p->Id, p->GetImageName().c_str());
286+
text.Format(L"Kill Process£º%u (%ws)?", p->Id, p->GetImageName().c_str());
279287
if (AtlMessageBox(*this, (PCWSTR)text, IDS_TITLE, MB_ICONWARNING | MB_OKCANCEL | MB_DEFBUTTON2) == IDCANCEL)
280288
return 0;
281289

@@ -294,7 +302,7 @@ LRESULT CProcessTable::OnProcessResume(WORD /*wNotifyCode*/, WORD /*wID*/, HWND
294302
auto& p = m_Table.data.info[selected];
295303

296304
CString text;
297-
text.Format(L"恢复进程: %u (%ws)?", p->Id, p->GetImageName().c_str());
305+
text.Format(L"Resume Process: %u (%ws)?", p->Id, p->GetImageName().c_str());
298306
if (AtlMessageBox(*this, (PCWSTR)text, IDS_TITLE, MB_ICONWARNING | MB_OKCANCEL | MB_DEFBUTTON2) == IDCANCEL)
299307
return 0;
300308

@@ -323,7 +331,7 @@ LRESULT CProcessTable::OnProcessSuspend(WORD /*wNotifyCode*/, WORD /*wID*/, HWND
323331
auto& p = m_Table.data.info[selected];
324332

325333
CString text;
326-
text.Format(L"挂起进程: %u (%ws)?", p->Id, p->GetImageName().c_str());
334+
text.Format(L"Suspend Process: %u (%ws)?", p->Id, p->GetImageName().c_str());
327335
if (AtlMessageBox(*this, (PCWSTR)text, IDS_TITLE, MB_ICONWARNING | MB_OKCANCEL | MB_DEFBUTTON2) == IDCANCEL)
328336
return 0;
329337

WinArk/ProcessTable.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ class CProcessTable
9797

9898
private:
9999
enum class ProcessColumn {
100-
Name,Id,Session,UserName,Eprocess,Priority,Threads,Handles,Attributes,CreateTime,Description,CompanyName,Version,ExePath,CmdLine
100+
Name,Id,Session,UserName,HasVEH,Eprocess,Priority,Threads,Handles,Attributes,CreateTime,Description,CompanyName,Version,ExePath,CmdLine
101101
};
102102
//std::vector<std::shared_ptr<WinSys::ProcessInfo>> m_Processes;
103103
mutable std::unordered_map<WinSys::ProcessInfo*, ProcessInfoEx> m_ProcessesEx;

WinSysCore/Processes.cpp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -416,4 +416,34 @@ SIZE_T Process::GetImageSize(HANDLE hProcess, DWORD_PTR imageBase) {
416416
return info.RegionSize;
417417
}
418418
return 0;
419+
}
420+
421+
bool Process::HasVEH(HANDLE hProcess) const {
422+
ULONG len = 0;
423+
PROCESS_BASIC_INFORMATION info;
424+
DWORD status = ::NtQueryInformationProcess(hProcess, ProcessBasicInformation, &info, sizeof(info), &len);
425+
if (!NT_SUCCESS(status))
426+
return false;
427+
428+
if (info.PebBaseAddress == nullptr)
429+
return false;
430+
DWORD flags = 0;
431+
DWORD* pCrossProcessFlags = nullptr;
432+
PROCESS_EXTENDED_BASIC_INFORMATION extInfo;
433+
if (!GetExtendedInfo(hProcess, &extInfo))
434+
return false;
435+
if (extInfo.IsWow64Process) {
436+
pCrossProcessFlags = reinterpret_cast<DWORD*>((BYTE*)info.PebBaseAddress + 0x1000 + 0x28);
437+
}
438+
else {
439+
pCrossProcessFlags = reinterpret_cast<DWORD*>((BYTE*)info.PebBaseAddress + 0x50);
440+
}
441+
442+
if (!::ReadProcessMemory(hProcess, pCrossProcessFlags, &flags, sizeof(flags), nullptr))
443+
return false;
444+
445+
if (flags & 0x00000004)
446+
return true;
447+
448+
return false;
419449
}

WinSysCore/Processes.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ namespace WinSys {
120120
static std::vector<std::pair<std::wstring, std::wstring>> GetEnvironment(HANDLE hProcess);
121121
static DWORD_PTR GetImageBaseAddress(HANDLE hProcess);
122122
static SIZE_T GetImageSize(HANDLE hProcess, DWORD_PTR imageBase);
123+
bool HasVEH(HANDLE hProcess) const;
123124

124125
bool SetPriorityClass(ProcessPriorityClass pc);
125126
uint32_t GetGdiObjectCount() const;

0 commit comments

Comments
 (0)