Everything posted by Fernando Mercês
-
Download das VMs
Ah, você conseguiu baixar? Os hashes batem com esses? $ md5sum Win10-DFIR.* f2e64a2481800bf25520dfae0f9dbefe Win10-DFIR.ova 3bbdafe7a7eee1f33db5a755c0d574e9 Win10-DFIR.z01 6fb27417deee653f38c2f1355ba9f119 Win10-DFIR.z02 33b30e6cf46da1a6355a4400725c24c5 Win10-DFIR.z03 4828550c123398e61d7ef3975c4dc720 Win10-DFIR.z04 6c9e9fd67316b7b2ea33567ad05f735e Win10-DFIR.z05 48b32de1f951cbf54a31cf17c73a0947 Win10-DFIR.z06 e4eb279ee8957ffaba3f6d55144cbbd1 Win10-DFIR.z07 ffc5e5037623d0f0b32f4f22dc4bf746 Win10-DFIR.z08 f330e1ecc38cf409894d06eb90b21863 Win10-DFIR.zipAqui importou de boa no Workstation. Deu uma travada ao subir, mas habilitei o Intel VT-x / AMD-V nas propriedades e foi que foi: Abraço.
-
Download das VMs
Caramba, removeram por alguma questão com termos de serviço. Pedi ao @Caique para upar de novo, mas tô baixando de outra fonte aqui também. Dá mais um dia pra nós, please.
-
Problemas Com Download nos Slides do Primeiro Módulo
Oi pessoal. Segue: https://mega.nz/folder/8BBmESaL#cvTkRvfPjppOiOJw492HlQ
-
Criando assinaturas para o Detect It Easy
Não é incomum encontrar capturas de tela do Detect It Easy (DIE) em relatórios e publicações sobre análise de malware. Isso se deve a um fato: ele funciona muito bem. Mas o que talvez você não saiba é que existe um trabalho nos bastidores de criação e atualização de assinaturas que ajuda nessa eficiência. Há também, obviamente, o excepcional trabalho do @horsicq (sim, ele é membro aqui!) no desenvolvimento deste software que mudou o paradigma da detecção de compiladores, linkers, packers e protectors utilizados em arquivos executáveis. Neste artigo vou mostrar como melhorei uma assinatura existente do DIE, na esperança de te encorajar a fazer o mesmo quando se deparar com desafios similares. Partiu? 😎 Uma breve história da detecção de packersO ano era 2001 quando snake e Qwerton, dois hackers (na época, crackers - como eram / ainda são chamadas as pessoas s que faziam engenharia reversa), liberaram a versão 0.7 Beta do PEiD. O nome vem de Portable Executable (PE) iDentifier. Ou seja, um software identificador para arquivos PE capaz de detectar se um packer fora utilizado para comprimir, ou um protector para proteger, o executável de Windows que você estava analisando. O PEiD não foi o primeiro, mas ganhou espaço e cresceu em popularidade na década de 2000. O software vinha com um banco de dados interno de assinaturas de packers e protectors, mas também permitia o uso de um arquivo externo chamado userdb.txt onde você poderia armazenar suas próprias assinaturas (e compartilhar com a galera depois). Tais assinaturas seguiam um padrão como a seguir: [nome do packer/protector] signature = 50 E8 ?? ?? ?? ?? 58 25 ?? F0 FF FF 8B C8 83 C1 60 51 83 C0 40 83 EA 06 52 FF 20 9D C3 ep_only = trueOs bytes no campo signature eram buscados no entrypoint do binário PE caso a opção ep_only estivesse presente e configurada como true. Do contrário, a sequência de bytes era buscada em todo o binário. Os dois caracteres "??" formavam um coringa que significava "qualquer byte". Se você usa o YARA (ou o YARA-X), deve soar familiar. Rapidamente, outros hackers começaram a popular e distribuir seus bancos de dados de assinaturas personalizadas, populando-os ao analisar binários compilados em várias linguagens, mas também binários comprimidos ou protegidos. Obviamente isso gerou uma infinidade de versões de userdb.txt pelo mundo afora e uma grande disputa para saber qual era o mais completo. Resumindo, o caos. 🤪 Por volta de 2006, surge o RDG Packer Detector v0.6.4, criado por uma pessoa conhecida por RDGMax. Rapidamente o software ganhou espaço por ter um banco de dados interno de assinaturas de muito boa qualidade. Para suportar assinaturas personalizadas, o RDG suporta ler um userdb.txt, ou seja, ele suporta assinaturas do PEiD, um movimento bastante inteligente para que as pessoas que tinham seus próprios bancos de assinaturas criado para o PEiD pudessem reaproveitá-las no RDG, caso as assinaturas padrão dele não detectassem o que se esperava ou para casos específicos. A última versão pública parece ter sido liberada em 2021, mas há rumores de que o desenvolvimento continua e pode ser que vejamos uma nova versão do RDG Packer Detector num futuro próximo! 😊 Em paralelo ao sucesso do RDG, em janeiro de 2013, surge a primeira versão pública do Detect It Easy (DIE). Não tenho certeza sobre as primeiras versões, mas hoje o DIE conta com modernidades interessantíssimas. Um bom exemplo é o fato de ser multiplataforma, uma vez que a onipresença do Windows ficou no passado já que nos últimos anos muitas pessoas migraram para - ou já "nasceram" usando - sistemas operacionais GNU/Linux ou macOS. Outro fator importante para o sucesso do DIE foram as assinaturas. Além de serem boas, são todas abertas, então nós podemos ver todas as assinaturas que já vêm com o software e, claro, criar as nossas baseadas nelas. Além disso, o motor é simples de usar e a linguagem para criar as assinaturas é turing-complete, ou seja, podemos declarar variáveis, fazer repetições, condicionais, cálculos, etc. Ela é implementada com QT Script/QJSEngine, o que na prática nos permite escrever assinaturas em JavaScript e isso certamente contribui para a popularização do DIE. O autor foi para o GitHub e aceita contribuições de novas assinaturas ou modificações nas existentes por lá, que é o tema deste artigo. Vamos agora ver como melhorei uma assinatura do DIE, mas este artigo também te dá as bases para criar assinaturas novas se você precisar. O desafioNormalmente você precisa de uma nova assinatura ou precisa modificar uma existente quando o DIE não detecta alguma característica de um binário de seu interesse. Num caso recente, usei o DIE para identificar um binário PE e ele não detectou o compilador. Suspeitei que algo estava errado e olhei a estrutura do binário. Uma das coisas que me chamou atenção no binário foi a presença das seções .pdata e .xdata, pouco comuns na minha experiência, como mostra a Figura 1: Figura 1 - Seções do binário não detectado pelo DIE Além disso, no binário haviam algumas ocorrências de strings bastante sugestivas, mostradas na Figura 2: Figura 2 - Strings intrigantes no binário Tais strings me lembraram da existência do MinGW, uma suíte de aplicativos GNU para Windows. De fato, MinGW é uma abreviação de Minimalist GNU for Windows. Na prática, você pode escrever código em C/C++ e utilizar o GCC para compilar seu programa para Windows. Compilei então um "hello, world" em C com a última versão do MinGW. A estrutura de seções ficou parecida. Testei a detecção com o DIE e o resultado foi o mesmo com o meu binário inicial: o DIE não conseguiu detectar o compilador (Figura 3). Figura 3 - DIE não detectou o compilador do meu "hello, world" com MinGW Decidi então investigar e tentar resolver este problema. Inspecionando a assinatura existenteFui na pasta do DIE e em db\PE\MinGW.4.sg encontrei a assinatura que deveria detectar o MinGW: // DIE's signature file init("compiler","MinGW"); includeScript("FPC"); // -- corte -- function detect(bShowType,bShowVersion,bShowOptions) { if(PE.getMajorLinkerVersion()==2) { if(!bFPC&&(PE.getMinorLinkerVersion()<=30||PE.getMinorLinkerVersion()==36||PE.getMinorLinkerVersion()==56)) { if(PE.compare("'MZ'90000300000004000000FFFF0000B800000000000000400000000000000000000000000000000000000000000000000000000000000000000000800000000E1FBA0E00B409CD21B8014CCD21'This program cannot be run in DOS mode.\r\r\n$'00000000000000'PE'0000")) { if(!PE.section[".rsrc"]) { bDetected=1; } else { var nOffset=PE.section[".rsrc"].FileOffset; var nSize=PE.section[".rsrc"].VirtualSize; if(!PE.isSignaturePresent(nOffset+nSize-512,512,"'Microsoft Corp.'")) { bDetected=1; } } } } } // -- corte -- return result(bShowType,bShowVersion,bShowOptions); }Cortei alguns trechos de código em favor da brevidade, mas o importante é saber que a função detect() é a responsável por detectar (dã!) o compilador y otras cositas más. No final, o return result() vai retornar as informações detectadas, mas estas só serão utilizadas se bDetected, que parece ser uma variável global, for true. Restava saber então qual fluxo este código estava seguindo que não chegava numa das linhas que ligava a bDetected. Depurando a assinaturaGraças à escolha da Qt, o DIE integrou um depurador (ou debugger, se você preferir a palavra em inglês) completo para encontrar problemas na assinatura. Para acessá-lo, basta: Clicar no botão Signatures. Escolher a assinatura que quer depurar no menu da esquerda. Clicar no botão Debug. Olha que belezinha: Figura 4 - Depurando a assinatura MinGW.4.sg do DIE no QT Script Debugger integrado É possível colocar breakpoints, usar Step Over (F10), Step Into (F11), etc. Assim ficou fácil perceber que, com o meu binário "hello, world", a condição do segundo if não resultava em verdadeiro: (!bFPC && (PE.getMinorLinkerVersion() <= 30 || PE.getMinorLinkerVersion() 36 || PE.getMinorLinkerVersion() 56). Essa função PE.getMinorLinkerVersion pega o campo MinorLinkVersion do cabeçalho opcional do PE, que no caso precisa ter um valor menor que 30 ou igual a 36 ou 56 para a variável bDetected ser true. Fui verificar no meu binário inicial e o valor dele neste campo era 41. Já no "hello, world" que gerei, era 44. Gerei mais alguns binários usando versões diferentes do MinGW e usei o readpe (projeto nosso! 💚) para filtrar todos os valores possíveis: $ ls *.exe hello_cygwin32.exe hello_mingw64_ucrt.exe hello_w64devkit_x64.exe nfuncs.exe hello_cygwin64.exe hello_mingw_from_linux.exe hello_w64devkit_x86.exe hello_mingw64_msvcrt.exe hello_mingw_from_linux_stripped.exe hello_winlib_x64.exe $ (for i in *.exe; do readpe -H "$i" | grep Linker; done) | sort -u Linker major version: 2 Linker minor version: 41 Linker minor version: 44Então o caminho parecia ser esse: expandir a assinatura para cobrir os valores 41 e 44 de LinkerMinorVersion. 🤞 Atualizando a assinaturaSó um pouquinho de programação básica foi necessário para modificar a assinatura. Criei uma variável minor para não precisar chamar PE.getMinorLinkerVersion() múltiplas vezes e atualizei a condição assim: // -- corte -- function detect(bShowType,bShowVersion,bShowOptions) { if(PE.getMajorLinkerVersion()==2) { var minor=PE.getMinorLinkerVersion(); if(!bFPC&&(minor<=30||minor==36||minor==41||minor==44||minor==56)) { // -- corte -- return result(bShowType,bShowVersion,bShowOptions); }O resultado causou aquela liberação de dopamina. Como mostrado na Figura 5, o DIE detectou o MinGW, sua versão, linguagem e tudo mais. Figura 5 - DIE detectando corretamente o compilador MinGW usado no "hello, word" Aproveitei e adicionei na assinatura uma informação adicional, pois percebi que quando você usa o comando strip, os dados no overlay (dados que não pertencem à nenhuma seção ou cabeçalho, após o "fim" do arquivo), são removidos. Então adicionei mais um condicional no fim: if(bDetected) { sVersion=getMinGWVersion(); if (!PE.isOverlayPresent()) sVersion+=", stripped"; }Testei e tudo funcionou bem. Era só enviar a contribuição no GitHub né? Será? 🤔 Enviando o patchPara minha surpresa, quando cheguei no GitHub, a assinatura estava um pouco diferente da que eu tinha em meu computador com o DIE 3.10. Acontece que o DIE está em pleno desenvolvimento e depois do release da versão 3.10, as assinaturas foram atualizadas e a API mudou um pouco (para melhor). Por sorte, o autor deixa disponível uma versão beta que usa as últimas assinaturas do GitHub. Tratei de estudar a nova assinatura e, no fim, enviei um pull request que acabou corrigindo um pequeno problema com ela: um zero a menos na comparação da PE.compare(). O PR foi aceito (obrigado, @horsicq!) com a correção e as melhorias simples que fiz para detecção do MinGW. ConclusãoA detecção de compilador e linker é uma parte importante da engenharia reversa porque te dá um norte de que ferramentas usar, como estarão as funções (convenção de chamadas, etc), como estarão as strings (.NET usa, na maioria dos casos, UTF-16-LE por exemplo). Além disso, saber se um compressor (packer) foi utilizado ou um protector já te prepara para o que você vai encontrar no entrypoint. É uma informação útil na inteligência de ameaças também. Portanto, ter um bom software de detecção à mão é essencial. Além disso, se o software permitir, você pode melhorá-lo. Exige algum esforço, algum estudo, mas as coisas boas exigem mesmo. E há prazer em fazer tais coisas, posso te garantir. Por fim, fica meu agradecimento a todas as pessoas que trabalharam em softwares de detecção do tipo nos últimos anos. Espero que você compartilhe dessa gratidão também. Na próxima vez que o DIE detectar corretamente o que foi usado no seu binário, agradeça a quem o desenvolveu, mas também às suas alternativas como o RDG e o PEiD. Há um trabalho comunitário grande nos bastidores para que você possa dar um duplo-clique e ter sua resposta rapidinho. E de graça. Ah, e se por acaso seu binário tiver sido compilado pelo MinGW e o DIE detectar corretamente, agradeça a quem criou a primeira versão do MinGW.4.sg e a quem já melhorou essa assinatura que, a partir de agora, inclui a Mente Binária também. 💚
-
O Labirinto Secreto das Imagens do Debian
Este artigo é de autoria de Thomas Lange e foi traduzido e reproduzido com autorização do autor. Link para o artigo original aqui. TL;DRÉ difícil encontrar a imagem de instalação certa do Debian. Existem milhares de arquivos ISO e imagens usadas em ambientes de nuvem, suportando múltiplas arquiteturas de CPU e vários métodos de download. A estrutura de diretórios do servidor principal de imagens é como um labirinto e as páginas da web para download também são confusas. Fatos mais importantes deste post https://cdimage.debian.org/cdimage A ISO netinst mais recente A imagem do Debian testing live com GNOME mais recente imagem do Debian testing com GNOME Não há ISO oficial do Debian stable usando o kernel backports O serviço web FAIme cria imagens personalizadas usando o Debian stable com um kernel mais recente A imagem mais antiga: Other-Maybe-Official - Debian-i386 2.1 Disc 1.iso O Labirinto do DebianVocê já procurou por uma imagem específica do Debian que não fosse a ISO netinst padrão para amd64? Quanto tempo levou para encontrá-la? O projeto Debian é muito bom em esconder suas imagens para download ao oferecer uma enorme quantidade de versões e variantes diferentes, além de múltiplos métodos para baixá-las. O Debian também possui várias páginas na web para Download do Debian Instalando o Debian pela internet Mídia de instalação do Debian USB, CD, DVD Instalação via rede a partir do menor USB ou CD possível Imagens de instalação live Baixando imagens de USB/CD/DVD do Debian via HTTP/FTP Baixando imagens de USB/CD/DVD do Debian via BitTorrent Baixando imagens de USB/CD/DVD do Debian via jigdo Instalando com o Debian-Installer Este é o labirinto secreto de imagens do Debian. Atualmente, ele está repleto com mais de 8.700 imagens ISO diferentes e outros 34.000+ arquivos (raw e qcow2) para as imagens para ambientes de nuvem (cloud images). A URL principal do servidor que hospeda todas as imagens do Debian é https://cdimage.debian.org/cdimage/ Lá você vai encontrar imagens do tipo installer, live e cloud. Vamos tentar encontrar a imagem certa para o que você precisaExistem três tipos diferentes de imagens: installer: podem ser inicializadas em um computador sem nenhum sistema operacional e, em seguida, o instalador do Debian pode ser iniciado para realizar uma instalação do Debian. live: inicializam um desktop Debian sem instalar nada nos discos locais. Você pode experimentar o Debian e, se gostar, pode usar o instalador gráfico Calamares para instalá-lo no disco local. cloud: destinadas a executar uma máquina virtual com Debian usando QEMU, KVM, OpenStack ou na nuvem da Amazon AWS ou Microsoft Azure. Imagens para a versão estávelQuase sempre você provavelmente está procurando a imagem para instalar a versão estável mais recente. A URL https://cdimage.debian.org/cdimage/release/ mostra: 12.9.0 12.9.0-live current current-livemas o que você não vê é que dois dos diretórios acima são na verdade links simbólicos: current -> 12.9.0/ current-live -> 12.9.0-live/Nestes diretórios você encontrará as imagens do tipo installer e live para a versão estável (atualmente Debian 12, codinome bookworm). Se você escolher https://cdimage.debian.org/cdimage/release/12.9.0/, verá uma lista de arquiteturas de CPU suportadas: amd64 arm64 armel armhf i386 mips64el mipsel ppc64el s390x source trace(Em tempo, source e trace não são arquiteturas de CPU) O usuário típico não se preocupará com a maioria das arquiteturas porque seu computador quase sempre precisará de imagens da pasta amd64. Vamos ver o que há na pasta amd64: bt-bd bt-cd bt-dvd iso-bd iso-cd iso-dvd jigdo-16G jigdo-bd jigdo-cd jigdo-dlbd jigdo-dvd list-16G list-bd list-cd list-dlbdUau. Isso é confuso e não há descrição do que todos essas pastas significam. bt = BitTorrent, um protocolo de compartilhamento de arquivos ponto-a-ponto iso = diretórios contendo arquivos ISO jigdo = uma opção de download muito especial apenas para especialistas que sabem que realmente querem isso list = contém listas dos nomes dos arquivos .deb que estão incluídos nas imagens Os três primeiros são diferentes métodos de como baixar uma imagem. Use iso quando uma única conexão de rede for rápida o suficiente para você. Usar bt pode resultar em um download mais rápido porque baixa via um protocolo de compartilhamento de arquivos ponto-a-ponto. Você precisa de um programa de torrent adicional para usar essa opção. Em seguida, temos essas variantes: bd = disco Blu-ray (tamanho até 8GB) cd = imagem de CD (tamanho até 700MB) dvd = imagens de DVD (tamanho até 4.7GB) 16G = para um pen drive USB de 16GB ou maior dlbd = disco Blu-ray de camada dupla As imagens 16G e dlbd estão disponíveis apenas via jigdo. Todas as pastas iso-xx e bt-xx fornecem as mesmas imagens, mas com um método de acesso diferente. Aqui estão exemplos de imagens: iso-cd/debian-12.9.0-amd64-netinst.iso iso-cd/debian-edu-12.9.0-amd64-netinst.iso iso-cd/debian-mac-12.9.0-amd64-netinst.iso Felizmente, a pasta explica em detalhes as diferenças entre essas imagens e também o que você encontra lá. Você pode ignorar os arquivos SHA... se não souber para que eles servem. Eles não são importantes para você. Esses arquivos ISO são pequenos e contêm apenas o núcleo do instalador do Debian e um pequeno conjunto de programas. Se você quiser instalar um ambiente de desktop, os outros pacotes serão baixados da internet no final da instalação. As pastas bt-dvd e iso-dvd contêm apenas o arquivo debian-12.9.0-amd64-DVD-1.iso ou o arquivo torrent apropriado. Em bt-bd e iso-bd você encontrará apenas debian-edu-12.9.0-amd64-BD-1.iso. Essas imagens grandes contêm muito mais pacotes do Debian, então você não precisará de uma conexão de rede durante a instalação. Para as outras arquiteturas de CPU (diferentes de amd64), o Debian fornece menos variantes de imagens, mas ainda muitas. No total, temos 44 arquivos ISO (ou torrents) para o lançamento atual do instalador do Debian para todas as arquiteturas. Ao usar jigdo, você pode escolher entre 268 imagens. E estas são apenas as imagens do instalador para a versão estável. Nenhuma versão mais antiga ou mais recente é contada aqui. Dê uma respirada antes de mergulharmos nas... As imagens liveAs imagens live em release/12.9.0-live/amd64/iso-hybrid/ estão disponíveis apenas para a arquitetura amd64, mas para versões mais recentes do Debian haverá imagens também para arm64. Temos 7 imagens live diferentes contendo um dos ambientes de desktop mais comuns e uma com apenas a interface de texto (standard). debian-live-12.9.0-amd64-xfce.iso debian-live-12.9.0-amd64-mate.iso debian-live-12.9.0-amd64-lxqt.iso debian-live-12.9.0-amd64-gnome.iso debian-live-12.9.0-amd64-lxde.iso debian-live-12.9.0-amd64-standard.iso debian-live-12.9.0-amd64-cinnamon.iso debian-live-12.9.0-amd64-kde.isoO nome da pasta iso-hybrid refere-se à tecnologia que permite usar esses arquivos ISO tanto para gravá-los em um CD/DVD/BD quanto num pen drive USB. Já bt-hybrid fornece os arquivos torrent para baixar essas mesmas imagens usando um programa cliente de torrent. Claro! Aqui está a tradução completa do trecho: Imagens installer e live mais recentes (também conhecidas como testing)Para versões mais novas das imagens, atualmente temos estas pastas: daily-builds weekly-builds weekly-live-builds trixie_di_alpha1Sugiro usar a pasta weekly-builds, porque nela você encontra uma estrutura similar e todas as variantes de imagens assim como no diretório release. Por exemplo: weekly-builds/amd64/iso-cd/debian-testing-amd64-netinst.iso E o mesmo vale para as imagens live: weekly-live-builds/amd64/iso-hybrid/debian-live-testing-amd64-kde.iso weekly-live-builds/amd64/iso-hybrid/debian-live-testing-amd64-lxde.iso weekly-live-builds/amd64/iso-hybrid/debian-live-testing-amd64-debian-junior.iso weekly-live-builds/amd64/iso-hybrid/debian-live-testing-amd64-standard.iso weekly-live-builds/amd64/iso-hybrid/debian-live-testing-amd64-lxqt.iso weekly-live-builds/amd64/iso-hybrid/debian-live-testing-amd64-mate.iso weekly-live-builds/amd64/iso-hybrid/debian-live-testing-amd64-xfce.iso weekly-live-builds/amd64/iso-hybrid/debian-live-testing-amd64-gnome.iso weekly-live-builds/amd64/iso-hybrid/debian-live-testing-amd64-cinnamon.iso weekly-live-builds/arm64/iso-hybrid/debian-live-testing-arm64-gnome.isoAqui você vê uma nova variante chamada debian-junior, que é um blend do Debian. Arquivos BitTorrent não estão disponíveis para as builds semanais. A estrutura da pasta daily-builds é diferente e fornece apenas as ISOs pequenas de instalação via rede (netinst), mas com várias versões dos últimos dias. Atualmente há 55 arquivos ISO disponíveis lá. Se quiser usar a imagem de instalação mais recente, baixe esta: https://cdimage.debian.org/cdimage/daily-builds/sid\_d-i/arch-latest/amd64/iso-cd/debian-testing-amd64-netinst.iso Debian estável com kernel backportsInfelizmente, o Debian não fornece nenhuma mídia de instalação usando a versão estável com kernel backports para hardware mais recente. Isso ocorre porque o ambiente do instalador é uma mistura bastante complexa de ferramentas especiais (como o anna) e versões .udeb de pacotes. No entanto, o serviço web FAIme, do meu projeto FAI, pode criar uma imagem de instalação personalizada usando o kernel backports. Você pode escolher um ambiente desktop, um idioma e adicionar pacotes se quiser. Depois selecione o Debian 12 (bookworm) e ative o repositório backports, incluindo o kernel mais recente. Em alguns segundos você poderá baixar sua própria imagem de instalação. Lançamentos antigosGeralmente, você não deve usar versões antigas para uma nova instalação. Em nosso repositório, a pasta https://cdimage.debian.org/cdimage/archive/ contém 6.163 arquivos ISO, começando do Debian 3.0 (primeiro lançamento em 2002) e incluindo todos os point releases subsequentes. A imagem completa em DVD do oldstable (Debian 11.11.0 com firmware non-free) está aqui: https://cdimage.debian.org/cdimage/unofficial/non-free/cd-including-firmware/archive/latest-oldstable/amd64/iso-dvd/firmware-11.11.0-amd64-DVD-1.iso A imagem menor, de instalação via rede (netinst), é: https://cdimage.debian.org/cdimage/archive/11.10.0/amd64/iso-cd/debian-11.10.0-amd64-netinst.iso A imagem ISO mais antiga que consegui encontrar é de 1999, usando o kernel 2.0.36: Other-Maybe-Official - Debian-i386 2.1 Disc 1.iso Ainda não consegui inicializá-la no KVM. ATUALIZAÇÃO: obtive um kernel panic porque minha VM tinha 4GB de RAM. Reduzindo para 500MB (até 8MB funcionam), o instalador do Debian 2.1 iniciou sem problemas. Mais alguma coisa?Neste post, ainda não cobrimos a pasta ports (com suporte não oficial para arquiteturas de hardware antigas), que contém cerca de 760 arquivos ISO, nem a pasta unofficial (1.445 arquivos ISO), que também fornecia ISOs com firmwares non-free no passado. Além disso, há mais de 34.000 imagens cloud. Mas, bem... não há arquivos ISO envolvidos aí. Isso pode ser assunto para uma nova publicação. Este artigo é de autoria de Thomas Lange e foi traduzido e reproduzido com autorização do autor. Link para o artigo original aqui.
-
Linguagem C ganha site oficial
É sim. Confirmado por um membro do WG14: Abraço!
-
Linguagem C ganha site oficial
Apesar de ter sido extensamente documentada em vários sites, livros, artigos e códigos-fonte espalhados pelo mundo, a linguagem C ganhou seu site oficial essa semana: c-language.org: Captura de tela do website c-language.org em 11/03/2025 O site contém vários links para as definições do padrão da linguagem, livros, um vídeo do Brian Kernighan (que já entrevistamos no Papo Binário!) falando sobre a linguagem, uma bela FAQ e muito mais! Ponto para o Brasil na lista de comunidades ("community" no site), onde o grupo C/C++ Brasil está listado! 💚 O "atraso" de cerca 50 anos (55 se considerarmos o desenho inicial da linguagem na década de 70) é motivo de zueira na comunidade, mas uma zueira saudável, afinal C é ensinado até hoje nas universidades pelo mundo afora além de ser uma linguagem utilizada comercialmente (ao contrário do que muita gente pensa). Esperamos que o site possa jogar uma luz sobre os novos recursos e as extensões da linguagem, talvez ainda subutilizados. Só para dar alguns exemplos: #include <stdio.h> int main() { // Inferência de tipo - extensão do GNU C, mas o livro "Effective C" diz que tá na C23 também auto x = 3; // a variável x é int porque um valor do tipo int foi atribuído a ela printf("%i\n", x);// Prefixo 0b para literais e especificador de formato %b para printf() - C23 int y = 0b10101010; printf("%b\n", y);// bool como palavra-chave, sempre 0 ou 1 - C23 bool b = true; b = 2; printf("%i\n", b); // imprime 1}No site, C é apresentado como a língua franca das linguagens de programação, ou seja, o idioma comum entre programadores e programadoras do mundo inteiro. Nas palavras do site, algo como o latim foi na Europa medieval, o chinês no leste asiático ou o inglês é hoje no mundo corporativo. Ousado, mas quem afirma o contrário? 😄 Em tempo, se você está estudando C ou pretende começar, te convido a fazer o nosso curso gratuito Programação Moderna em C. Nele você aprende vários conceitos importantes da linguagem e ganha uma base para computação em geral. O ambiente do curso envolve uma máquina virtual com Linux, mas nada impede de você segui-lo com WSL, no macOS ou mesmo no Windows com algum compilador C (CodeBlocks, DevC++, Visual Studio Community, etc), embora alguns exemplos precisem ser adaptados para serem replicados. Agradecimentos ao Thiago Adams, do grupo C/C++ Brasil, por avisar no grupo que o site foi lançado!
-
Hardware hacking ou conserto simples?
Havia anos que não mexia com eletrônica, mas recentemente tirei as ferramentas da maleta e montei minha bancada de novo. Não sou especialista no assunto, mas ainda sei cortar uns fios. 🙂 Neste artigo conto como consertei uma campainha tipo gongo de alta potência, aquelas muito utilizadas em pátios de escolas. Não é bem hardware hacking né? Ou é? Bem, deixo para você decidir. O objetivo de compartilhar essa empreitada é inspirar que você faça pequenos reparos também (ou pequenos hacks, se assim preferir), economize e gere menos lixo. Afinal, numa época onde tudo é descartável, pouco é reciclável e quase nada é reciclado, o costume de "jogar fora e comprar novo" é demasiado perigoso. Quem separa o lixo, sabe o quanto de plástico entra em casa, por exemplo. É assustador. E quase toda nova compra significa novos plásticos jogados no lixo. Além disso, tem aquele mito de que "não vale a pena consertar porque custa quase o preço de um novo". Não é sempre assim, como você verá adiante. A campainha parou de funcionar de repente e não faço ideia do que tenha causado o problema. Fiquei curioso para entender o mecanismo dela e a abri para ver. Para minha surpresa, a campainha tinha um circuito que, de acordo com as inscrições na placa, parecia converter 127VAC (corrente alternada) para 12VDC (corrente contínua). Eu não sabia que dava para fazer isso com um circuito tão pequeno. De qualquer forma, estava claro que um circuito integrado na placa havia fritado: Placa original da campainha. No canto inferior esquerdo tem um Circuito Integrado (CI) partido ao meio! A primeira coisa que fiz foi testar o motor para ver se ainda funcionava e se realmente era alimentado com 12VDC. Funcionou. Então procurei identificar o CI destruído. Era um SM7055-12, mas não o encontrei em São Paulo para comprar. Se tivesse achado, o custo do conserto seria menor que R$ 5,00, mas não rolou. Minha ideia então foi buscar a fonte de 12V (doze volts) mais barata que eu conseguisse afim de remover a placa e substituir a da campainha. Precisava ser pequena também, para caber no chassi da campainha. Achei uma de 3A por R$ 17,73 na internet que parecia ser uma boa candidata. Testei o motor com a fonte nova de 12V e ele funcionou. Abri o chassi, removi a placa, dessoldei os terminais conectados aos plugues que vão na tomada e soldei dois fios no lugar. Então dessoldei o par de fios que iam para a saída da fonte (para o plugue) e conectei o motor ali, como mostra a imagem a seguir. Chassi plástico da campainha com a placa da nova fonte conectada ao motor (mas ainda não fixada no chassi) A placa da fonte comprada era aproximadamente três vezes maior que a placa original (como conseguiram um conversor AC/DC tão pequeno?), então tive que improvisar. Com uma furadeira e uma broca bem fina, fiz um furo no plástico e pus um parafuso num orifício já existente na placa para fixá-la no compartimento plástico. Ficou firme, então fiquei tranquilo. O funcionamento você pode conferir no vídeo a seguir: A campainha ganhou um LED azul porque não me dei o trabalho de removê-lo do circuito da placa da fonte nova, mas ficou por dentro, invisível de fora e deu um toque de gambiarra que gosto. 😄 Gastei apenas R$ 17,73 para comprar a fonte. Já uma campainha dessa nova, não sairia por menos de R$ 110,00 (exclui o frete em ambos os preços). Significou uma economia de R$ 92,97 ou 84% e menos plástico jogado fora. Claro que eu utilizei ferramentas e materiais que eu já tinha disponíveis como: Multímetro Ferro de solda Sugador de solda Estanho Furadeira Fonte 12VDC (para testar o motor antes de comprar uma fonte nova) Tais itens não entraram na conta, mas eles já foram comprados há tempos e fazem parte da pequena bancada para consertos que tenho aqui. 🙂 Um outro ponto que acho interessante de consertar as coisas: mantém nossa mente afiada e nos força a fazer algo fora da tela, o que é muito bom para nossa saúde mental também. Portanto, sempre que puder, tente um conserto. Só não se arrisque ao mexer com eletricidade sem orientação/estudo prévio. Pode ser perigoso, especialmente em altas tensões. Happy hacking? 😄
-
Porteira 443 - Hacking Conf
Mais informações: https://linktr.ee/porteira443
-
Relógio do windows acelerado
Que loucura. Data/hora para o PC nunca é simples. haha Que bom que resolveu! 🙂
-
Relógio do windows acelerado
Nunca vi isso não... o que tive no Windows é problema com a sincronização da hora. Resolvi assim (como administrador no Prompt de Comando): tzutil /s "E. South America Standard Time" w32tm /config /manualpeerlist:pool.ntp.org,0x8 /syncfromflags:MANUAL net stop w32time net start w32time w32tm /resync /rediscover Não sei se vai ajudar no teu caso, mas pode servir para embasar uma busca pela solução. Abraço!
-
Um Debugador ASSEMBLY (NASM) para Iniciante
gdb ./teste Aí começa. Dá uma busca por "gdb básico" no Google. Tem vários tutoriais e vídeos. Em tempo: removi seu post perguntando se tem alguém para ajudar. Não precisa postar isso tá? O post com a pergunta tá implica que você tá pedindo ajuda. 😉 Abraço.
-
Um Debugador ASSEMBLY (NASM) para Iniciante
Oi Jorge. Pelo NASM não dá, mas o GDB debuga qualquer executável ELF, inclusive programas compilados com NASM. Certamente te atende. 😉
-
Falha de segmentação (NASM)
Opa, o include com nome do arquivo é necessário sim. Mas depois disso você tem que utilizar a macro, ou seja, “chamá-la”. Em outras palavras, digitar o nome dela. 🙂 O SEGFAULT é porque o programa não chamou a SYS_exit(), mas quando você usar as macros vai parar. 😉 Abraço!
-
Falha de segmentação (NASM)
Opa, no hello.asm você inclui dois arquivos que definem as macros, mas você não as utiliza. É preciso usá-las digitando seu nome. 😉 Falta também um : depois de MSG_SIZE. Abraço!
-
MiniDebConf Maceió 2025
until
A MiniDebConf acontecerá de 1 a 4 de maio no Centro de Inovação do Jaraguá em Maceió - AL. A MiniDebConf é um evento aberto a todas as pessoas, independente do seu nível de conhecimento sobre Debian. O mais importante será reunir a comunidade para celebrar um dos maiores projeto de Software Livre no mundo, por isso queremos receber desde usuários(as) inexperientes que estão iniciando o seu contato com o Debian até Desenvolvedores(as) oficiais do projeto. Ou seja, estão todos(as) convidados(as)! Mais informações e inscrições: https://maceio.mini.debconf.org/ -
malware research
Bom dia! Já viu nosso menteb.in/guia? 🙂
-
Como criar uma função em NASM
Beleza. Nesse caso, saiba que você vai precisar de uma instrução JMP no final do procedimento para voltar para onde estava. Algo assim: _start: ; código jmp soma depois_da_soma: ; código soma: ; código jmp depois_da_soma Do contrário o fluxo vai para a soma e não volta para onde deveria. Ao invés disso, vai continuar para a próxima instrução depois da última instrução do seu rótulo soma. O mesmo deve ser feito para os outros rótulos. Alternativamente, você pode por uma coisa depois da outra, sem saltos, só para começar (depois você implementa os saltos): _start: soma: ; código int_para_string: ; código imprimir: ; código final: ; código Agora vamos aos problemas nos seus rótulos: Em int_para_string, você não vai usar nenhuma syscall, por isso não tem que ter aquele int 0x80 ali. Em imprimir, você tá usando a syscall write (eax=4). Ela precisa de três parâmetros: O file descriptor (fd) onde você quer escrever, em ebx (no caso como você quer imprimir na tela, ebx precisa ser 1). O endereço do buffer para ser escrito, em ecx. O tamanho do buffer a ser escrito, em edx. Ou seja, antes de chegar na int 0x80 dela, você precisa desses três parâmetros configurados. Logo, você precisa de uma terceira "variável" na seção .data para o resultado, ou pode sobrescrever a sua x ou y. No início do rótulo de imprimir você pode fazer: mov byte [resultado], al mov ebx, resultado A primeira instrução vai pegar o byte que está em AL (a parte baixa de AX, que é a parte baixa de EAX), que conterá o seu 0x36 (6 + '0') e copiar para o buffer resultado (como disse antes, se quiser usar o próprio x ou y, fique à vontade pois nesse momento você não precisará mais deles). A segunda vai pegar o endereço de resultado e por em ebx, que é o que a syscall write precisa. O tamanho do buffer será 1 também, pois você vai imprimir apenas um caractere. Então você precisa por 1 em edx antes de chegar na int 0x80 do imprimir, que vai chamar a write. Depois que isso funcionar a gente segue aumentando o programa com a lógica que você quer, o que acha? 🙂 PS.: Tem um botão para postar código aqui no fórum. No editor, é o botão <>. Fica bem melhor de lermos se você utilizá-lo, e será mais fácil te ajudar. 😉 Abraço.
-
Como criar uma função em NASM
Oi @Jorge Luiz Gouveia Sousa, beleza? Recomendo começar pela função de soma(), que é mais simples que a int_para_string(). Outra coisa, você tá trabalhando em Intel 32-bits e há convenções de chamadas estabelecidas para esta arquitetura. Veja: Para complementar, leia aqui também: https://mentebinaria.gitbook.io/engenharia-reversa/assembly/funcoes-e-pilha No entanto, não vejo problema em você criar a sua própria convenção de chamadas para fins de estudo. No caso, o jeito que você escolheu para passar os argumentos para a função tá sendo via registradores (EAX e EBX no seu exemplo). Depois disso você vai precisar da instrução CALL e no fim da sua função, a instrução RET. Já que você começou assim (passando argumentos via registradores), pode seguir depois você muda para uma convenção mais convencional se quiser. Tenta aí e volta com o que conseguiu que a gente ajuda mais. 😉 Abraço e bons estudos! Muito legal o desafio!
-
Conheça as pessoas que concluíram o Do zero Ao Um 2024
É com muita emoção que reporto a conclusão de mais uma turma do projeto Do Zero Ao Um, nosso programa de formação de pessoas negras para a área de segurança da informação. Estamos na edição número três deste projeto e estamos igualmente felizes com o impacto que ele tem gerado em nossa sociedade. Foram quatro meses de muito aprendizado para nós e de muita entrega para os alunos e alunas do programa, que estudaram Introdução à Computação, Matemática, Windows, Inglês Instrumental, Programação, Soft Skills, Redes, Nuvem, Introdução à Segurança, Segurança de Redes e Data Centers, Segurança de Endpoints e Análise de Logs, totalizando 250 horas de estudo. Uma baita jornada, que exigiu um grande comprometimento de todos os envolvidos. Falando nos envolvidos, formamos alunos maravilhosos, homens e mulheres negras que confiaram seu tempo ao nosso cuidado e com quem desenvolvemos relações permanentes de parceria. A equipe foi composta por: 11 docentes Mais de 20 mentores/as Equipe Mente Binária Essa galera super comprometida contribuiu para que as seguintes pessoas concluírem o curso com mais de 70% de aproveitamento: Alex Rangel, de Porto Alegre/RS Amabelle Brena, de Aquiraz/CE Cesar Augusto, de São Paulo/SP Danilo Moura, de Sumaré/SP Davi Santos, de São Gonçalo/RJ Ednilson Calixto, de Pernambuco/PE Gabriela Ferraz, de Aquiraz/CE Gustavo Nunes, de Marabá/PA Italo Alexandre, do Rio de Janeiro/RJ Jamily Gonçalves, de Paulista/PE Kaique Sampaio, do Rio de Janeiro/RJ Leonardo Santos, de Pedras de Fogo/PB Louise Ferreira, de Mesquita/RJ Luã Moura, do Rio de Janeiro/RJ Marcela Apolinario, de Salvador/BA Marcelo Henrique, de Salvador/BA Marcio Ribeiro Dos Santos, de Praia Grande/SP Midian Brandão, de Itanhangá/RJ Natacha Cruz, de São Paulo/SP Patrick Dinganga, de São Paulo/SP Ricardo Barboza, de Vicentina/MS Vanessa Ferraz, de São Paulo/SP Wesley Cristian, de Itapecerica da Serra/SP Yuri Miranda, do Rio de Janeiro/RJ Agora a segurança da informação ganha mais 24 pessoas negras aptas a continuarem sua jornada na área, mas algumas delas precisam do seu apoio também (a maioria não está na área ainda)! Segue nossas sugestões para você fazer parte disso: Fale na sua empresa sobre este programa e sugira que abram vagas de júnior ou trainee para receberem alguns dos nossos alunos e alunas. Se você é responsável por criar as oportunidades na sua empresa, considere receber as pessoas que formamos aqui! São maravilhosas e só precisam de uma oportunidade. Faça um post na sua rede social preferida linkando este texto para aumentar a chance de contatos profissionais que possam oferecer oportunidades. Adicione essas pessoas na sua rede no LinkedIn (links acima, no nome da pessoa). Se permita conhecê-las. 💚 Doe para o projeto do ano que vem. Gostaria de agradecer a todas as pessoas que se envolveram neste processo. Foi muito lindo e muito prazeroso fazer parte disso. E só foi possível graças a você que ajudou, que deu aula, assistiu aula, fez reunião, mentorou, coordenou, abriu sala, deu ingresso para evento, deu livro, doou seu tempo, doou dinheiro, promoveu, enfim, fez sua parte. A Mente Binária é sobre isso mesmo. É sobre dar apoio, dar acesso, ir junto. Não há lugar melhor para estar do que no meio de gente boa e munida de boas intenções. Vamos em frente! E que venham as contratações e o Do Zero Ao Um 2025! 🙌
-
Xô BoBus está de volta! #naopera
Brasil, fim da década de 90. A internet já oferecia muitos riscos aos nossos sistemas com Windows 95, 98 e Millennium Edition (ME), que poderiam ser facilmente invadidos por "hackers" (sempre eles). A maioria dos usuários de internet discada ou banda larga tinha um IP público direto no modem do computador, o que de fato os deixavam expostos. Às vezes bastava um pacotinho mal formado para desligar alguém da internet, técnica que ficou conhecida como "ping da morte". 💀 Pensando em tornar a internet mais segura, dois desenvolvedores brasileiros, "skymans" e "skull", criaram o Xô BoBus, um software escrito em Visual Basic 6 que monitorava as portas de rede no computador, avisava se alguém tentava conectar e derrubava o possível invasor. O software funcionou bem e se tornou bastante conhecido. Possui inclusive uma entrada modesta na Wikipédia. O nome do Xô BoBus vem de dois malwares conhecidos da época: Back Orifice (BO) e NetBus. A ideia era espantar estes e outros malwares, intenção que a interjeição "xô" comunica perfeitamente. O Xô BoBus alertava se qualquer processo utilizasse bibliotecas para acesso ao rede ou abrisse portas e quem usava podia indicar um nível de confiança no processo, como mostra a Figura 1. Figura 1 - Xô BoBus detectando o uso da Winsock por parte do próprio Windows Havia muitos outros recursos, mas um dos mais legais era a monitoração "ativa" de portas. O Xô BoBus efetivamente escutava nas portas protegidas. Isso pode ser questionável, mas impedia que programas maliciosos o fizessem e também permitia que o Xô BoBus respondesse a tentativas de ataque (na verdade qualquer pacote enviado para as portas monitoradas). Na figura 2, enviei um texto com o netcat a partir do meu sistema principal para uma máquina virtual de Windows 98 SE com o Xô BoBus instalado. O software "segurava" a conexão e mantinha o atacante "preso" nela. Poderia até responder com uma mensagem. Genial. Figura 2 - Xô BoBus neutralizando o "ataque" ❤️ Por admirar o trabalho destes dois, a um tempo atrás eu tentei contato via e-mail com ambos, mas o domínio xobobus.com.br estava fora do ar já. Foi aí que tive a ideia de registrá-lo com o objetivo de manter viva esta memória da internet brasileira. Então baixei o conteúdo do site de 2001 do Wayback Machine, dei uma modernizada no código usando o ChatGPT para reescrever os fontes em HTML5 e pus tudo no ar de novo, com todos os links funcionando, inclusive os de download do programa e atualizações. O site segue o mesmo: xobobus.com.br, com os textos integrais, suporte a TLS e links ajustados. Se você tem contato com um dos desenvolvedores, por favor fale com a gente. Eu adoraria conversar com eles num programa do Papo Binário e claro, transferir o domínio para eles se assim desejarem. ATUALIZAÇÃO em 17/4/2025: Graças a um e-mail que recebemos do @felicary, um dos testadores do Xô BoBus, encontramos o desenvolvedor principal e gravamos uma entrevista com ele! Viva a internet! 😍 Em tempo, tem algum outro projeto brasileiro que você gostaria que não "sumisse" da internet? Conta aí nos comentários. 😉
-
Ajuda em linguagem C
Bom dia! Bem vindo/a! 🙂 Por favor, leia este tópico primeiro: Aí depois é só voltar aqui e expor sua dúvida e código até onde foi que ajudamos! 😉 Abraço!
-
Fiquei travado em 2 exercícios de CTF
Oi @Ikkipnx. O que você já explorou do site? Abraço!
-
Analisando arquivos desconhecidos com o Hiewix
Talvez você conheça o Hiew (abreviação de Hacker's View), um poderoso editor hexadecimal que reconhece formatos de executáveis como PE e ELF e é capaz de editar suas características, disassemblar código em x86 e ARM e muito mais. Se ainda não conhece, comenta aí que num momento oportuno volto para falar mais dele. 😉 Neste artigo apresento o Hiewix, um novo programa feito pelo mesmo desenvolvedor do Hiew, Eugeny Suslikov, mais conhecido por seu nick SEN. Nesta leitura, você vai descobrir: Para que serve o Hiewix e o problema que ele vem resolver. Os poderes e limitações do Hiewix. Se vale a pena ou não comprá-lo. 💸 O Hiewix é para os momentos em que você não conhece a estrutura de determinado arquivo binário. Logo, seu intuito não é servir para editar arquivos PE, ELF ou Mach-O. Na real, a versão atual nem é capaz de modificar arquivos abertos, mas sim de trabalhar para reconhecer, com a sua ajuda, arquivos desconhecidos. Nada melhor que um exemplo para entender o poder do Hiewix. Recomendo acompanhar o artigo baixando a versão demo do Hiewix no site oficial e a ISO do Math Invaders para extrair o GAME.PAK que vamos utilizar como exemplo. Considere um formato de arquivo binários, ou seja, cuja estrutura e conteúdo não sejam facilmente deduzíveis, utilizado num jogo qualquer. O nome do nosso arquivo é GAME.PAK, então vamos chamá-lo de arquivo PAK, mas não conhecemos sua estrutura ainda. A figura 1 mostra a tela do Hiewix v1.10.633 ao abrir o arquivo pela primeira vez. Figura 1 - Tela inicial do Hiewix ao abrir o arquivo GAME.PAK O Hiewix nos dá algumas opções iniciais para carregar o arquivo: Main parser é o parser principal. O padrão é Binary(internal), que não faz nenhuma análise no arquivo. É nossa única opção numa primeira vez. Base address configura o primeiro endereço mostrado na tela do Hiewix para o conteúdo do arquivo. Por exemplo, se você digitar "10" (sem aspas), o primeiro byte do arquivo começará no endereço 0x10 e todos os comandos do Hiewix vão trabalhar a partir deste endereço base. Codesize permite configurar, se o arquivo contiver bytecode, (bytes que representam instruções para a CPU) o tipo de código para 16, 32 ou 64-bits. O Hiewix assume a arquitetura x86. Para arquivos de dados, a opção é Data. Second parser permite carregar um segundo parser além do principal para rodar sobre o arquivo. Mais sobre parsers em breve. Ao clicar em OK com as opções padrão selecionadas somos apresentados a uma tela bem parecida com a de um editor hexadecimal comum, mostrada na figura 2. Figura 2 - arquivo GAME.PAK aberto no Hiewix NOTA: Se ao bater o olho nos bytes deste arquivo você achou esse formato familiar, provavelmente já fez engenharia reversa em jogos antigos ou assistiu a um dos vídeos sobre a engenharia reversa que fiz no jogo Math Invaders (veja a parte 1 e a parte 2). Na parte 1, usei o Kaitai Struct e o Hiew. Já na parte 2, utilizei também o ImHex editor. Na época ainda não tinha Hiewix. 😄 O Hiewix criou um segmento padrão de dados de tamanho 0x15EB759, que no caso é o tamanho total do arquivo (22,984,537 bytes). Este segmento, assim como outros que porventura sejam criados, só fazem sentido na interface do Hiewix e servem para organizar diferentes segmentos de dados ou código que você descubra. Nada no arquivo é alterado com a criação deles. Alías, lembre-se: o Hiewix abre o arquivo com permissão de leitura somente. Uma vez o arquivo aberto, cabe a nós entender sua estrutura. Isso pode ser feito diretamente para formatos simples, mas formatos mais complexos podem exigir a engenharia reversa do executável que abre o arquivo analisado. Conforme formos compreendendo os dados no arquivo, vamos dando comandos no Hiewix que reflitam o que entendemos sobre tais dados. Comandos do Hiewix Os comandos são para você descrever o tipo de dado no qual o cursor se encontra. Por exemplo, por conta da análise deste arquivo PAK que já fiz, sei que os primeiros quatro bytes deste arquivo representam uma DWORD (double word), ou seja, um número de 4 bytes que nos diz quantos arquivos existem neste .PAK (o .PAK é uma espécie de sistema de arquivos rústico implementado num único arquivo que contém vários arquivos). Para descobrir como cheguei a esta conclusão, assista os vídeos de engenharia reversa no Math Invaders. 😉 Se os primeiros quatro bytes são uma DWORD, eu dou um clique no primeiro byte da DWORD (0x56 na figura 3) e clico no pequeno botão de um balãozinho com as lestras dd (de define dword) para produzir o efeito mostrado na figura 3. Figura 3 - Primeira DWORD definida com o Hiewix no GAME.PAK Perceba o efeito: O Hiewix pula uma linha na visualização após o fim da DWORD (ou seja, após o quarto byte) e muda a representação na coluna da direita para "dd 00000056", que indica que ela é uma DWORD e seu valor é 0x56 em little-endian. Ao definir números, é possível ter algum controle sobre sua representação. Por exemplo, posso selecionar os mesmos quatro bytes da minha DWORD e clicar novamente no botão dd para definir um array de um elemento com representação decimal. Dessa forma, o valor é apresentado em decimal na coluna da direita, como mostra a figura 4. Figura 4 - DWORD redefinida como array de um elemento com visualização em decimal A ideia é que você vá descrevendo os conjuntos de bytes do arquivo com os comandos disponíveis no Hiewix, o que me lembra bastante o IDA, da Hex-Rays. Os principais comandos disponíveis no Hiewix estão a seguir (o texto do ícone de cada botão, quando existe, está entre parênteses): Name (ab), define um nome para o byte, que aparecerá na aba Names, mostrada como Names(0) na Figura 2. Code (add), diz que o byte deve ser interpretado como código. Está desabilitado pois estamos num segmento de dados. Byte (db), define um byte. Word (dw), define uma WORD de dois bytes. Dword (dd), define uma DWORD de quatro bytes. Qword (dq), define uma QWORD de oito bytes. Float (df), define o tipo de dados float para números reais. Double (dF), define o tipo de dados double para números reais. Dump, ainda não entendi. 😄 Byteline, define um conjunto de bytes sem interpretação. Asciiz (a), define uma string ASCII. Unicode, define uma string Unicode. Comment line, insere um comentário acima da linha. Comment on line, insere um comentário à direita da linha (na coluna da direita). A figura 5 mostra as três primeiras entradas do arquivo PAK totalmente definidas e com comentários e nomes criados. Figura 5 - Definições dos campos da estrutura do PAK O texto em vermelho descreve o tipo de definição que usei, ou seja, os botões que apertei para definir os dados. Como também usei nomes, a aba Names à esquerda mostra os quatro nomes que defini. A ideia é poder dar um duplo-clique no endereço do nome (coluna address) para que o Hiewix navegue direto para lá. Também é possível marcar pontos como favoritos no arquivo que serão mostrados na aba Bookmarks. Para isso, basta selecionar o byte desejado clicar à esquerda da linha. Com estes poderes, o Hiewix nos permite ter uma visualização muito melhor do conteúdo do arquivo. Algo similar aos Templates no 010 Editor ou às structs do Kaitai Struct. A diferença é que o Hiewix nos permite criar a estrutura interativamente e não só programaticamente. Criando parsers Na versão paga, você até pode salvar o estado atual (com suas definições feitas) para este arquivo específico e depois carregá-lo. No entanto, se uma definição se repete muito (como é o caso das 86 entradas neste arquivo PAK) ou se você precisar abrir outros arquivos com a mesma estrutura, não faria sentido ter que definir todos os campos manualmente. Para estes casos, o Hiewix oferece o recurso de criação de parsers, ou seja, de pequenos programas que irão entender o conteúdo do arquivo para você. O software oferece duas APIs, uma em C e outra em Lua para tal. O pacote da versão paga vem com um exemplo em C++ um pouco difícil de entender e um esqueleto em Lua, sem um exemplos completo. Com alguma luta, consegui escrever um parser em C/C++ e compilá-lo com o Visual Studio 2022. O código basicamente automatiza o que fizemos na mão, mas com algumas ressalvas. A principal função é a ParseFile(), que mostro abaixo: /* * Math Invaders' PAK file parser for Hiewix * Author: mer0x36 * Date: December 2024 * * Compile with: * cl pak.cpp /link /out:pak.hwx32 kernel32.lib Hiewix32.lib /dll /subsystem:windows * * Then copy te pak.hwx32 to Hiewix root folder and load the PAK file * You can download the GAME.PAK file from * https://archive.org/details/MathInvaders (it's in the ISO file) */ #include <fcntl.h> #include <inttypes.h> #include <io.h> #include <stdio.h> #include <stdlib.h> #include <sys/stat.h> #include <sys/types.h> #include "HiewixExport.h" // API version: 110 #define NAME_LEN 64 // Compile with: // cl pak.cpp /link /out:pak.hwx32 kernel32.lib Hiewix32.lib /dll /subsystem:windows long __stdcall DllMain(void *hModule, unsigned long reason, void *lpReserved) { return 1; } HWX_EXPORT int ApiVersionUsed() { return HWX_API_VERSION; } HWX_EXPORT unsigned long HwxID() { return 0; } HWX_EXPORT const wchar_t *HwxTitle() { return L"Math Invaders PAK"; } HWX_EXPORT unsigned long HwxFlags() { return 0; } // PAK entry struct typedef struct { char name[NAME_LEN]; uint32_t offset; } entry; HWX_EXPORT bool IKnowThisFile(HWX_PREFILE_DATA *p_hwx_prefile_data) { p_hwx_prefile_data->_decode_engine = decode_engine_none; return true; } HWX_EXPORT bool ParseFile(HWX_FILE_DATA *p_hwx_file_data) { uint32_t nentries = 0; __int64 addr = 0; struct _stat st; const int file_index = p_hwx_file_data->_file_index; // Read the first DWORD from the file as it contains its number of entries int fd = ::_wopen(p_hwx_file_data->_filename, _O_RDONLY); if (fd == -1) return false; if ( ::_read(fd, &nentries, sizeof(nentries)) != sizeof(nentries) ) return false; // We'll use st.st_size to get the filesize if (::_fstat(fd, &st) != 0) return false; ::_close(fd); // Adds a data segment for the PAK header const __int64 headerSize = (nentries + 1) * sizeof(entry) + sizeof(uint32_t); HwxFileAddDataSegment(file_index, 0, 0, headerSize, 0); HwxFileSegmentName(file_index, 0, L"PAK_Header"); HwxFileSegmentCollapse(file_index, 0, false); // Adds a data segment for the PAK contents (right after header) HwxFileAddDataSegment(file_index, headerSize, headerSize, st.st_size-headerSize, 0); HwxFileSegmentName(file_index, headerSize, L"PAK_Contents"); HwxFileSegmentCollapse(file_index, headerSize, false); // Add a comment above the first line HwxFileCommentline(file_index, 0, L"PAK file start"); // Set number format to decimal HwxFileMakeDec(file_index); // Define a Dword HwxFileMakeDword(file_index, addr); // Set number format back to hex (default) HwxFileMakeHex(file_index); HwxFileCommentOnline(file_index, addr, L"number of entries"); addr += sizeof(uint32_t); // Loop that defines the entries for (int i=0; i < nentries; i++) { // Define a string, a comment, then advances 16 bytes HwxFileMakeStringAsciiz(file_index, addr, NAME_LEN); HwxFileCommentOnline(file_index, addr, L"file path"); addr += NAME_LEN; // Define a DWORD, a comment, then advances 4 bytes HwxFileMakeDword(file_index, addr); HwxFileCommentOnline(file_index, addr, L"file offset"); addr += sizeof(uint32_t); } return true; } O código completo será disponibilizado em breve. Após compilado, o arquivo é uma DLL com extensão .hwx32 que deve ser colocado no diretório raiz do Hiewix. Dessa forma, ao abrir um novo arquivo, será possível escolher o nosso parser personalizado como mostra a figura 6. Figura 6 - Nosso parser personalizado para escolha ao carregar um novo arquivo O resultado você vê na figura 7. O arquivo é totalmente parseado (sim, um neologismo - e por que não?), dois segmentos são criados e vários comentários feitos. Figura 7 - PAK parseado com nosso parser personalizado Neste parser optei por não criar nomes para o código ficar menor. Ao invés de nomes, criei um segundo segmento, algo que só parece ser possível através da API por enquanto. Já dá para perceber o poder que o Hiewix tem. Imagine que você pode criar parsers para qualquer tipo de arquivo que desejar. Se somar o poder o Kaitai Struct (que emite parsers em C++), fica mais poderoso ainda. No entanto, o Hiewix ainda está em desenvolvimento e é possível que muitas coisas mudem, inclusive na API, então recomendo segurar sua peteca antes de sair por aí criando parsers. Vale a pena comprar? O software me pareceu muito bom, mas há alguns pontos que requerem atenção na minha opinião, embora as coisas possam mudar muito em breve. São eles: Prós Velocidade. O Hiewix é escrito em C/C++ como tudo o que o SEN faz. E tudo acontece muito rápido no software. Isso é algo que eu valorizo muito, especialmente depois da invasão destes apps escritos em JavaScript para desktop que são uma carroça. Há quatro opções para marcar um endereço: nome, comentário acima da linha, comentário à direita da linha e favorito (bookmark). Muito legal essa versatilidade e muito similar ao Hiew, com o comentário acima talvez inspirado no IDA? Possibilidade de rodar um segundo parser, deixando ainda mais versátil. A API também sugere parsers reentrantes, mas não encontrei muita informação a respeito. A criação de tabelas (abas na parte de baixo da janela), que não mostrei aqui, mas é exibida na captura de tela aqui (abas Header, Dir, Sections, etc). Para um software pago, o preço é razoável: 50 dólares (aproximadamente R$ 300,00) por um ano e você renova se quiser as atualizações depois deste período. Para quem trabalha com arquivos desconhecidos com frequência, pode justificar o investimento. Contras Em minha opinião, o software ainda vai amadurecer. Há um pequeno bug na visualização das colunas e não dá para controlar o tamanho da janela inicial do software (basta ir no menu Options e clicar em Save as default), por exemplo. Outros recursos dos quais senti a falta: Criação de novos segmentos através da interface gráfica. Possibilidade de exportar os bytes, como no Hiew. Redefinir uma Dword como decimal pela API como fiz na interface gráfica. Bem, pode ser que haja uma maneira, mas ainda não descobri (basta usar HwxFileMakeDec() e depois voltar para hexadecimal com a HwxFileMakeHex()). Suporte a outras arquiteturas além de x86 para segmentos de código. A API, por enquanto, me pareceu um pouco difícil de usar e não há documentação além de um arquivo de cabeçalho com os protótipos das funções da API. Como todos os outros softwares do SEN, o Hiewix é nativo para Windows, mas consegui rodá-lo no Ubuntu com Wine sem problemas aparentes. Espero que este artigo tenha sido útil para conhecer esta nova ferramenta e/ou como uma introdução no conceito de parsing de arquivos binários. Como sempre, fique junto e lembre-se que você pode apoiar a Mente Binária para que artigos como esse continuem sendo publicados. Um abraço e happy hacking! Atualização em 10/12/2024: O autor do software leu o artigo e entrou em contato explicando alguns dos "contras".
-
Latinoware
until
Mais informações: https://latinoware.org/