peedit is a cross-platform, zero-dependency, pure-Go tool and library for inspecting and modifying resources (icons, manifests, version info) in Windows Portable Executable (PE) files.
Designed as a lightweight, programmatic alternative to legacy tools like Resource Hacker, peedit operates entirely in standard Go without CGO or Windows API dependencies.
- Pure Go Engine: Built strictly using Go's standard library (
debug/pe,encoding/binary). - Cross-Platform: Inspect and edit Windows PE binaries on Linux, macOS, or Windows.
- Resource Tree Traversal: Walk nested
Type -> Name/ID -> Languagedirectory trees. - Manifest Extraction: Parse and export application manifests as raw XML.
- Full ICO Assembly: Reconstruct valid, multi-resolution
.icobinaries directly fromRT_GROUP_ICONandRT_ICONstructures.
| Phase | Feature | Status |
|---|---|---|
| Phase 1 | PE Parsing, Tree Traversal, Manifest & ICO Extraction | ✅v0.1.0 Released |
| Phase 2 | .rsrc Binary Assembler & PE Section Writer |
🔜 In Development |
| Phase 3 | Resource Replacement (Manifests, Icons, Version Info) | 📅 Planned |
| Phase 4 | Arbitrary Resource Insertion & Deletion | 📅 Planned |
| Phase 5 | Cross-Platform GUI (Fyne / Wails) | 📅 Planned |
# Clone and build
git clone [https://github.com/TemidayoAkinwamide/peedit.git](https://github.com/TemidayoAkinwamide/peedit.git)
cd peedit
go build -o peedit cmd/peedit/main.go
# Inspect PE resource tree
./peedit -f target.exe
# Extract application manifest
./peedit -f target.exe -manifest
# Extract all icon groups to .ico files
./peedit -f target.exe -icon all
Library Usage
Go
package main
import (
"fmt"
"log"
"[github.com/TemidayoAkinwamide/peedit/pkg/pe](https://github.com/TemidayoAkinwamide/peedit/pkg/pe)"
"[github.com/TemidayoAkinwamide/peedit/pkg/resource](https://github.com/TemidayoAkinwamide/peedit/pkg/resource)"
)
func main() {
parsedPE, err := pe.Open("notepad.exe")
if err != nil {
log.Fatalf("Failed to parse PE: %v", err)
}
defer parsedPE.Close()
tree, err := resource.ExtractTree(parsedPE)
if err != nil {
log.Fatalf("Failed to parse resource directory: %v", err)
}
fmt.Printf("Discovered %d resource types\n", len(tree.Entries))
}
License
MIT © Temidayo Akinwamide
---
**4. Publishing Execution Steps**
Run these exact commands in your VS Code terminal to initialize, push, and release `v0.1.0`:
```bash
# Update go.mod to reflect remote GitHub import path
go mod edit -module github.com/TemidayoAkinwamide/peedit
# Initialize git repository
git init
git branch -M main
# Add files and make initial commit
git add .
git commit -m "feat: initial release v0.1.0 - PE parser, resource tree traversal, and ICO/manifest extractor"
# Connect remote and push
git remote add origin https://github.com/TemidayoAkinwamide/peedit.git
git push -u origin main
# Create release tag v0.1.0
git tag -a v0.1.0 -m "v0.1.0: Stable PE parser, manifest reader, and ICO group extractor"
git push origin v0.1.0