typeanalysisfamilyunclassified-dotnet-protobuf-loaderconfidencemediumcreated2026-07-04updated2026-07-04dotnetmalware-familyloaderc2defense-evasionmitre-attcksigning
SHA-256: 6cdc73c825f3c1dd9d61f8ba2cc4f8a7c43f1236d94f196191c7a2a922ecb3d9

unclassified-dotnet-protobuf-loader: 6cdc73c8 — Signed .NET RAT with protobuf-net C2, Smadav masquerade

Executive Summary

A .NET Framework PE32 binary masquerading as "Smadav Updater" and signed with a valid Sectigo code-signing certificate. Internally it carries protobuf-net serialization, System.ServiceModel (WCF) networking, and heavy reflection.Emit usage — a build stack consistent with a modular RAT or reflective loader rather than the legitimate AV updater it claims to be. No runtime detonation available (CAPE skipped — no Windows guest), so all behaviour is static inference. ^[file.txt] ^[pefile.txt] ^[capa.txt]

What It Is

Attribute Value
SHA-256 6cdc73c825f3c1dd9d61f8ba2cc4f8a7c43f1236d94f196191c7a2a922ecb3d9
File name Revised_506133.exe
Size 1,364,704 bytes (1.3 MB)
Type PE32 executable (GUI) Intel 80386 Mono/.NET assembly ^[file.txt]
Compiler .NET Framework v4.0.30319 (CLR metadata) ^[rabin2-info.txt]
Timestamp 2024-08-13 23:21:34 UTC ^[pefile.txt]
Version info "Smadav Updater" v1.9.0.5 by "Smadsoft" ^[exiftool.json]
Signing Authenticode signed, Sectigo code-signing cert chain (3 certs + PKCS#7 signature) ^[binwalk.txt] ^[pefile.txt]
Namespace Ngwdqommvm (unobfuscated) ^[rabin2-info.txt]

The VS_VERSIONINFO is a complete fabrication: "Smadav" is a real Indonesian antivirus product, but the binary contains no Smadav code. The certificate chain is valid and unrevoked at time of analysis, which will satisfy Windows SmartScreen and many EDR trust models. ^[pefile.txt] ^[exiftool.json]

How It Works

Build / RE

Toolchain. Compiled as a .NET Framework 4.x PE32 with standard MS IL. No native AOT, no ConfuserEx, no SmartAssembly — the IL metadata is fully intact and readable. CLR string heap reveals the full type surface. ^[rabin2-info.txt]

No packing. The .text section entropy is 7.84 (high for IL, but consistent with merged protobuf-net and WCF library code). No UPX, Themida, or custom packer signatures. The binary is effectively a self-contained .NET deployment with third-party libraries merged or embedded. ^[pefile.txt] ^[binwalk.txt]

Libraries merged/embedded. Static namespace analysis reveals:

  • ProtoBuf — protobuf-net serialization library (IExtensible, IExtension, Meta, ServiceModel namespaces) ^[rabin2-info.txt]
  • System.ServiceModel — WCF client/service model, channels, dispatcher, description ^[rabin2-info.txt]
  • System.Reflection.Emit — DynamicAssembly, ILGenerator usage for runtime code generation ^[capa.txt]
  • System.Security.Cryptography — AES, DES, TripleDES, Rijndael, RC2 (multi-cipher support) ^[capa.txt] ^[strings.txt]

Anti-analysis. Capa flags reference analysis tools strings ^[capa.txt]. No VM/debug/VMware-specific strings were recovered, but the .NET runtime is configured with canary: true, nx: true, pic: true ^[rabin2-info.txt], indicating standard compilation with security mitigations rather than deliberate evasion.

Embedded data. A 232-byte Base64-decoded ciphertext sits in the CLR User String (#US) heap — likely an encrypted config blob or small payload. Decoded bytes show high entropy (no zlib magic, no PEM/DER structure). The string is not a standard .NET settings block; it is referenced at runtime and decrypted. ^[strings.txt]

Deploy / ATT&CK

TTPs (all static inference — no CAPE detonation).

Technique ID Evidence
Reflective Code Loading T1620 39 capa matches on generate method via reflection, plus Assembly.Load, DynamicAssembly, GetManifestResourceStream ^[capa.txt] ^[rabin2-info.txt]
Deobfuscate/Decode Files or Information T1140 Base64 decode + AES decrypt via .NET (capa confirms) ^[capa.txt]
Obfuscated Files or Information T1027 Encrypted config/payload in #US heap ^[strings.txt]
Generate Pseudo-random Sequence C0021.003 PRNG via .NET API (2 capa matches) ^[capa.txt]
Decode Data::Base64 C0053.001 Base64 decode in .NET (2 capa matches) ^[capa.txt]
Decrypt data using AES E1027.m05 AES via .NET CryptoStream/CreateDecryptor ^[capa.txt]
Analysis Tool Discovery B0013.001 Reference to analysis tool strings ^[capa.txt]

C2 Infrastructure. No hardcoded IPs, domains, or URLs recovered. The use of System.ServiceModel (WCF) suggests the C2 endpoint is configured in the encrypted payload or fetched at runtime. The protobuf-net serialization layer implies structured binary messages over WCF channels — a more sophisticated protocol than raw TCP or HTTP POST. Static inference only; runtime C2 is opaque. ^[rabin2-info.txt]

Persistence. No registry keys, scheduled tasks, or startup folder paths found in strings. Persistence may be established by the decrypted second stage. ^[strings.txt]

Decompiled Behavior

Radare2 analysis (level 3) found 2,677 CIL functions. No Ghidra decompilation was performed — the CIL metadata is sufficient for static characterization. Notable function categories observed: ^[rabin2-info.txt]

  • ProtoBuf.Meta — runtime type model construction for protobuf serialization
  • System.ServiceModel.Description.IOperationBehavior — WCF operation contract behaviors (client-side or service-side dispatch)
  • System.Reflection.Emit.ILGenerator — dynamic IL emission for runtime method generation
  • System.Security.Cryptography.Aes / CryptoStream — symmetric decryption pipeline

The entry point (entry0) is standard .NET PE entry through mscoree.dll!_CorExeMain. ^[pefile.txt]

C2 Infrastructure

  • Protocol: Inferred WCF-over-TCP or WCF-over-HTTP with protobuf-net binary serialization
  • Endpoint: Runtime-resolved (no static strings)
  • Config carrier: 232-byte encrypted blob in #US heap (Base64-encoded at rest)
  • Certificate: Valid Sectigo code-signing chain embedded in PE security directory ^[pefile.txt]

No IPs, domains, mutexes, or named pipes recovered statically.

Interesting Tidbits

  1. Signed masquerade. The valid Sectigo certificate plus "Smadav Updater" version info is deliberately chosen to exploit trust in Indonesian AV software. This is more sophisticated than self-signed or unsigned variants. ^[pefile.txt] ^[exiftool.json]
  2. Protobuf + WCF is unusual. Most commodity .NET RATs (AsyncRAT, Quasar, NanoCore) use raw TCP or HTTP with MessagePack/JSON/protobuf-lite. Full WCF service model with protobuf-net suggests either a custom builder or a repurposed enterprise/internal tool. ^[rabin2-info.txt]
  3. Reflection.Emit count. 39 matches for runtime method generation is unusually high — this may be a dynamically-compiled plugin loader or a crypter that JIT-decrypts methods. ^[capa.txt]
  4. Multi-cipher support. Presence of AES, DES, TripleDES, Rijndael, and RC2 in the crypto namespace suggests a configurable encryption layer, possibly switching ciphers per campaign. ^[strings.txt]
  5. No anti-VM, no sandbox evasion. Unlike most .NET malware in this corpus, there are no vmware, vbox, sandboxie, or IsDebuggerPresent strings. The author relied on the certificate and masquerade for evasion. ^[strings.txt]

How To Mess With It (Homelab Replication)

Goal: Build a minimal .NET binary that produces a comparable capa fingerprint (protobuf + WCF + reflection + AES).

  1. Create a new .NET Framework 4.8 Console project in Visual Studio.
  2. NuGet: Install-Package protobuf-net and System.ServiceModel.
  3. Add a WCF service contract with [OperationContract] and protobuf [ProtoContract] data classes.
  4. Add a System.Reflection.Emit.DynamicMethod that generates a simple delegate at runtime.
  5. Encrypt a small JSON config with AesManaged + Convert.ToBase64String, embed as a string literal.
  6. At runtime: Base64-decode → AES-decrypt → Assembly.Load(byte[]) → invoke via reflection.
  7. Compile with csc.exe or MSBuild with default flags.

Verification: Run capa reproducer.exe. Expected hits: compiled to the .NET platform, generate method via reflection, invoke .NET assembly method, load .NET assembly, decode data using Base64, decrypt data using AES.

Deployable Signatures

YARA Rule

rule unclassified_dotnet_protobuf_loader_6cdc73c8 {
    meta:
        description = ".NET PE with protobuf-net + WCF + heavy reflection + Smadav masquerade"
        author = "PacketPursuit"
        date = "2026-07-04"
        sha256 = "6cdc73c825f3c1dd9d61f8ba2cc4f8a7c43f1236d94f196191c7a2a922ecb3d9"
        confidence = "medium"
    strings:
        $dotnet = "BSJB" ascii
        $smadav1 = "Smadav Updater" wide
        $smadav2 = "Smadsoft" wide
        $smadav3 = "Revised_506133.exe" wide
        $proto1 = "ProtoBuf.IExtensible" wide
        $proto2 = "ProtoBuf.Meta" wide
        $wcf1 = "System.ServiceModel.Description.IOperationBehavior" wide
        $reflect1 = "System.Reflection.Emit" wide
        $crypto1 = "System.Security.Cryptography" wide
        $aes1 = "CreateDecryptor" wide
        $manifest = "Assembly Version" wide
    condition:
        uint16(0) == 0x5A4D and
        pe.number_of_signatures > 0 and
        $dotnet and
        (2 of ($smadav*)) and
        (2 of ($proto*)) and
        $wcf1 and
        $reflect1 and
        $crypto1 and
        filesize < 2MB
}

Behavioral Hunt Query (KQL)

DeviceProcessEvents
| where ProcessVersionInfoProductName contains "Smadav" 
    or ProcessVersionInfoCompanyName contains "Smadsoft"
| where InitiatingProcessCommandLine !contains "smadav" // exclude legit Smadav if known
| where ProcessCommandLine contains "Revised" 
    or FileName startswith "Revised_"
| summarize count() by DeviceName, AccountName, ProcessCommandLine, FolderPath, SHA256

IOC List

Type Value Notes
SHA-256 6cdc73c825f3c1dd9d61f8ba2cc4f8a7c43f1236d94f196191c7a2a922ecb3d9 Primary sample
SHA-1 ade841a7d134346dec1b628fc0a3abd05a7a963a
MD5 2f3dda6fd64e130db0b457a436a85654
Filename Revised_506133.exe InternalName / OriginalFilename ^[exiftool.json]
VersionInfo 1.9.0.5 ProductVersion / FileVersion / AssemblyVersion ^[exiftool.json]
CompanyName Smadsoft Fabricated ^[exiftool.json]
ProductName Smadav Updater Masquerade ^[exiftool.json]
Cert Subject Sectigo code-signing chain 3 X.509 certs + PKCS#7 in security directory ^[binwalk.txt]
Namespace Ngwdqommvm .NET assembly namespace ^[rabin2-info.txt]
ssdeep 24576:GNkS7wJHlq13k2zqKUGJRXt+TaMBkZjmk45nRV1evkN/IaOkgSXZQT5oRo2rUrFB:GR7wDERXtSvMsR/1N6F6ZQT5oRoP ^[ssdeep.txt]
tlsh B455E00173889D96C99B1EF1C47FD51452F8AE6E522ADB0E2842B6772DF3302211B6DF ^[tlsh.txt]

Behavioral Fingerprint

This binary is a .NET Framework PE with a valid Authenticode signature and fake "Smadav Updater" version metadata. At runtime it uses System.Reflection.Emit to generate methods dynamically, loads additional assemblies via Assembly.Load(byte[]), and communicates over WCF channels serialized with protobuf-net. It decrypts embedded configuration using .NET AesManaged after Base64-decoding from the assembly's user string heap. No anti-VM or anti-debug checks are present; evasion relies on the signed certificate and benign masquerade identity.

Detection Signatures

Capability Namespace ATT&CK
reference analysis tools strings anti-analysis
decode data using Base64 in .NET data-manipulation/encoding/base64 T1140
decrypt data using AES via .NET data-manipulation/encryption/aes T1140
generate random numbers in .NET data-manipulation/prng C0021.003
access .NET resource executable/resource
check file extension in .NET host-interaction/file-system
generate method via reflection in .NET load-code/dotnet T1620
invoke .NET assembly method load-code/dotnet T1620
load .NET assembly load-code/dotnet T1620
compiled to the .NET platform runtime/dotnet

^[capa.txt]

References

Provenance

Analysis derived from static artifacts generated by the triage pipeline on 2026-05-26: file (libmagic), exiftool, pefile (Python pefile), strings, ssdeep, tlsh, yara, binwalk, radare2 (rabin2 -I), flare-capa (static analysis). No dynamic execution performed — CAPE skipped due to no Windows guest available. All behavioural claims are static inference and marked accordingly.