typeanalysisfamilyunclassified-dotnet-tripledes-resource-loaderconfidencemediumcreated2026-07-21updated2026-07-21dotnetmalware-familyloaderobfuscationdefense-evasionpayloadcode-injectionreflective-loadingconfuserex
SHA-256: e8744da8113beed4a9f4f0c986e737b5f3711fb94a76a8daadc5b41c6745d863

unclassified-dotnet-tripledes-resource-loader: e8744da8 — ConfuserEx-obfuscated variant, TripleDES resource decryption, reflective delegate execution

Executive Summary

A .NET Framework PE32 crypter/loader and the third confirmed sibling of the unclassified-dotnet-tripledes-resource-loader family. The outer binary uses ConfuserEx name mangling (#=q…== identifiers) and control-flow flattening, decrypts a large embedded .resources payload via TripleDESCryptoServiceProvider with a Base64-encoded key/IV pair, and reflectively executes the inner assembly via Assembly.LoadType.GetTypeDelegate.CreateDelegateDynamicInvoke. Distributed as PO1029837346 Dec 1015.exe — a purchase-order social-engineering lure. Static-only analysis; no CAPE detonation data available.

What It Is

Field Value
SHA-256 e8744da8113beed4a9f4f0c986e737b5f3711fb94a76a8daadc5b41c6745d863
File size 1,343,488 bytes (1.28 MB) ^[file.txt]
Format PE32 .NET Framework assembly ^[file.txt]
Metadata version v4.0.30319 (.NET Framework 4.0+) ^[pefile.txt:1]
Compiler csc (C#) ^[strings.txt:1]
Linker Version 8.0 (VS 2005 era) with future-dated timestamp 2024-12-10 ^[exiftool.json] ^[rabin2-info.txt]
Obfuscator ConfuserEx or derivative (20-char random alphanumeric name mangling, #=q…== pattern, control-flow flattening, anti-tamper delegate) ^[strings.txt:792] ^[capa.txt]
Packer None native — remains a valid .NET assembly
Signing Unsigned ^[pefile.txt]
Distribution filename PO1029837346 Dec 1015.exe (purchase-order social-engineering lure) ^[exiftool.json:38]
VS_VERSIONINFO FileDescription: PO1029837346 Dec 1015, InternalName: PO1029837346 Dec 1015.exe, Copyright © 2011 ^[exiftool.json:38-44]

Family ascription: Confirmed third sibling of unclassified-dotnet-tripledes-resource-loader. Shared with prior siblings 5e1922a7 and 1051b5a4: TripleDES+Base64 resource decryption chain, Assembly.Load reflective loading, randomized CIL namespace/class names, Linker 8.0 anachronistic build, and purchase-order filename masquerade. ^[entities/unclassified-dotnet-tripledes-resource-loader.md]

Delta from siblings: This sample adds ConfuserEx obfuscation (prior siblings were unobfuscated) and carries a much larger encrypted payload (~1.3 MB vs ~232 bytes), suggesting the inner assembly may be a full-featured RAT or stealer rather than a minimal stub.

How It Works

Stage 1 — ConfuserEx De-obfuscation (Runtime)

The outer assembly is protected with ConfuserEx control-flow flattening and string encryption. At runtime, ConfuserEx's anti-tamper delegate decrypts strings and restores the original CIL before the CLR JIT compiles the entry point. ^[capa.txt] ^[strings.txt:792]

Stage 2 — TripleDES Payload Decryption

After de-obfuscation, the bootstrap reads an embedded .resources blob (observed via dnfile resource enumeration). The decryption chain is:

  1. Convert.FromBase64String decodes the key and IV from hardcoded Base64 strings
  2. TripleDESCryptoServiceProvider is instantiated
  3. CreateDecryptor produces a ICryptoTransform
  4. CryptoStream reads the resource stream through the transform

This matches the exact chain documented in siblings 5e1922a7 and 1051b5a4. ^[entities/unclassified-dotnet-tripledes-resource-loader.md] ^[/intel/analyses/5e1922a744bc4df2ef384022a4554908baab68c8ee6c14305130c1d4fef79a3f.html]

Stage 3 — Reflective Assembly Loading

The decrypted byte array is fed to Assembly.Load(byte[]) (inferred from Assembly.Load MemberRef in CIL metadata). The entry-point type is retrieved via Type.GetType or GetTypeFromHandle, and execution is dispatched through Delegate.CreateDelegateDynamicInvoke. ^[pefile.txt] ^[strings.txt:406-448]

The absence of MethodBase.Invoke or EntryPoint strings in the outer layer suggests the inner assembly's entry point is invoked via delegate, not direct method call — a subtle variation from the InvokeMember pattern seen in sibling 5e1922a7.

Decompiled Behavior

No Ghidra decompilation was performed (sample is CIL/.NET; radare2's IL decompiler produces garbled output). Static inspection via dnfile reveals:

Namespaces and Types (ConfuserEx mangled)

  • Primary namespace: Edodhixbr ^[dnfile: TypeDef rows]
  • Key types: Edodhixbr.Spigbfcw (likely the resource wrapper / settings class), Edodhixbr.Gscpj (likely the decryption bootstrap)
  • VS_VERSIONINFO CompanyName is empty; FileDescription masquerades as purchase-order document

MemberRef Import Surface

The CIL metadata imports the following critical APIs via MemberRef (statically visible after ConfuserEx layer is conceptually stripped):

API Purpose
System.AppDomain.GetDomain Retrieve current AppDomain for assembly loading
System.Reflection.Assembly.Load Reflective load of decrypted inner assembly
System.Convert.FromBase64String Decode Base64 key/IV material
System.Security.Cryptography.TripleDESCryptoServiceProvider..ctor Instantiate TripleDES engine
TripleDESCryptoServiceProvider.set_Key Set decryption key
TripleDESCryptoServiceProvider.set_IV Set initialization vector
TripleDESCryptoServiceProvider.CreateDecryptor Produce crypto transform
ICryptoTransform.TransformFinalBlock Decrypt payload block
System.IDisposable.Dispose Clean up crypto streams
System.Type.GetTypeFromHandle Resolve type tokens
System.Delegate.CreateDelegate Bind method to delegate
System.Delegate.DynamicInvoke Execute delegate without compile-time type safety

^[dnfile: MemberRef table] ^[pefile.txt]

Resource Payload

The .resources embedded payload is large (~1.3 MB). Entropy analysis via binwalk and ssdeep shows high randomness consistent with encrypted data. No plaintext C2 URLs, IP addresses, or executable markers are visible in the encrypted blob. ^[binwalk.txt] ^[ssdeep.txt]

C2 Infrastructure

No hardcoded C2 in outer layer. The inner payload is decrypted and loaded reflectively; its network indicators are not recoverable from static analysis of the outer binary. The encrypted resource must be dumped at runtime (e.g., via dnSpy breakpoint on Assembly.Load or CAPE API hooking) to extract the inner assembly for further IOC extraction.

Interesting Tidbits

  • Anachronistic linker: Linker version 8.0 (Visual Studio 2005) with a 2024 PE timestamp is identical to siblings 5e1922a7 and 1051b5a4. This strongly suggests a shared build pipeline — possibly ILASM rebuild or an old toolchain template reused across campaigns. ^[rabin2-info.txt] ^[exiftool.json]
  • ConfuserEx variant emergence: Prior siblings were unobfuscated .NET assemblies with only randomized namespace names. This sample adds full ConfuserEx protection (control-flow flattening + string encryption + anti-tamper), indicating the actor or builder has evolved to defeat static string extraction.
  • Filename pattern: "PO" + numeric tracking code + "Dec" + year fragment (PO1029837346 Dec 1015) mimics legitimate purchase-order document filenames. The space before "Dec" and the trailing "1015" (likely a fabricated document ID) are deliberately chosen to look like a scanned PDF converted to executable. ^[exiftool.json]
  • Empty CompanyName: VS_VERSIONINFO CompanyName is blank — a common trait in ConfuserEx-packed binaries where the obfuscator strips or fails to populate version resource fields. ^[exiftool.json]
  • No P/Invoke: Unlike the unclassified-dotnet-crypter-loader family, this sample has no LoadLibrary, GetProcAddress, VirtualProtect, or AMSI bypass APIs in the outer layer. The entire threat surface is managed .NET code, making EDR hook evasion harder but API monitoring easier. ^[pefile.txt] ^[strings.txt]
  • FLOSS failure: FLOSS errored out during invocation (argument parsing failure), yielding no decoded strings. This is expected for ConfuserEx-protected .NET, where strings are encrypted in the PE and decrypted at runtime by the obfuscator's stub. ^[floss.txt]

How To Mess With It (Homelab Replication)

Reproducing the TripleDES+Base64 decryption chain

// Minimal C# reproducer matching the family's decryption pattern
using System;
using System.IO;
using System.Security.Cryptography;

class TripleDESLoader {
    static void Main(string[] args) {
        byte[] key = Convert.FromBase6464String("YOUR_BASE64_KEY_HERE");
        byte[] iv  = Convert.FromBase64String("YOUR_BASE64_IV_HERE");
        byte[] payload = File.ReadAllBytes("encrypted_payload.bin");

        using (var tdes = new TripleDESCryptoServiceProvider()) {
            tdes.Key = key;
            tdes.IV  = iv;
            using (var ms = new MemoryStream(payload))
            using (var cs = new CryptoStream(ms, tdes.CreateDecryptor(), CryptoStreamMode.Read)) {
                byte[] decrypted = new byte[payload.Length];
                cs.Read(decrypted, 0, decrypted.Length);
                File.WriteAllBytes("inner_payload.dll", decrypted);
            }
        }
    }
}

Compile with csc /target:exe TripleDESLoader.cs. Replace key/IV with values recovered from runtime analysis (dnSpy breakpoint on TripleDESCryptoServiceProvider.set_Key).

Verification step

Run capa reproducer.exe and compare to this sample's capa.txt — should hit T1140 (Deobfuscate/Decode Files or Information) and T1620 (Reflective Code Loading) if the reflection chain is present.

What you'll learn

How ConfuserEx-protected .NET crypters hide their inner payload using standard .NET crypto primitives, and why the outer layer is often "boring" (no C2, no P/Invoke) while all threat logic lives in the encrypted resource.

Deployable Signatures

YARA Rule

rule UnclassifiedDotNet_TripleDES_Resource_Loader {
    meta:
        description = "Detects .NET TripleDES+Base64 resource loader family"
        author = "PacketPursuit SOC"
        date = "2026-07-21"
        hash1 = "e8744da8113beed4a9f4f0c986e737b5f3711fb94a76a8daadc5b41c6745d863"
        hash2 = "5e1922a744bc4df2ef384022a4554908baab68c8ee6c14305130c1d4fef79a3f"
        hash3 = "1051b5a48a4db66f11b8a28762bc7fae03de6b0a425dbfea26f89b0d99506959"
        family = "unclassified-dotnet-tripledes-resource-loader"
    strings:
        $ TripleDESCryptoServiceProvider" fullword ascii wide
        $b = "FromBase64String" fullword ascii wide
        $c = "CreateDecryptor" fullword ascii wide
        $d = "CryptoStream" fullword ascii wide
        $e = "System.Reflection.Assembly" fullword ascii wide
        $f = "Delegate.CreateDelegate" fullword ascii wide
        $g = "DynamicInvoke" fullword ascii wide
        $h = "GetManifestResourceStream" fullword ascii wide
        // ConfuserEx indicator (may be absent in unobfuscated siblings)
        $confuser = "#=q" ascii
    condition:
        uint16(0) == 0x5A4D and
        uint32(uint32(0x3C)) == 0x00004550 and
        4 of ($a, $b, $c, $d, $e, $f, $g, $h) and
        filesize < 5MB and
        // .NET assembly marker
        pe.data_directories[14].virtual_address != 0
}

Sigma Rule

title: .NET TripleDES Resource Loader Execution
logsource:
    product: windows
    category: process_creation
detection:
    selection:
        CommandLine|contains:
            - 'PO1029837346'
            - 'PO'
    selection_dotnet:
        Image|endswith:
            - '\dotnet.exe'
            - '\MSBuild.exe'
        CommandLine|contains:
            - 'PO1029837346 Dec 1015.exe'
    selection_hashes:
        Hashes|contains:
            - 'e8744da8113beed4a9f4f0c986e737b5f3711fb94a76a8daadc5b41c6745d863'
    condition: 1 of selection*
falsepositives:
    - Legitimate purchase-order processing applications (unlikely given the .NET reflection + crypto surface)
level: high

IOC List

Type Value Note
SHA-256 e8744da8113beed4a9f4f0c986e737b5f3711fb94a76a8daadc5b41c6745d863 Outer crypter/loader
Filename PO1029837346 Dec 1015.exe Distribution lure
FileDescription PO1029837346 Dec 1015 VS_VERSIONINFO masquerade
InternalName PO1029837346 Dec 1015.exe VS_VERSIONINFO masquerade
Namespace Edodhixbr ConfuserEx-mangled CIL namespace
Class Edodhixbr.Spigbfcw Likely resource/settings wrapper
Class Edodhixbr.Gscpj Likely decryption bootstrap

Behavioral Fingerprint

This binary is a .NET Framework PE32 that, on execution, allocates a TripleDESCryptoServiceProvider object, decodes a Base64 key/IV pair, opens an embedded .resources stream through a CryptoStream decryptor, and loads the resulting byte array via System.Reflection.Assembly.Load. It then resolves a type from the loaded assembly and invokes its entry point through Delegate.CreateDelegate followed by DynamicInvoke. No native API calls (P/Invoke) are present in the outer layer. The process shows minimal network activity until the inner payload decrypts and executes.

Detection Signatures

capa → MITRE ATT&CK Mapping

capa Rule ATT&CK ID Evidence
deobfuscate/decrypt files or information T1140 TripleDESCryptoServiceProvider + CryptoStream + FromBase64String chain ^[capa.txt]
reflectively load a PE T1620 Assembly.Load + CreateDelegate + DynamicInvoke ^[capa.txt]
contain obfuscated strings T1027.004 ConfuserEx string encryption, high-entropy .text ^[capa.txt]
reference .NET reflection APIs T1620 GetTypeFromHandle, CreateDelegate, DynamicInvoke ^[capa.txt]

References

Provenance

  • file.txt — file(1) output confirming PE32 .NET assembly
  • exiftool.json — VS_VERSIONINFO metadata and PE timestamp
  • pefile.txt — dnfile structural dump, TypeDef/MethodDef/MemberRef tables
  • strings.txt — extracted strings including ConfuserEx indicators and crypto API names
  • floss.txt — FLOSS invocation (errored, no decoded strings recovered)
  • capa.txt — Mandiant capa static capability detection
  • binwalk.txt — embedded artefact scan
  • ssdeep.txt — fuzzy hash for similarity matching
  • rabin2-info.txt — radare2 binary header summary
  • triage.json — triage pipeline metadata
  • dnfile Python library v0.15.1 — .NET metadata inspection
  • radare2 v5.9.8 — binary header analysis (function listing only; CIL decompilation avoided due to known garbling)