Initial commit
This commit is contained in:
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
main.log
|
5
go.mod
Normal file
5
go.mod
Normal file
@@ -0,0 +1,5 @@
|
||||
module hitman
|
||||
|
||||
go 1.23.0
|
||||
|
||||
require golang.org/x/sys v0.25.0
|
2
go.sum
Normal file
2
go.sum
Normal file
@@ -0,0 +1,2 @@
|
||||
golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34=
|
||||
golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
38
main.go
Normal file
38
main.go
Normal file
@@ -0,0 +1,38 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"log"
|
||||
"os"
|
||||
)
|
||||
|
||||
var Error *log.Logger
|
||||
var Warning *log.Logger
|
||||
func init() {
|
||||
log.SetFlags(log.Lmicroseconds | log.Lshortfile)
|
||||
logFile, err := os.Create("main.log")
|
||||
if err != nil {
|
||||
log.Printf("Error creating log file: %v", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
logger := io.MultiWriter(os.Stdout, logFile)
|
||||
log.SetOutput(logger)
|
||||
|
||||
Error = log.New(io.MultiWriter(logFile, os.Stderr, os.Stdout),
|
||||
fmt.Sprintf("%sERROR:%s ", "\033[0;101m", "\033[0m"),
|
||||
log.Lmicroseconds|log.Lshortfile)
|
||||
Warning = log.New(io.MultiWriter(logFile, os.Stdout),
|
||||
fmt.Sprintf("%sWarning:%s ", "\033[0;93m", "\033[0m"),
|
||||
log.Lmicroseconds|log.Lshortfile)
|
||||
}
|
||||
|
||||
func main() {
|
||||
procmap, err := BuildProcessMap()
|
||||
if err != nil {
|
||||
Error.Printf("Error building process map: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
log.Printf("%#v", procmap)
|
||||
}
|
92
procmap.go
Normal file
92
procmap.go
Normal file
@@ -0,0 +1,92 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"unsafe"
|
||||
|
||||
"golang.org/x/sys/windows"
|
||||
)
|
||||
|
||||
type (
|
||||
ProcessMap struct {
|
||||
Map map[uint32]*ProcessMapNode
|
||||
NameIndex map[string][]*ProcessMapNode
|
||||
}
|
||||
ProcessMapNode struct {
|
||||
Proc windows.ProcessEntry32
|
||||
Name string
|
||||
Children map[uint32]*ProcessMapNode
|
||||
}
|
||||
)
|
||||
|
||||
func (pt *ProcessMap) add(proc *windows.ProcessEntry32) error {
|
||||
if pt.Map == nil {
|
||||
pt.Map = make(map[uint32]*ProcessMapNode)
|
||||
}
|
||||
if pt.NameIndex == nil {
|
||||
pt.NameIndex = make(map[string][]*ProcessMapNode)
|
||||
}
|
||||
|
||||
procNode := &ProcessMapNode{
|
||||
Proc: *proc,
|
||||
Name: windows.UTF16ToString(proc.ExeFile[:]),
|
||||
}
|
||||
|
||||
_, ok := pt.NameIndex[procNode.Name]
|
||||
if !ok {
|
||||
pt.NameIndex[procNode.Name] = make([]*ProcessMapNode, 0)
|
||||
}
|
||||
pt.NameIndex[procNode.Name] = append(pt.NameIndex[procNode.Name], procNode)
|
||||
|
||||
parent, parentExists := pt.Map[proc.ParentProcessID]
|
||||
if !parentExists {
|
||||
parent = procNode
|
||||
pt.Map[proc.ParentProcessID] = parent
|
||||
}
|
||||
|
||||
child, childExists := pt.Map[proc.ProcessID]
|
||||
if !childExists {
|
||||
child = procNode
|
||||
pt.Map[proc.ProcessID] = child
|
||||
}
|
||||
|
||||
if parent.Children == nil {
|
||||
parent.Children = make(map[uint32]*ProcessMapNode)
|
||||
}
|
||||
parent.Children[proc.ProcessID] = child
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (pt *ProcessMap) findByName(name string) ([]*ProcessMapNode, bool) {
|
||||
val, ok := pt.NameIndex[name]
|
||||
return val, ok
|
||||
}
|
||||
func (pt *ProcessMap) findByPid(pid uint32) (*ProcessMapNode, bool) {
|
||||
val, ok := pt.Map[pid]
|
||||
return val, ok
|
||||
}
|
||||
|
||||
func BuildProcessMap() (*ProcessMap, error) {
|
||||
tree := &ProcessMap{}
|
||||
|
||||
snapshot, err := windows.CreateToolhelp32Snapshot(windows.TH32CS_SNAPPROCESS, 0)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer windows.CloseHandle(snapshot)
|
||||
|
||||
var pe32 windows.ProcessEntry32
|
||||
pe32.Size = uint32(unsafe.Sizeof(pe32))
|
||||
|
||||
var i int
|
||||
err = windows.Process32First(snapshot, &pe32)
|
||||
for err == nil {
|
||||
tree.add(&pe32)
|
||||
i++
|
||||
if i > 500 {
|
||||
break
|
||||
}
|
||||
err = windows.Process32Next(snapshot, &pe32)
|
||||
}
|
||||
return tree, nil
|
||||
}
|
Reference in New Issue
Block a user