From 746a7cb2717868a91b59e14d322a4ebdf4c272c8 Mon Sep 17 00:00:00 2001 From: David Korth Date: Fri, 7 Jul 2017 22:59:34 -0400 Subject: [PATCH] Added README and screenshots. --- README.md | 28 ++++++++++++++++++++++++++++ screenshots/hd-winxp.png | Bin 0 -> 7421 bytes screenshots/hd-xterm.png | Bin 0 -> 11442 bytes 3 files changed, 28 insertions(+) create mode 100644 README.md create mode 100644 screenshots/hd-winxp.png create mode 100644 screenshots/hd-xterm.png diff --git a/README.md b/README.md new file mode 100644 index 0000000..b1ce98c --- /dev/null +++ b/README.md @@ -0,0 +1,28 @@ +# *** HACK DETECTION *** + +This is a simple command line utility that can check if a ROM hack +appears to be a hex-edited binary hack instead of a hack based on +a disassembly. + +## How to use: + +``` +$ hack-detection [Source ROM] [Hacked ROM] +``` + +* Source ROM: The original ROM, e.g. "Sonic 1 Rev00.gen". +* Hacked ROM: The hacked ROM, e.g. "Sonic 1337.bin". + +## Screenshots + +These examples use Sonic 1 Rev00 as the source ROM and +[Sonic 1337](https://info.sonicretro.org/Sonic_1337) as the hacked ROM. + +![hack-detection on Windows XP](screenshots/hd-winxp.png) + +![hack-detection on xterm (KDE5)](screenshots/hd-xterm.png) + +## License + +hack-detection is licensed under the GNU AGPLv3. See [LICENSE.md](LICENSE.md) +for more information. diff --git a/screenshots/hd-winxp.png b/screenshots/hd-winxp.png new file mode 100644 index 0000000000000000000000000000000000000000..ad6c13e0e507464f06425ce523dce4643b6a794a GIT binary patch literal 7421 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 Z`U7KO?aki)2xSIbx4CZxHy=6s{{W}vl`#MS literal 0 HcmV?d00001 diff --git a/screenshots/hd-xterm.png b/screenshots/hd-xterm.png new file mode 100644 index 0000000000000000000000000000000000000000..5b8ad7c77e8373d0bc46d4f27623c8e2d9328508 GIT binary patch literal 11442 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