clearbluejar
ghidriff
Python

Python Command-Line Ghidra Binary Diffing Engine

Last updated Jul 8, 2026
790
Stars
43
Forks
32
Issues
+1
Stars/day
Attention Score
60
Language breakdown
No language data available.
β–Έ Files click to expand
README

GitHub Workflow Status (with event) PyPI - Downloads

Ghidriff - Ghidra Binary Diffing Engine

ghidriff provides a command-line binary diffing capability with a fresh take on diffing workflow and results. It leverages the power of Ghidra's ProgramAPI and FlatProgramAPI to find the added, deleted, and modified functions of two arbitrary binaries. It is written in Python3 using pyghidra to orchestrate Ghidra and jpype as the Python to Java interface to Ghidra. Its primary use case is patch diffing. Its ability to perform a patch diff with a single command makes it ideal for automated analysis. The diffing results are stored in JSON and rendered in markdown (optionally side-by-side HTML). The markdown output promotes "social" diffing, as results are easy to publish in a gist or include in your next writeup or blog post.

High Level

flowchart LR
 
 a(old binary - rpcrt4.dll-v1) --> b[GhidraDiffEngine]
 c(new binary - rpcrt4.dll-v2) --> b
 
 b --> e(Ghidra Project Files)
 b --> diffsoutputdir
 
 subgraph diffsoutputdir
     direction LR
     i(rpcrt4.dll-v1-v2.diff.md)
     h(rpcrt4.dll-v1-v2.diff.json)
     j(rpcrt4.dll-v1-v2.diff.side-by-side.html)
 end

Sample Diffs

image image

Features

  • Command Line (patch diffing workflow reduced to a single step)
  • Highlights important changes in the TOC
  • Fast - Can diff the full Windows kernel in less than a minute (after Ghidra analysis is complete)
  • Enables Social Diffing
- Beautiful Markdown Output - Easily hosted in a GitHub or GitLab gist, blog, or anywhere markdown is supported - Visual Diff Graph Results
  • Supports both unified and side by side diff results (unified is default)
  • Provides unique Meta Diffs:
- Binary Strings - Called - Calling - Binary Metadata
  • Batteries Included
- Docker support - Automated Testing - Ghidra (No license required) See below for CVE diffs and sample usage

Design Goals

  • Find all added, deleted, and modified functions
  • Provide foundation for automation
  • Simple, Fast, Accurate
  • Resilient
  • Extendable
  • Easy sharing of results
  • Social Diffing

Powered by Ghidra

The heavy lifting of the binary analysis is done by Ghidra and the diffing is possible via Ghidra's Program API. ghidriff provides a diffing workflow, function matching, and resulting markdown and HTML diff output.

Docs

Engine

An "engine" is a self-contained, but externally-controllable, piece of code that encapsulates powerful logic designed to perform a specific type of work.
ghidriff provides a core base class GhidraDiffEngine that can be extended to create your own binary diffing implementations. The base class implements the first 3 steps of the Ghidra headless workflow: >1. Create Ghidra Project - Directory and collection of Ghidra project files and data >2. Import Binary to project - Import one or more binaries to the project for analysis >3. Analyze Binary - Ghidra will perform default binary analysis on each binary The base class provides the abstract method findmatches where the actual diffing (function matching) takes place.

Extending ghidriff

ghidriff can be used as is, but it offers developers the ability to extend the tool by implementing their own differ. The basic idea is create new diffing tools by implementing the find_matches method from the base class.
class NewDiffTool(GhidraDiffEngine):
 
     def init(self,verbose=False) -> None:
         super().init(verbose)
 
     @abstractmethod
     def find_matches(
             self,            
             old: Union[str, pathlib.Path],
             new: Union[str, pathlib.Path]
     ) -> dict:
         """My amazing differ"""
 
         # find added, deleted, and modified functions
         # <code goes here>
 
         return [unmatched, matched]

Implementations

There are currently 3 diffing implementations, which also display the evolution of diffing for the project.
  • SimpleDiff - A simple diff implementation. "Simple" as in it relies mostly on known symbol names for matching.
  • StructualGraphDiff - A slightly more advanced differ, beginning to perform some more advanced hashing (such as Halvar's Structural Graph Comparison)
  • VersionTrackingDiff - The latest differ, with several correlators (an algorithm used to score specific associations based on code, program flow, or any observable aspect of comparison) for function matching. This one is fast.
Each implementation leverages the base class, and implements find_changes.

Usage

usage: ghidriff [-h] [--engine {SimpleDiff,StructualGraphDiff,VersionTrackingDiff}] [-o OUTPUTPATH] [--summary] [-p PROJECTLOCATION]                 [-n PROJECTNAME] [-s SYMBOLSPATH] [-g GZFSPATH] [--ba BASEADDRESS] [--program-options PROGRAM_OPTIONS] [--threaded | --no-threaded]
                 [--force-analysis] [--force-diff] [--no-symbols] [--log-level {CRITICAL,FATAL,ERROR,WARN,WARNING,INFO,DEBUG,NOTSET}]
                 [--file-log-level {CRITICAL,FATAL,ERROR,WARN,WARNING,INFO,DEBUG,NOTSET}] [--log-path LOGPATH] [--va] [--min-func-len MINFUNC_LEN]
                 [--use-calling-counts | --no-use-calling-counts] [--gdt GDT] [--bsim | --no-bsim] [--bsim-full | --no-bsim-full]
                 [--max-ram-percent MAXRAMPERCENT] [--print-flags] [--jvm-args JVMARGS] [--decompiler-timeout DECOMPILERTIMEOUT] [--sxs]                 [--max-section-funcs MAXSECTIONFUNCS] [--md-title MD_TITLE]                 old new [new ...]
 
 ghidriff - A Command Line Ghidra Binary Diffing Engine
 
 positional arguments:
   old                   Path to old version of binary '/somewhere/bin.old'
   new                   Path to new version of binary '/somewhere/bin.new'. (For multiple new binaries add oldest to newest)
 
 options:
   -h, --help            show this help message and exit
   --engine {SimpleDiff,StructualGraphDiff,VersionTrackingDiff}
                         The diff implementation to use. (default: VersionTrackingDiff)
   -o OUTPUTPATH, --output-path OUTPUTPATH
                         Output path for resulting diffs (default: ghidriffs)
   --summary             Add a summary diff if more than two bins are provided (default: False)

Extendend Usage

There are quite a few options here, and some complexity. Generally you can succeed with the defaults, but you can override the defaults as needed. One example might be to increase the JVM RAM used to run Ghidra to enable faster analysis of large binaries (--max-ram-percent 80). See help for details of other options.
Show Extended Usage
Ghidra Project Options:
   -p PROJECTLOCATION, --project-location PROJECTLOCATION
                         Ghidra Project Path (default: ghidra_projects)
   -n PROJECTNAME, --project-name PROJECTNAME
                         Ghidra Project Name (default: ghidriff)
   -s SYMBOLSPATH, --symbols-path SYMBOLSPATH
                         Ghidra local symbol store directory (default: symbols)
   -g GZFSPATH, --gzfs-path GZFSPATH
                         Location to store GZFs of analyzed binaries (default: gzfs)
   --ba BASEADDRESS, --base-address BASEADDRESS
                         Set base address from both programs. 0x2000 or 8192 (default: None)
   --program-options PROGRAM_OPTIONS
                         Path to json file with Program Options (custom analyzer settings) (default: None)
 
 Engine Options:
   --threaded, --no-threaded
                         Use threading during import, analysis, and diffing. Recommended (default: True)
   --force-analysis      Force a new binary analysis each run (slow) (default: False)
   --force-diff          Force binary diff (ignore arch/symbols mismatch) (default: False)
   --no-symbols          Turn off symbols for analysis (default: False)
   --log-level {CRITICAL,FATAL,ERROR,WARN,WARNING,INFO,DEBUG,NOTSET}
                         Set console log level (default: INFO)
   --file-log-level {CRITICAL,FATAL,ERROR,WARN,WARNING,INFO,DEBUG,NOTSET}
                         Set log file level (default: INFO)
   --log-path LOG_PATH   Set ghidriff log path. (default: ghidriff.log)
   --va, --verbose-analysis
                         Verbose logging for analysis step. (default: False)
   --min-func-len MINFUNCLEN
                         Minimum function length to consider for diff (default: 10)
   --use-calling-counts, --no-use-calling-counts
                         Add calling/called reference counts (default: False)
   --gdt GDT             Path to GDT file for analysis (default: [])
 
 BSIM Options:
   --bsim, --no-bsim     Toggle using BSIM correlation (default: True)
   --bsim-full, --no-bsim-full
                         Slower but better matching. Use only when needed (default: False)
 
 JVM Options:
   --max-ram-percent MAXRAMPERCENT
                         Set JVM Max Ram % of host RAM (default: 60.0)
   --print-flags         Print JVM flags at start (default: False)
   --jvm-args [JVM_ARGS]                         JVM arg to add at start. Repeat as needed; use --jvm-args=-Xmx8G for values beginning with "-". (default: [])   --decompiler-timeout DECOMPILER_TIMEOUT                         Decompiler timeout in seconds per function (default: 60) 
 Markdown Options:
   --sxs                 Include side by side code diff (default: False)
   --max-section-funcs MAXSECTIONFUNCS
                         Max number of functions to display per section. (default: 200)
   --md-title MD_TITLE   Overwrite default title for markdown diff (default: None)

Using Custom Analyzer Settings

If you want to configure specific analyzers for your Ghidra binary analysis, set a custom program_options.json with --program-options.
ghidriff --prog-options prog_options.json tapisrv.dll.x64.10.0.10240.20708 tapisrv.dll.x64.10.0.10240.20708
The program_options.json would need to look something like this:
{
     "program_options": {
         "binary_name": null,
         "Analyzers": {
             "ASCII Strings": "true",
             "ASCII Strings.Create Strings Containing Existing Strings": "true",
             "ASCII Strings.Create Strings Containing References": "true",
             "ASCII Strings.Force Model Reload": "true",
             "ASCII Strings.Minimum String Length": "LEN_5",
             "ASCII Strings.Model File": "StringModel.sng",
             "ASCII Strings.Require Null Termination for String": "true",
             "ASCII Strings.Search Only in Accessible Memory Blocks": "true",
             "ASCII Strings.String Start Alignment": "ALIGN_1",
             "ASCII Strings.String end alignment": "4",
             "Aggressive Instruction Finder": "false",
             "Aggressive Instruction Finder.Create Analysis Bookmarks": "true",
             "Apply Data Archives": "true",
             "Apply Data Archives.Archive Chooser": "[Auto-Detect]",
             "Apply Data Archives.Create Analysis Bookmarks": "true",
             "Apply Data Archives.GDT User File Archive Path": null,
             "Apply Data Archives.User Project Archive Path": null,
             "Call Convention ID": "true",
         }
     }
 }
The custom settings will then be used for your binary analysis.

Setting a Custom Image Base Address (Bootloaders, etc.)

If you are reverse engineering firmware or other fun binary and want to change the base address for the binary, use the --base-address parameter to change the base address.
$ ghidriff --base-address 0x80000 STM32F103C-firmware.bin STM32F103Ca-firmware.bin

Quick Start Environment Setup

  • Download and install Ghidra. The current development target is Ghidra 12.0.4 with pyghidra 3.x.
  • Set Ghidra Environment Variable GHIDRAINSTALLDIR to Ghidra install location.
  • Pip install ghidriff

Windows

PS C:\Users\user> [System.Environment]::SetEnvironmentVariable('GHIDRAINSTALLDIR','C:\ghidra10.2.3PUBLIC20230208\ghidra10.2.3_PUBLIC')
PS C:\Users\user> pip install ghidriff

Linux / Mac

export GHIDRAINSTALLDIR="/path/to/ghidra/"
pip install ghidriff

On macOS, install a JDK supported by your Ghidra release first, then set GHIDRAINSTALLDIR to the unpacked Ghidra application directory. If macOS Gatekeeper quarantines the downloaded Ghidra archive, remove the quarantine attribute before first launch:

xattr -dr com.apple.quarantine /path/to/ghidra12.0.4PUBLIC
export GHIDRAINSTALLDIR="/path/to/ghidra12.0.4PUBLIC"
pip install ghidriff

UV

export GHIDRAINSTALLDIR="/path/to/ghidra/"
uvx ghidriff

Ghidriff in a Box

Don't want to install Ghidra and Java on your host? Try "Ghidriff in a box". It supports multiple-platforms (x64 and arm64).

Docker

docker pull ghcr.io/clearbluejar/ghidriff:latest This is a docker container with the latest PyPi version of Ghidriff installed. You can check the latest container here.

For Docker command-line diffing

You will need to map the binaries you want to compare into the container. See below for an example.
mkdir -p ghidriffs
wget https://msdl.microsoft.com/download/symbols/clfs.sys/9848245C6f000/clfs.sys -O ghidriffs/clfs.sys.x64.10.0.22621.2506
wget https://msdl.microsoft.com/download/symbols/clfs.sys/D929C6E56f000/clfs.sys -O ghidriffs/clfs.sys.x64.10.0.22621.2715
docker run -it --rm -v $(pwd)/ghidriffs:/ghidriffs ghcr.io/clearbluejar/ghidriff:latest  ghidriffs/clfs.sys.x64.10.0.22621.2506 ghidriffs/clfs.sys.x64.10.0.22621.2715
The result will produce the following.
tree ghidriffs
ghidriffs
β”œβ”€β”€ clfs.sys.x64.10.0.22621.2506
β”œβ”€β”€ clfs.sys.x64.10.0.22621.2506-clfs.sys.x64.10.0.22621.2715.ghidriff.md
β”œβ”€β”€ clfs.sys.x64.10.0.22621.2715
β”œβ”€β”€ ghidra_projects
β”‚   └── ghidriff-clfs.sys.x64.10.0.22621.2506-clfs.sys.x64.10.0.22621.2715
β”‚       β”œβ”€β”€ ghidriff-clfs.sys.x64.10.0.22621.2506-clfs.sys.x64.10.0.22621.2715.gpr
β”‚       β”œβ”€β”€ ghidriff-clfs.sys.x64.10.0.22621.2506-clfs.sys.x64.10.0.22621.2715.lock
β”‚       └── ghidriff-clfs.sys.x64.10.0.22621.2506-clfs.sys.x64.10.0.22621.2715.rep
β”œβ”€β”€ ghidriff.log
β”œβ”€β”€ json
β”‚   └── clfs.sys.x64.10.0.22621.2506-clfs.sys.x64.10.0.22621.2715.ghidriff.json
└── symbols
    β”œβ”€β”€ 000admin
    β”œβ”€β”€ clfs.pdb
    β”‚   β”œβ”€β”€ 6EAE8987F981603FEFA0E55DE0CE2C521
    β”‚   β”‚   └── clfs.pdb
    β”‚   └── E3D1FEA241ECEC3DC6DB2B278A22A6A31
    β”‚       └── clfs.pdb
    └── pingme.txt

Devcontainer - For Ghidriff development

Use the .devcontainer in this repo. If you don't know how, follow the detailed instructions here: ghidra-python-vscode-devcontainer-skeleton quick setup.

The devcontainer targets ghcr.io/clearbluejar/ghidra-python:12.0.4ghidra3.13python-bookworm. After rebuilding it, the post-create step installs ghidriff with test and dev extras.

Useful development commands:

make install-dev
make test
make test-fast
make test-integration
make lint
make check

make test runs the full suite. make test-fast runs tests that do not launch Ghidra. make test-integration runs the Ghidra-backed tests and requires tests/data, GHIDRAINSTALLDIR, and a compatible pyghidra/Ghidra runtime. JVM arguments that begin with - should be passed with equals syntax, for example:

ghidriff --jvm-args=-Xmx8G --decompiler-timeout 120 old.bin new.bin

Deferred design items are tracked in docs/deferred-issues.md.

Use Cases

Diffing a full Windows Kernel

Download two versions of the kernel (older and latest binary):

wget https://msdl.microsoft.com/download/symbols/ntoskrnl.exe/F7E31BA91047000/ntoskrnl.exe -O ntoskrnl.exe.10.0.22621.1344
wget https://msdl.microsoft.com/download/symbols/ntoskrnl.exe/17B6B7221047000/ntoskrnl.exe -O ntoskrnl.exe.10.0.22621.1413
Console Output:
vscode ➜ /workspaces/ghidriff (main) $ wget https://msdl.microsoft.com/download/symbols/ntoskrnl.exe/F7E31BA91047000/ntoskrnl.exe -O ntoskrnl.exe.10.0.22621.1344
--2023-05-17 03:18:40--  https://msdl.microsoft.com/download/symbols/ntoskrnl.exe/F7E31BA91047000/ntoskrnl.exe
Resolving msdl.microsoft.com (msdl.microsoft.com)... 204.79.197.219
Connecting to msdl.microsoft.com (msdl.microsoft.com)|204.79.197.219|:443... connected.
HTTP request sent, awaiting response... 302 Found
Could not parse String-Transport-Security header
Location: https://vsblobprodscussu5shard72.blob.core.windows.net/b-4712e0edc5a240eabf23330d7df68e77/8BFC691F50434EC2DC87BBDFC06A6A5FBACE992E60062F9C8CE829F58E3BCFB300.blob?sv=2019-07-07&sr=b&si=1&sig=Kgrvf90Kc15ac%2FtHsgPPj9ztxxTfkQ0yHGQh8dLDwQs%3D&spr=https&se=2023-05-18T03%3A32%3A47Z&rscl=x-e2eid-420cea82-598a4a00-a990abf8-919be2ff-session-5e9eb5eb-195146cb-b123c222-30eef52e [following]
--2023-05-17 03:18:40--  https://vsblobprodscussu5shard72.blob.core.windows.net/b-4712e0edc5a240eabf23330d7df68e77/8BFC691F50434EC2DC87BBDFC06A6A5FBACE992E60062F9C8CE829F58E3BCFB300.blob?sv=2019-07-07&sr=b&si=1&sig=Kgrvf90Kc15ac%2FtHsgPPj9ztxxTfkQ0yHGQh8dLDwQs%3D&spr=https&se=2023-05-18T03%3A32%3A47Z&rscl=x-e2eid-420cea82-598a4a00-a990abf8-919be2ff-session-5e9eb5eb-195146cb-b123c222-30eef52e
Resolving vsblobprodscussu5shard72.blob.core.windows.net (vsblobprodscussu5shard72.blob.core.windows.net)... 20.209.34.36
Connecting to vsblobprodscussu5shard72.blob.core.windows.net (vsblobprodscussu5shard72.blob.core.windows.net)|20.209.34.36|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 11990400 (11M) [application/octet-stream]
Saving to: β€˜ntoskrnl.exe.10.0.22621.1344’

ntoskrnl.exe.10.0.22621.1344                       100%[===============================================================================================================>]  11.43M  2.47MB/s    in 5.5s    

2023-05-17 03:18:46 (2.08 MB/s) - β€˜ntoskrnl.exe.10.0.22621.1344’ saved [11990400/11990400]

vscode ➜ /workspaces/ghidriff (main) $ wget https://msdl.microsoft.com/download/symbols/ntoskrnl.exe/17B6B7221047000/ntoskrnl.exe -O ntoskrnl.exe.10.0.22621.1413
--2023-05-17 03:18:58--  https://msdl.microsoft.com/download/symbols/ntoskrnl.exe/17B6B7221047000/ntoskrnl.exe
Resolving msdl.microsoft.com (msdl.microsoft.com)... 204.79.197.219
Connecting to msdl.microsoft.com (msdl.microsoft.com)|204.79.197.219|:443... connected.
HTTP request sent, awaiting response... 302 Found
Could not parse String-Transport-Security header
Location: https://vsblobprodscussu5shard75.blob.core.windows.net/b-4712e0edc5a240eabf23330d7df68e77/D946523F2726056CD289008C977D02C0C0FBBCBB89D9FA40ADBB42CDE8D5022A00.blob?sv=2019-07-07&sr=b&si=1&sig=KfYz9cB7cUPO9JVo0U8eIj0etpASEWOyvCv5NkwVkfw%3D&spr=https&se=2023-05-18T03%3A50%3A53Z&rscl=x-e2eid-4960dee3-47d94aa4-a2207913-b73825a4-session-2879fa10-75774ef4-93e39015-3be72abb [following]
--2023-05-17 03:18:59--  https://vsblobprodscussu5shard75.blob.core.windows.net/b-4712e0edc5a240eabf23330d7df68e77/D946523F2726056CD289008C977D02C0C0FBBCBB89D9FA40ADBB42CDE8D5022A00.blob?sv=2019-07-07&sr=b&si=1&sig=KfYz9cB7cUPO9JVo0U8eIj0etpASEWOyvCv5NkwVkfw%3D&spr=https&se=2023-05-18T03%3A50%3A53Z&rscl=x-e2eid-4960dee3-47d94aa4-a2207913-b73825a4-session-2879fa10-75774ef4-93e39015-3be72abb
Resolving vsblobprodscussu5shard75.blob.core.windows.net (vsblobprodscussu5shard75.blob.core.windows.net)... 20.209.34.36
Connecting to vsblobprodscussu5shard75.blob.core.windows.net (vsblobprodscussu5shard75.blob.core.windows.net)|20.209.34.36|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 11990336 (11M) [application/octet-stream]
Saving to: β€˜ntoskrnl.exe.10.0.22621.1413’

ntoskrnl.exe.10.0.22621.1413                       100%[===============================================================================================================>]  11.43M  1.02MB/s    in 12s     

2023-05-17 03:19:11 (1004 KB/s) - β€˜ntoskrnl.exe.10.0.22621.1413’ saved [11990336/11990336]

Run ghidriff:

ghidriff ntoskrnl.exe.10.0.22621.1344 ntoskrnl.exe.10.0.22621.1413
Console Output
(.env) vscode ➜ /workspaces/ghidriff (main) $ ghidriff ntoskrnl.exe.10.0.22621.1344 ntoskrnl.exe.10.0.22621.1413
INFO | ghidriff | Init Ghidra Diff Engine...
INFO | ghidriff | Engine Console Log: INFO
INFO | ghidriff | Engine File Log:  .ghidriffs/ghidriff.log INFO
INFO | ghidriff | Starting Ghidra...
INFO  Using log config file: jar:file:/ghidra/Ghidra/Framework/Generic/lib/Generic.jar!/generic.log4j.xml (LoggingInitialization)  
INFO  Using log file: /workspaces/ghidriff/.ghidriffs/ghidriff.log (LoggingInitialization)  
INFO  Loading user preferences: /home/vscode/.ghidra/.ghidra10.2.3PUBLIC/preferences (Preferences)  
INFO  Class search complete (716 ms) (ClassSearcher)  
INFO  Initializing SSL Context (SSLContextInitializer)  
INFO  Initializing Random Number Generator... (SecureRandomFactory)  
INFO  Random Number Generator initialization complete: NativePRNGNonBlocking (SecureRandomFactory)  
INFO  Trust manager disabled, cacerts have not been set (ApplicationTrustManagerFactory)  
INFO | ghidriff | GHIDRAINSTALLDIR: /ghidra
INFO | ghidriff | GHIDRA 10.2.3  Build Date: 2023-Feb-08 1242 EST Release: PUBLIC
INFO | ghidriff | Engine Args:
INFO | ghidriff |       old:                ['ntoskrnl.exe.10.0.22621.1344']
INFO | ghidriff |       new:                [['ntoskrnl.exe.10.0.22621.1413']]
INFO | ghidriff |       engine:             VersionTrackingDiff
INFO | ghidriff |       output_path:        .ghidriffs
INFO | ghidriff |       summary:            False
INFO | ghidriff |       projectlocation:   .ghidraprojects
INFO | ghidriff |       project_name:       ghidriff
INFO | ghidriff |       symbols_path:       .symbols
INFO | ghidriff |       threaded:           True
INFO | ghidriff |       force_analysis:     False
INFO | ghidriff |       force_diff:         False
INFO | ghidriff |       no_symbols:         False
INFO | ghidriff |       log_level:          INFO
INFO | ghidriff |       fileloglevel:     INFO
INFO | ghidriff |       log_path:           ghidriff.log
INFO | ghidriff |       va:                 False
INFO | ghidriff |       maxrampercent:    60.0
INFO | ghidriff |       print_flags:        False
INFO | ghidriff |       jvm_args:           None
INFO | ghidriff |       sidebyside:       False
INFO | ghidriff |       maxsectionfuncs:  200
INFO | ghidriff |       md_title:           None
INFO | ghidriff | Setting Up Ghidra Project...
INFO  Creating project: /workspaces/ghidriff/.ghidra_projects/ghidriff-ntoskrnl.exe.10.0.22621.1344-ntoskrnl.exe.10.0.22621.1413/ghidriff-ntoskrnl.exe.10.0.22621.1344-ntoskrnl.exe.10.0.22621.1413 (DefaultProject)  
INFO | ghidriff | Created project: ghidriff-ntoskrnl.exe.10.0.22621.1344-ntoskrnl.exe.10.0.22621.1413
INFO | ghidriff | Project Location: /workspaces/ghidriff/.ghidra_projects/ghidriff-ntoskrnl.exe.10.0.22621.1344-ntoskrnl.exe.10.0.22621.1413
INFO | ghidriff | Importing ntoskrnl.exe.10.0.22621.1344
INFO  Starting cache cleanup: /tmp/vscode-Ghidra/fscache2 (FileCacheMaintenanceDaemon)  
INFO  Finished cache cleanup, estimated storage used: 0 (FileCacheMaintenanceDaemon)  
INFO  Using Loader: Portable Executable (PE) (AutoImporter)  
INFO | ghidriff | Importing ntoskrnl.exe.10.0.22621.1413
INFO  Using Loader: Portable Executable (PE) (AutoImporter)  
INFO | ghidriff | Setting up Symbol Server for symbols...
INFO | ghidriff | path: .symbols level: 1
INFO | ghidriff | Symbol Server Configured path: SymbolServerService:
        symbolStore: LocalSymbolStore: [ rootDir: /workspaces/ghidriff/.symbols, storageLevel: -1],
        symbolServers:
                HttpSymbolServer: [ url: https://msdl.microsoft.com/download/symbols/, storageLevel: -1]
                HttpSymbolServer: [ url: https://chromium-browser-symsrv.commondatastorage.googleapis.com/, storageLevel: -1]
                HttpSymbolServer: [ url: https://symbols.mozilla.org/, storageLevel: -1]
                HttpSymbolServer: [ url: https://software.intel.com/sites/downloads/symbols/, storageLevel: -1]
                HttpSymbolServer: [ url: https://driver-symbols.nvidia.com/, storageLevel: -1]
                HttpSymbolServer: [ url: https://download.amd.com/dir/bin/, storageLevel: -1]
INFO  Connecting to https://msdl.microsoft.com/download/symbols/ (ConsoleTaskMonitor)  
INFO  Success (ConsoleTaskMonitor)  
INFO  Storing ntkrnlmp.pdb in local symbol store (12.66MB) (ConsoleTaskMonitor)  
INFO | ghidriff | Pdb stored at: /workspaces/ghidriff/.symbols/ntkrnlmp.pdb/FB0913AF0585F234BD64A64A87C62DB11/ntkrnlmp.pdb
INFO  Connecting to https://msdl.microsoft.com/download/symbols/ (ConsoleTaskMonitor)  
INFO  Success (ConsoleTaskMonitor)  
INFO  Storing ntkrnlmp.pdb in local symbol store (12.66MB) (ConsoleTaskMonitor)  
INFO | ghidriff | Pdb stored at: /workspaces/ghidriff/.symbols/ntkrnlmp.pdb/797E613DB16DB6C0E57795A0CB03F4711/ntkrnlmp.pdb
INFO | ghidriff | Program: /ntoskrnl.exe.10.0.22621.1344 imported: True haspdb: True pdbloaded: False analyzed False
INFO | ghidriff | Program: /ntoskrnl.exe.10.0.22621.1413 imported: True haspdb: True pdbloaded: False analyzed False
INFO | ghidriff | Starting analysis for 2 binaries
INFO | ghidriff | Analyzing: ntoskrnl.exe.10.0.22621.1413 - .ProgramDB
INFO | ghidriff | Analyzing: ntoskrnl.exe.10.0.22621.1344 - .ProgramDB
WARNING| ghidriff | Turning off 'Shared Return Calls' for ntoskrnl.exe.10.0.22621.1344 - .ProgramDB
INFO | ghidriff | Starting Ghidra analysis of ntoskrnl.exe.10.0.22621.1344 - .ProgramDB...
INFO  PDB analyzer parsing file: /workspaces/ghidriff/.symbols/ntkrnlmp.pdb/FB0913AF0585F234BD64A64A87C62DB11/ntkrnlmp.pdb (PdbUniversalAnalyzer)  
WARNING| ghidriff | Turning off 'Shared Return Calls' for ntoskrnl.exe.10.0.22621.1413 - .ProgramDB
INFO | ghidriff | Starting Ghidra analysis of ntoskrnl.exe.10.0.22621.1413 - .ProgramDB...
INFO  PDB analyzer parsing file: /workspaces/ghidriff/.symbols/ntkrnlmp.pdb/797E613DB16DB6C0E57795A0CB03F4711/ntkrnlmp.pdb (PdbUniversalAnalyzer)  
WARN  PDB STRUCTURE reconstruction failed to align /ntkrnlmp.pdb/<unnamed-tag_00001117> (CppCompositeType)  
WARN  PDB STRUCTURE reconstruction failed to align /ntkrnlmp.pdb/<unnamed-tag_0000111B> (CppCompositeType)  
WARN  PDB STRUCTURE reconstruction failed to align /ntkrnlmp.pdb/<unnamed-tag_0000111F> (CppCompositeType)  
WARN  PDB STRUCTURE reconstruction failed to align /ntkrnlmp.pdb/WMILOGGER_CONTEXT (CppCompositeType)  
WARN  PDB STRUCTURE reconstruction failed to align /ntkrnlmp.pdb/PPMPLATFORM_STATE (CppCompositeType)  
WARN  PDB STRUCTURE reconstruction failed to align /ntkrnlmp.pdb/IOPIRP_EXTENSION (CppCompositeType)  
WARN  PDB STRUCTURE reconstruction failed to align /ntkrnlmp.pdb/EXHEAPPOOLNODE (CppCompositeType)  
WARN  PDB STRUCTURE reconstruction failed to align /ntkrnlmp.pdb/_BLOB (CppCompositeType)  
WARN  PDB STRUCTURE reconstruction failed to align /ntkrnlmp.pdb/MMPAGINGFILE (CppCompositeType)  
WARN  PDB STRUCTURE reconstruction failed to align /ntkrnlmp.pdb/MMCLONEDESCRIPTOR (CppCompositeType)  
WARN  PDB STRUCTURE reconstruction failed to align /ntkrnlmp.pdb/KUSERSHARED_DATA (CppCompositeType)  
INFO  Resolve time: 1939 mS (DefaultPdbApplicator)  
INFO  resolveCount: 3644 (DefaultPdbApplicator)  
INFO  Resolve time: 1854 mS (DefaultPdbApplicator)  
INFO  resolveCount: 3644 (DefaultPdbApplicator)  
WARN  Decompiling 1402efc70, pcode error at 14000000c: Unable to resolve constructor at 14000000c (DecompileCallback)  
WARN  Decompiling 1402efc70, pcode error at 14000000c: Unable to resolve constructor at 14000000c (DecompileCallback)  
WARN  Decompiling 1402efc70, pcode error at 14000000c: Unable to resolve constructor at 14000000c (DecompileCallback)  
INFO  Packed database cache: /tmp/vscode-Ghidra/packed-db-cache (PackedDatabaseCache)  

 
INFO  -----------------------------------------------------
    ASCII Strings                              0.137 secs
    Apply Data Archives                        3.295 secs
    Call Convention ID                         2.037 secs
    Call-Fixup Installer                       0.998 secs
    Create Address Tables                      0.021 secs
    Create Address Tables - One Time           5.159 secs
    Create Function                            8.858 secs
    Data Reference                            17.246 secs
    Decompiler Switch Analysis               266.328 secs
    Demangler Microsoft                        3.514 secs
    Disassemble                                0.232 secs
    Disassemble Entry Points                  58.448 secs
    Disassemble Entry Points - One Time        1.802 secs
    Embedded Media                             0.123 secs
    External Entry References                  0.125 secs
    Function ID                              114.335 secs
    Function Start Search                      0.859 secs
    Non-Returning Functions - Discovered      25.594 secs
    Non-Returning Functions - Known            0.144 secs
    PDB Universal                            168.601 secs
    Reference                                  6.969 secs
    Scalar Operand References                 91.615 secs
    Shared Return Calls                        4.718 secs
    Stack                                    291.121 secs
    Subroutine References                     14.672 secs
    Subroutine References - One Time           0.027 secs
    Windows x86 PE Exception Handling          0.470 secs
    Windows x86 PE RTTI Analyzer               0.091 secs
    Windows x86 Thread Environment Block (TEB) Analyzer     0.115 secs
    WindowsResourceReference                   0.413 secs
    x86 Constant Reference Analyzer          261.728 secs

Total Time 1349 secs
(AutoAnalysisManager) INFO ----------------------------------------------------- ASCII Strings 3.249 secs Apply Data Archives 3.290 secs Call Convention ID 1.984 secs Call-Fixup Installer 0.947 secs Create Address Tables 0.007 secs Create Address Tables - One Time 5.178 secs Create Function 8.855 secs Data Reference 17.320 secs Decompiler Switch Analysis 264.962 secs Demangler Microsoft 3.649 secs Disassemble 0.468 secs Disassemble Entry Points 58.480 secs Disassemble Entry Points - One Time 1.805 secs Embedded Media 0.102 secs External Entry References 0.120 secs Function ID 114.285 secs Function Start Search 0.987 secs Non-Returning Functions - Discovered 25.826 secs Non-Returning Functions - Known 0.034 secs PDB Universal 169.189 secs Reference 6.714 secs Scalar Operand References 91.422 secs Shared Return Calls 4.760 secs Stack 291.137 secs Subroutine References 14.711 secs Subroutine References - One Time 0.018 secs Windows x86 PE Exception Handling 0.463 secs Windows x86 PE RTTI Analyzer 0.089 secs Windows x86 Thread Environment Block (TEB) Analyzer 0.119 secs WindowsResourceReference 0.403 secs x86 Constant Reference Analyzer 262.810 secs
Total Time 1353 secs
(AutoAnalysisManager) INFO | ghidriff | Analysis for ghidriff-ntoskrnl.exe.10.0.22621.1344-ntoskrnl.exe.10.0.22621.1413:/ntoskrnl.exe.10.0.22621.1413 complete INFO | ghidriff | Analysis for ghidriff-ntoskrnl.exe.10.0.22621.1344-ntoskrnl.exe.10.0.22621.1413:/ntoskrnl.exe.10.0.22621.1344 complete INFO | ghidriff | Diffing bins: ntoskrnl.exe.10.0.22621.1344 - ntoskrnl.exe.10.0.22621.1413 INFO | ghidriff | Setup 16 decompliers INFO | ghidriff | Loaded old program: ntoskrnl.exe.10.0.22621.1344 INFO | ghidriff | Loaded new program: ntoskrnl.exe.10.0.22621.1413 INFO | ghidriff | p1 sym count: reported: 244603 analyzed: 16772 INFO | ghidriff | p2 sym count: reported: 244606 analyzed: 16809 INFO | ghidriff | Found unmatched: 65 matched: 16758 symbols INFO Hashing symbols in ntoskrnl.exe.10.0.22621.1344 (ConsoleTaskMonitor) INFO Hashing symbols in ntoskrnl.exe.10.0.22621.1413 (ConsoleTaskMonitor) INFO Eliminate non-unique matches (ConsoleTaskMonitor) INFO Finding symbol matches (ConsoleTaskMonitor) INFO | ghidriff | Exec time: 2.1672 secs INFO | ghidriff | Match count 54939 INFO | ghidriff | Counter({('SymbolsHash',): 27893}) INFO | ghidriff | Running correlator: ExactBytesFunctionHasher INFO | ghidriff | name: ExactBytesFunctionHasher hasher: ghidra.app.plugin.match.ExactBytesFunctionHasher@7167d81b onetoone: True onetomany: False INFO Hashing functions in ntoskrnl.exe.10.0.22621.1344 (ConsoleTaskMonitor) INFO Hashing functions in ntoskrnl.exe.10.0.22621.1413 (ConsoleTaskMonitor) INFO Finding function matches (ConsoleTaskMonitor) INFO | ghidriff | ExactBytesFunctionHasher Exec time: 0.8299 secs INFO | ghidriff | Match count: 100 INFO | ghidriff | Counter({('SymbolsHash',): 27893, ('ExactBytesFunctionHasher',): 100}) INFO | ghidriff | Running correlator: ExactInstructionsFunctionHasher INFO | ghidriff | name: ExactInstructionsFunctionHasher hasher: ghidra.app.plugin.match.ExactInstructionsFunctionHasher@3c9cfcde onetoone: True onetomany: False INFO Hashing functions in ntoskrnl.exe.10.0.22621.1344 (ConsoleTaskMonitor) INFO Hashing functions in ntoskrnl.exe.10.0.22621.1413 (ConsoleTaskMonitor) INFO Finding function matches (ConsoleTaskMonitor) INFO | ghidriff | ExactInstructionsFunctionHasher Exec time: 0.4906 secs INFO | ghidriff | Match count: 123 INFO | ghidriff | Counter({('SymbolsHash',): 27893, ('ExactInstructionsFunctionHasher',): 123, ('ExactBytesFunctionHasher',): 100}) INFO | ghidriff | Running correlator: StructuralGraphExactHash INFO | ghidriff | name: StructuralGraphExactHash hasher: <jpype.jproxy.proxy.StructuralGraphExactHasher object at 0xffff26c53bf0> onetoone: True oneto_many: False INFO Hashing functions in ntoskrnl.exe.10.0.22621.1344 (ConsoleTaskMonitor) INFO Hashing functions in ntoskrnl.exe.10.0.22621.1413 (ConsoleTaskMonitor) INFO Finding function matches (ConsoleTaskMonitor) INFO | ghidriff | StructuralGraphExactHash Exec time: 1.3213 secs INFO | ghidriff | Match count: 0 INFO | ghidriff | Counter({('SymbolsHash',): 27893, ('ExactInstructionsFunctionHasher',): 123, ('ExactBytesFunctionHasher',): 100}) INFO | ghidriff | Running correlator: ExactMnemonicsFunctionHasher INFO | ghidriff | name: ExactMnemonicsFunctionHasher hasher: ghidra.app.plugin.match.ExactMnemonicsFunctionHasher@7533923b onetoone: True onetomany: False INFO Hashing functions in ntoskrnl.exe.10.0.22621.1344 (ConsoleTaskMonitor) INFO Hashing functions in ntoskrnl.exe.10.0.22621.1413 (ConsoleTaskMonitor) INFO Finding function matches (ConsoleTaskMonitor) INFO | ghidriff | ExactMnemonicsFunctionHasher Exec time: 2.5697 secs INFO | ghidriff | Match count: 0 INFO | ghidriff | Counter({('SymbolsHash',): 27893, ('ExactInstructionsFunctionHasher',): 123, ('ExactBytesFunctionHasher',): 100}) INFO | ghidriff | Running correlator: BulkInstructionHash INFO | ghidriff | name: BulkInstructionHash hasher: <jpype.jproxy.proxy.BulkInstructionsHasher object at 0xffff26c53b50> onetoone: True oneto_many: False INFO Hashing functions in ntoskrnl.exe.10.0.22621.1344 (ConsoleTaskMonitor) INFO Hashing functions in ntoskrnl.exe.10.0.22621.1413 (ConsoleTaskMonitor) INFO Finding function matches (ConsoleTaskMonitor) INFO | ghidriff | BulkInstructionHash Exec time: 1.1462 secs INFO | ghidriff | Match count: 2 INFO | ghidriff | Counter({('SymbolsHash',): 27893, ('ExactInstructionsFunctionHasher',): 123, ('ExactBytesFunctionHasher',): 100, ('BulkInstructionHash',): 2}) INFO | ghidriff | Running correlator: StructuralGraphHash INFO | ghidriff | name: StructuralGraphHash hasher: <jpype.jproxy.proxy.StructuralGraphHasher object at 0xffff26c53ab0> onetoone: True oneto_many: True INFO Hashing functions in ntoskrnl.exe.10.0.22621.1344 (ConsoleTaskMonitor) INFO Hashing functions in ntoskrnl.exe.10.0.22621.1413 (ConsoleTaskMonitor) INFO Finding function matches (ConsoleTaskMonitor) INFO | ghidriff | StructuralGraphHash Exec time: 0.1894 secs INFO | ghidriff | Match count: 693 INFO | ghidriff | Counter({('SymbolsHash',): 27893, ('StructuralGraphHash',): 693, ('ExactInstructionsFunctionHasher',): 123, ('ExactBytesFunctionHasher',): 100, ('BulkInstructionHash',): 2}) INFO | ghidriff | Running correlator: BulkBasicBlockMnemonicHash INFO | ghidriff | name: BulkBasicBlockMnemonicHash hasher: <jpype.jproxy.proxy.BulkBasicBlockMnemonicHasher object at 0xffff26c53a10> onetoone: True oneto_many: True INFO Hashing functions in ntoskrnl.exe.10.0.22621.1344 (ConsoleTaskMonitor) INFO Hashing functions in ntoskrnl.exe.10.0.22621.1413 (ConsoleTaskMonitor) INFO Finding function matches (ConsoleTaskMonitor) INFO | ghidriff | BulkBasicBlockMnemonicHash Exec time: 0.1846 secs INFO | ghidriff | Match count: 0 INFO | ghidriff | Counter({('SymbolsHash',): 27893, ('StructuralGraphHash',): 693, ('ExactInstructionsFunctionHasher',): 123, ('ExactBytesFunctionHasher',): 100, ('BulkInstructionHash',): 2}) INFO | ghidriff | Running correlator: SigCallingCalledHasher INFO | ghidriff | name: SigCallingCalledHasher hasher: <jpype.jproxy.proxy.SigCallingCalledHasher object at 0xffff26c53970> onetoone: True oneto_many: False INFO Hashing functions in ntoskrnl.exe.10.0.22621.1344 (ConsoleTaskMonitor) INFO Hashing functions in ntoskrnl.exe.10.0.22621.1413 (ConsoleTaskMonitor) INFO Finding function matches (ConsoleTaskMonitor) INFO | ghidriff | SigCallingCalledHasher Exec time: 0.1398 secs INFO | ghidriff | Match count: 0 INFO | ghidriff | Counter({('SymbolsHash',): 27893, ('StructuralGraphHash',): 693, ('ExactInstructionsFunctionHasher',): 123, ('ExactBytesFunctionHasher',): 100, ('BulkInstructionHash',): 2}) INFO | ghidriff | p1 missing = 1 INFO | ghidriff | p2 missing = 1 INFO | ghidriff | Deduping symbols and functions... INFO | ghidriff | Sorting symbols and strings... INFO | ghidriff | Sorting functions... INFO | ghidriff | Starting esym lookups for 71 symbols using 8 threads INFO | ghidriff | Completed 4 at 5% INFO | ghidriff | Completed 8 at 11% INFO | ghidriff | Completed 12 at 16% INFO | ghidriff | Completed 16 at 22% INFO | ghidriff | Completed 20 at 28% INFO | ghidriff | Completed 24 at 33% INFO | ghidriff | Completed 28 at 39% INFO | ghidriff | Completed 32 at 45% INFO | ghidriff | Completed 36 at 50% INFO | ghidriff | Completed 40 at 56% INFO | ghidriff | Completed 44 at 61% INFO | ghidriff | Completed 48 at 67% INFO | ghidriff | Completed 52 at 73% INFO | ghidriff | Completed 56 at 78% INFO | ghidriff | Completed 60 at 84% INFO | ghidriff | Completed 64 at 90% INFO | ghidriff | Completed 68 at 95% INFO | ghidriff | Finished diffing old program: ntoskrnl.exe.10.0.22621.1344 INFO | ghidriff | Finished diffing program: ntoskrnl.exe.10.0.22621.1413 INFO | ghidriff | { "addedfuncslen": 1, "deletedfuncslen": 1, "modifiedfuncslen": 11, "addedsymbolslen": 12, "deletedsymbolslen": 8, "diff_time": 86.45361375808716, "deletedstringslen": 6, "addedstringslen": 39, "match_types": { "SymbolsHash": 27893, "ExactBytesFunctionHasher": 100, "ExactInstructionsFunctionHasher": 123, "BulkInstructionHash": 2, "StructuralGraphHash": 693 }, "itemstoprocess": 33, "diff_types": { "code": 5, "length": 5, "refcount": 7, "calling": 6, "address": 6, "called": 3 }, "unmatchedfuncslen": 2, "totalfuncslen": 60664, "matchedfuncslen": 60662, "matchedfuncswithcodechanges_len": 5, "matchedfuncswithnoncodechangeslen": 6, "matchedfuncsnochangeslen": 60651, "matchfuncsimilarity_percent": "99.9819%", "funcmatchoverall_percent": "99.9967%" } INFO | ghidriff | Writing md diff... INFO | ghidriff | Generating markdown from {'addedfuncslen': 1, 'deletedfuncslen': 1, 'modifiedfuncslen': 11, 'addedsymbolslen': 12, 'deletedsymbolslen': 8, 'difftime': 86.45361375808716, 'deletedstringslen': 6, 'addedstringslen': 39, 'matchtypes': Counter({'SymbolsHash': 27893, 'StructuralGraphHash': 693, 'ExactInstructionsFunctionHasher': 123, 'ExactBytesFunctionHasher': 100, 'BulkInstructionHash': 2}), 'itemstoprocess': 33, 'difftypes': Counter({'refcount': 7, 'calling': 6, 'address': 6, 'code': 5, 'length': 5, 'called': 3}), 'unmatchedfuncslen': 2, 'totalfuncslen': 60664, 'matchedfuncslen': 60662, 'matchedfuncswithcodechangeslen': 5, 'matchedfuncswithnoncodechangeslen': 6, 'matchedfuncsnochangeslen': 60651, 'matchfuncsimilaritypercent': '99.9819%', 'funcmatchoverallpercent': '99.9967%'} INFO | ghidriff | Known Command line: python ghidriff --project-location .ghidra_projects --project-name ghidriff --symbols-path .symbols --threaded --log-level INFO --file-log-level INFO --log-path ghidriff.log --max-ram-percent 60.0 --max-section-funcs 200 ntoskrnl.exe.10.0.22621.1344 ntoskrnl.exe.10.0.22621.1413 INFO | ghidriff | Extra Command line: --engine VersionTrackingDiff --output-path .ghidriffs INFO | ghidriff | Writing pdiff json... INFO | ghidriff | Wrote .ghidriffs/ntoskrnl.exe.10.0.22621.1344-ntoskrnl.exe.10.0.22621.1413_diff.md INFO | ghidriff | Wrote .ghidriffs/json/ntoskrnl.exe.10.0.22621.1344-ntoskrnl.exe.10.0.22621.1413_diff.json

Analyze the Diff

Results in this beatiful markdown: ntoskrnl.exe.10.0.22621.1344-ntoskrnl.exe.10.0.22621.1413.diff.md See if you can figure out what function was patched for CVE-2023-2342. Prefer a side by side diff? Try out ghidriff's custom html viewer. https://diffpreview.github.io/?b95ae854a92ee917cd0b5c7055b60282
Results stored in ghidriffs folder
$ tree ghidriffs
ghidriffs
β”œβ”€β”€ ghidra_projects
β”‚   └── ghidriff-ntoskrnl.exe.10.0.22621.2215-ntoskrnl.exe.10.0.22621.2283
β”‚       β”œβ”€β”€ ghidriff-ntoskrnl.exe.10.0.22621.2215-ntoskrnl.exe.10.0.22621.2283.gpr
β”‚       └── ghidriff-ntoskrnl.exe.10.0.22621.2215-ntoskrnl.exe.10.0.22621.2283.rep
β”‚           β”œβ”€β”€ idata
β”‚           β”œβ”€β”€ project.prp
β”‚           β”œβ”€β”€ user
β”‚           └── versioned
β”œβ”€β”€ ghidriff.log
β”œβ”€β”€ json
β”‚   └── ntoskrnl.exe.10.0.22621.2215-ntoskrnl.exe.10.0.22621.2283.ghidriff.json
β”œβ”€β”€ ntoskrnl.exe.10.0.22621.2215-ntoskrnl.exe.10.0.22621.2283.ghidriff.md
└── symbols
    β”œβ”€β”€ ntkrnlmp.pdb
        β”œβ”€β”€ 69071F680ADFE36F178C6EC06E79E09C1
        β”‚   └── ntkrnlmp.pdb
        └── 738ED8FF966E8502EFE17095B9F1F5481
            └── ntkrnlmp.pdb

Diffing CVE-2023-21768

Details of the CVE-2023-21768 (detailed in this blog post). What if you wanted to repeat this patch diff with ghidriff?
  • Download two versions of AFD.sys (vulnerable and patched):
wget https://msdl.microsoft.com/download/symbols/afd.sys/0C5C6994A8000/afd.sys -O afd.sys.x64.10.0.22621.1028
wget https://msdl.microsoft.com/download/symbols/afd.sys/50989142A9000/afd.sys -O afd.sys.x64.10.0.22621.1415
  • Run ghidriff:
ghidriff afd.sys.x64.10.0.22621.1028 afd.sys.x64.10.0.22621.1415
  • Review results
The diff results are posted in this GitHub gist. The vulnerable function AfdNotifyRemoveIoCompletion was identified here with a single line change. Want to see the entire diff in a side by side? https://diffpreview.github.io/?f6fecbc507a9f1a92c9231e3db7ef40d or jump to the single line change(param3%20%2B%200x18)%2C4%2C4)%3B)

Notes

Markdown Spec + MermaidJs

  • Striving to be compliant with GFM and cmark. Still working on it though. See issues.

Β© 2026 GitRepoTrend Β· clearbluejar/ghidriff Β· Updated daily from GitHub