Giter Club home page Giter Club logo

hextor's Introduction

Hextor

           

More screenshots and use cases >>

Download: https://github.com/digitalw0lf/hextor/releases/latest

Hextor is a Hexadecimal editor and binary data analyzing toolkit for Windows.

It was created to make working with binary file formats as simple and convenient as with plain text. Although it is staffed with a powerful set of data analyzing tools, it starts instantly and rapidly works with files of any size.

Main features are:

  • View data as different basic types (text/hex/int8/16/32/float/etc.)
  • Interpret and edit data as structure with C-like description
  • View/edit logical volumes, physical disks, process memory
  • Unlimited Undo/Redo
  • Bookmarks
  • Configurable text encoding (ANSI, ASCII etc.)
  • Flexible text/hex/unicode search and replace with wildcards and value search
  • Search and replace in files/directories
  • Advanced binary file comparison with insert/delete detection
  • View data as bitmap
  • "Text editor" mode for huge text files and text sections inside of binary files
  • Hash calculation (MD/SHA/CRC etc.)
  • Disassembler (using Zydis library)
  • Scripting support (via IActiveScript)
  • Planned feature: Plugin support (via OleAutomation API)
  • Dark and Light UI themes

As with any other low-level tool, use with caution and always make backups of valuable data!

Copyright (C) 2019-2022 Grigoriy Mylnikov (DigitalWolF) [email protected]

Hextor is a Freeware Source-Available software. See LICENSE.txt for details

Building from sources

I recommend using pre-built binaries from Releases page.

If you want to build Hextor yourself:

Hexter is tested with Delphi 10.4.
Links to all dependencies can be found below in the Credits list. Usually master branch will do.
You also need to clone https://github.com/digitalw0lf/dwfunits.git next to Hextor folder.
AppVersion.Inc is generated by ./Installer/MakeIncludes.sh. I use bash from WSL.
(or you can just paste const AppVersion = 'v0.999'; into AppVersion.inc)

Credits

Hextor uses the following open-source libraries.

FastMM4 A memory manager for Delphi applications
https://github.com/pleriche/FastMM4
Copyright (c) Professional Software Development / Pierre le Riche
Licence: MPL 1.1 / LGPL 2.1

HashLib4Pascal Checksum and hash library
https://github.com/Xor-el/HashLib4Pascal
Copyright (c) Ugochukwu Mmaduekwe
Licence: MIT

JCL JEDI Code Library
https://www.delphi-jedi.org
Copyright (c) Project JEDI contributors
Licence: MPL 1.1

superobject JSON library
https://github.com/hgourvest/superobject
(fixed version from fork https://github.com/fainspace/superobject)
Copyright (c) Henri Gourvest
Licence: LGPL / MPL 1.1

SynEdit Syntax highlighting editor component
https://github.com/SynEdit/SynEdit
Licence: MPL 1.1 / GPL 2

Virtual-TreeView Delphi treeview control
https://www.jam-software.com/virtual-treeview
Copyright (c) 1999-2001 digital publishing AG
Copyright (c) 2000-2009 Mike Lischke
Copyright (c) JAM Software
License: MPL 1.1 / LGPL 2.1

Zydis Fast and lightweight x86/x86-64 disassembler library
https://github.com/zyantific/zydis
Copyright (c) 2014-2020 Florian Bernd
Copyright (c) 2014-2020 Joel Honer
Licence: MIT

hextor's People

Contributors

digitalw0lf avatar gitoffthelawn avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

hextor's Issues

Re-work toolframes UI

Requirements:
Show different tools simultaneously (e.g. Struct and Asm)
Open several frames of same type for different data ranges/files
Dock to any side of window or floating (even out of main app window)
Each toolframe instance can be either bound to specific editor or unbound (auto-show active editor)
By default frame is unbound, with option to bind to currently shown data
More convenient tool selection for 20+ tools
In future - adding tools with plugins

repo/symlink issues

There's a couple files in the repo that look suspect:

clayne@dorian:~/git/hextor/Source (master +=) $ git reset --hard
error: unable to create symlink Source/uOleAutoAPIWrapper.pas: File name too long
error: unable to create symlink Source/uSkipList.pas: File name too long
fatal: Could not reset index file to revision 'HEAD'.

strace snippet:

newfstatat(AT_FDCWD, "Source/uSkipList.pas", 0x7ffca4fa6808, AT_SYMLINK_NOFOLLOW) = -1 ENOENT (No such file or directory)
symlink("unit uSkipList;\n\ninterface\n\nuses\n  Types, SysUtils, Classes, RTLConsts, Generics.Collections, Generics.Defaults,\n  {Graphics,} Math;\n\ntype\n  TSkipListSet<T> = class(TEnumerable<T>)\n  private type\n    PT = ^T;\n    PItem = ^TItem;\n    TItem = record\n      Next, Down, Up: PItem;\n      ChildCount: Integer;\n      Value: PT;\n    end;\n    TItemPath = array of PItem;\n  public type\n    TElement = T;\n    TEnumerator = class(TEnumerator<T>)\n    private\n      FOwner: TSkipListSet<T>;\n      FItem: PItem;\n      FLastItem: PItem;  // If assigned, enumeration stops after this item\n      FInited: Boolean;\n    protected\n      function DoGetCurrent: T; override;\n      function DoMoveNext: Boolean; override;\n    public\n      constructor Create(Owner: TSkipListSet<T>);\n    end;\n    // For auto-refcounting\n    IEnumerableRange = interface(IInterface)\n      function GetEnumerator: TEnumerator;\n    end;\n    TEnumerableRange = class(TInterfacedObject, IEnumerableRange)\n    protected\n      FOwner: TSkipListSet<T>;\n      FFirstItem, FLastItem: PItem;\n    public\n      constructor Create(Owner: TSkipListSet<T>);\n      function GetEnumerator: TEnumerator;\n    end;\n  private\n    FComparer: IComparer<T>;\n    FLevels, FProb: Byte;\n    FHeads: array of PItem;\n    FOnNotify: TCollectionNotifyEvent<T>;\n    FOwnsObjects: Boolean;\n    function FindItemLEQ(const Key: T): TItemPath;\n    function FindItemLE(const Key: T): TItemPath;\n    function Insert(Path: TItemPath; Value: T): PItem;\n    function Promote(After: PItem; Item: PItem): PItem;\n    function DoExtract(const Key: T; Action: TCollectionNotification): T;\n  protected\n    function DoGetEnumerator: TEnumerator<T>; override;\n    procedure Notify(const Item: T; Action: TCollectionNotification); virtual;\n  public\n    constructor Create(ALevels: Byte = 4; AProb: Byte = 4; AComparer: IComparer<T> = nil);\n    destructor Destroy; override;\n    procedure Clear;\n    procedure AddOrSet(Value: T);\n    function TryFetch(const Key: T; var Value: T): Boolean;\n    // \315\340\365\356\344\350\362 \375\353\345\354\345\355\362 \361\362\360\356\343\356 \354\345\355\374\370\345 \363\352\340\347\340\355\355\356\343\356\n    function FindLE(const Key: T; var Value: T): Boolean;\n    // \315\340\365\356\344\350\362 \375\353\345\354\345\355\362 \354\345\355\374\370\350\351 \350\353\350 \360\340\342\355\373\351 \363\352\340\347\340\355\355\356\354\363\n    function FindLEQ(const Key: T; var Value: T): Boolean;\n    // \315\340\365\356\344\350\362 \375\353\345\354\345\355\362 \361\362\360\356\343\356 \341\356\353\374\370\345 \363\352\340\347\340\355\355\356\343\356\n    function FindGE(const Key: T; var Value: T): Boolean;\n    // \315\340\365\356\344\350\362 \375\353\345\354\345\355\362 \341\356\353\374\370\350\351 \350\353\350 \360\340\342\355\373\351 \363\352\340\347\340\355\355\356\354\363\n    function FindGEQ(const Key: T; var Value: T): Boolean;\n    function HasKey(const Key: T): Boolean;\n    // \302\356\347\342\360\340\371\340\345\362 \347\355\340\367\345\355\350\345 \350 \363\344\340\353\377\345\362 \345\343\356 \350\347 \361\357\350\361\352\340\n    function Extract(const Key: T): T;\n    procedure Remove(const Key: T);\n    function Get(const Key: T): T;\n    function First: T;\n    // \302\356\347\342\360\340\371\340\345\362 Enumerator \344\353\377 \375\353\345\354\345\355\362\340 \354\345\355\374\370\345\343\356 \350\353\350 \360\340\342\355\356\343\356 \363\352\340\347\340\355\355\356\354\363\n    function GetEnumeratorLEQ(const Key: T): TEnumerator;\n    // \302\356\347\342\360\340\371\340\345\362 Enumerator \344\353\377 \375\353\345\354\345\355\362\340 \361\362\360\356\343\356 \354\345\355\374\370\345 \363\352\340\347\340\355\355\356\343\356\n    function GetEnumeratorLE(const Key: T): TEnumerator;\n    // \302\356\347\342\360\340\371\340\345\362 Enumerator \344\353\377 \375\353\345\354\345\355\362\340 \341\356\353\374\370\345\343\356 \350\353\350 \360\340\342\355\356\343\356 \363\352\340\347\340\355\355\356\354\363\n    function GetEnumeratorGEQ(const Key: T): TEnumerator;\n    // \302\356\347\342\360\340\371\340\345\362 Enumerator \344\353\377 \375\353\345\354\345\355\362\340 \361\362\360\356\343\356 \341\356\353\374\370\345 \363\352\340\347\340\355\355\356\343\356\n    function GetEnumeratorGE(const Key: T): TEnumerator;\n//    function GetEnumeratorForRange(const FirstKey, LastKey: T): TEnumerator;\n    function EnumerateRange(const FirstKey, LastKey: T): IEnumerableRange;\n    function EnumerateFrom(const FirstKey: T): IEnumerableRange;\n    function Count(): Integer;\n    function IsEmpty(): Boolean;\n    property OnNotify: TCollectionNotifyEvent<T> read FOnNotify write FOnNotify;\n    property OwnsObjects: Boolean read FOwnsObjects write FOwnsObjects;\n    //    procedure DebugDraw(Canvas: TCanvas; R: TRect);\n  end;\n\n  TSkipListMap<TKey, TValue> = class(TSkipListSet<TPair<TKey, TValue>>)\n  public\n    constructor Create(ALevels: Byte = 4; AProb: Byte = 4; AComparer: IComparer<TKey> = nil);\n    procedure AddOrSet(const Key: TKey; Value: TValue);\n    function TryFetch(const Key: TKey; var Value: TValue): Boolean;\n    function HasKey(const Key: TKey): Boolean;\n    procedure Remove(const Key: TKey);\n    function Extract(const Key: TKe"..., "Source/uSkipList.pas") = -1 ENAMETOOLONG (File name too long)

The issue was created here: 37519a3

I.e. the actual content of the files (which normally points to the symlink target) is now the files themselves yet git still thinks the files are symlinks. The commit itself references changing them to hard links but last I checked git has no ability to represent hard links via a surrogate inode or otherwise.

Assembler

Compile modified disassembly back into machine code

D10.2.3 errors

D10.2.3
Could not find uActiveScript;
ctx.NotWriteEmptyField := ANotWriteEmptyField; no such thing NotWriteEmptyField
may be more?

Compare files and export patch

From discussion #44

  1. export patch (oldfile new file patchfilename)
  2. clickable list to see the differences and on click jump to the difference
  3. option to copy the file offset address (right mouse button, copy address)

Workspace saving

Save:
List of open files, position/selection, Each editor settings, Struct/script text, Search results, Bookmarks, ...?

Autosave workspace(s) to special folder if no workspace explicitly selected.

Alternative:
Save some settings, Bookmarks for each file path; restore when same file opened

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.