Voltar ao perfil

Engenharia e engenharia reversa · 2024–2025

Dark Seal

Exalted, um skin hack de League of Legends: da transformação de recursos do jogo a um sistema desktop com distribuição de assets e sincronização de grupos.

Período
2024–2025
Meu papel
Criador e proprietário da Dark Seal; criador do Exalted
Produto
Desktop e serviços
Situação
Encerrado; arquivo histórico
visitas ao site, relatadas
1,2M
estrelas no lol-skins
942
forks do lol-skins
227

Tráfego histórico informado pela Dark Seal, sem auditoria independente. Estrelas e forks registrados em 9 de setembro de 2026; os números do GitHub mudam. Contexto e fontes

Um skin hack, do catálogo ao jogo

Eu sou Bruno Bezerra Trigueiro. Criei e fui proprietário da Dark Seal, um projeto de engenharia de software e engenharia reversa que operou principalmente em 2024–2025. Também criei o Exalted, um skin hack de League of Legends, desenvolvido com uma equipe de colaboradores.

O usuário escolhia skins em um catálogo no desktop. Por trás dessa seleção, o Exalted baixava pacotes, processava arquivos locais e coordenava ferramentas nativas de modding para preparar os recursos usados pelo jogo. Autenticação, licenças, atualizações e modo em grupo faziam parte do sistema. Cada cliente baixava e preparava os assets localmente; o Party sincronizava as escolhas dos participantes.

O que eu construí

Meu trabalho atravessou os limites entre esses componentes: desenvolvimento do cliente Exalted, autenticação e persistência de sessões, migração dos catálogos para APIs e integração do cliente com serviços de grupo. No Navori, trabalhei no backend e na extração da funcionalidade de grupos para um serviço separado.

Também trabalhei no acervo lol-skins, incluindo correções de comportamento dos assets e a mudança de empacotamento de Fantome para ZIP. Construí o Shadowflame, a camada Python para reparar pacotes em lote, com extração de WAD, edição de definições de recursos e conversão e reempacotamento em paralelo. Seu README me credita como koobzaar.

Da seleção ao processo nativo

O cliente Electron usava React e TypeScript na interface. O renderer enviava solicitações pelo preload e por IPC ao processo principal, que cuidava das sessões, rede, arquivos e processos nativos. Essa era a fronteira entre a interface e as operações no computador do usuário.

Caminho local no cliente de junho de 2025
  1. SelecionarCatálogo e escolhas do grupo
  2. PrepararBaixar pacotes e importar mods
  3. ConstruirMontar o overlay com CSLOL
  4. ExecutarIniciar o processo nativo do overlay

O overlay reunia as substituições de recursos em um perfil para o jogo. O Exalted coordenava importação, construção e execução com ferramentas do CSLOL, incluindo tentativas e limites de tempo nas etapas de importação e construção. O loader nativo vinha desse projeto externo.

Navori
Backend Node/Next.js com estado em MongoDB para contas, licenças, catálogos, assets e atualizações. Separava identidade do usuário, direito de acesso e chaves geradas. O cliente persistia a sessão localmente e a revalidava no servidor.
Party
Serviço Node/Express separado: HTTP para entrar, sair e mudar seleções; WebSockets para transmitir o estado completo do grupo. MongoDB guardava membros e escolhas, enquanto conexões e presença ao vivo ficavam na memória do processo. O serviço tinha configuração Docker/Compose própria.

Distribuir metadados e pacotes

Os catálogos usavam ETags para reconhecer dados inalterados, deltas para descrever mudanças e chunks identificados por hash. O cliente comparava o hash dos chunks recém-baixados com o manifesto antes de armazená-los e podia reutilizar o cache em falhas comuns de rede. Essas verificações mantinham consistência com o catálogo recebido.

O Navori também gerava os metadados consumidos pelo electron-updater. No desenvolvimento posterior, a entrega de assets passou a incluir URLs temporárias assinadas para armazenamento de objetos compatível com S3. Isso separava a autorização do download da transferência do pacote.

Entender o recurso por dentro

O trabalho com assets exigia lidar com as convenções de recursos proprietários do League. Arquivos BIN descreviam recursos e suas referências; arquivos WAD agrupavam dados do jogo. Um nome de arquivo correto não bastava: os identificadores internos também precisavam corresponder ao slot que seria substituído.

O CDragonSkinExtractor, creditado a jinjutwo e nylish, mostra essa transformação. Ele obtinha definições pelo CommunityDragon, convertia BIN para JSON com ritobin, alterava os identificadores da skin e do ResourceResolver para o slot base Skin0, e reconstruía BIN, WAD e ZIP. Essa rotina preparava definições de substituição; não coletava todas as dependências de texturas e modelos.

No meu trabalho com o Shadowflame, o caminho começava em pacotes existentes: extrair WAD, converter BIN em texto, corrigir referências com expressões regulares e reempacotar. A saída era especializada em skin0.bin. Paralelizar extração, conversão e empacotamento permitia aplicar a mesma correção em lotes.

Era engenharia sobre semânticas de recursos obtidas por engenharia reversa: entender quais referências mudar e conectar esse conhecimento a uma rotina repetível. A conversão binária era do ritobin, de moonshadow565; as ferramentas nativas de WAD e overlay vinham do CSLOL, de LoL-Fantome. O CommunityDragon fornecia dados e hashes usados pelo ferramental.

Responsabilidades saem do cliente

O sistema mudou conforme cresceu. As migrações de grupos e catálogos mostram como o cliente passou a delegar trabalho aos serviços.

  1. Novembro de 2024: grupos entre clientes. Kohelet introduziu a implementação PeerJS. O cliente anfitrião distribuía o estado por conexões diretas entre participantes.
  2. Março de 2025: integração com serviços. Migrei a integração de grupos para HTTP/WebSocket no processo principal do Exalted. A funcionalidade ficou brevemente no Navori, antes da separação do WebSocket e da remoção das rotas de grupos no fim de março.
  3. Catálogos passam ao backend. A migração de março substituiu leitores de repositório e geração local por busca via API, com cache e tratamento de respostas no cliente. Navori assumiu a geração dos catálogos a partir de dados de repositórios.

No desenvolvimento posterior de 2025, ainda em Electron, o Exalted ganhou integração IPC com a API HTTPS local do League Client para consultar invocador e seleção de campeões, além da entrega por URLs temporárias. Esses acréscimos pertencem ao ramo de desenvolvimento de novembro; não descrevem todos os recursos da versão 1.6.3 de junho nem estabelecem uma data de lançamento.

Um acervo mantido em comunidade

O lol-skins reunia pacotes por campeão, skin e chroma. A árvore registrada continha 10.811 entradas, incluindo diretórios e documentação. O repositório tinha 942 estrelas e 227 forks no registro de 9 de setembro de 2026; esses números não representam usuários do Exalted nem a situação no encerramento.

A retrospectiva da Dark Seal informa aproximadamente 1,2 milhão de visitas ao site e cerca de 570 mil visualizações em um período de 14 dias. São estatísticas históricas relatadas pela organização, sem medição independente.

Criar o projeto não significou escrever cada subsistema sozinho. Além do trabalho de Kohelet no PeerJS, nylish contribuiu com o servidor Flask anterior, acesso a artefatos privados e integrações posteriores. jinjutwo, CresianaRVN, nylish, kyewyve, DarkSeaI e outros participaram da manutenção do acervo junto comigo. O CDragonSkinExtractor credita jinjutwo e nylish; minha publicação do arquivo Party não atribui a mim cada linha do serviço.

O que permanece

A Dark Seal encerrou as atividades em novembro de 2025. Seu registro público relata uma notificação jurídica recebida em 14 de novembro de 2025, seguida da interrupção do desenvolvimento, da distribuição e dos serviços. Os repositórios abaixo são arquivos históricos sem manutenção ou suporte. O código completo do cliente Exalted e do Navori não está nesses repositórios públicos.

  • ShadowflameReparo em lote, conversão e reempacotamento; crédito a koobzaar.
  • PartyServiço HTTP/WebSocket, estado e configuração Docker. Histórico de desenvolvimento condensado antes da publicação.
  • CDragonSkinExtractorTransformação de identificadores BIN e empacotamento WAD.
  • lol-skinsAcervo de pacotes e histórico de manutenção da comunidade.
  • Arquivo da organização Dark SealRelato do projeto, tráfego informado e encerramento.