É possível "descompilar" um .exe do Windows? Ou pelo menos visualizar a Assembléia?


237

Um amigo meu baixou alguns malwares do Facebook e estou curioso para ver o que ele faz sem me infectar. Eu sei que você não pode realmente descompilar um .exe, mas posso pelo menos vê-lo no Assembly ou anexar um depurador?

Edite para dizer que não é um executável .NET, sem cabeçalho da CLI.


3
malware do facebook ?? você poderia explicar isso?
— Aditya Mukherji 7/08/08

Desculpem a resposta super tardia ... mas do jeito que acho que aconteceu foi: ela executou um malware, que em algum momento enviou spam para todos os seus contatos no FB (eu) com um link para um "vídeo" que solicitou a você baixe um "novo codec". Estou assumindo que ele se comportou como um verme nesse sentido.
— 21420

Respostas:


448

Com um depurador, você pode percorrer o assembly do programa interativamente.
Com um desmontador , você pode visualizar a montagem do programa em mais detalhes.
Com um descompilador , você pode transformar um programa novamente em código-fonte parcial, supondo que você saiba em que foi escrito (que você pode descobrir com ferramentas gratuitas como o PEiD - se o programa estiver compactado, será necessário descompactá-lo primeiro OU Detecte-o-Fácil se você não encontrar o PEiD em nenhum lugar (o DIE tem uma forte comunidade de desenvolvedores no github atualmente).

Depuradores:

  • OllyDbg , free, um bom depurador de 32 bits, para o qual você pode encontrar vários plugins e scripts criados pelo usuário para torná-lo ainda mais útil.
  • WinDbg , grátis, um depurador bastante capaz da Microsoft. O WinDbg é especialmente útil para examinar os componentes internos do Windows, pois ele sabe mais sobre as estruturas de dados do que outros depuradores.
  • SoftICE , SICE para amigos. O comércio e o desenvolvimento foram interrompidos em 2006. O SoftICE é uma ferramenta hardcore que roda sob o sistema operacional (e interrompe todo o sistema quando invocado). O SoftICE ainda é usado por muitos profissionais, embora possa ser difícil de obter e talvez não funcione em algum hardware (ou software - ou seja, não funcionará nas placas gfx Vista ou NVIDIA).

Desmontadores:

  • IDA Pro (comercial) - desmontador / depurador topo de linha. Utilizado pela maioria dos profissionais, como analistas de malware, etc. Custa alguns dólares (existe a versão gratuita , mas é bastante limitada)
  • W32Dasm (gratuito) - um pouco datado, mas faz o trabalho. Acredito que o W32Dasm é abandonware atualmente e existem inúmeros hacks criados por usuários para adicionar algumas funcionalidades muito úteis. Você precisará procurar ao redor a melhor versão.

Descompiladores:

  • Visual Basic: VB Decompiler , comercial, produz um bytecode um tanto identificável.
  • Delphi: DeDe , grátis, produz código fonte de boa qualidade.
  • C: HexRays , comercial, um plugin para o IDA Pro da mesma empresa. Produz ótimos resultados, mas custa muito dinheiro, e não será vendido a ninguém (ou pelo que ouvi).
  • .NET (C #): dotPeek , gratuito, descompila os assemblies do .NET 1.0-4.5 para C #. Suporte para arquivos .dll, .exe, .zip, .vsix, .nupkg e .winmd.

Algumas ferramentas relacionadas que podem ser úteis para o que você está fazendo são editores de recursos, como o ResourceHacker (gratuito) e um bom editor hexadecimal, como o Hex Workshop (comercial).

Além disso, se você estiver fazendo uma análise de malware (ou usar o SICE) , sugiro sinceramente executar tudo dentro de uma máquina virtual, ou seja, o VMware Workstation . No caso do SICE, ele protegerá seu sistema real dos BSODs e, no caso de malware, protegerá seu sistema real do programa de destino. Você pode ler sobre a análise de malware com o VMware aqui .

Pessoalmente, eu rolo com Olly, WinDbg & W32Dasm e algumas ferramentas utilitárias menores.

Além disso, lembre-se de que desmontar ou até depurar o software de outras pessoas geralmente é contra o EULA no mínimo :)


16
Aprecio o último parágrafo em sua generalidade, bons conselhos, mas é divertido no contexto da pergunta: duvido que um vírus venha com um EULA! ;-)
— PhiLho

4
Na verdade, alguns malwares e até cavalos de Troia nos últimos tempos têm EULAs neles (ah, esses russos ..) É claro que eles podem ser (e são) ignorados pelas pesquisas, porque pode-se presumir que ninguém se apresentará para processá-los. .. Além disso, eles geralmente são escritos muito mal para significar algo em tribunal em qualquer caso.
— Anon6439

2
Observe que a versão anterior do IDA Pro é gratuita para uso não comercial.
— Simon Buchan

6
Note-se que a maioria dos malwares nos dias de hoje (pelo menos malwares compilado) pode facilmente detectar se ele está sendo executado em VMWare, Virtual PC, vinho, VirtualBox, etc.
— Mick

Se você estiver executando em uma VM, atente para o ataque Blue Pill.
— Siqi Lin 25/08/10

44

O excelente post de psoul responde à sua pergunta, para não replicar o bom trabalho dele, mas acho que ajudaria a explicar por que essa é uma pergunta ao mesmo tempo perfeitamente válida, mas também terrivelmente boba. Afinal, este é um lugar para aprender, certo?

Programas de computador modernos são produzidos por meio de uma série de conversões, começando com a entrada de um corpo de instruções de texto legível por humanos (chamado "código-fonte") e terminando com um corpo de instruções legível por computador (chamado alternativamente de "binário" ou "máquina" código").

A maneira como um computador executa um conjunto de instruções de código de máquina é basicamente muito simples. Cada ação que um processador pode executar (por exemplo, ler da memória, adicionar dois valores) é representada por um código numérico. Se eu lhe dissesse que o número 1 significava gritar e o número 2 significava rir, e depois segurava cartas com 1 ou 2 esperando que você gritasse ou risse de acordo, eu usaria o que é essencialmente o mesmo sistema que um computador usa para operar.

Um arquivo binário é apenas um conjunto desses códigos (geralmente chamados de "códigos operacionais") e as informações ("argumentos") em que os códigos operacionais atuam.

Agora, a linguagem assembly é uma linguagem de computador em que cada palavra de comando na linguagem representa exatamente um código operacional no processador. Há uma tradução direta 1: 1 entre um comando da linguagem assembly e um código operacional do processador. É por isso que o conjunto de codificação para um processador x386 é diferente do conjunto de codificação para um processador ARM.

A desmontagem é simplesmente esta: um programa lê o binário (o código da máquina), substituindo os códigos op por seus comandos equivalentes na linguagem assembly, e gera o resultado como um arquivo de texto. É importante entender isso; se o seu computador pode ler o binário, você também pode ler o binário, manualmente, com uma tabela de código operacional na mão (ick) ou através de um desmontador.

Os desmontadores têm alguns truques novos e tudo mais, mas é importante entender que um desmontador é, em última análise, um mecanismo de busca e substituição. É por isso que qualquer EULA que o proíba está soprando ar quente. Você não pode imediatamente permitir que o computador leia os dados do programa e também proibi-lo de ler os dados do programa.

(Não me interpretem mal, houve tentativas de fazê-lo. Eles funcionam tão bem quanto o DRM em arquivos de música.)

No entanto, existem advertências na abordagem de desmontagem. Nomes de variáveis ​​são inexistentes; tal coisa não existe na sua CPU. As chamadas à biblioteca são confusas como o inferno e geralmente exigem a desmontagem de outros binários. E é difícil ler a montagem nas melhores condições.

A maioria dos programadores profissionais não consegue sentar e ler a linguagem assembly sem sentir dor de cabeça. Para um amador, isso simplesmente não vai acontecer.

De qualquer forma, esta é uma explicação um pouco obscurecida, mas espero que ajude. Todos podem se sentir livres para corrigir quaisquer distorções da minha parte; faz algum tempo. ;)


1
Isso explica a desmontagem, mas eu adoraria ouvir uma elaboração sobre a descompilação. É provável que seja tão infrutífero? Quais são as advertências disso?
— Prometheus

@has: descompilar código nativo é um desafio bastante difícil, muitas vezes impossível. Os otimizadores são extremamente agressivos, frequentemente convertendo o código fonte em nada. Você não pode descompilar nada.
— 11nspectable


11

Qualquer depurador decente pode fazer isso. Experimente o OllyDbg . (edit: que possui um ótimo desmontador que até decodifica os parâmetros para chamadas WinAPI!)



6

Claro, dê uma olhada no IDA Pro . Eles oferecem uma versão de avaliação para que você possa experimentá-lo.


6

Se você está apenas tentando descobrir o que um malware faz, pode ser muito mais fácil executá-lo sob algo como a ferramenta gratuita Process Monitor que será reportada sempre que tentar acessar o sistema de arquivos, o registro, as portas, etc.

Além disso, o uso de uma máquina virtual como o servidor VMWare gratuito é muito útil para esse tipo de trabalho. Você pode criar uma imagem "limpa" e depois voltar sempre que executar o malware.


4

Você pode obter algumas informações visualizando-as em montagem, mas acho que a coisa mais fácil é iniciar uma máquina virtual e ver o que ela faz. Certifique-se de que você não possui compartilhamentos abertos ou algo do tipo que possa atravessar;)


Sim, eu pensei sobre isso, mas eu prefiro não passar pelo incômodo de configurar uma VM apenas para matá-la :) #
— 28580

1
É verdade que é um aborrecimento para este caso, mas sempre acho útil manter uma VM disponível para testar novos softwares ou coisas assim. Posso fazer o que quiser e apenas optar por não salvar o estado no final e voltar à VM limpa para a próxima execução.
— Rob Prouse

4

Também vale a pena conferir o Boomerang .


Na verdade não. ele trava e queima por algo mais complicado do que os executáveis ​​mais triviais.
— shoosh


3

Ainda não acredito que ninguém tenha dito nada sobre o Immunity Debugger .

O Immunity Debugger é uma ferramenta poderosa para gravar explorações, analisar malware e fazer engenharia reversa de arquivos binários. Inicialmente, foi baseado no código-fonte do Ollydbg 1.0, mas com o bug da pesquisa de nomes corrigido. Possui uma API Python bem suportada para fácil extensibilidade, para que você possa escrever seus scripts python para ajudá-lo na análise.

Além disso, há um bom que Peter, da equipe Corelan, escreveu chamado mona.py , excelente ferramenta btw.


2

Se você deseja executar o programa para ver o que ele faz sem infectar o computador, use com uma máquina virtual como VMWare ou Microsoft VPC ou um programa que possa proteger o programa como o SandboxIE




2

Eu diria que em 2019 vale a pena conferir Ghidra ( https://ghidra-sre.org/ ). É de código aberto (e gratuito) e possui recursos fenomenais de análise de código, incluindo a capacidade de descompilar todo o caminho de volta ao código C razoavelmente legível.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.