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.
- SelecionarCatálogo e escolhas do grupo
- PrepararBaixar pacotes e importar mods
- ConstruirMontar o overlay com CSLOL
- 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.
- 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.
- 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.
- 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.