StegoToolkit

GIF Steganography Extractor

Extract hidden data from GIF files. Supports palette LSB, multi-frame distribution, and metadata methods. Auto-detect mode for CTF challenges.

Auto-detect
CTF Mode

Try the demo instantly

Loads a small animated GIF — no upload needed

Drop a GIF here or click to browse

Static or animated GIF · Max 50 MB

Processed in your browser

Your GIF is read and processed in this browser tab and is not sent to a StegoToolkit server. Coarse usage facts (such as file size range and the options chosen) may be counted if you accept analytics; the file, message and password are never included.

How to Decode a GIF Steganography File (5 steps)

  1. Upload the GIF you received (static or animated)
  2. Choose a mode: Quick for one click, Standard to pick a method, Forensic for raw analysis
  3. Enter the password if the sender used one
  4. Click Extract and read the message or download the file
  5. If nothing is found, check the method with the sender or try Forensic mode

GIF Decoding Methods

MethodTechniqueQualityBest For
Auto-detectLooks for the STEGO header and for a STEGANOG extension block, then uses the method the header namesFinds files made with this tool's default settingsMessages from the GIF Steganography Hider
Palette LSBReads the lowest bit of each pixel's colour index, frame after frameNeeds a header, or the exact method for headerless messagesWhen the Hider used Palette LSB
Multi-FrameReads the header from frame 1, then the evenly spread body from the chosen framesCustom frame selections need the same framesWhen the Hider used Multi-Frame
Metadata (Extension Block)Reads the data inside the STEGANOG Application Extension blockNo pixel analysisWhen the Hider used Metadata

What the Extractor Reads

This Extractor reads messages written by the GIF Steganography Hider. In a GIF made with the Hider's default settings it looks for a 12-byte STEGO header at the start of the pixel data (frame 1) or for an Application Extension block named STEGANOG, and takes the method, length and flags from it. It does not read messages hidden by other tools, which use their own layouts; for those, try Forensic mode, which shows what is in the file, or the Strings Analyzer and Hex Viewer in the CTF Lab.

Once the payload has been found, Reed-Solomon parity is recognised from its own header, so you do not set a level when decoding. A password is only needed if the sender used one.

When Auto-Detect Works, and When It Cannot

Auto-Detect needs the STEGO header or the STEGANOG block. Two choices at the Hider remove that: the Plausible deniability switch leaves the signature out, and a custom frame selection in Multi-Frame puts the body in frames the Extractor cannot guess. For those files you must choose the exact method (and frames) yourself. The pre-scan panel shows what it found for each method as a confidence level; it is a rule of thumb, not a probability.

If no header is found, the tool says so (an amber note, and the title does not claim a message was found) and still shows the raw bytes of a Palette LSB read so you can look at them yourself. On a clean GIF these bytes are just picture noise, so check whether they look like text before treating them as a message.

Passwords

If the data was encrypted, the Extractor needs the same password. Data that looks random is reported as possibly encrypted or compressed; that is a clue, not proof.

The password is turned into a key with PBKDF2-HMAC-SHA-256 (100,000 iterations) and the salt stored in the payload, and the AES-256-GCM authentication tag then checks it. A wrong password and a damaged payload both simply report failure, so the tool cannot tell you which it was, and there is no way to recover a forgotten password. The full description, including what this scheme does not protect, is on the GIF Steganography Hider page.

Decoy and Real Payload

A GIF made with the Hider's Forensic-mode "Plausible Deniability: Decoy + Real Payload" option carries two messages and no signature. The Extractor's matching Forensic-mode section recovers the decoy without a password and the real payload only with the right password. This tool's Auto-Detect does not identify either layer, which does not make the data undetectable by other tools or manual inspection.

What the Extractor Can and Cannot Find on Its Own

File was made withAuto-Detect finds it?What to do
Palette LSB, default settingsYes (STEGO header in frame 1)Extract
Multi-Frame, all framesYes (STEGO header in frame 1)Extract
Metadata (Extension Block)Yes (STEGANOG block)Extract
Any method with Reed-SolomonSame as the method it was combined with: the parity sits inside the payload and is recognised only after the payload has been found (so not when the signature was left out)Extract
Plausible deniability switch onNo: no signatureChoose the exact method
Multi-Frame with a custom frame selectionNoChoose Multi-Frame and the same frames
Decoy + Real PayloadNo: headerlessUse the Forensic-mode section with the password
Another tool's formatNoUse Forensic mode, the Strings Analyzer or the Hex Viewer

Examples

Input: A GIF made by the Hider with the 40-character text 0123456789012345678901234567890123456789, Palette LSB, no password

Result: Quick mode returns the same 40 characters

Meaning: The STEGO header names Palette LSB and the length, so no settings are needed.

Input: The same message hidden with a password, extracted without one

Result: The result shows the stat "Encrypted: Yes (enter password)" and the encrypted bytes, with a hint that they match the layout of an AES-256-GCM payload from this toolkit

Meaning: The header was found, but the data is still encrypted, and the result page has no password box. Go back, enter the password in the Decode step and extract again. A wrong password fails with an error instead.

Input: A GIF made with the Plausible deniability switch, extracted in Quick mode

Result: No signature is found; the tool shows raw noise bytes with a note that no header was found

Meaning: That option leaves out the signature. Choose the exact method in Standard mode.

How the Extractor Works

1. Parse

The GIF is read frame by frame and its LZW index data is decompressed.

2. Detect

The first 12 bytes of the lowest-bit stream in frame 1 are checked for the STEGO header, and the file is checked for a STEGANOG extension block.

3. Read

The method named in the header decides how the length-many bytes are read: frame after frame for Palette LSB, header in frame 1 and an evenly spread body for Multi-Frame, or the extension block for Metadata.

4. Unwrap

Reed-Solomon parity is removed if present, then decryption with your password, then Deflate decompression, then the filename frame.

5. Interpret

The result is checked for readable text, a known file signature, or bytes that look encrypted or compressed (byte entropy above 7.4 bits per byte, or the layout of this toolkit's encrypted payload), so you see what the bytes probably are.

What the results mean

ResultWhat it meansWhat to do
Text messageThe bytes are readable textCopy it
File with a known typeThe bytes start with a known file signatureDownload it with the suggested name
Looks encryptedHigh byte entropy, or the layout of this toolkit's AES-256-GCM payload: usually a password-protected payload, but compressed data looks the sameEnter the password in the Decode step, or ask the sender for it
Scan confidence: highA valid STEGO header or STEGANOG block was foundExtract with the detected method
Scan confidence: lowOnly a weak statistical pattern was foundTreat it as a hint and look at the raw bytes
Amber note: no valid headerNo STEGO header or STEGANOG block was found; the bytes shown are raw pixel bitsAsk the sender which method was used, or try the exact method in Standard mode

Limitations

  • Only messages made by this tool's Hider are read by Auto-Detect. Other tools use other layouts.
  • A GIF that was re-saved, resized, converted or optimised after hiding usually loses a pixel-method message. The Metadata message survives only if the new file still has the extension block. We have not tested individual websites or apps.
  • The scan figures use a simple statistical test on the lowest bits. They are a rule of thumb, not a calibrated detector, and a clean GIF can score high while a well-hidden message can score low.
  • Messages made with the plausible-deniability switch, a custom frame selection or the Decoy + Real option are not auto-detectable.
  • Maximum file size is 50 MB.

Privacy

Your GIF and password are processed in your browser, in a Web Worker, and are not sent to a StegoToolkit upload server: the GIF code makes no network requests. Page views are counted by Vercel Analytics, which is cookieless. Tool events (the options you choose such as the decode mode, the file's type and a size range, and how long processing took) are sent to Google Analytics only if the site has it configured and you accepted analytics cookies. The code does not pass the GIF, the extracted message, a password or the filename to analytics. If you accept cookies, the site may also load advertising and other analytics scripts that are outside this tool's code. Your display mode preference is kept in this browser's localStorage.

Which Tool Next?

Frequently Asked Questions

How do I know whether a GIF contains hidden data?

Run Auto-Detect. It looks for the Hider's STEGO header and STEGANOG extension block. A scan panel also shows a rule-of-thumb confidence per method, based on the balance of the lowest bits. Neither can prove a GIF is clean: a message hidden with a signature-free option is not auto-detectable.

What if I do not know the method?

Try Auto-Detect first. If nothing is found, ask the sender which method was used and whether the plausible-deniability switch or a custom frame selection was on, then choose that method in Standard mode. You can also try each method in turn.

Why does extraction fail even with the right password?

Common reasons: the GIF was re-saved, resized or optimised after hiding, the wrong method or frames were chosen for a message without a signature, or the file was changed in transfer. Ask for the original file and check that it is the same size as the one sent.

Do I need to set the Reed-Solomon level?

No. Reed-Solomon data is recognised by its own header and decoded automatically.

Can it read GIFs from other steganography tools?

Not reliably. Auto-Detect is built around this tool's layout. For other formats use Forensic mode to see the raw bits, or the Strings Analyzer and Hex Viewer.

What do the scan confidence levels mean?

High means a valid STEGO header or STEGANOG block was found. Lower levels come from a simple statistical test on the lowest bits and are a hint only. They are not probabilities and not a replacement for trying the extraction.

Related Tools