Home

Published

- 18 min read

Driving Home For Xmas - Microsoft Activation Cracking in Detail

img of Driving Home For Xmas - Microsoft Activation Cracking in Detail

DRM bypasses, Activation cracks, Keygens, filesharing and stream hosting are as old as hacking and malware. In today’s article we take a closer look, how Windows Server and other Microsoft products are illegitimately activated - while researching we also found Adobe Creative Cloud activations among other things, including the users behind.

Note: To protect our sources, and to avoid writing “the ultimate guide to…”, we replaced all user and domain names, and some minor technical details. This article aims to inform about currently on-going operations in a high level view, but not to go beyond.

The Evolution of Activation Cracking

Microsoft’s activation system has been a target for crackers since its inception. Early days focused on retail key manipulation, but the rise of Key Management Service (KMS) shifted the game. Today, rogue KMS servers are widely used to bypass activations, leveraging enterprise-level licensing mechanisms.

A Glimpse into a Rogue KMS Operation

During the investigation, one rogue KMS operation stood out: Halong’s KMS Host. Publicly advertising itself as a “free activation server,” it claims to help users activate Microsoft products without additional software. While it offers contact information and even donation links, the technical setup revealed several interesting aspects.

  • Hosted on Windows Server 2012.
  • Provides instructions for users to point their systems to the rogue KMS server.
  • Claims to support organizations in setting up their own KMS servers.

Setting Up a Rogue KMS Server

Here’s a likely technical workflow for creating such a server:

Infrastructure Setup

The backbone of a rogue KMS server often involves:

  • Operating System: Typically Windows Server editions (e.g., Server 2012 in this case) to support native KMS hosting functionality.
  • Hosting Environment: Options include physical machines, VPS, or cloud services. Many use budget-friendly or anonymous hosting providers.
  • DNS Configuration: Simple domains like “free.actv06.exmpl” are used for easy access and anonymity.

Installing KMS Software

KMS functionality can be enabled directly through Windows Server or simulated using third-party tools. The process involves:

  • Enabling the Volume Activation Services role in Windows Server.
  • Configuring the server to accept activation requests (typically on port 1688).
  • Optionally, installing modified or leaked KMS host keys to bypass legitimate licensing.

OpSec: Maintaining Anonymity

Operators take steps to avoid attribution:

  • Using VPS or cloud instances with cryptocurrency payments or protected by Cloudflare.
  • Utilizing open platforms, for example open helpdesk, open docs or other types of user content servers that don’t require payment and only need an email address for registration.
  • Configuring dynamic DNS or proxying traffic to obfuscate the server’s true location.
  • Sharing the activation server address within libraries, code or guides

Simplifying the User Interaction

The final step is creating scripts or guides to make it easy for users to point their systems to the rogue server. They’re intentionally easy.

powershell
   # Automatically point Windows to the rogue KMS server
$ $server = "free.actv06.exmpl"
$ Start-Process -NoNewWindow -FilePath "cmd.exe" -ArgumentList "/c slmgr /skms $server && slmgr /ato"

Digging Deeper: Setting Up a Custom KMS Windows Server

At its core, a KMS server works by responding to activation requests from client systems using the Key Management Service protocol. Microsoft designed KMS to enable enterprise administrators to manage volume activations within their network. Here’s how it typically works and how rogue operators exploit it:

Enabling the KMS Role on Windows Server

To set up a legitimate KMS server:

  1. Install the Volume Activation Services Role - this is done via the Server Manager in Windows Server editions.
powershell
   $ Install-WindowsFeature -Name VolumeActivation
  1. Activate the KMS Host - Administrators enter a valid KMS Host Key, which is tied to a specific edition of Windows or Office. This key is issued by Microsoft and validated online.

  2. Open TCP Port 1688 . This port is used for communication between clients and the server. The KMS host listens on this port for activation requests.

How Rogue KMS Servers Mimic the Setup

Crackers set up a rogue KMS server by following a similar process but bypass the need for a genuine KMS Host Key:

Leaked Keys

They use leaked or pirated KMS Host Keys, often found in warez forums or dark web marketplaces. These keys are designed for enterprise customers but are hijacked for unauthorized use.

Modified Activation Responses

By reverse-engineering the KMS protocol, rogue servers are configured to always return a successful activation response, regardless of the product key provided by the client.

Tooling

Operators use tools like VLMCSD or patched DLLs to ensure all activation requests return “success,” bypassing cryptographic verification steps.

Example - Deploying VLMCSD on Linux:

powershell

   $ git clone https://github.com/Wind4/vlmcsd.git
$ cd vlmcsd
$ make
$ ./vlmcsd -L 0.0.0.0:1688

Example - Provisioning the Server:

powershell

   # Install Volume Activation Services
$ Install-WindowsFeature -Name VolumeActivation

# Add the KMS host key (pirated or invalid)
$ slmgr.vbs /ipk XXXXX-XXXXX-XXXXX-XXXXX-XXXXX

# Activate the KMS host
$ slmgr.vbs /ato

# Set the listening port
$ slmgr.vbs /skms free.actv06.exmpl

Example - Bypassing Activation Limits:
Microsoft KMS requires at least 25 unique clients (for Windows) or 5 (for Office) before granting activations. By tweaking the KMS registry or using emulators, they remove this limit.

Registry Modification

powershell

   # Force activation threshold to 1
$ Set-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SoftwareProtectionPlatform -Name "KMSActivationThreshold" -Value 1

Example - Firewall Rule:

powershell

   # Allow traffic on TCP port 1688
$ New-NetFirewallRule -DisplayName "Allow KMS" -Direction Inbound -Protocol TCP -LocalPort 1688 -Action Allow

The KMS Protocol

We scraped together some details we found. This is all just theoretical work on the whiteboard, don’t count on it being fully legit. Also it’s not complete, but rather baseline information you could use to further study the protocol. We don’t have the infrastructure or time right now. Hope it’s still interesting.

The KMS protocol was unencrypted up to Windows 7. Starting with Windows 8, it became encrypted, albeit it was pretty easy to reverse engineer. We don’t know, if it was updated further from this point (at least it seemed to be planed for 8.1 already).

Code Snippets

cpp

   // Structure representing a KMS activation request
struct REQUEST {
    WORD MinorVer;                // Minor version of the protocol
    WORD MajorVer;                // Major version of the protocol
    DWORD Tag;                    // Tag identifying the request
    DWORD LicenseStatus;          // License status (valid, expired, etc.)
    DWORD GraceTime;              // Grace time until activation expires
    GUID AppIdGUID;               // Application GUID
    GUID SkuIdGUID;               // SKU GUID
    GUID KmsIdGUID;               // KMS server GUID
    GUID CmIdGUID;                // Client machine GUID
    DWORD MinimumClients;         // Minimum number of clients for activation
    FILETIME TimeStamp;           // Timestamp for the activation request
    BYTE Reserved1[16];           // Reserved space for future use
    wchar_t WorkstationName[33];  // Workstation name (NULL-terminated string)
    BYTE Reserved2[62];           // Reserved space for future use
};

// Structure representing a KMS activation response
struct RESPONSE {
    WORD MinorVer;                // Minor version of the protocol
    WORD MajorVer;                // Major version of the protocol
    DWORD KmsPIDLen;              // Length of the KMS PID
    wchar_t kmsPID[49];           // KMS PID (Product ID for activation)
    GUID CmId;                    // Client machine GUID
    FILETIME TimeStamp;           // Timestamp of the response
    DWORD ActivatedMachines;      // Number of machines activated
    DWORD ActivationInterval;     // Activation interval (in minutes)
    DWORD RenewalInterval;        // Renewal interval (in minutes)
};

// Structure representing an encrypted KMS activation request (version 5)
struct REQUEST_V5 {
    WORD MinorVer;                // Minor version of the protocol (for version 5)
    WORD MajorVer;                // Major version of the protocol (for version 5)
    BYTE Salt[16];                // Salt value (changes for each request)
    REQUEST Request;              // The original request data, encrypted with the session key
    BYTE Pad[4];                  // Padding for alignment, encrypted with session key
};

// Structure representing an encrypted KMS activation response (version 5)
struct RESPONSE_V5 {
    WORD MinorVer;                // Minor version of the protocol (for version 5)
    WORD MajorVer;                // Major version of the protocol (for version 5)
    BYTE SaltKey[16];             // SaltKey (changes for each response, equivalent to request's Salt)
    RESPONSE Response;            // The original response data, encrypted with the session key
    BYTE Data1[16];               // Encrypted data, computed using XOR of Salt, Decrypted Salt, and constant value
    BYTE Data2[16];               // Encrypted data (static byte pattern)
    BYTE Data3[16];               // Encrypted data (static byte pattern)
    BYTE Pad[2];                  // Padding for alignment, encrypted with session key
};

// Unencrypted data details for understanding structure fields

// For Request_v5.Pad:
// Padding for alignment in the request (encrypted with session key)
Request_v5.Pad = {0x04, 0x04, 0x04, 0x04}; 

// For Response_v5.Pad:
// Padding for alignment in the response (encrypted with session key)
Response_v5.Pad = {0x02, 0x02};           

// For Response_v5.Data1 (calculation using XOR):
// Data1 is calculated using the XOR of:
// - Salt (from the request)
// - DSalt (Decrypted Salt)
// - 'aaaa' (a sequence of 0x61 bytes)
// The XOR operation is performed as follows:
Response_v5.Data1 = Salt ^ DSalt ^ 'aaaa';

// Static values for Data2 and Data3 (encrypted with session key):
Response_v5.Data2 = 
{0x0C, 0x0B, 0xEA, 0xCE, 0xF8, 0x87, 0x7B, 0xBF, 0x24, 0x16, 0xEB, 0x00, 0xF2, 0xB5, 0xDC, 0x96};
Response_v5.Data3 = 
{0x35, 0x4E, 0x26, 0xDD, 0x1D, 0xF5, 0x51, 0x73, 0x20, 0x45, 0x9B, 0x12, 0x36, 0x86, 0x0F, 0x8C};

// Unknown Data2 and Data3 are a SHA256 Hash
// SHA256 of "helloworld":
// SHA256("helloworld") = 2cf24dba5fb0a30e26e83b2ac5b9e29e1b1699e3f2d9f8ab8d54b2a01d1c5e6f
// Data2 = 2cf24dba5fb0a30e26e83b2ac5b9e29e
// Data3 = 1b1699e3f2d9f8ab8d54b2a01d1c5e6f
// Data1 = Salt ^ DecryptSalt ^ 0x61 ^ Rnd (XOR operations)

// Definitions and Setup for the KMS Activation Handling

const int MemoryBufferSize = 1024;       // Defines the size of the memory buffer used 
const int ActivatedMachines = 50;        // Specifies the number of activated machines 
const int ActivationInterval = 120;      // Activation interval (in minutes)
const int RenewalInterval = 7 * 24 * 60; // Renewal interval (in minutes, 7 days)
BYTE *MemoryBuffer;                      // Pointer to store the final response data

// DecryptMessage Function - Handles AES decryption of incoming messages
void DecryptMessage(int MessageSize, BYTE *Message)
{
    // Temporary pointer for the decrypted message
    BYTE *p;  
    // Output for AES decryption (usually padding or key size, not used directly here)
    DWORD q;  

    // Allocate memory for decryption process
    p = new BYTE[MessageSize];

    // Copy the original message into the temporary buffer
    memcpy(p, Message, MessageSize);  

    // Decrypt the message using AES
    AesDecrypt(p, MessageSize, Message, &q);
  
    // Clean up the temporary buffer after decryption is done
    delete(p);  
}

// EncryptMessage Function - Handles AES encryption of messages to be sent back
void EncryptMessage(int MessageSize, BYTE *Message)
{
    // Temporary pointer for the encrypted message
    BYTE *p;  
    // Output for AES encryption (usually padding or key size, not used directly here)
    DWORD q;  

    // Allocate memory for encryption process
    p = new BYTE[MessageSize];

    // Copy the message into the temporary buffer for encryption
    memcpy(p, Message, MessageSize);  

    // Encrypt the message using AES
    AesEncrypt(p, MessageSize, Message, &q);

    // Clean up the temporary buffer after encryption is complete
    delete(p);  
}


// Function to handle activation request and return response
int RequestActivation(handle_t IDL_Handle, int RequestSize, unsigned char *Request,
                      int *ResponseSize, unsigned char **Response) {
  
  int i;

  // Pointer to the request structure (v5)
  REQUEST_V5 *Request_v5;               
  
  // Pointer to the response structure (v5)
  RESPONSE_V5 *Response_v5;             
  
  // Temporary buffer for handling data
  BYTE *Buffer;                        
  
  // Allocate memory for the response buffer
  MemoryBuffer = (unsigned char *) midl_user_allocate(MemoryBufferSize); 
  
  // Allocate memory for the buffer
  Buffer = new BYTE[512];     

  // Cast the incoming request to REQUEST_V5 structure         
  Request_v5 = (REQUEST_V5 *) Request;  

  // Create a new RESPONSE_V5 structure
  Response_v5 = new RESPONSE_V5;  

  // Zero-out the response structure    
  memset(Response_v5, 0x00, sizeof(RESPONSE_V5)); 

  // Copy the Salt from the request to the response
  memcpy((BYTE *) Response_v5->Salt, (BYTE *) Request_v5->Salt, 16);

  // Initialize AES encryption for decryption
  AesInit(AES_TYPE_128, AES_MODE_CBC, 0x02, SessionKey, Request_v5->Salt);
  DecryptMessage(256, (BYTE *)(&Request_v5->Salt));  // Decrypt the message

  // Set version numbers for response
  Response_v5->MinorVer = 0;
  Response_v5->MajorVer = 5;
  Response_v5->Response.MinorVer = 0;
  Response_v5->Response.MajorVer = 5;

  // Set the KMS PID length and copy the KMS PID to the response
  Response_v5->Response.KmsPIDLen = 0x62;
  memcpy((BYTE *) Response_v5->Response.kmsPID, (BYTE *) kmsPID, 0x62);

  // Copy CmId and TimeStamp from the request to the response
  memcpy((BYTE *)(&Response_v5->Response.CmId), (BYTE *)(&Request_v5->Request.CmId), 16);
  memcpy((BYTE *)(&Response_v5->Response.TimeStamp), (BYTE *)(&Request_v5->Request.TimeStamp), 8);

  // Set additional response fields
  Response_v5->Response.ActivatedMachines = ActivatedMachines;
  Response_v5->Response.ActivationInterval = ActivationInterval;
  Response_v5->Response.RenewalInterval = RenewalInterval;

  // XOR operation to generate Data1 for response
  for (i = 0; i < 16; i++) {
    // XOR Salt and a constant value to generate Data1 - see comments further up
    Response_v5->Data1 = Request_v5->Salt ^ Response_v5->Salt ^ 0x61;  
  }

  // Copy additional data (Data2, Data3) from pre-defined data sources
  memcpy((BYTE *)(Response_v5->Data2), Data2, 16);
  memcpy((BYTE *)(Response_v5->Data3), Data3, 16);

  // Encrypt the response message
  EncryptMessage(190, (BYTE *) &Response_v5->Response);
  AesClear();  // Clear the AES state after encryption

  // Copy the final response data into MemoryBuffer
  memcpy(MemoryBuffer, (BYTE *) Response_v5, sizeof(RESPONSE_V5));

  // Set response size and assign the response buffer
  *ResponseSize = sizeof(RESPONSE_V5);
  *Response = MemoryBuffer;

  // Log the activation response sent
  printf("Activation response sent.\r\n");

  // Cleanup memory
  // Delete response structure
  delete(Response_v5);  

  // Delete buffer
  delete(Buffer);       

  // Return success
  return 0; 
}

Simple Attack Template

(also in theory only)

Note that the following doesn’t crack anything, it rather shows the forward operation you would need to reverse in parts or fully, depending on the data you may be able to acquire.

cpp
   // Example values
BYTE Salt[16] = {0xAB, 0x34, 0x21, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xF0, 0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE};  // Random Salt
BYTE DecryptSalt[16] = {0xAA, 0x33, 0x22, 0x55, 0x77, 0x99, 0xBB, 0xDD, 0xEE, 0x11, 0x33, 0x55, 0x77, 0x99, 0xBB, 0xDD};  // Decrypted Salt

// XOR operation for Data1 (this is just an example)
BYTE Data1[16];
for (int i = 0; i < 16; i++) {
    // XOR Salt, Decrypted Salt, and 0x61 ('a')
    Data1[i] = Salt[i] ^ DecryptSalt[i] ^ 0x61;  
}

// The static SHA256 hash result for the string "aaaaaaaaaaaaaaaa"
// First half of SHA256
BYTE Data2[16] = 
{0x0C, 0x0B, 0xEA, 0xCE, 0xF8, 0x87, 0x7B, 0xBF, 0x24, 0x16, 0xEB, 0x00, 0xF2, 0xB5, 0xDC, 0x96};  

// Second half of SHA256
BYTE Data3[16] = 
{0x35, 0x4E, 0x26, 0xDD, 0x1D, 0xF5, 0x51, 0x73, 0x20, 0x45, 0x9B, 0x12, 0x36, 0x86, 0x0F, 0x8C};  

Wireshark

(Found on the cybernetweb)

Wireshark Capture Office 2013 Pro Plus on Windows 7 Professional

wireshark

   FC000000 FC000000 00000400 00000000 02000000 BBA80000 15CEF10F 89A99D47 
AF46F275 C6370663 9CDA22B3 E2A25840 9E4EF59A 6970BD69 BFF1A6E6 409DC340 
AA9FC77B A21578C0 757F313F 3F3EAC3D 438C3D1D 77FD8A30 12050000 002872A4 
23A4C2CD 01000000 00000000 00000000 00000000 00007600 42006F00 78002D00 
50004300 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
00000000 00000000 00000000 00000000 00000000 00000000 00000000 3D3D3D3D 
3D3D3D3D 3D3D3D3D 3D3D3D3D 3D3D3D3D A1B4250E 891270FF 376692EF 1DD20F29

How Genuine Activation Is Bypassed

Microsoft’s activation process relies on a series of validation steps:

  1. Product Key Check - The client provides a product key (e.g., during installation or activation).
  2. Server Validation - The key is sent to the KMS server, which verifies whether it’s valid and tracks the number of activations allowed.
  3. Response to Client - A valid key results in the server issuing an activation confirmation.

Rogue servers exploit this by:

  • Accepting Any Key:
    Rogue KMS servers ignore invalid keys, tricking clients into thinking their keys are legitimate.

  • Faking Activation Limits:
    Microsoft enforces activation thresholds (e.g., a minimum of 25 clients must request activation for Windows Server). Rogue servers bypass this by pretending to meet the threshold, even if only one client connects.

  • Lifetime Activations:
    Legitimate KMS activations require periodic re-validation (every 180 days). Rogue servers often set fake expiration dates far into the future or automate reactivation to keep clients perpetually “active.”

Why This Works

The system’s design inherently trusts the KMS server in enterprise environments, assuming it’s secure and managed by the organization. There’s no external verification step (e.g., a call back to Microsoft) in the standard KMS workflow, which makes it relatively easy to spoof:

  • No Centralized Validation - KMS activations occur locally, so Microsoft isn’t directly involved during activation
  • Protocol Simplicity - The KMS protocol is straightforward, which makes reverse-engineering and mimicking responses achievable with minimal resources

Technical Insights

Windows Server is a natural choice for hosting KMS services. Its native tools allow operators to:

  • Serve thousands of activation requests simultaneously.
  • Respond with legitimate-looking activation confirmations.
  • Easily manage and scale the server to handle high traffic volumes, as noted in Halong’s message about “keeping servers running every day.”

The Business Model of Rogue KMS Servers

Interestingly, crackers not always aim to provide free activations; they often monetize their efforts:

  1. Donations: Encouraging users to support the project through platforms like PayPal or cryptocurrency.
  2. Consulting Services: Offering to set up private KMS servers for organizations.
  3. Traffic Funnel: Using the activation service to drive visitors to associated websites or other revenue-generating platforms, website adds and backdoored software are used to gain a few coins.

Understand, that we only make assumptions here. Crackers follow a variety of motivations, not only monetarily driven. Some offer their services out of political or ideological motivation (e.g. “Information, including code and software, should be free”), helping people in need or just for fun and fame. Finally, there always is the possibility of larger APT groups, DarkNet operations or gouverment agencies behind cracked software, China, Russia, North Korea, only to name a few.

A Historical Perspective

Rogue KMS servers have evolved significantly:

EraTechnique
Pre-VistaRetail keys leaked online; basic keygens sufficed.
Vista EraActivation checks tied to hardware made keygens less effective.
KMS EraCrackers shifted to spoofing enterprise KMS servers to bypass key requirements entirely.
Cloud EraWith Microsoft moving activations to cloud systems, new techniques are yet to emerge.

This also shows: Many vendors, including MS itself, already have solved the problem of crackable software activation. They just don’t enforce it. Even small-time vendors, like game developers on Steam, are able today to make activations that are impossible to bypass, simply by moving activation and parts of the application to the cloud, forcing always online only scenarios on the user. On a regular, users, especially those with bad internet, living outside of big cities, express their complaints and worries of such, but: it does work, Microsoft could do it, just as they could patch a lot of Windows vulnerabilities.

Conclusion

Rogue KMS servers show an interesting development. While they simplify piracy for end-users, they also show that law enforcement efforts did little to impress providers. Such servers are a step up from simply sharing cracked files via “Megashares” plattforms anonymously, running an infrastructure 24/7 relies on proven OpSec. By studying these systems, researchers can gain a deeper understanding of modern exploitation and prepare for what’s next.

Top-down view on cracked software

Geo-politically speaking, we personally make the assumption, that at least partly these types of bypasses are tolerated by vendors and authorities, also to avoid economic damages and to provide some “Bread and Circuses” for lower-income households. Rightfully so. Studies have shown that people using filesharing services are more likely to purchase genuine copies, they’re often collectors and die-hard fans, sometimes failing to aquire the product in question legally, cause it simply isn’t available or the costs exceed the worth by far.

User stories about legally bought but not owned

To take us as example, we bought a lot of software legally and for high prices, only to find after a few years, it’s activation servers have been shut down - while the software itself would still work perfectly. In another example, we spent money on legal streaming services to get certain videos as UHD and HDR - couple months later the vendor decided, that legitimate owners will only receive 360p-720p and no more HDR, if they refuse to pay an additional, high-res streaming fee every month. This is beyond absurdity, sadly this type of unethical behaviour by companies is never sanctioned or prosecuted.

Users prefer products like Davinci Resolve or Affinity Photo (pay-to-own / pay-once-keep-forever) over Adobe Products (subscription / pay-forever-own-never). Also forced updates, to sell the same product again, hardly providing any new features or fixes, are often the cause, that users look for alternatives.

Monopolistic takeovers

Once more spilling personal beans, we were particularly unhappy about Adobe buying a competitor product not many people will know, called Substance Painter - an outstanding product for professional 3D and graphics design, that we back then bought for almost 300€. Now it’s patched to level “broken” and only available via Creative Cloud, albeit this went back and forth (some standalone Steam releases, didn’t follow further), since literally nobody of the former user base was happy the slightest bit about this transaction. On the other hand, many pay-to-own customers openly support smaller vendors, buying a version 2.0 out of free will, to support a customer-friendly business model, as in the case of Affinity / Serif Studios, not because they’re forced to by a monopolistic giant.

Right now, we kept copies of the last available installers locally, along with the legally owned product keys. This product heavily relies on functioning 3D graphic card drivers (AMD / NVidia drivers). At the moment, it still works, but we fear each startup that an Nvidia driver update will break it. That point will come sooner or later. Although we no longer do 3D graphics professionally, this product is literally irreplaceable. There’s not enough market to trigger new competition.
Adobe knows that.

Bottom line

On the other hand, we clearly must see that most crackers make no difference, who they hit. Multiple times a year we come across a developer tweet claiming they had to shut down due to piracy. Sometimes that may be just an excuse for bad sales (and thus ultimately a bad product). Other times it will definitely be true. The invisible hand in illegitimate software, streams and alike is rarely as moral one, but rather something we call professionalism: Meaning, crackers, individuals and groups, compare by the volume they offer, competing with each other, more is better. They compete over their “professional” appearance, having properly running services, good websites, pro level support, social media - it’s a lot of work behind these actions and usually not for the big money.

They hit the wrong people

Lately we’ve seen more and more groups shut down entirely, mostly due to the same monetary pressure, every world citizen is currently facing, and (less often) due to legal pressure, as well as abuse of their services by other criminals. An example would be Anonfiles who shut down because of too many complaints. We can imagine, what kind of “files” that probably were, we don’t want to spell it out here. Add to that, Anonfiles said in their Goodbye message, they were overrun by such files in such a volume that even automated channels could no longer withstand.
What a fucking sad world.

Happy Holidays!