An Avalonia desktop tool for carving fil
es from raw binary data, recovering embedded media by signature, and experimenting with low-level disassembly workflows.
ByteCarve is a desktop forensic-style utility built with C#, .NET 10, and Avalonia UI. The app takes a raw file, lets the user choose a carving mode and output folder, scans the byte stream for recognizable file signatures/extracts recoverable content, and presents the result in a clean report view.
The current focus is media carving, with support for detecting and extracting embedded PNG, JPG, and BMP data. The repo also includes a low-level disassembly layer with instruction-group services for branches, loads, register operations, scalar operations, and immediate data-processing experiments.
| Screen | Preview |
|---|---|
| Source Picker | ![]() |
| Configuration | ![]() |
| Carving Progress | ![]() |
| Report | ![]() |
| History | ![]() |
Pick source file
|
v
Choose carve mode + output folder
|
v
Scan raw bytes for known signatures
|
v
Extract recovered files
|
v
Show report + save history
| Area | Details |
|---|---|
| File selection | Uses Avalonia storage APIs to pick the source file from disk. |
| Carving setup | Lets the user choose a mode and output location before starting. |
| Signature scanning | Searches raw byte data for known file headers and structured endings. |
| Media recovery | Extracts PNG chunks until IEND, JPG scan data until FFD9, and BMP content by size header. |
| Progress page | Shows a dedicated carving screen while extraction runs. |
| Report view | Displays the carve name, duration, output folder, and recovered file count. |
| History | Stores past runs in a local SQLite database. |
| Disassembly lab | Includes service classes for experimenting with instruction decoding logic. |
| Layer | Files | Role |
|---|---|---|
| App shell | App.axaml, MainWindow.axaml, ViewLocator.cs |
Starts Avalonia, loads views from view models, and hosts page navigation. |
| View models | PickViewModel, ConfigsViewModel, CarvingProgressViewModel, ReportViewModel, HistoryViewModel |
Own the app flow and screen state. |
| Views | PickView, ConfigsView, CarvingProgressView, ReportView, HistoryView |
Styled Avalonia screens for each step. |
| Carving engine | Models/carver.cs |
Reads the binary input and extracts media files by signatures and format structure. |
| Storage | Models/database.cs, Assets/admin.db |
Saves and loads run history through SQLite. |
| Disassembly services | Services/Branches.cs, Loads.cs, DP_* |
Experimental instruction decoding modules. |
| Tech | Usage |
|---|---|
| C# / .NET 10 | Core app logic and binary-processing code |
| Avalonia 12 | Cross-platform desktop UI |
| CommunityToolkit.Mvvm | Observable properties and relay commands |
| Microsoft.Data.Sqlite | Local history database |
| Inter Font + Fluent Theme | Clean desktop styling |
cd ByteCarve
dotnet restore
dotnet runOr build only:
dotnet buildwell,reverse engineering was always something that attracted me yet i had no knowledge about it , so yea here goes an Aarch64 disassembler just for fun , but jokes aside thie repo really did help me get better at low level systems and really got a string foundation on binaries/registers/buckets etc , fun and interesting repo! (i sold my soul to finish this...)
now for the notes:
- recorded hours of work : lost count after the 62th hour ..
- monsters/redbulls digested : 36 cans .
- current flaws : i have substracted several subbuckets , especially in the loads buckets , because god forbid i sit there for another * * month designing more subbuckets , i am not making a production level disassembler. *frontend : helped by a web-dev friend (mostly he used generative ai ), i aint a front-end developer to spend weeks on the ui *total sub-buckets: 38 , price: my soul ..
- this repo is a learning project , not a serious project , further updates and commits will contribute into upgrading it into a more production ready state *NOTE : all of the subbuckets are made by me , the only sub-bucket i used capstone for was in the data_processing_immediate section , it was an isolated and very long sub-bucket so it wasnt worth the time and effort.




