Na extração dos dados, utilizamos programas que fazem o inverso do compilador, obtendo o código fonte do produto desde que conheçamos a linguagem na qual o programa foi desenvolvido. Também utiliza-se disassemblers que obtêm o código de máquina do executável, esses códigos de máquina necessitam de grande conhecimento para serem analisados. Mas é por meio deles que muitas vezes consegue-se entender o funcionamento do programa.
Alguns programas podem ter código ofuscado, ficando mais difícil a compreensão do código obtido pelos descompiladores, uma técnica de programação que consiste em não utilizar nomes óbvios para funções também atrapalha muito na engenharia reversa, pois a análise do código depende em muito do correto entendimento do código fonte.
Utiliza-se também, e muito, a análise dinâmica do programa através de debuggers, programas que monitoram alterações/leituras de registro, variáveis na memória, carregamento de variáveis, estados de pilhas, filas e arquivos. Esses programas nos mostram o funcionamento em tempo real do programa, alguns permitem inclusive a gravação dos estados do programa e a pausa da execução. É extremamente útil para se saber em qual momento o programa executa determinada trecho do código e se há código não usado.
Programas sniffers fazem o trabalho quando o programa analisado utiliza conexão de rede para funcionar, como programas cliente-servidor, ou programas que requisitam validações em sistemas on-line. Sniffers monitoram todo o tráfego da rede, então deve-se conhecer protocolos, endereços IP e portas utilizadas pelo programa para a filtragem dos pacotes que realmente importam para a aplicação.
Que top, ja fiz isso utilizando python, para extração de dados de sites.