GajShield LabsThreat Research Research Note · TR-2026-09
Malware Analysis/ Phishing/ DLL Sideloading

The Borrowed Signature

A fake Income Tax notice was received by a honeypot mailbox operated by GajShield Labs on 1 September 2026. Four hops later, the delivery chain culminated in a counterfeit libvlc.dll carrying a copy of VideoLAN’s legitimate certificate table, transplanted byte for byte from the genuine binary.

Initial vectorPhishing link
Execution techniqueDLL sideloading
Primary findingCopied certificate table
The lure

A tax notice that got its own timezone wrong

The message impersonates the Income Tax Department, Government of India. It is bilingual Hindi and English, carries a memorandum number, cites two real sections of the Income Tax Act, and threatens prosecution within 72 hours. It is also, in several places, careless.

Message headersselected
From:    Direct Tax Administration Cell <spyvvlhi@outlook.com>  ← free mailbox
To:      xxx@gajshield.com
Subject: Urgent Tax Notice
Date:    Tue, 1 Sep 2026 16:08:11 +0800            ← India is +0530
X-Mailer:Supmailer 47.0.2                       ← bulk mailer
Received:from SEYPR02CU001.outbound.protection.outlook.com
         (mail-koreacentral… [52.103.74.79])
Content-Type: multipart/alternative
  • TELL 01The body signs off as Raj Kumar Sharma, Assistant Commissioner of Income Tax, with a contact address at incometax.gov.in — while the message itself is sent from a free outlook.com account.
  • TELL 02The Date header is +0800 and the mail is relayed through Microsoft’s Korea Central region. A genuine notice from Aayakar Bhawan, New Delhi would be +0530.
  • TELL 03The text/plain alternative is not plain text at all — it opens with leaked CSS (-webkit-text-size-adjust, mso-table-lspace) because the builder dumped the HTML body through a careless converter.
  • TELL 04The invented reference No. TAX/GST-IT/2026-204 and a flat 72-hour deadline supply the urgency. Sections 271(1)(c) and 276C are real, which is what makes them persuasive.

One detail deserves emphasis for anyone tuning a mail gateway: because the message was sent through a genuine Outlook account, SPF and DKIM pass. Authentication checks alone will not stop this. The signal is in the mismatch between who the message claims to be and the infrastructure that carried it.

The email carries no attachment. Everything hangs on a single link.

Delivery chain

From one link to a signed process running attacker code

The link was still serving at the time of analysis. Each stage below was retrieved and hashed directly.

Stage sequenceretrieved 2026-09-01
  1. 01
    spam.1788250113.19291
    PhishingRFC 822

    The quarantined message. No attachment, no exploit — a delivery vehicle for one URL.

    26,412 bytesMD5 c0a1549e5675558738683899b48efaf1
  2. 02
    hxxps://dajiangcq[.]com/download/7d03c28a7c
    Livenginx

    Serves application/octet-stream with a Content-Disposition filename. No landing page, no redirect — the URL is a direct file handout.

    458,642 bytes declaredfilename="tax-documents7.zip"
  3. 03
    tax-documents7.zip
    MaliciousDeflate

    A single-entry archive. No password, no decoy document to lend it cover.

    458,611 bytesMD5 fc5ddf3a3e82778ee71771fb7394dfb6
  4. 04
    tax-documents8.exe
    DropperPE32+ x86-6411 sections

    An almost empty program whose real cargo sits in its resource section. Imports WININET, and carries the format string %s\libvlc.dll.

    1,195,280 bytesMD5 3558891c163b9f3b8e39173ae6f84c1b
  5. 05
    vlc.exe + libvlc.dll, written side by side
    1 genuine1 counterfeit

    The dropper unpacks a real, validly signed VLC media player next to a fake libvlc.dll. Windows resolves the DLL from the application directory first, so launching genuine VLC executes attacker code inside a trusted, signed process.

    RCDATA 101 & 102see resource table below
Dropper anatomy

Eight kilobytes of program, a megabyte of cargo

The clearest structural signal in tax-documents8.exe is its shape. Executable code accounts for well under one percent of the file. Almost everything else is resource data.

Section footprint1,195,280 bytes total
.text · 8,920 b · 0.75% 8 other sections · 1.86% .rsrc · 1,163,912 b · 97.4%

Parsing the resource directory gives exact boundaries for what it carries. This matters: carving on MZ markers alone truncates each file at its last raw section and silently discards the overlay, producing hashes that match nothing on disk.

Resource directory.rsrc
EntryOffsetSizeContentsMD5
RCDATA 10119,6641,046,424 PE32+ EXE, 14 sections
Genuine VLC
f0a4d5c3492115bfe2f346bc7bdce396
RCDATA 1021,066,088116,096 PE32+ DLL, 8 sections
Counterfeit
992228aa3c313c2ee8d85a3ec8e693c0
RT_MANIFEST1,182,1841,167 Application manifest (XML) 5aa04ce935e78505e230765e85c34355
Attribution of the payload

Three reasons the DLL is not VideoLAN’s

Both embedded files claim the same vendor. Both carry the string 1996-2025 VideoLAN and VLC Authors, both name themselves in their version resources, and both appear signed. Telling them apart takes more than metadata.

Comparisonembedded EXE vs embedded DLL
PropertyRCDATA 101 — vlc.exeRCDATA 102 — libvlc.dll
Build toolchain.buildid, .edata, /4 — MinGW.00cfg — MSVC (CFG)
Exports1 — WinMain316 — all libvlc_*
Code section744,960 b59,904 b
Importsstandard VLC setKERNEL32, ADVAPI32, msvcrt, libvlc.dll
Certificate table23,424 b23,424 b
  • 01Wrong toolchain. VLC ships as a MinGW build, and the bundled vlc.exe shows exactly that signature layout. The DLL carries .00cfg, a Control Flow Guard section emitted by MSVC. VideoLAN did not build it.
  • 02Proxy shape. It re-exports all 316 libvlc_* symbols and then imports libvlc.dll itself, forwarding calls to the real library so VLC keeps working. It does this in 59,904 bytes of code — nowhere near enough to implement the API it advertises.
  • 03The signature is borrowed. Both certificate tables are 23,424 bytes. Extracted and hashed, they are the same bytes.
The finding

One certificate, two files

The certificate blob was lifted out of each file at its recorded offset and hashed independently.

Authenticode certificate tableextracted and compared
Genuine — RCDATA 101
vlc.exe
File size
1,046,424 bytes
Cert offset
1,023,000
Cert size
23,424 bytes
Signer
C=FR, L=Paris, O=VideoLAN, CN=VideoLAN
Issuer
DigiCert Trusted G4 Code Signing RSA4096 SHA384 2021 CA1
Counterfeit — RCDATA 102
libvlc.dll
File size
116,096 bytes
Cert offset
92,672
Cert size
23,424 bytes
Signer
C=FR, L=Paris, O=VideoLAN, CN=VideoLAN
Issuer
DigiCert Trusted G4 Code Signing RSA4096 SHA384 2021 CA1
MD5 30b27babb1cb1a7070968850789e37e7 — identical in both files

The attacker copied VideoLAN’s certificate table verbatim onto a file VideoLAN never built.

The certificate itself is real. It chains to DigiCert Trusted Root G4 and names VideoLAN in Paris, with Sectigo timestamping. Nothing about it is forged — it was simply moved.

What this cannot survive is verification. An Authenticode signature commits to a hash of the file it was issued for, so the copied blob will not validate against the DLL’s contents. But it is enough to defeat any check that asks only whether a file has a signature, or reads the publisher name out of it without verifying the digest. That shortcut appears in allowlists, in software inventory tooling, and in more than one EDR policy.

Detection

What to block, and what to leave alone

Three MD5 signatures cover the malicious files in this chain. A fourth hash in the sample must be deliberately excluded.

ClamAV .hdb3 signatures
fc5ddf3a3e82778ee71771fb7394dfb6:458611:…virus.fc5ddf3a…   tax-documents7.zip
3558891c163b9f3b8e39173ae6f84c1b:1195280:…virus.3558891c…  tax-documents8.exe
992228aa3c313c2ee8d85a3ec8e693c0:116096:…virus.992228aa…   libvlc.dll (fake)

Do not sign f0a4d5c3492115bfe2f346bc7bdce396

That hash belongs to the genuine, unmodified VLC media player carried inside the dropper. It is a legitimate binary that happens to travel with malware. Signing it would flag every real VLC installation in your estate.

Bundling a clean signed application alongside a malicious library is the entire point of a sideloading loader. Hashing everything a sample contains, without asking what each file actually is, converts that into a false-positive campaign against your own users.

Hashes are the weakest layer here. The tax-documents7 and tax-documents8 naming implies a builder that has already produced at least eight variants, so these three values have a short useful life. More durable controls, in rough order:

  • 01Block the domain. dajiangcq[.]com is the one indicator that survives a rebuild of the payload.
  • 02Verify signatures, don’t just detect them. Flag any PE whose Authenticode digest fails to validate while carrying a well-known publisher’s certificate. This catches the technique rather than the sample.
  • 03Watch for the sideloading shape. An archive that delivers a signed vendor executable together with a same-vendor DLL that is not that vendor’s build is a strong pattern on its own.
  • 04Tune mail on mismatch, not on authentication. SPF and DKIM pass here. Government-authority impersonation from consumer mailboxes, bulk-mailer artefacts, and timezone-to-claimed-origin mismatches are the usable signals.
Reference

Indicators

URLs are defanged. Hashes are MD5 unless marked otherwise.

Indicators of compromise5 files, 1 host
IndicatorTypeSizeAssessment
dajiangcq[.]comHostPayload delivery
hxxps://dajiangcq[.]com/download/7d03c28a7cURLDirect download
c0a1549e5675558738683899b48efaf1Email26,412Phishing lure
fc5ddf3a3e82778ee71771fb7394dfb6ZIP458,611Malicious
3558891c163b9f3b8e39173ae6f84c1bEXE1,195,280Dropper
992228aa3c313c2ee8d85a3ec8e693c0DLL116,096Sideloaded payload
f0a4d5c3492115bfe2f346bc7bdce396EXE1,046,424Genuine VLC — do not block
30b27babb1cb1a7070968850789e37e7Cert blob23,424Copied onto both files
spyvvlhi@outlook.comSenderImpersonates ITD