Nein.
Code: Alles auswählen
;/-----------------------------\
;| ProcessCrasher |
;| |
;| Version 1.01 |
;| by Thorium |
;| written in PureBasic 4.10 |
;| |
;| compatible with: |
;| -Windows 95 or higher |
;| -Windows 2000 or higher |
;\-----------------------------/
EnableExplicit
#AppTitle = "ProcessCrasher"
#CrashFailedText = "Failed to crash process!"
#UpdateInterval = 250
Enumeration
#MainWindow
EndEnumeration
Enumeration
#ListGad
EndEnumeration
Structure ProcessInfo
Name.s
Path.s
ID.l
ParentID.l
ThreadsCnt.l
PriorityClass.l
Icon.l
EndStructure
#CrashCodeLen = 4
DataSection
CrashCode:
Data.b $33,$C0,$F7,$F0
EndDataSection
Global OS.l
Global Dim ProcessList.ProcessInfo(0)
Global ProcessListCnt.l
Global SystemAppIcon.l
Procedure OpenMainWindow()
If OpenWindow(#MainWindow,216,0,590,290,"ProcessCrasher v1.01 by Thorium",#PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar)
If CreateGadgetList(WindowID(#MainWindow))
ListIconGadget(#ListGad,0,0,590,290,"Name",150,#PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect)
AddGadgetColumn(#ListGad,1,"Path",250)
AddGadgetColumn(#ListGad,2,"PID",50)
AddGadgetColumn(#ListGad,3,"Parent PID",75)
EndIf
EndIf
EndProcedure
Procedure GetProcessList()
Define.l ProcessSnapHandle,ModuleSnapHandle,RetVal,i,ProcessID,ExePath,IconHandle
Define.PROCESSENTRY32 ProcessEntry
Define.MODULEENTRY32 ModuleEntry
ReDim ProcessList.ProcessInfo(0)
ProcessListCnt = 0
ProcessEntry\dwSize = SizeOf(ProcessEntry)
ModuleEntry\dwSize = SizeOf(ModuleEntry)
;laufende Prozesse ermitteln
ExePath = AllocateMemory(1024)
ProcessSnapHandle = CreateToolhelp32Snapshot_(#TH32CS_SNAPPROCESS,0)
RetVal = Process32First_(ProcessSnapHandle,ProcessEntry)
While RetVal = #True
ProcessListCnt = ProcessListCnt + 1
ReDim ProcessList.ProcessInfo(ProcessListCnt)
ProcessList(ProcessListCnt)\Name = PeekS(@ProcessEntry\szExeFile)
If OS = #PB_OS_Windows_95 Or OS = #PB_OS_Windows_98 Or OS = #PB_OS_Windows_ME
ProcessList(ProcessListCnt)\Name = GetFilePart(ProcessList(ProcessListCnt)\Name)
EndIf
ProcessList(ProcessListCnt)\ID = ProcessEntry\th32ProcessID
ProcessList(ProcessListCnt)\ParentID = ProcessEntry\th32ParentProcessID
ProcessList(ProcessListCnt)\ThreadsCnt = ProcessEntry\cntThreads
ProcessList(ProcessListCnt)\PriorityClass = ProcessEntry\pcPriClassBase
If ProcessEntry\th32ProcessID <> 0
ModuleSnapHandle = CreateToolhelp32Snapshot_(#TH32CS_SNAPMODULE,ProcessEntry\th32ProcessID)
If ModuleSnapHandle
If Module32First_(ModuleSnapHandle,ModuleEntry)
ProcessList(ProcessListCnt)\Path = GetPathPart(Trim(PeekS(@ModuleEntry\szExePath)))
EndIf
CloseHandle_(ModuleSnapHandle)
EndIf
EndIf
PokeS(ExePath,ProcessList(ProcessListCnt)\Path + ProcessList(ProcessListCnt)\Name)
IconHandle = ExtractIcon_(0,ExePath,0)
If IconHandle = 0
IconHandle = SystemAppIcon
EndIf
ProcessList(ProcessListCnt)\Icon = IconHandle
RetVal = Process32Next_(ProcessSnapHandle,ProcessEntry)
Wend
CloseHandle_(ProcessSnapHandle)
FreeMemory(ExePath)
EndProcedure
Procedure FillProcessList()
Define.l i
ClearGadgetItemList(#ListGad)
For i = 1 To ProcessListCnt
AddGadgetItem(#ListGad,i-1,ProcessList(i)\Name,ProcessList(i)\Icon)
SetGadgetItemText(#ListGad,i-1,ProcessList(i)\Path,1)
SetGadgetItemText(#ListGad,i-1,Hex(ProcessList(i)\ID),2)
SetGadgetItemText(#ListGad,i-1,Hex(ProcessList(i)\ParentID),3)
Next
EndProcedure
Procedure.l CrashByInjection(ProcessID.l)
Define.l ProcessHandle,CrashCodeAddr,BytesWritten
ProcessHandle = OpenProcess_(#PROCESS_ALL_ACCESS,0,ProcessID)
If ProcessHandle = 0
ProcedureReturn 1
EndIf
CrashCodeAddr = VirtualAllocEx_(ProcessHandle,0,#CrashCodeLen,#MEM_COMMIT | #MEM_RESERVE,#PAGE_EXECUTE_READWRITE)
If CrashCodeAddr = 0
CloseHandle_(ProcessHandle)
ProcedureReturn 1
EndIf
If WriteProcessMemory_(ProcessHandle,CrashCodeAddr,?CrashCode,#CrashCodeLen,@BytesWritten) = 0
CloseHandle_(ProcessHandle)
ProcedureReturn 1
EndIf
If CreateRemoteThread_(ProcessHandle,0,0,CrashCodeAddr,0,0,0) = 0
CloseHandle_(ProcessHandle)
ProcedureReturn 1
EndIf
CloseHandle_(ProcessHandle)
ProcedureReturn 0
EndProcedure
Procedure CrashProcess(Index.l)
If CrashByInjection(ProcessList(Index)\ID) = 1
MessageRequester(#AppTitle,#CrashFailedText,#MB_ICONERROR)
EndIf
EndProcedure
Procedure UpdateProcessList()
Define.l i,i2,OldProcessListCnt
Dim OldProcessList.ProcessInfo(ProcessListCnt)
For i = 1 To ProcessListCnt
OldProcessList(i)\Name = ProcessList(i)\Name
OldProcessList(i)\Path = ProcessList(i)\Path
OldProcessList(i)\ID = ProcessList(i)\ID
OldProcessList(i)\Icon = ProcessList(i)\Icon
Next
OldProcessListCnt = ProcessListCnt
For i = 1 To OldProcessListCnt
If OldProcessList(i)\Icon <> SystemAppIcon
DestroyIcon_(OldProcessList(i)\Icon)
EndIf
Next
GetProcessList()
If OldProcessListCnt = ProcessListCnt
For i = 1 To ProcessListCnt
If OldProcessList(i)\Name <> ProcessList(i)\Name Or OldProcessList(i)\Path <> ProcessList(i)\Path Or OldProcessList(i)\ID <> ProcessList(i)\ID
FillProcessList()
Break
EndIf
Next
Else
FillProcessList()
EndIf
EndProcedure
Define.l Event,Index,UpdateStartTime,i
Define.s ProcessToCrash
OS = OSVersion()
If OS = #PB_OS_Windows_NT3_51 Or OS = #PB_OS_Windows_NT_4
MessageRequester(#AppTitle, "Unsupported Windows version!",#MB_ICONEXCLAMATION)
End
EndIf
If CountProgramParameters() > 0
ProcessToCrash = LCase(ProgramParameter(0))
GetProcessList()
For i = 1 To ProcessListCnt
If ProcessToCrash = LCase(ProcessList(i)\Name)
CrashByInjection(ProcessList(i)\ID)
EndIf
Next
End
EndIf
SystemAppIcon = LoadIcon_(0,#IDI_APPLICATION)
OpenMainWindow()
GetProcessList()
FillProcessList()
Repeat
UpdateStartTime = ElapsedMilliseconds()
Event = WaitWindowEvent(#UpdateInterval)
Select Event
Case #PB_Event_SizeWindow
ResizeGadget(#ListGad,#PB_Ignore,#PB_Ignore,WindowWidth(#MainWindow),WindowHeight(#MainWindow))
Case #PB_Event_Gadget
Select EventType()
Case #PB_EventType_LeftDoubleClick
Index = GetGadgetState(#ListGad)
If Index > -1
CrashProcess(Index+1)
EndIf
EndSelect
EndSelect
If ElapsedMilliseconds() => UpdateStartTime + #UpdateInterval
UpdateProcessList()
EndIf
Until Event = #PB_Event_CloseWindow