Files
mirror-processhacker/trunk/ProcessHacker/Forms/HackerWindow.cs
T
wj32 23e974deb5 added module provider
git-svn-id: svn://svn.code.sf.net/p/processhacker/code@406 21ef857c-d57f-4fe0-8362-d861dc6d29cd
2008-12-24 07:26:47 +00:00

2949 lines
108 KiB
C#

/*
* Process Hacker
*
* Copyright (C) 2008 Dean
* Copyright (C) 2008 wj32
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Windows.Forms;
using Aga.Controls.Tree;
namespace ProcessHacker
{
public partial class HackerWindow : Form
{
delegate void QueueUpdatedCallback();
delegate void AddIconCallback(Icon icon);
delegate void AddListViewItemCallback(ListView lv, string[] text);
#region Variables
public int RefreshInterval = 1000;
public HelpWindow HelpForm = new HelpWindow();
public SysInfoWindow SysInfoWindow = null;
public HandleFilterWindow HandleFilterForm = new HandleFilterWindow();
ProcessProvider processP = new ProcessProvider();
ServiceProvider serviceP = new ServiceProvider();
HandleProvider handleP;
Dictionary<int, List<string>> processServices = new Dictionary<int, List<string>>();
int processSelectedItems;
int processSelectedPID;
Process processSelected;
Process virtualProtectProcess;
int virtualProtectAddress;
int virtualProtectSize;
Process memoryProcess;
int memoryAddress;
int memorySize;
List<Control> listControls = new List<Control>();
Queue<KeyValuePair<string, Icon>> statusMessages = new Queue<KeyValuePair<string, Icon>>();
List<string> log = new List<string>();
#endregion
#region Properties
public MenuItem WindowMenuItem
{
get { return windowMenuItem; }
}
public NotifyIcon NotifyIcon
{
get { return notifyIcon; }
}
public wyDay.Controls.VistaMenu VistaMenu
{
get { return vistaMenu; }
}
public ProcessProvider ProcessProvider
{
get { return processP; }
}
public ServiceProvider ServiceProvider
{
get { return serviceP; }
}
public HandleProvider HandleProvider
{
get { return handleP; }
}
public ProcessTree ProcessList
{
get { return treeProcesses; }
}
public Dictionary<int, List<string>> ProcessServices
{
get { return processServices; }
}
#endregion
#region Events
#region Buttons
private void buttonCloseProc_Click(object sender, EventArgs e)
{
panelProc.Visible = false;
this.AcceptButton = null;
treeProcesses.Enabled = true;
tabControl.Enabled = true;
}
private void buttonCloseVirtualProtect_Click(object sender, EventArgs e)
{
CloseVirtualProtect();
}
private void buttonGetProcAddress_Click(object sender, EventArgs e)
{
if (listModules.SelectedItems.Count != 1)
return;
bool loaded = Win32.GetModuleHandle(listModules.SelectedItems[0].ToolTipText) != 0;
int module;
int address = 0;
int ordinal = 0;
if (loaded)
module = Win32.GetModuleHandle(listModules.SelectedItems[0].ToolTipText);
else
module = Win32.LoadLibraryEx(listModules.SelectedItems[0].ToolTipText, 0, Win32.DONT_RESOLVE_DLL_REFERENCES);
if (module == 0)
{
textProcAddress.Text = "Could not load library!";
}
if ((textProcName.Text.Length > 0) &&
(textProcName.Text[0] >= '0' && textProcName.Text[0] <= '9'))
ordinal = (int)BaseConverter.ToNumberParse(textProcName.Text, false);
if (ordinal != 0)
{
address = Win32.GetProcAddress(module, ordinal);
}
else
{
address = Win32.GetProcAddress(module, textProcName.Text);
}
if (address != 0)
{
textProcAddress.Text = String.Format("0x{0:x8}", address);
textProcAddress.SelectAll();
textProcAddress.Focus();
}
else
{
textProcAddress.Text = Win32.GetLastErrorMessage();
}
// don't unload libraries we had before
if (module != 0 && !loaded)
Win32.FreeLibrary(module);
}
private void buttonSearch_Click(object sender, EventArgs e)
{
PerformSearch(buttonSearch.Text);
}
private void buttonVirtualProtect_Click(object sender, EventArgs e)
{
try
{
int old = 0;
int newprotect;
try
{
newprotect = (int)BaseConverter.ToNumberParse(textNewProtection.Text);
}
catch
{
return;
}
using (Win32.ProcessHandle phandle =
new Win32.ProcessHandle(virtualProtectProcess.Id, Win32.PROCESS_RIGHTS.PROCESS_VM_OPERATION))
{
if (!Win32.VirtualProtectEx(phandle, virtualProtectAddress,
virtualProtectSize, newprotect, out old))
{
MessageBox.Show("There was an error setting memory protection:\n\n" +
Win32.GetLastErrorMessage(), "Process Hacker",
MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
}
CloseVirtualProtect();
try
{
listMemory.SelectedItems[0].SubItems[4].Text =
((Win32.MEMORY_PROTECTION)newprotect).ToString().Replace("PAGE_", "");
}
catch { }
}
catch (Exception ex)
{
MessageBox.Show("There was an error setting memory protection:\n\n" + ex.Message, "Process Hacker",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
#endregion
#region Handle Context Menu
private void menuHandle_Popup(object sender, EventArgs e)
{
if (listHandles.SelectedItems.Count == 0)
{
Misc.DisableAllMenuItems(menuHandle);
}
else if (listHandles.SelectedItems.Count == 1)
{
Misc.EnableAllMenuItems(menuHandle);
propertiesHandleMenuItem.Enabled = false;
string type = listHandles.SelectedItems[0].SubItems[0].Text;
if (type == "Token" || type == "Event" || type == "Mutant" || type == "Section")
propertiesHandleMenuItem.Enabled = true;
}
else
{
Misc.EnableAllMenuItems(menuHandle);
closeHandleMenuItem.Enabled = false;
}
}
private void closeHandleMenuItem_Click(object sender, EventArgs e)
{
try
{
int handle = (int)BaseConverter.ToNumberParse(listHandles.SelectedItems[0].SubItems[2].Text);
using (Win32.ProcessHandle process =
new Win32.ProcessHandle(processSelectedPID, Win32.PROCESS_RIGHTS.PROCESS_DUP_HANDLE))
{
if (Win32.ZwDuplicateObject(process.Handle, handle, 0, 0, 0, 0,
0x1 // DUPLICATE_CLOSE_SOURCE
) != 0)
throw new Exception(Win32.GetLastErrorMessage());
}
}
catch (Exception ex)
{
MessageBox.Show("Could not close handle:\n\n" + ex.Message,
"Process Hacker", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
}
private void propertiesHandleMenuItem_Click(object sender, EventArgs e)
{
string type = listHandles.SelectedItems[0].Text;
try
{
int handle = int.Parse(listHandles.SelectedItems[0].Name);
using (Win32.ProcessHandle phandle = new Win32.ProcessHandle(
processSelectedPID, Win32.PROCESS_RIGHTS.PROCESS_DUP_HANDLE))
{
if (type == "Token")
{
TokenWindow tokForm = new TokenWindow(new Win32.RemoteTokenHandle(phandle, handle));
tokForm.TopMost = this.TopMost;
tokForm.Text = String.Format("Token - Handle 0x{0:x} owned by {1} (PID {2})",
short.Parse(listHandles.SelectedItems[0].Name),
processP.Dictionary[processSelectedPID].Name,
processSelectedPID);
tokForm.ShowDialog();
}
else if (type == "Event")
{
Win32.RemoteHandle rhandle = new Win32.RemoteHandle(phandle, handle);
int event_handle = rhandle.GetHandle((int)Win32.SYNC_RIGHTS.EVENT_QUERY_STATE);
Win32.EVENT_BASIC_INFORMATION ebi = new Win32.EVENT_BASIC_INFORMATION();
int retLen;
Win32.ZwQueryEvent(event_handle, Win32.EVENT_INFORMATION_CLASS.EventBasicInformation,
ref ebi, Marshal.SizeOf(ebi), out retLen);
InformationBox info = new InformationBox(
"Type: " + ebi.EventType.ToString().Replace("Event", "") +
"\r\nState: " + (ebi.EventState != 0 ? "True" : "False"));
info.ShowDialog();
Win32.CloseHandle(event_handle);
}
else if (type == "Mutant")
{
Win32.RemoteHandle rhandle = new Win32.RemoteHandle(phandle, handle);
int mutant_handle = rhandle.GetHandle((int)Win32.SYNC_RIGHTS.MUTEX_MODIFY_STATE);
Win32.MUTANT_BASIC_INFORMATION mbi = new Win32.MUTANT_BASIC_INFORMATION();
int retLen;
Win32.ZwQueryMutant(mutant_handle, Win32.MUTANT_INFORMATION_CLASS.MutantBasicInformation,
ref mbi, Marshal.SizeOf(mbi), out retLen);
InformationBox info = new InformationBox(
"Count: " + mbi.CurrentCount +
"\r\nOwned by Caller: " + (mbi.OwnedByCaller != 0 ? "True" : "False") +
"\r\nAbandoned: " + (mbi.AbandonedState != 0 ? "True" : "False"));
info.ShowDialog();
Win32.CloseHandle(mutant_handle);
}
else if (type == "Section")
{
Win32.RemoteHandle rhandle = new Win32.RemoteHandle(phandle, handle);
int section_handle = rhandle.GetHandle((int)Win32.SECTION_RIGHTS.SECTION_QUERY);
Win32.SECTION_BASIC_INFORMATION sbi = new Win32.SECTION_BASIC_INFORMATION();
Win32.SECTION_IMAGE_INFORMATION sii = new Win32.SECTION_IMAGE_INFORMATION();
int retLen;
int retVal;
Win32.ZwQuerySection(section_handle, Win32.SECTION_INFORMATION_CLASS.SectionBasicInformation,
ref sbi, Marshal.SizeOf(sbi), out retLen);
retVal = Win32.ZwQuerySection(section_handle, Win32.SECTION_INFORMATION_CLASS.SectionImageInformation,
ref sii, Marshal.SizeOf(sii), out retLen);
InformationBox info = new InformationBox(
"Attributes: " + Misc.FlagsToString(typeof(Win32.SECTION_ATTRIBUTES), (long)sbi.SectionAttributes) +
"\r\nSize: " + Misc.GetNiceSizeName(sbi.SectionSize) + " (" + sbi.SectionSize.ToString() + " B)" +
(retVal == 0 ? ("\r\n\r\nImage Entry Point: 0x" + sii.EntryPoint.ToString("x8") +
"\r\nImage Machine Type: " + ((PE.MachineType)sii.ImageMachineType).ToString() +
"\r\nImage Characteristics: " + ((PE.ImageCharacteristics)sii.ImageCharacteristics).ToString() +
"\r\nImage Subsystem: " + ((PE.ImageSubsystem)sii.ImageSubsystem).ToString() +
"\r\nStack Reserve: 0x" + sii.StackReserved.ToString("x")) : ""));
info.ShowDialog();
Win32.CloseHandle(section_handle);
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Process Hacker", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
#endregion
#region Lists
private void listMemory_DoubleClick(object sender, EventArgs e)
{
readWriteMemoryMemoryMenuItem_Click(null, null);
}
private void listModules_DoubleClick(object sender, EventArgs e)
{
goToInMemoryViewModuleMenuItem_Click(null, null);
}
private void listProcesses_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyData == Keys.Delete)
{
terminateMenuItem_Click(null, null);
}
}
private void listProcesses_SelectionChanged(object sender, EventArgs e)
{
listMemory.Enabled = true;
listModules.Enabled = true;
processSelectedItems = treeProcesses.SelectedNodes.Count;
if (processSelectedItems == 1)
{
processSelectedPID = treeProcesses.SelectedNodes[0].PID;
treeMisc.Enabled = true;
buttonSearch.Enabled = true;
try
{
try
{
if (processSelected != null)
processSelected.Close();
}
catch
{ }
processSelected = Process.GetProcessById(processSelectedPID);
UpdateProcessExtra();
}
catch
{
processSelected = null;
listMemory.Enabled = false;
listModules.Enabled = false;
}
}
else
{
processSelectedPID = -1;
try
{
if (processSelected != null)
processSelected.Close();
}
catch
{ }
processSelected = null;
treeMisc.Enabled = false;
buttonSearch.Enabled = false;
UpdateProcessExtra();
}
}
private void listServices_DoubleClick(object sender, EventArgs e)
{
propertiesServiceMenuItem_Click(null, null);
}
#endregion
#region Main Menu
private void selectAllHackerMenuItem_Click(object sender, EventArgs e)
{
foreach (Control c in listControls)
{
if (c.Focused)
{
if (c is ListView)
{
Misc.SelectAll((c as ListView).Items);
}
else if (c is TreeViewAdv)
{
Misc.SelectAll((c as TreeViewAdv).AllNodes);
}
}
}
}
private void getSNFAMenuItem_Click(object sender, EventArgs e)
{
PromptBox box = new PromptBox();
if (box.ShowDialog() == DialogResult.OK)
{
try
{
int address = (int)BaseConverter.ToNumberParse(box.Value);
InformationBox infoBox = new InformationBox(Symbols.GetNameFromAddress(address));
infoBox.ShowDialog();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Process Hacker", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
private void runAsMenuItem_Click(object sender, EventArgs e)
{
RunWindow run = new RunWindow();
run.TopMost = this.TopMost;
run.ShowDialog();
}
private void findHandlesMenuItem_Click(object sender, EventArgs e)
{
HandleFilterForm.Show();
HandleFilterForm.Activate();
}
private void inspectPEFileMenuItem_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
if (ofd.ShowDialog() == DialogResult.OK)
{
PEWindow pw = Program.GetPEWindow(ofd.FileName, new Program.PEWindowInvokeAction(delegate(PEWindow f)
{
try
{
f.Show();
}
catch
{ }
}));
}
}
private void logMenuItem_Click(object sender, EventArgs e)
{
string str = "";
foreach (string item in log)
str += item + "\r\n";
InformationBox box = new InformationBox(str);
box.TopMost = this.TopMost;
box.ShowDialog();
}
private void aboutMenuItem_Click(object sender, EventArgs e)
{
AboutWindow about = new AboutWindow();
about.TopMost = this.TopMost;
about.ShowDialog();
}
private void optionsMenuItem_Click(object sender, EventArgs e)
{
OptionsWindow options = new OptionsWindow();
options.TopMost = this.TopMost;
options.ShowDialog();
RefreshInterval = Properties.Settings.Default.RefreshInterval;
timerFire.Interval = RefreshInterval;
}
private void helpMenuItem_Click(object sender, EventArgs e)
{
HelpForm.Show();
HelpForm.Activate();
}
private void exitMenuItem_Click(object sender, EventArgs e)
{
this.Close();
}
private void sysInfoMenuItem_Click(object sender, EventArgs e)
{
if (SysInfoWindow == null)
{
SysInfoWindow = new SysInfoWindow();
}
SysInfoWindow.Show();
SysInfoWindow.Activate();
}
#endregion
#region Memory Context Menu
private void menuMemory_Popup(object sender, EventArgs e)
{
if (listMemory.SelectedItems.Count == 1 && treeProcesses.SelectedTreeNodes.Count == 1)
{
Misc.EnableAllMenuItems(menuMemory);
}
else
{
Misc.DisableAllMenuItems(menuMemory);
if (treeProcesses.SelectedTreeNodes.Count == 1)
readWriteAddressMemoryMenuItem.Enabled = true;
if (listMemory.SelectedItems.Count > 1)
{
copyMemoryMenuItem.Enabled = true;
}
if (listMemory.Items.Count > 0)
{
selectAllMemoryMenuItem.Enabled = true;
}
else
{
selectAllMemoryMenuItem.Enabled = false;
}
}
}
private void changeMemoryProtectionMemoryMenuItem_Click(object sender, EventArgs e)
{
virtualProtectProcess = Process.GetProcessById(processSelectedPID);
virtualProtectAddress = Int32.Parse(listMemory.SelectedItems[0].SubItems[0].Text.Replace("0x", ""),
System.Globalization.NumberStyles.HexNumber);
virtualProtectSize = Int32.Parse(listMemory.SelectedItems[0].SubItems[1].Text.Replace("0x", ""),
System.Globalization.NumberStyles.HexNumber);
ShowVirtualProtect();
}
private void readWriteMemoryMemoryMenuItem_Click(object sender, EventArgs e)
{
memoryProcess = Process.GetProcessById(processSelectedPID);
memoryAddress = Int32.Parse(listMemory.SelectedItems[0].SubItems[0].Text.Replace("0x", ""),
System.Globalization.NumberStyles.HexNumber);
memorySize = Int32.Parse(listMemory.SelectedItems[0].SubItems[1].Text.Replace("0x", ""),
System.Globalization.NumberStyles.HexNumber);
ReadWriteMemory();
}
private void readWriteAddressMemoryMenuItem_Click(object sender, EventArgs e)
{
PromptBox prompt = new PromptBox();
if (prompt.ShowDialog() == DialogResult.OK)
{
int address = -1;
bool found = false;
try
{
address = (int)BaseConverter.ToNumberParse(prompt.Value);
}
catch
{
MessageBox.Show("Invalid address!", "Process Hacker", MessageBoxButtons.OK,
MessageBoxIcon.Error);
return;
}
if (address < 0)
return;
memoryProcess = Process.GetProcessById(processSelectedPID);
foreach (ListViewItem item in listMemory.Items)
{
int itemaddress = Int32.Parse(item.SubItems[0].Text.Replace("0x", ""),
System.Globalization.NumberStyles.HexNumber);
if (itemaddress > address)
{
listMemory.Items[item.Index - 1].Selected = true;
listMemory.Items[item.Index - 1].EnsureVisible();
memoryAddress = Int32.Parse(listMemory.Items[item.Index - 1].SubItems[0].Text.Replace("0x", ""),
System.Globalization.NumberStyles.HexNumber);
memorySize = Int32.Parse(listMemory.Items[item.Index - 1].SubItems[1].Text.Replace("0x", ""),
System.Globalization.NumberStyles.HexNumber);
found = true;
break;
}
}
if (!found)
{
MessageBox.Show("Memory address not found!", "Process Hacker", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
MemoryEditor m_e = ReadWriteMemory(true);
try
{
m_e.BeginInvoke(new MethodInvoker(delegate { m_e.Select(address - memoryAddress, 1); }));
}
catch
{ }
}
}
private void selectAllMemoryMenuItem_Click(object sender, EventArgs e)
{
Misc.SelectAll(listMemory.Items);
}
#endregion
#region Misc. Context Menu
private void menuMisc_Popup(object sender, EventArgs e)
{
if (treeMisc.SelectedNode == null)
copyMiscMenuItem.Enabled = false;
else
copyMiscMenuItem.Enabled = true;
}
private void copyMiscMenuItem_Click(object sender, EventArgs e)
{
Clipboard.SetText(treeMisc.SelectedNode.Text);
}
#endregion
#region Module Context Menu
private void menuModule_Popup(object sender, EventArgs e)
{
if (listModules.SelectedItems.Count == 1 && treeProcesses.SelectedTreeNodes.Count == 1)
{
if (processSelectedPID == 4)
{
Misc.DisableAllMenuItems(menuModule);
inspectModuleMenuItem.Enabled = true;
searchModuleMenuItem.Enabled = true;
copyFileNameMenuItem.Enabled = true;
copyModuleMenuItem.Enabled = true;
openContainingFolderMenuItem.Enabled = true;
propertiesMenuItem.Enabled = true;
}
else
{
Misc.EnableAllMenuItems(menuModule);
}
}
else
{
Misc.DisableAllMenuItems(menuModule);
if (listModules.SelectedItems.Count > 1)
{
copyFileNameMenuItem.Enabled = true;
copyModuleMenuItem.Enabled = true;
}
}
if (listModules.Items.Count > 0)
{
selectAllModuleMenuItem.Enabled = true;
}
else
{
selectAllModuleMenuItem.Enabled = false;
}
}
private void searchModuleMenuItem_Click(object sender, EventArgs e)
{
try
{
Process.Start(Properties.Settings.Default.SearchEngine.Replace("%s",
listModules.SelectedItems[0].Text));
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Process Hacker", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void copyFileNameMenuItem_Click(object sender, EventArgs e)
{
string text = "";
for (int i = 0; i < listModules.SelectedItems.Count; i++)
{
text += listModules.SelectedItems[i].ToolTipText;
if (i != listModules.SelectedItems.Count - 1)
text += "\r\n";
}
Clipboard.SetText(text);
}
private void openContainingFolderMenuItem_Click(object sender, EventArgs e)
{
try
{
Process.Start("explorer.exe", "/select," + listModules.SelectedItems[0].ToolTipText);
}
catch (Exception ex)
{
MessageBox.Show("Could not start process:\n\n" + ex.Message, "Process Hacker",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void propertiesMenuItem_Click(object sender, EventArgs e)
{
Win32.SHELLEXECUTEINFO info = new Win32.SHELLEXECUTEINFO();
info.cbSize = System.Runtime.InteropServices.Marshal.SizeOf(typeof(Win32.SHELLEXECUTEINFO));
info.lpFile = listModules.SelectedItems[0].ToolTipText;
info.nShow = Win32.SW_SHOW;
info.fMask = Win32.SEE_MASK_INVOKEIDLIST;
info.lpVerb = "properties";
Win32.ShellExecuteEx(ref info);
}
private void inspectModuleMenuItem_Click(object sender, EventArgs e)
{
try
{
PEWindow pw = Program.GetPEWindow(listModules.SelectedItems[0].ToolTipText,
new Program.PEWindowInvokeAction(delegate(PEWindow f)
{
try
{
f.Show();
f.Activate();
}
catch
{ }
}));
}
catch (Exception ex)
{
MessageBox.Show("Error inspecting:\n\n" + ex.Message, "Process Hacker", MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
}
private void goToInMemoryViewModuleMenuItem_Click(object sender, EventArgs e)
{
string address = listModules.SelectedItems[0].SubItems[1].Text;
foreach (ListViewItem item in listMemory.Items)
{
if (item.SubItems[0].Text == address)
{
DeselectAll(listMemory);
item.Selected = true;
tabControl.SelectedTab = tabMemory;
listMemory.EnsureVisible(item.Index);
listMemory.Select();
listMemory.Focus();
break;
}
}
}
private void getFuncAddressMenuItem_Click(object sender, EventArgs e)
{
treeProcesses.Enabled = false;
tabControl.Enabled = false;
panelProc.Visible = true;
panelProc.BringToFront();
this.AcceptButton = buttonGetProcAddress;
textProcName.SelectAll();
textProcName.Focus();
textProcAddress.Text = "";
}
private void changeMemoryProtectionModuleMenuItem_Click(object sender, EventArgs e)
{
virtualProtectProcess = Process.GetProcessById(processSelectedPID);
ProcessModule module = null;
foreach (ProcessModule m in virtualProtectProcess.Modules)
{
if (m.FileName == listModules.SelectedItems[0].ToolTipText)
{
module = m;
break;
}
}
if (module == null)
return;
virtualProtectAddress = module.BaseAddress.ToInt32();
virtualProtectSize = module.ModuleMemorySize;
ShowVirtualProtect();
}
private void readMemoryModuleMenuItem_Click(object sender, EventArgs e)
{
Process p = Process.GetProcessById(processSelectedPID);
ProcessModule module = null;
foreach (ProcessModule m in p.Modules)
{
if (m.FileName == listModules.SelectedItems[0].ToolTipText)
{
module = m;
break;
}
}
if (module == null)
return;
memoryProcess = p;
memoryAddress = module.BaseAddress.ToInt32();
memorySize = module.ModuleMemorySize;
ReadWriteMemory(true);
}
private void selectAllModuleMenuItem_Click(object sender, EventArgs e)
{
Misc.SelectAll(listModules.Items);
}
#endregion
#region Notification Icon & Menu
private void notifyIcon_MouseDoubleClick(object sender, MouseEventArgs e)
{
showHideMenuItem_Click(null, null);
}
private void showHideMenuItem_Click(object sender, EventArgs e)
{
this.Visible = !this.Visible;
this.WindowState = FormWindowState.Normal;
this.Activate();
}
private void exitTrayMenuItem_Click(object sender, EventArgs e)
{
this.Close();
}
#endregion
#region Process Context Menu
private void menuProcess_Popup(object sender, EventArgs e)
{
if (treeProcesses.SelectedTreeNodes.Count == 0)
{
Misc.DisableAllMenuItems(menuProcess);
}
else if (treeProcesses.SelectedTreeNodes.Count == 1)
{
Misc.EnableAllMenuItems(menuProcess);
priorityMenuItem.Text = "&Priority";
terminateMenuItem.Text = "&Terminate Process";
suspendMenuItem.Text = "&Suspend Process";
resumeMenuItem.Text = "&Resume Process";
try
{
List<string> services = processServices[processSelectedPID];
if (services == null)
throw new Exception();
if (services.Count == 0)
throw new Exception();
servicesProcessMenuItem.Enabled = true;
}
catch
{
servicesProcessMenuItem.Enabled = false;
}
realTimeMenuItem.Checked = false;
highMenuItem.Checked = false;
aboveNormalMenuItem.Checked = false;
normalMenuItem.Checked = false;
belowNormalMenuItem.Checked = false;
idleMenuItem.Checked = false;
try
{
switch (Process.GetProcessById(processSelectedPID).PriorityClass)
{
case ProcessPriorityClass.RealTime:
realTimeMenuItem.Checked = true;
break;
case ProcessPriorityClass.High:
highMenuItem.Checked = true;
break;
case ProcessPriorityClass.AboveNormal:
aboveNormalMenuItem.Checked = true;
break;
case ProcessPriorityClass.Normal:
normalMenuItem.Checked = true;
break;
case ProcessPriorityClass.BelowNormal:
belowNormalMenuItem.Checked = true;
break;
case ProcessPriorityClass.Idle:
idleMenuItem.Checked = true;
break;
}
}
catch (Exception ex)
{
priorityMenuItem.Text = "(" + ex.Message + ")";
priorityMenuItem.Enabled = false;
}
}
else
{
Misc.DisableAllMenuItems(menuProcess);
terminateMenuItem.Text = "&Terminate Processes";
suspendMenuItem.Text = "&Suspend Processes";
resumeMenuItem.Text = "&Resume Processes";
terminateMenuItem.Enabled = true;
suspendMenuItem.Enabled = true;
resumeMenuItem.Enabled = true;
copyProcessMenuItem.Enabled = true;
}
if (treeProcesses.Model.Nodes.Count == 0)
{
selectAllProcessMenuItem.Enabled = false;
}
else
{
selectAllProcessMenuItem.Enabled = true;
}
}
private void terminateMenuItem_Click(object sender, EventArgs e)
{
if (MessageBox.Show("Are you sure you want to terminate the selected process(es)?",
"Process Hacker", MessageBoxButtons.YesNo,
MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
{
foreach (ProcessNode node in treeProcesses.SelectedNodes)
{
try
{
using (Win32.ProcessHandle handle = new Win32.ProcessHandle(node.PID,
Win32.PROCESS_RIGHTS.PROCESS_TERMINATE))
handle.Terminate();
}
catch (Exception ex)
{
DialogResult result = MessageBox.Show("Could not terminate process \"" + node.Name +
"\" with PID " + node.PID.ToString() + ":\n\n" +
ex.Message, "Process Hacker", MessageBoxButtons.OKCancel, MessageBoxIcon.Error);
if (result == DialogResult.Cancel)
return;
}
}
}
}
private void suspendMenuItem_Click(object sender, EventArgs e)
{
foreach (ProcessNode node in treeProcesses.SelectedNodes)
{
Process process;
try
{
process = Process.GetProcessById(node.PID);
}
catch { return; }
if (Properties.Settings.Default.WarnDangerous && IsDangerousPID(process.Id))
{
DialogResult result = MessageBox.Show("The process with PID " + process.Id + " is a system process. Are you" +
" sure you want to suspend it?", "Process Hacker", MessageBoxButtons.YesNoCancel,
MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button2);
if (result == DialogResult.No)
continue;
else if (result == DialogResult.Cancel)
return;
}
try
{
foreach (ProcessThread thread in process.Threads)
{
using (Win32.ThreadHandle handle = new Win32.ThreadHandle(thread.Id,
Win32.THREAD_RIGHTS.THREAD_SUSPEND_RESUME))
handle.Suspend();
}
}
catch (Exception ex)
{
DialogResult result = MessageBox.Show("Could not suspend process with PID " + node.PID +
".\n\n" + ex.Message, "Process Hacker", MessageBoxButtons.OKCancel, MessageBoxIcon.Error);
if (result == DialogResult.Cancel)
return;
}
}
}
private void resumeMenuItem_Click(object sender, EventArgs e)
{
foreach (ProcessNode node in treeProcesses.SelectedNodes)
{
Process process;
try
{
process = Process.GetProcessById(node.PID);
}
catch { return; }
try
{
foreach (ProcessThread thread in process.Threads)
{
using (Win32.ThreadHandle handle = new Win32.ThreadHandle(thread.Id,
Win32.THREAD_RIGHTS.THREAD_SUSPEND_RESUME))
handle.Resume();
}
}
catch (Exception ex)
{
DialogResult result = MessageBox.Show("Could not resume process with PID " + node.PID.ToString() +
".\n\n" + ex.Message, "Process Hacker", MessageBoxButtons.OKCancel, MessageBoxIcon.Error);
if (result == DialogResult.Cancel)
return;
}
}
}
private void inspectProcessMenuItem_Click(object sender, EventArgs e)
{
try
{
ProcessWindow pForm = Program.GetProcessWindow(processP.Dictionary[processSelectedPID],
new Program.PWindowInvokeAction(delegate(ProcessWindow f)
{
f.Show();
f.Activate();
}));
}
catch (Exception ex)
{
MessageBox.Show("Could not inspect the process:\n\n" + ex.Message,
"Process Hacker", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void affinityProcessMenuItem_Click(object sender, EventArgs e)
{
ProcessAffinity affForm = new ProcessAffinity(processSelectedPID);
try
{
affForm.TopMost = this.TopMost;
affForm.ShowDialog();
}
catch
{ }
}
private void servicesProcessMenuItem_Click(object sender, EventArgs e)
{
try
{
ServiceWindow sw = new ServiceWindow(processServices[processSelectedPID].ToArray());
sw.TopMost = this.TopMost;
sw.ShowDialog();
}
catch
{ }
}
private void tokenMenuItem_Click(object sender, EventArgs e)
{
try
{
using (Win32.ProcessHandle process = new Win32.ProcessHandle(processSelectedPID,
Program.MinProcessQueryRights))
{
TokenWindow tokForm = new TokenWindow(process);
tokForm.TopMost = this.TopMost;
tokForm.Text = "Token - " + processP.Dictionary[processSelectedPID].Name +
" (PID " + processSelectedPID.ToString() + ")";
tokForm.ShowDialog();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Process Hacker", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void terminatorProcessMenuItem_Click(object sender, EventArgs e)
{
TerminatorWindow w = new TerminatorWindow(processSelectedPID);
w.Text = "Terminator - " + processP.Dictionary[processSelectedPID].Name +
" (PID " + processSelectedPID.ToString() + ")";
w.ShowDialog();
}
#region Run As
private void launchAsUserProcessMenuItem_Click(object sender, EventArgs e)
{
try
{
Properties.Settings.Default.RunAsCommand = Misc.GetRealPath(processSelected.MainModule.FileName);
RunWindow run = new RunWindow();
run.TopMost = this.TopMost;
run.ShowDialog();
}
catch
{ }
}
private void launchAsThisUserProcessMenuItem_Click(object sender, EventArgs e)
{
try
{
RunWindow run = new RunWindow();
run.TopMost = this.TopMost;
run.UsePID(processSelectedPID);
run.ShowDialog();
}
catch
{ }
}
#endregion
#region Injector
private void startProcessProcessMenuItem_Click(object sender, EventArgs e)
{
PromptBox box = new PromptBox();
box.TextBox.AutoCompleteSource = AutoCompleteSource.FileSystem;
box.TextBox.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
if (box.ShowDialog() == DialogResult.OK)
{
ProcessStartInfo info = new ProcessStartInfo();
info.FileName = Application.StartupPath + "\\Injector.exe";
info.Arguments = "createprocessc " + processSelectedPID.ToString() + " \"" +
box.Value.Replace("\"", "\\\"") + "\"";
info.RedirectStandardOutput = true;
info.UseShellExecute = false;
info.CreateNoWindow = true;
Process p = Process.Start(info);
p.WaitForExit();
if (p.ExitCode != 0)
{
InformationBox infoBox = new InformationBox(p.StandardOutput.ReadToEnd() + "\r\nReturn code: " + p.ExitCode +
" (" + Win32.GetErrorMessage(p.ExitCode) + ")");
infoBox.ShowDialog();
}
}
}
private void getCommandLineProcessMenuItem_Click(object sender, EventArgs e)
{
ProcessStartInfo info = new ProcessStartInfo();
info.FileName = Application.StartupPath + "\\Injector.exe";
info.Arguments = "cmdline " + processSelectedPID.ToString();
info.RedirectStandardOutput = true;
info.UseShellExecute = false;
info.CreateNoWindow = true;
Process p = Process.Start(info);
p.WaitForExit();
InformationBox infoBox = new InformationBox(p.StandardOutput.ReadToEnd() + (p.ExitCode != 0 ? "\r\nReturn code: " + p.ExitCode +
" (" + Win32.GetErrorMessage(p.ExitCode) + ")" : ""));
infoBox.ShowDialog();
}
private void exitProcessProcessMenuItem_Click(object sender, EventArgs e)
{
if (MessageBox.Show("Are you sure you want to terminate the selected process?", "Process Hacker",
MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button2) == DialogResult.No)
return;
ProcessStartInfo info = new ProcessStartInfo();
info.FileName = Application.StartupPath + "\\Injector.exe";
info.Arguments = "exitprocess " + processSelectedPID.ToString();
info.RedirectStandardOutput = true;
info.UseShellExecute = false;
info.CreateNoWindow = true;
Process p = Process.Start(info);
p.WaitForExit();
if (p.ExitCode != 0)
{
InformationBox infoBox = new InformationBox(p.StandardOutput.ReadToEnd() + "\r\nReturn code: " + p.ExitCode +
" (" + Win32.GetErrorMessage(p.ExitCode) + ")");
infoBox.ShowDialog();
}
}
#endregion
#region Priority
private void realTimeMenuItem_Click(object sender, EventArgs e)
{
SetProcessPriority(ProcessPriorityClass.RealTime);
}
private void highMenuItem_Click(object sender, EventArgs e)
{
SetProcessPriority(ProcessPriorityClass.High);
}
private void aboveNormalMenuItem_Click(object sender, EventArgs e)
{
SetProcessPriority(ProcessPriorityClass.AboveNormal);
}
private void normalMenuItem_Click(object sender, EventArgs e)
{
SetProcessPriority(ProcessPriorityClass.Normal);
}
private void belowNormalMenuItem_Click(object sender, EventArgs e)
{
SetProcessPriority(ProcessPriorityClass.BelowNormal);
}
private void idleMenuItem_Click(object sender, EventArgs e)
{
SetProcessPriority(ProcessPriorityClass.Idle);
}
#endregion
private void searchProcessMenuItem_Click(object sender, EventArgs e)
{
try
{
Process.Start(Properties.Settings.Default.SearchEngine.Replace("%s",
treeProcesses.SelectedNodes[0].Name));
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Process Hacker", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void selectAllProcessMenuItem_Click(object sender, EventArgs e)
{
Misc.SelectAll(treeProcesses.Tree.AllNodes);
}
#endregion
#region Providers
public void processP_DictionaryAdded(ProcessItem item)
{
ProcessItem parent = new ProcessItem();
string parentText = "";
if (item.ParentPID != -1)
{
try
{
parent = processP.Dictionary[item.ParentPID];
parentText += " started by " + parent.Name + " (PID " + parent.PID.ToString() + ")";
}
catch
{ }
}
this.QueueMessage("New Process: " + item.Name + " (PID " + item.PID.ToString() + ")" + parentText, item.Icon);
if (NPMenuItem.Checked)
notifyIcon.ShowBalloonTip(2000, "New Process",
"The process " + item.Name + " (" + item.PID.ToString() +
") was started" + ((parentText != "") ? " by " +
parent.Name + " (PID " + parent.PID.ToString() + ")" : "") + ".", ToolTipIcon.Info);
}
public void processP_DictionaryRemoved(ProcessItem item)
{
this.QueueMessage("Terminated Process: " + item.Name + " (PID " + item.PID.ToString() + ")", item.Icon);
if (processServices.ContainsKey(item.PID))
processServices.Remove(item.PID);
if (TPMenuItem.Checked)
notifyIcon.ShowBalloonTip(2000, "Terminated Process",
"The process " + item.Name + " (" + item.PID.ToString() + ") was terminated.", ToolTipIcon.Info);
}
public void serviceP_DictionaryAdded(ServiceItem item)
{
this.QueueMessage("New Service: " + item.Status.ServiceName +
" (" + item.Status.ServiceStatusProcess.ServiceType.ToString() + ")" +
((item.Status.DisplayName != "") ?
" (" + item.Status.DisplayName + ")" :
""), null);
if (NSMenuItem.Checked)
notifyIcon.ShowBalloonTip(2000, "New Service",
"The service " + item.Status.ServiceName + " (" + item.Status.DisplayName + ") has been created.",
ToolTipIcon.Info);
}
public void serviceP_DictionaryAdded_Process(ServiceItem item)
{
if (item.Status.ServiceStatusProcess.ProcessID != 0)
{
if (!processServices.ContainsKey(item.Status.ServiceStatusProcess.ProcessID))
processServices.Add(item.Status.ServiceStatusProcess.ProcessID, new List<string>());
processServices[item.Status.ServiceStatusProcess.ProcessID].Add(item.Status.ServiceName);
}
}
public void serviceP_DictionaryModified(ServiceItem oldItem, ServiceItem newItem)
{
Win32.SERVICE_STATE oldState = oldItem.Status.ServiceStatusProcess.CurrentState;
Win32.SERVICE_STATE newState = newItem.Status.ServiceStatusProcess.CurrentState;
if ((oldState == Win32.SERVICE_STATE.Paused || oldState == Win32.SERVICE_STATE.Stopped ||
oldState == Win32.SERVICE_STATE.StartPending) &&
newState == Win32.SERVICE_STATE.Running)
{
this.QueueMessage("Service Started: " + newItem.Status.ServiceName +
" (" + newItem.Status.ServiceStatusProcess.ServiceType.ToString() + ")" +
((newItem.Status.DisplayName != "") ?
" (" + newItem.Status.DisplayName + ")" :
""), null);
if (startedSMenuItem.Checked)
notifyIcon.ShowBalloonTip(2000, "Service Started",
"The service " + newItem.Status.ServiceName + " (" + newItem.Status.DisplayName + ") has been started.",
ToolTipIcon.Info);
}
if (oldState == Win32.SERVICE_STATE.Running &&
newState == Win32.SERVICE_STATE.Paused)
this.QueueMessage("Service Paused: " + newItem.Status.ServiceName +
" (" + newItem.Status.ServiceStatusProcess.ServiceType.ToString() + ")" +
((newItem.Status.DisplayName != "") ?
" (" + newItem.Status.DisplayName + ")" :
""), null);
if (oldState == Win32.SERVICE_STATE.Running &&
newState == Win32.SERVICE_STATE.Stopped)
{
this.QueueMessage("Service Stopped: " + newItem.Status.ServiceName +
" (" + newItem.Status.ServiceStatusProcess.ServiceType.ToString() + ")" +
((newItem.Status.DisplayName != "") ?
" (" + newItem.Status.DisplayName + ")" :
""), null);
if (stoppedSMenuItem.Checked)
notifyIcon.ShowBalloonTip(2000, "Service Stopped",
"The service " + newItem.Status.ServiceName + " (" + newItem.Status.DisplayName + ") has been stopped.",
ToolTipIcon.Info);
}
}
public void serviceP_DictionaryModified_Process(ServiceItem oldItem, ServiceItem newItem)
{
ServiceItem sitem = (ServiceItem)newItem;
if (sitem.Status.ServiceStatusProcess.ProcessID != 0)
{
if (!processServices.ContainsKey(sitem.Status.ServiceStatusProcess.ProcessID))
processServices.Add(sitem.Status.ServiceStatusProcess.ProcessID, new List<string>());
if (!processServices[sitem.Status.ServiceStatusProcess.ProcessID].Contains(
sitem.Status.ServiceName))
processServices[sitem.Status.ServiceStatusProcess.ProcessID].Add(sitem.Status.ServiceName);
processServices[sitem.Status.ServiceStatusProcess.ProcessID].Sort();
}
else
{
int oldId = ((ServiceItem)oldItem).Status.ServiceStatusProcess.ProcessID;
if (processServices.ContainsKey(oldId))
{
if (processServices[oldId].Contains(
sitem.Status.ServiceName))
processServices[oldId].Remove(sitem.Status.ServiceName);
}
}
}
public void serviceP_DictionaryRemoved(ServiceItem item)
{
this.QueueMessage("Deleted Service: " + item.Status.ServiceName +
" (" + item.Status.ServiceStatusProcess.ServiceType.ToString() + ")" +
((item.Status.DisplayName != "") ?
" (" + item.Status.DisplayName + ")" :
""), null);
if (DSMenuItem.Checked)
notifyIcon.ShowBalloonTip(2000, "Service Deleted",
"The service " + item.Status.ServiceName + " (" + item.Status.DisplayName + ") has been deleted.",
ToolTipIcon.Info);
}
public void serviceP_DictionaryRemoved_Process(ServiceItem item)
{
if (item.Status.ServiceStatusProcess.ProcessID != 0)
{
if (!processServices.ContainsKey(item.Status.ServiceStatusProcess.ProcessID))
processServices.Add(item.Status.ServiceStatusProcess.ProcessID, new List<string>());
if (!processServices[item.Status.ServiceStatusProcess.ProcessID].Contains(
item.Status.ServiceName))
processServices[item.Status.ServiceStatusProcess.ProcessID].Add(item.Status.ServiceName);
processServices[item.Status.ServiceStatusProcess.ProcessID].Sort();
}
}
#endregion
#region Service Context Menu
private void menuService_Popup(object sender, EventArgs e)
{
if (listServices.SelectedItems.Count == 0)
{
Misc.DisableAllMenuItems(menuService);
goToProcessServiceMenuItem.Visible = true;
startServiceMenuItem.Visible = true;
continueServiceMenuItem.Visible = true;
pauseServiceMenuItem.Visible = true;
stopServiceMenuItem.Visible = true;
selectAllServiceMenuItem.Enabled = true;
}
else if (listServices.SelectedItems.Count == 1)
{
Misc.EnableAllMenuItems(menuService);
goToProcessServiceMenuItem.Visible = true;
startServiceMenuItem.Visible = true;
continueServiceMenuItem.Visible = true;
pauseServiceMenuItem.Visible = true;
stopServiceMenuItem.Visible = true;
try
{
ServiceItem item = serviceP.Dictionary[listServices.SelectedItems[0].Name];
if (item.Status.ServiceStatusProcess.ProcessID != 0)
{
goToProcessServiceMenuItem.Enabled = true;
}
else
{
goToProcessServiceMenuItem.Enabled = false;
}
if ((item.Status.ServiceStatusProcess.ControlsAccepted & Win32.SERVICE_ACCEPT.PauseContinue)
== 0)
{
continueServiceMenuItem.Visible = false;
pauseServiceMenuItem.Visible = false;
}
else
{
continueServiceMenuItem.Visible = true;
pauseServiceMenuItem.Visible = true;
}
if (item.Status.ServiceStatusProcess.CurrentState == Win32.SERVICE_STATE.Paused)
{
startServiceMenuItem.Enabled = false;
pauseServiceMenuItem.Enabled = false;
}
else if (item.Status.ServiceStatusProcess.CurrentState == Win32.SERVICE_STATE.Running)
{
startServiceMenuItem.Enabled = false;
continueServiceMenuItem.Enabled = false;
}
else if (item.Status.ServiceStatusProcess.CurrentState == Win32.SERVICE_STATE.Stopped)
{
pauseServiceMenuItem.Enabled = false;
stopServiceMenuItem.Enabled = false;
}
if ((item.Status.ServiceStatusProcess.ControlsAccepted & Win32.SERVICE_ACCEPT.Stop) == 0 &&
item.Status.ServiceStatusProcess.CurrentState == Win32.SERVICE_STATE.Running)
{
stopServiceMenuItem.Enabled = false;
}
}
catch
{
Misc.DisableAllMenuItems(menuService);
copyServiceMenuItem.Enabled = true;
propertiesServiceMenuItem.Enabled = true;
}
}
else
{
Misc.DisableAllMenuItems(menuService);
goToProcessServiceMenuItem.Visible = false;
startServiceMenuItem.Visible = false;
continueServiceMenuItem.Visible = false;
pauseServiceMenuItem.Visible = false;
stopServiceMenuItem.Visible = false;
copyServiceMenuItem.Enabled = true;
propertiesServiceMenuItem.Enabled = true;
selectAllServiceMenuItem.Enabled = true;
}
if (listServices.List.Items.Count == 0)
selectAllServiceMenuItem.Enabled = false;
}
private void goToProcessServiceMenuItem_Click(object sender, EventArgs e)
{
DeselectAll(treeProcesses.Tree);
try
{
TreeNodeAdv node = treeProcesses.FindTreeNode(serviceP.Dictionary[
listServices.SelectedItems[0].Name].Status.ServiceStatusProcess.ProcessID);
node.IsSelected = true;
node.EnsureVisible();
tabControlBig.SelectedTab = tabProcesses;
}
catch
{ }
}
private void startServiceMenuItem_Click(object sender, EventArgs e)
{
try
{
using (Win32.ServiceHandle service = new Win32.ServiceHandle(
listServices.SelectedItems[0].Name, Win32.SERVICE_RIGHTS.SERVICE_ALL_ACCESS))
service.Start();
}
catch (Exception ex)
{
MessageBox.Show("Error starting service:\n\n" + ex.Message, "Process Hacker",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void continueServiceMenuItem_Click(object sender, EventArgs e)
{
try
{
using (Win32.ServiceHandle service = new Win32.ServiceHandle(
listServices.SelectedItems[0].Name, Win32.SERVICE_RIGHTS.SERVICE_ALL_ACCESS))
service.Control(Win32.SERVICE_CONTROL.Continue);
}
catch (Exception ex)
{
MessageBox.Show("Error continuing service:\n\n" + ex.Message, "Process Hacker",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void pauseServiceMenuItem_Click(object sender, EventArgs e)
{
try
{
using (Win32.ServiceHandle service = new Win32.ServiceHandle(
listServices.SelectedItems[0].Name, Win32.SERVICE_RIGHTS.SERVICE_ALL_ACCESS))
service.Control(Win32.SERVICE_CONTROL.Pause);
}
catch (Exception ex)
{
MessageBox.Show("Error pausing service:\n\n" + ex.Message, "Process Hacker",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void stopServiceMenuItem_Click(object sender, EventArgs e)
{
try
{
using (Win32.ServiceHandle service = new Win32.ServiceHandle(
listServices.SelectedItems[0].Name, Win32.SERVICE_RIGHTS.SERVICE_ALL_ACCESS))
service.Control(Win32.SERVICE_CONTROL.Stop);
}
catch (Exception ex)
{
MessageBox.Show("Error stopping service:\n\n" + ex.Message, "Process Hacker",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void deleteServiceMenuItem_Click(object sender, EventArgs e)
{
if (MessageBox.Show("Are you sure you want to delete the service '" +
listServices.SelectedItems[0].Name + "'?",
"Process Hacker",
MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
{
try
{
using (Win32.ServiceHandle service = new Win32.ServiceHandle(
listServices.SelectedItems[0].Name, Win32.SERVICE_RIGHTS.SERVICE_ALL_ACCESS))
service.Delete();
}
catch (Exception ex)
{
MessageBox.Show("Error deleting service:\n\n" + ex.Message, "Process Hacker",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
private void propertiesServiceMenuItem_Click(object sender, EventArgs e)
{
List<string> selected = new List<string>();
ServiceWindow sw;
foreach (ListViewItem item in listServices.SelectedItems)
selected.Add(item.Name);
if (selected.Count == 1)
{
sw = new ServiceWindow(selected[0]);
}
else
{
sw = new ServiceWindow(selected.ToArray());
}
sw.TopMost = this.TopMost;
sw.ShowDialog();
}
private void selectAllServiceMenuItem_Click(object sender, EventArgs e)
{
Misc.SelectAll(listServices.Items);
}
#endregion
#region Tab Controls
private void tabControl_SelectedIndexChanged(object sender, EventArgs e)
{
if (handleP != null)
handleP.Enabled = false;
if (tabControl.SelectedTab == tabHandles)
{
if (handleP != null)
handleP.Enabled = true;
}
}
#endregion
#region Timers
private void timerFire_Tick(object sender, EventArgs e)
{
UpdateMiscInfo();
UpdateStatusInfo();
}
private void timerMessages_Tick(object sender, EventArgs e)
{
if (statusMessages.Count != 0)
{
KeyValuePair<string, Icon> v = statusMessages.Dequeue();
statusText.Text = v.Key;
if (v.Value != null)
statusIcon.Icon = v.Value;
else
statusIcon.Icon = null;
}
else
{
statusText.Text = "";
statusIcon.Icon = null;
}
}
#endregion
#endregion
#region Form-related Helper functions
private void AddIcon(Icon icon)
{
imageList.Images.Add(icon);
}
private void AddListViewItem(ListView lv, string[] text)
{
ListViewItem item = new ListViewItem();
item.Text = text[0];
for (int i = 1; i < text.Length; i++)
{
item.SubItems.Add(new ListViewItem.ListViewSubItem(item, text[i]));
}
}
private void CloseVirtualProtect()
{
this.AcceptButton = null;
virtualProtectProcess = null;
panelVirtualProtect.Visible = false;
treeProcesses.Enabled = true;
tabControl.Enabled = true;
}
public void DeselectAll(ListView list)
{
foreach (ListViewItem item in list.SelectedItems)
item.Selected = false;
}
public void DeselectAll(TreeViewAdv tree)
{
foreach (TreeNodeAdv node in tree.AllNodes)
node.IsSelected = false;
}
private void LoadSettings()
{
RefreshInterval = Properties.Settings.Default.RefreshInterval;
this.Location = Properties.Settings.Default.WindowLocation;
this.Size = Properties.Settings.Default.WindowSize;
this.WindowState = Properties.Settings.Default.WindowState;
splitMain.SplitterDistance = Properties.Settings.Default.SplitterDistance;
buttonSearch.Text = Properties.Settings.Default.SearchType;
PromptBox.LastValue = Properties.Settings.Default.PromptBoxText;
ColumnSettings.LoadSettings(Properties.Settings.Default.ProcessTreeColumns, treeProcesses.Tree);
ColumnSettings.LoadSettings(Properties.Settings.Default.ModuleListViewColumns, listModules);
ColumnSettings.LoadSettings(Properties.Settings.Default.MemoryListViewColumns, listMemory);
ColumnSettings.LoadSettings(Properties.Settings.Default.HandleListViewColumns, listHandles.List);
ColumnSettings.LoadSettings(Properties.Settings.Default.ServiceListViewColumns, listServices.List);
}
private void PerformSearch(string text)
{
Point location = this.Location;
System.Drawing.Size size = this.Size;
ResultsWindow rw = Program.GetResultsWindow(processSelectedPID, new Program.ResultsWindowInvokeAction(delegate(ResultsWindow f)
{
if (text == "&New Results Window...")
{
f.Show();
}
else if (text == "&Literal Search...")
{
if (f.EditSearch(SearchType.Literal, location, size) == DialogResult.OK)
{
f.Show();
f.StartSearch();
}
else
{
f.Close();
}
}
else if (text == "&Regex Search...")
{
if (f.EditSearch(SearchType.Regex, location, size) == DialogResult.OK)
{
f.Show();
f.StartSearch();
}
else
{
f.Close();
}
}
else if (text == "&String Scan...")
{
f.SearchOptions.Type = SearchType.String;
f.Show();
f.StartSearch();
}
else if (text == "&Heap Scan...")
{
f.SearchOptions.Type = SearchType.Heap;
f.Show();
f.StartSearch();
}
}));
buttonSearch.Text = text;
}
private void PerformSearch(object sender, EventArgs e)
{
PerformSearch(((MenuItem)sender).Text);
}
public void QueueMessage(string message)
{
this.QueueMessage(message, null);
}
public void QueueMessage(string message, Icon icon)
{
log.Add(DateTime.Now.ToString() + ": " + message);
statusMessages.Enqueue(new KeyValuePair<string,Icon>(message, icon));
}
private MemoryEditor ReadWriteMemory()
{
return ReadWriteMemory(false);
}
private MemoryEditor ReadWriteMemory(bool RO)
{
try
{
MemoryEditor ed = null;
this.Cursor = Cursors.WaitCursor;
ed = Program.GetMemoryEditor(processSelectedPID, memoryAddress, memorySize,
new Program.MemoryEditorInvokeAction(delegate(MemoryEditor f)
{
try
{
f.ReadOnly = RO;
f.Show();
f.Activate();
}
catch
{ }
}));
this.Cursor = Cursors.Default;
return ed;
}
catch
{
this.Cursor = Cursors.Default;
return null;
}
}
private void SaveSettings()
{
Properties.Settings.Default.RefreshInterval = RefreshInterval;
if (this.WindowState == FormWindowState.Normal && this.Visible)
{
Properties.Settings.Default.WindowLocation = this.Location;
Properties.Settings.Default.WindowSize = this.Size;
}
Properties.Settings.Default.WindowState = this.WindowState == FormWindowState.Minimized ?
FormWindowState.Normal : this.WindowState;
Properties.Settings.Default.SplitterDistance = splitMain.SplitterDistance;
Properties.Settings.Default.SearchType = buttonSearch.Text;
Properties.Settings.Default.PromptBoxText = PromptBox.LastValue;
Properties.Settings.Default.ProcessTreeColumns = ColumnSettings.SaveSettings(treeProcesses.Tree);
Properties.Settings.Default.ModuleListViewColumns = ColumnSettings.SaveSettings(listModules);
Properties.Settings.Default.MemoryListViewColumns = ColumnSettings.SaveSettings(listMemory);
Properties.Settings.Default.HandleListViewColumns = ColumnSettings.SaveSettings(listHandles.List);
Properties.Settings.Default.ServiceListViewColumns = ColumnSettings.SaveSettings(listServices.List);
Properties.Settings.Default.NewProcesses = NPMenuItem.Checked;
Properties.Settings.Default.TerminatedProcesses = TPMenuItem.Checked;
Properties.Settings.Default.NewServices = NSMenuItem.Checked;
Properties.Settings.Default.StartedServices = startedSMenuItem.Checked;
Properties.Settings.Default.StoppedServices = stoppedSMenuItem.Checked;
Properties.Settings.Default.DeletedServices = DSMenuItem.Checked;
try
{
Properties.Settings.Default.Save();
}
catch
{ }
}
public void SelectAll(TreeViewAdv tree)
{
foreach (TreeNodeAdv node in tree.AllNodes)
node.IsSelected = true;
}
private void ShowVirtualProtect()
{
panelVirtualProtect.Visible = true;
panelVirtualProtect.BringToFront();
textNewProtection.SelectAll();
textNewProtection.Focus();
this.AcceptButton = buttonVirtualProtect;
treeProcesses.Enabled = false;
tabControl.Enabled = false;
}
private void UpdateStatusInfo()
{
statusGeneral.Text = string.Format("{0} processes", processP.Dictionary.Count);
}
#endregion
#region Helper functions
private bool IsDangerousPID(int pid)
{
if (pid == 4)
return true;
try
{
Process p = Process.GetProcessById(pid);
foreach (string s in Misc.DangerousNames)
{
if ((Environment.SystemDirectory + "\\" + s).ToLower() == Misc.GetRealPath(p.MainModule.FileName).ToLower())
{
return true;
}
}
}
catch { }
return false;
}
private bool IsDifferentSessionId(int pid)
{
try
{
if (Win32.GetProcessSessionId(pid) == Program.CurrentSessionId)
return false;
else
return true;
}
catch
{
return true;
}
}
private void SetProcessPriority(ProcessPriorityClass priority)
{
try
{
Process.GetProcessById(processSelectedPID).PriorityClass = priority;
}
catch (Exception ex)
{
MessageBox.Show("The priority could not be set:\n\n" + ex.Message, "Process Hacker", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
#endregion
#region Updaters
#region Misc Decl.
delegate string MiscInfoDelegate(Process p);
string[] misctoplevel = { "Process", "DEP", "Handles", "I/O", "Memory" };
string[][] miscinfo = {
new string[] { "Command Line", "Is Being Debugged", "Priority Boost Enabled",
"Total CPU Time", "Privileged CPU Time", "User CPU Time", "Start Time"},
new string[] { "Status", "Permanent" },
new string[] { "Handle Count" },
new string[] { "Read", "Write", "Other" },
new string[] { "Non-paged System Memory Size", "Paged Memory Size",
"Paged System Memory Size", "Peak Paged Memory Size", "Peak Virtual Memory Size",
"Peak Working Set", "Private Memory Size", "Virtual Memory Size", "Working Set"}
};
MiscInfoDelegate[][] miscinfofuncs = {
// Process
new MiscInfoDelegate[]
{
delegate (Process p)
{
return Program.HackerWindow.processP.Dictionary[p.Id].CmdLine;
},
delegate (Process p)
{
return Program.HackerWindow.processP.Dictionary[p.Id].IsBeingDebugged.ToString();
},
delegate (Process p)
{
return p.PriorityBoostEnabled ? "Yes" : "No";
},
delegate (Process p)
{
return Misc.GetNiceTimeSpan(p.TotalProcessorTime);
},
delegate (Process p)
{
return Misc.GetNiceTimeSpan(p.PrivilegedProcessorTime);
},
delegate (Process p)
{
return Misc.GetNiceTimeSpan(p.UserProcessorTime);
},
delegate (Process p)
{
return Misc.GetNiceDateTime(p.StartTime);
}
},
// DEP
new MiscInfoDelegate[]
{
delegate (Process p)
{
Win32.DEPFLAGS flags = 0;
int perm = 0;
using (Win32.ProcessHandle phandle =
new Win32.ProcessHandle(p.Id, Win32.PROCESS_RIGHTS.PROCESS_QUERY_INFORMATION))
{
if (!Win32.GetProcessDEPPolicy(phandle.Handle, out flags, out perm))
throw new Exception(Win32.GetLastErrorMessage());
return flags == Win32.DEPFLAGS.PROCESS_DEP_DISABLE ? "Disabled" :
(flags == Win32.DEPFLAGS.PROCESS_DEP_ENABLE ? "Enabled" :
(flags == (Win32.DEPFLAGS.PROCESS_DEP_ENABLE |
Win32.DEPFLAGS.PROCESS_DEP_DISABLE_ATL_THUNK_EMULATION)) ?
"Enabled, DEP-ATL thunk emulation disabled" : "Unknown"
);
}
},
delegate (Process p)
{
Win32.DEPFLAGS flags = 0;
int perm = 0;
using (Win32.ProcessHandle phandle =
new Win32.ProcessHandle(p.Id, Win32.PROCESS_RIGHTS.PROCESS_QUERY_INFORMATION))
{
if (!Win32.GetProcessDEPPolicy(phandle.Handle, out flags, out perm))
throw new Exception(Win32.GetLastErrorMessage());
return perm == 0 ? "No" : "Yes";
}
}
},
// Handles
new MiscInfoDelegate[]
{
delegate (Process p) { return p.HandleCount.ToString(); }
},
// I/O
new MiscInfoDelegate[]
{
delegate (Process p)
{
using (Win32.ProcessHandle phandle =
new Win32.ProcessHandle(p.Id, Program.MinProcessQueryRights))
{
Win32.IO_COUNTERS counters = Win32.GetProcessIoCounters(phandle);
return counters.ReadOperationCount + " (" +
Misc.GetNiceSizeName(counters.ReadTransferCount) + ")";
}
},
delegate (Process p)
{
using (Win32.ProcessHandle phandle =
new Win32.ProcessHandle(p.Id, Program.MinProcessQueryRights))
{
Win32.IO_COUNTERS counters = Win32.GetProcessIoCounters(phandle);
return counters.WriteOperationCount + " (" +
Misc.GetNiceSizeName(counters.WriteTransferCount) + ")";
}
},
delegate (Process p)
{
using (Win32.ProcessHandle phandle =
new Win32.ProcessHandle(p.Id, Program.MinProcessQueryRights))
{
Win32.IO_COUNTERS counters = Win32.GetProcessIoCounters(phandle);
return counters.OtherOperationCount + " (" +
Misc.GetNiceSizeName(counters.OtherTransferCount) + ")";
}
}
},
// Memory
new MiscInfoDelegate[]
{
delegate (Process p) { return Misc.GetNiceSizeName(p.NonpagedSystemMemorySize64); },
delegate (Process p) { return Misc.GetNiceSizeName(p.PagedMemorySize64); },
delegate (Process p) { return Misc.GetNiceSizeName(p.PagedSystemMemorySize64); },
delegate (Process p) { return Misc.GetNiceSizeName(p.PeakPagedMemorySize64); },
delegate (Process p) { return Misc.GetNiceSizeName(p.PeakVirtualMemorySize64); },
delegate (Process p) { return Misc.GetNiceSizeName(p.PeakWorkingSet64); },
delegate (Process p) { return Misc.GetNiceSizeName(p.PrivateMemorySize64); },
delegate (Process p) { return Misc.GetNiceSizeName(p.VirtualMemorySize64); },
delegate (Process p) { return Misc.GetNiceSizeName(p.WorkingSet64); }
}
};
#endregion
private void InitMiscInfo()
{
treeMisc.BeginUpdate();
TreeNode n;
for (int i = 0; i < misctoplevel.Length; i++)
{
n = treeMisc.Nodes.Add(misctoplevel[i]);
for (int j = 0; j < miscinfo[i].Length; j++)
{
n.Nodes.Add(miscinfo[i][j] + ": Unknown");
}
}
treeMisc.ExpandAll();
treeMisc.EndUpdate();
}
private void UpdateMiscInfo()
{
Process p;
try
{
p = Process.GetProcessById(processSelectedPID);
}
catch
{
return;
}
treeMisc.BeginUpdate();
for (int i = 0; i < misctoplevel.Length; i++)
{
for (int j = 0; j < miscinfo[i].Length; j++)
{
try
{
string newtext = miscinfo[i][j] + ": " +
miscinfofuncs[i][j].Invoke(p);
if (treeMisc.Nodes[i].Nodes[j].Text != newtext)
treeMisc.Nodes[i].Nodes[j].Text = newtext;
}
catch
{
treeMisc.Nodes[i].Nodes[j].Text = miscinfo[i][j] +
": Unknown";
}
}
}
p.Close();
treeMisc.EndUpdate();
}
private void UpdateDriversInfo()
{
int RequiredSize = 0;
int[] ImageBases;
List<int> done = new List<int>();
ListViewItem primary = null;
Win32.EnumDeviceDrivers(null, 0, out RequiredSize);
ImageBases = new int[RequiredSize];
Win32.EnumDeviceDrivers(ImageBases, RequiredSize * sizeof(int), out RequiredSize);
listModules.BeginUpdate();
for (int i = 0; i < RequiredSize; i++)
{
if (done.Contains(ImageBases[i]))
break;
if (ImageBases[i] == 0)
continue;
StringBuilder name = new StringBuilder(256);
StringBuilder filename = new StringBuilder(256);
string realname = "";
string desc = "";
ListViewItem item = new ListViewItem();
Win32.GetDeviceDriverBaseName(ImageBases[i], name, 255);
Win32.GetDeviceDriverFileName(ImageBases[i], filename, 255);
try
{
System.IO.FileInfo fi = new System.IO.FileInfo(Misc.GetRealPath(filename.ToString()));
realname = fi.FullName;
desc = FileVersionInfo.GetVersionInfo(realname).FileDescription;
}
catch
{ }
item = new ListViewItem();
item.SubItems.Add(new ListViewItem.ListViewSubItem());
item.SubItems.Add(new ListViewItem.ListViewSubItem());
item.SubItems.Add(new ListViewItem.ListViewSubItem());
item.ToolTipText = realname;
item.SubItems[0].Text = name.ToString();
item.SubItems[1].Text = String.Format("0x{0:x8}", ImageBases[i]);
item.SubItems[2].Text = "";
item.SubItems[3].Text = desc;
try
{
bool kernel = false;
foreach (string k in Misc.KernelNames)
{
if (realname.ToLower() == Environment.SystemDirectory.ToLower() + "\\" + k.ToLower())
{
kernel = true;
break;
}
}
if (kernel)
{
primary = item;
}
else
{
listModules.Items.Add(item);
}
}
catch
{ }
done.Add(ImageBases[i]);
}
// sorts the list
listModules.Sorting = SortOrder.Ascending;
listModules.Sorting = SortOrder.None;
if (primary != null)
{
primary.Font = new Font(primary.Font, FontStyle.Bold);
listModules.Items.Insert(0, primary);
}
listModules.EndUpdate();
}
private void UpdateMemoryInfo()
{
Process p;
try
{
p = Process.GetProcessById(processSelectedPID);
}
catch
{
return;
}
Win32.MEMORY_BASIC_INFORMATION info = new Win32.MEMORY_BASIC_INFORMATION();
int address = 0;
listMemory.BeginUpdate();
try
{
using (Win32.ProcessHandle phandle = new Win32.ProcessHandle(p.Id, Win32.PROCESS_RIGHTS.PROCESS_QUERY_INFORMATION))
{
while (true)
{
if (!Win32.VirtualQueryEx(phandle, address, ref info,
Marshal.SizeOf(typeof(Win32.MEMORY_BASIC_INFORMATION))))
{
break;
}
else
{
ListViewItem item = new ListViewItem();
item.SubItems.Add(new ListViewItem.ListViewSubItem());
item.SubItems.Add(new ListViewItem.ListViewSubItem());
item.SubItems.Add(new ListViewItem.ListViewSubItem());
item.SubItems.Add(new ListViewItem.ListViewSubItem());
item.SubItems[0].Text = String.Format("0x{0:x8}", info.BaseAddress);
item.SubItems[1].Text = String.Format("0x{0:x8}", info.RegionSize);
item.SubItems[2].Text = info.State.ToString().Replace("MEM_", "").Replace("0", "");
item.SubItems[3].Text = info.Type.ToString().Replace("MEM_", "").Replace("0", "");
item.SubItems[4].Text = info.Protect.ToString().Replace("PAGE_", "");
listMemory.Items.Add(item);
address += info.RegionSize;
}
}
}
tabMemory.Enabled = true;
}
catch
{
tabMemory.Enabled = false;
}
listMemory.EndUpdate();
}
// .NET based
private void UpdateModuleInfo()
{
Process p = null;
ListViewItem primary = null;
try
{
p = Process.GetProcessById(processSelectedPID);
}
catch
{
listModules.Items.Clear();
listModules.Enabled = false;
return;
}
// Get drivers instead
if (p.Id == 4)
{
UpdateDriversInfo();
return;
}
listModules.BeginUpdate();
try
{
ListViewItem item;
item = new ListViewItem();
foreach (ProcessModule m in p.Modules)
{
item = new ListViewItem();
item.SubItems.Add(new ListViewItem.ListViewSubItem());
item.SubItems.Add(new ListViewItem.ListViewSubItem());
item.SubItems.Add(new ListViewItem.ListViewSubItem());
try { item.ToolTipText = Misc.GetRealPath(m.FileName); }
catch { item.ToolTipText = ""; }
try { item.SubItems[0].Text = m.ModuleName; }
catch { item.SubItems[0].Text = "(error)"; }
try { item.SubItems[1].Text = String.Format("0x{0:x8}", m.BaseAddress.ToInt32()); }
catch { item.SubItems[1].Text = ""; }
try { item.SubItems[2].Text = Misc.GetNiceSizeName(m.ModuleMemorySize); }
catch { item.SubItems[2].Text = ""; }
try { item.SubItems[3].Text = FileVersionInfo.GetVersionInfo(Misc.GetRealPath(m.FileName)).FileDescription; }
catch { item.SubItems[3].Text = ""; }
try
{
if (m.ModuleName.ToLower() == treeProcesses.SelectedNodes[0].Name.ToLower())
{
primary = item;
}
else
{
listModules.Items.Add(item);
}
}
catch
{ }
}
// sorts the list
listModules.Sorting = SortOrder.Ascending;
listModules.Sorting = SortOrder.None;
if (primary != null)
{
primary.Font = new Font(primary.Font, FontStyle.Bold);
listModules.Items.Insert(0, primary);
}
listModules.Enabled = true;
}
catch (Exception ex)
{
listModules.Items.Clear();
listModules.Items.Add(ex.Message);
listModules.Enabled = false;
}
listModules.EndUpdate();
}
// toolhelp based
private void UpdateModuleInfoToolhelp()
{
int snapshot;
Win32.MODULEENTRY32 module = new Win32.MODULEENTRY32();
ListViewItem primary = null;
// Get drivers instead
if (processSelectedPID == 4)
{
UpdateDriversInfo();
return;
}
snapshot = Win32.CreateToolhelp32Snapshot(Win32.SnapshotFlags.Module, processSelectedPID);
module.dwSize = Marshal.SizeOf(typeof(Win32.MODULEENTRY32));
if (snapshot != 0 && Marshal.GetLastWin32Error() == 0 && processSelectedPID != 0)
{
listModules.BeginUpdate();
try
{
ListViewItem item;
item = new ListViewItem();
Win32.Module32First(snapshot, ref module);
do
{
item = new ListViewItem();
item.SubItems.Add(new ListViewItem.ListViewSubItem());
item.SubItems.Add(new ListViewItem.ListViewSubItem());
item.SubItems.Add(new ListViewItem.ListViewSubItem());
item.ToolTipText = module.szExePath;
item.SubItems[0].Text = module.szModule;
item.SubItems[1].Text = String.Format("0x{0:x8}", module.modBaseAddr);
item.SubItems[2].Text = Misc.GetNiceSizeName(module.modBaseSize);
try { item.SubItems[3].Text =
FileVersionInfo.GetVersionInfo(Misc.GetRealPath(module.szExePath)).FileDescription; }
catch { item.SubItems[3].Text = ""; }
if (module.szModule.ToLower() == treeProcesses.SelectedNodes[0].Name.ToLower())
{
primary = item;
}
else
{
listModules.Items.Add(item);
}
} while (Win32.Module32Next(snapshot, ref module) != 0);
// sorts the list
listModules.Sorting = SortOrder.Ascending;
listModules.Sorting = SortOrder.None;
if (primary != null)
{
primary.Font = new Font(primary.Font, FontStyle.Bold);
listModules.Items.Insert(0, primary);
}
listModules.Enabled = true;
}
catch (Exception ex)
{
listModules.Items.Clear();
listModules.Items.Add(ex.Message);
listModules.Enabled = false;
}
}
else if (processSelectedPID == 0)
{
listModules.Items.Clear();
listModules.Enabled = false;
}
else
{
listModules.Items.Clear();
listModules.Items.Add(Win32.GetLastErrorMessage());
listModules.Enabled = false;
}
listModules.EndUpdate();
}
private void UpdateProcessExtra()
{
listModules.Items.Clear();
listMemory.Items.Clear();
listHandles.Provider = null;
if (handleP != null)
handleP.Kill();
handleP = null;
GC.Collect();
if (treeProcesses.SelectedTreeNodes.Count != 1)
return;
if (processSelectedPID == 0)
return;
this.Cursor = Cursors.WaitCursor;
Application.DoEvents();
if (processSelectedPID != Process.GetCurrentProcess().Id)
{
handleP = new HandleProvider(processSelectedPID);
listHandles.Provider = handleP;
handleP.Interval = Properties.Settings.Default.RefreshInterval;
if (tabControl.SelectedTab == tabHandles)
handleP.Enabled = true;
handleP.RunOnceAsync();
}
if (Properties.Settings.Default.UseToolhelpModules)
UpdateModuleInfoToolhelp();
else
UpdateModuleInfo();
UpdateMemoryInfo();
UpdateMiscInfo();
this.Cursor = Cursors.Default;
}
#endregion
private void formViewer_FormClosing(object sender, FormClosingEventArgs e)
{
Properties.Settings.Default.AlwaysOnTop = this.TopMost;
if (handleP != null)
handleP.Kill();
processP.Kill();
serviceP.Kill();
notifyIcon.Visible = false;
SaveSettings();
// kill, just in case we are performing an operation we don't want random .net errors about disposed objects.
Process.GetCurrentProcess().Kill();
}
public HackerWindow()
{
InitializeComponent();
if (!System.IO.File.Exists(Application.StartupPath + "\\Assistant.exe"))
{
runAsMenuItem.Enabled = false;
runAsProcessMenuItem.Visible = false;
}
this.TopMost = Properties.Settings.Default.AlwaysOnTop;
HighlightedListViewItem.Colors[ListViewItemState.New] = Properties.Settings.Default.ColorNewProcesses;
HighlightedListViewItem.Colors[ListViewItemState.Removed] = Properties.Settings.Default.ColorRemovedProcesses;
TreeNodeAdv.StateColors[TreeNodeAdv.NodeState.New] = Properties.Settings.Default.ColorNewProcesses;
TreeNodeAdv.StateColors[TreeNodeAdv.NodeState.Removed] = Properties.Settings.Default.ColorRemovedProcesses;
Misc.SetDoubleBuffered(listMemory, typeof(ListView), true);
Misc.SetDoubleBuffered(listModules, typeof(ListView), true);
Misc.SetDoubleBuffered(treeMisc, typeof(TreeView), true);
InitMiscInfo();
Thread.CurrentThread.Priority = ThreadPriority.Highest;
notifyIcon.ContextMenu = menuIcon;
notifyIcon.Visible = Properties.Settings.Default.ShowIcon;
NPMenuItem.Checked = Properties.Settings.Default.NewProcesses;
TPMenuItem.Checked = Properties.Settings.Default.TerminatedProcesses;
NSMenuItem.Checked = Properties.Settings.Default.NewServices;
startedSMenuItem.Checked = Properties.Settings.Default.StartedServices;
stoppedSMenuItem.Checked = Properties.Settings.Default.StoppedServices;
DSMenuItem.Checked = Properties.Settings.Default.DeletedServices;
NPMenuItem.Click += new EventHandler(CheckedMenuItem_Click);
TPMenuItem.Click += new EventHandler(CheckedMenuItem_Click);
NSMenuItem.Click += new EventHandler(CheckedMenuItem_Click);
startedSMenuItem.Click += new EventHandler(CheckedMenuItem_Click);
stoppedSMenuItem.Click += new EventHandler(CheckedMenuItem_Click);
DSMenuItem.Click += new EventHandler(CheckedMenuItem_Click);
}
private void CheckedMenuItem_Click(object sender, EventArgs e)
{
((MenuItem)sender).Checked = !((MenuItem)sender).Checked;
}
private void serviceP_Updated()
{
listServices.List.EndUpdate();
HighlightedListViewItem.StateHighlighting = true;
serviceP.DictionaryAdded += new ServiceProvider.ProviderDictionaryAdded(serviceP_DictionaryAdded);
serviceP.DictionaryModified += new ServiceProvider.ProviderDictionaryModified(serviceP_DictionaryModified);
serviceP.DictionaryRemoved += new ServiceProvider.ProviderDictionaryRemoved(serviceP_DictionaryRemoved);
serviceP.Updated -= new ServiceProvider.ProviderUpdateOnce(serviceP_Updated);
if (processP.RunCount >= 1)
this.Invoke(new MethodInvoker(UpdateCommon));
}
private void processP_Updated()
{
processP.DictionaryAdded += new ProcessProvider.ProviderDictionaryAdded(processP_DictionaryAdded);
processP.DictionaryRemoved += new ProcessProvider.ProviderDictionaryRemoved(processP_DictionaryRemoved);
processP.Updated -= new ProcessProvider.ProviderUpdateOnce(processP_Updated);
if (processP.RunCount >= 1)
this.Invoke(new MethodInvoker(UpdateCommon));
}
private void UpdateCommon()
{
timerMessages.Enabled = true;
treeProcesses.RefreshItems();
}
private void HackerWindow_Load(object sender, EventArgs e)
{
Program.UpdateWindows();
timerFire.Interval = RefreshInterval;
timerFire.Enabled = true;
timerFire_Tick(null, null);
listProcesses_SelectionChanged(null, null);
newResultsWindowMenuItem.Click += new EventHandler(PerformSearch);
literalSearchMenuItem.Click += new EventHandler(PerformSearch);
regexSearchMenuItem.Click += new EventHandler(PerformSearch);
stringScanMenuItem.Click += new EventHandler(PerformSearch);
heapScanMenuItem.Click += new EventHandler(PerformSearch);
listControls.Add(treeProcesses.Tree);
listControls.Add(listModules);
listControls.Add(listMemory);
listControls.Add(listHandles);
listControls.Add(listServices);
GenericViewMenu.AddMenuItems(copyProcessMenuItem.MenuItems, treeProcesses.Tree);
GenericViewMenu.AddMenuItems(copyModuleMenuItem.MenuItems, listModules, null);
GenericViewMenu.AddMenuItems(copyMemoryMenuItem.MenuItems, listMemory, null);
GenericViewMenu.AddMenuItems(copyHandleMenuItem.MenuItems, listHandles.List, null);
GenericViewMenu.AddMenuItems(copyServiceMenuItem.MenuItems, listServices.List, null);
treeProcesses.ContextMenu = menuProcess;
listModules.ContextMenu = menuModule;
listMemory.ContextMenu = menuMemory;
listHandles.ContextMenu = menuHandle;
listServices.ContextMenu = menuService;
treeMisc.ContextMenu = menuMisc;
processP.Interval = RefreshInterval;
treeProcesses.Provider = processP;
processP.Updated += new ProcessProvider.ProviderUpdateOnce(processP_Updated);
processP.Enabled = true;
HighlightedListViewItem.HighlightingDuration = Properties.Settings.Default.HighlightingDuration;
HighlightedListViewItem.StateHighlighting = false;
listServices.List.BeginUpdate();
serviceP.Interval = RefreshInterval;
listServices.Provider = serviceP;
serviceP.DictionaryAdded += new ServiceProvider.ProviderDictionaryAdded(serviceP_DictionaryAdded_Process);
serviceP.DictionaryModified += new ServiceProvider.ProviderDictionaryModified(serviceP_DictionaryModified_Process);
serviceP.DictionaryRemoved += new ServiceProvider.ProviderDictionaryRemoved(serviceP_DictionaryRemoved_Process);
serviceP.Updated += new ServiceProvider.ProviderUpdateOnce(serviceP_Updated);
serviceP.Enabled = true;
statusText.Text = "Waiting...";
// huge hack
listModules.Items.Add(new ListViewItem("b"));
listModules.Items.Add(new ListViewItem("a"));
listModules.Sorting = SortOrder.Ascending;
listModules.Sorting = SortOrder.None;
listModules.Items.Add(new ListViewItem("c"));
tabControl.SelectedTab = tabProcess;
tabControl.SelectedTab = tabThreads;
tabControl.SelectedTab = tabModules;
tabControl.SelectedTab = tabMemory;
listModules.Items.Clear();
LoadSettings();
// load symbols on a separate thread
Thread t = new Thread(new ThreadStart(delegate
{
foreach (ProcessModule module in Process.GetCurrentProcess().Modules)
{
this.BeginInvoke(new MethodInvoker(delegate
{
statusIcon.Icon = null;
statusText.Text = "Loading symbols for " + module.ModuleName + "...";
}));
try
{
if (!module.FileName.ToLower().EndsWith(".exe"))
Symbols.LoadSymbolsFromLibrary(module.FileName, module.BaseAddress.ToInt32());
}
catch (Exception ex)
{
QueueMessage("Could not load symbols for " + module.ModuleName + ": " + ex.Message, null);
}
}
this.BeginInvoke(new MethodInvoker(delegate
{
statusIcon.Icon = null;
statusText.Text = "";
}));
}));
t.Priority = ThreadPriority.Lowest;
t.Start();
}
private void HackerWindow_SizeChanged(object sender, EventArgs e)
{
if (this.WindowState == FormWindowState.Minimized)
{
if (this.NotifyIcon.Visible && Properties.Settings.Default.HideWhenMinimized)
{
this.Hide();
}
}
}
}
}