Como modificar a saída de um programa para o qual você não tem o código fonte

89

Em nossa empresa, temos um pequeno programa (tamanho .exe de 500 KB) que faz cálculos matemáticos e, no final, expõe o resultado em uma planilha do Excel que usamos para continuar nosso fluxo de trabalho.

Eu quero modificar as colunas, o formato do espaçamento e adicionar a lógica VBA etc. na planilha do Excel, mas como esses parâmetros não são configuráveis ​​nesse programa, parece-me que a única maneira de modificá-lo é desagregar / fazer engenharia reversa do arquivo .exe

Ninguém sabe em que idioma foi programado, a única coisa que sabemos é:

  1. Desenvolvido há mais de 20 anos
  2. Desenvolvedor aposentado 10 anos atrás
  3. Aplicativo GUI
  4. Executa autônomo
  5. Tamanho 500Kb

Alguma sugestão de quais opções eu tenho para lidar com esse tipo de problema? A engenharia reversa é a única opção ou existe uma abordagem melhor?

Alec
fonte
149
Você sabe qual é o cálculo que ele executa? Nesse caso, escreva um novo aplicativo, insira alguns dados de teste nos dois para verificar se o novo funciona da mesma maneira e jogue fora o antigo. Em seguida, faça as alterações que deseja fazer.
David Arno
13
O comentário de @DavidArno seria uma boa resposta. A engenharia reversa é possível, mas reformular e reescrever o aplicativo será muito mais barato / fácil / rápido.
Dan Pichelman 27/05
44
A outra maneira de modificá-lo seria pegar o resultado que o programa original produz e filtrá-lo para o que você quiser.
Blrfl
9
@Alec Se você abrir o .exe com um editor hexadecimal, poderá obter dicas sobre o que foi escrito. Por exemplo, o nome do compilador pode estar incorporado. A partir daí, você saberá mais sobre as possíveis opções de descompilação.
GrandmasterB
26
Como alternativa, você pode tentar encontrar o cavalheiro que escreveu o pedido e verificar se ele está disposto a entrar por um dia ou dois (talvez duas horas por dia) como consultor. Se ele é um desenvolvedor aposentado, há uma chance moderada de que ele goste de gastar um pouco de dinheiro a uma taxa de US $ 100-150 / hora, enquanto aproveita o momento de trabalhar um pouco por apenas um breve período de tempo.
RLH 27/05

Respostas:

234

A engenharia reversa pode se tornar muito difícil, ainda mais se você não quiser apenas entender a lógica do programa, mas alterar e recompilar. Então, a primeira coisa que eu tentaria é procurar uma solução diferente.

Desejo modificar as colunas, o formato do espaçamento e adicionar a lógica VBA etc. na planilha do Excel

Se essa é a única coisa que você deseja e o cálculo feito pelo programa é bom, por que não escrever um programa no idioma de sua escolha (talvez uma macro do Excel) que chame seu "exe" herdado, pegue a saída e a processe mais distante.

Doc Brown
fonte
9
Por que o novo programa precisa chamar o EXE antigo? Por que não tornar o novo programa independente e depois escrever um script que chame ambos e coordene a saída e a entrada? Minha experiência sugere que permitir linguagens de linha de comando como bash, PowerShell ou prompt de comando manipular coordenadas do processo é geralmente mais simples do que tentar codificá-lo em uma linguagem imperativa. Caso contrário, +1.
Jpmc26
8
@ jpmc26: Isso é verdade até você ter que lidar com as absurdas regras de cotação de Bash. Sim, eles são (principalmente) compatíveis com POSIX. Não, eles não fazem nenhum sentido. $ FOO não deve dividir palavras, por exemplo.
2828 Kevin
16
@ jpmc26: Eu nunca tive problemas em ligar subprocess.run()pessoalmente.
28416 Kevin
3
@ jpmc26: Que tubulação? É puro livro de receitas; se você deseja stdout, passa a PIPEconstante mágica . Caso contrário, você não o faz e ele é descartado. O que há para entender?
28416 Kevin
3
... Devo acrescentar que usei o Excel com VBA no passado como front-end para utilitários de linha de comando com muito sucesso mais de uma vez. A estrutura é sempre a mesma: uma planilha para inserir os parâmetros como uma "interface do usuário pobre", um botão "Iniciar" nessa planilha. No código VBA, é necessário Shellchamar no Excel VBA como este: stackoverflow.com/questions/8902022/… , pode-se canalizar o stdout / stderr do utilitário cmd em arquivos separados e aplicar a formatação de saída.
Doc Brown
114

Além das respostas já dadas por Doc Brown e Telastyn, eu gostaria de sugerir uma abordagem alternativa (sob a suposição de que é de missão crítica).

Se você não souber os cálculos que ele executa e os cálculos são (de certa forma) críticos: deduza a lógica original no .exearquivo por qualquer meio necessário. Decodifique-o usando um descompilador / desmontador como o IDA, se necessário. Contrate um consultor (ou um lote de consultores), se necessário.

Claro, contorná-lo por enquanto usando sua solução, mas não o deixe.

A razão pela qual sugiro é a seguinte: Você admitiu que os cálculos são muito complexos (de acordo com um engenheiro com quem você falou). Também é de missão crítica. Portanto, se de alguma forma o original .exeparar de funcionar devido a alterações nas plataformas que você possui (talvez o suporte de 16 bits seja descartado?), Você acabou de perder um conhecimento crítico .

Agora, não estou preocupado em perder o .exe, mas em perder o conhecimento que ele codifica. Esse conhecimento deve ser recuperado.

Como antes: se esse conhecimento já estiver disponível, anote-o em um formato que não será perdido tão cedo. Caso contrário, recupere-o e anote-o.

Sjoerd Job Postmus
fonte
14
Na verdade, os decompiladores modernos produzem código geralmente legível, especialmente se a fonte original estivesse em C ou assembler simples, e não em uma linguagem de nível superior.
Phyrfox
4
Muito bom ponto. Além disso: apenas corrigi-lo para que funcione novamente só funcionará até que a próxima correção precise ser implementada.
Daniel Jour
33
@phyrfox 20 anos de idade ... desenvolvedor aposentado há 10 anos ... apenas saída é uma planilha do Excel ... eu colocaria dinheiro em ser um aplicativo VB6.
J ...
10
@micaho: ou a empresa ainda existe e a pessoa com o know-how para verificar os resultados e suposições ocultas acaba de ser atropelada por um caminhão. Obviamente, é um risco comercial, pelo que as partes interessadas devem decidir. Eu só queria enfatizar que o "invólucro" funcionará agora, mas apenas aumenta a dívida técnica.
Sjoerd Job Postmus
22
@J ...: Se for VB6, o pôster original está com sorte. Você pode recuperar o código fonte de uma compilação VB6 com bastante facilidade.
Eric Lippert
74

Pergunte ao programador original, se possível.

Algumas semanas atrás, fui contactado por uma empresa com a qual trabalhei há 10 anos, com a mesma pergunta sobre um arquivo mdb desenvolvido em meados dos anos 90.

Paolo
fonte
52
Esta é a verdadeira fruta baixa. Todos (inclusive eu) romantizam o uso de habilidades difíceis de programação, como engenharia reversa, reimplementando a funcionalidade do programa ou adicionando camadas ao processamento de dados. Na realidade, o melhor lugar para começar é um e-mail amigável que pode voltar em uma hora com a localização do código-fonte ou outra solução ideal.
User1717828
2
Quando em casa com um aplicativo antigo 10 anos me também eu o fogo até um desmontador mas durante as horas de trabalho o objetivo é diferente ^^
Paolo
2
Você se lembrou de algo sobre isso? :)
Ángel
2
claro! infelizmente, a empresa passou por três aquisições e mesclagens para que muitas informações fossem perdidas e parte dos backups estava na bolsa perdida ... o desenvolvimento estava no local em suas máquinas, por isso não tenho cópia da fonte e é isso.
Paolo
11
Examine o EXE em busca de cadeias incorporadas que possam incluir o nome de um desenvolvedor ou algo assim. Isso é mais fácil do que uma desmontagem completa!
JDługosz 01/06
55

Alguma sugestão de quais opções eu tenho para lidar com esse tipo de problema?

Se tudo o que você deseja fazer é modificar a saída, por que não usar simplesmente composição?

Em vez de modificar a caixa preta que você não pode acessar facilmente, você cria um novo programa que obtém a saída do Excel e também sua formatação / coluna também é alterada . Em seguida, você pode criar um novo exe / script que chame os dois programas em ordem, para que o usuário final pareça que existe apenas um programa que faz todo o trabalho - mesmo sendo duas etapas distintas.

Telastyn
fonte
2
@Alec Se o java é uma linguagem adequada ou não, depende principalmente da quantidade de dados que você precisa manipular / da quantidade de computação que você precisa fazer. Se ambos são baixos, java está bem. Se qualquer um deles for crítico, é melhor usar C ou C ++. Mas como você parece estar usando apenas uma quantidade de dados que se encaixa em uma planilha do Excel, não acho que haja dados suficientes envolvidos para fazer do java uma má escolha (o Excel provavelmente explodiria antes do seu aplicativo).
Cmaster 27/16 /
18
@cmaster A ideia de que o Java é proibitivo para computação pesada é uma noção desatualizada. O pior benchmark listado aqui nem é 4x (a maioria é 2x ou menos) e, se um escalar de um dígito é o seu ponto de ruptura, é mais do que provável que as economias em segurança (que se traduzem diretamente em dólares do desenvolvedor) compensem o impacto no desempenho .
CorsiKa
8
@Alec qualquer idioma funcionará. O VBA parece uma boa escolha, porque já se integra muito bem ao Excel.
Captain Man
4
@corsiKa Isso depende inteiramente da escala do seu aplicativo. Se uma única execução consome várias dezenas de milhares de horas de CPU, um fator 2 ou 4 se torna proibitivo: isso se traduz diretamente na quantidade de resultados que você pode obter de uma máquina multimilionária. Além disso, esses aplicativos geralmente funcionam em etapas fechadas, de modo que a coleta de lixo é um veneno puro para seu desempenho, as pequenas interrupções se multiplicariam pelo número de processos. Eu digo a você, esses aplicativos existem e certamente não são escritos em Java. Eles simplesmente não são usados ​​pelas empresas de internet comuns.
Cmaster
7
@cmaster Estamos falando de alguns cálculos simples, não de um mecanismo de jogo AAA completo com iluminação global em tempo real, renderização física, renderização esparsa de voxel esparsos, simulação de campo de física universal e similares. Sem ofensa, mas inserir qualquer argumento de desempenho de RE aqui é ruim. A facilidade de uso deve ser a número 1 e, como alguém que usa C ++ há alguns anos, é o último idioma que eu recomendaria neste caso.
3

Existem empresas especializadas nesse tipo de problema. Eles usam código proprietário para descompilar o código nativo em uma linguagem de alto nível e, em seguida, aplicam o conhecimento humano para torná-lo útil (por exemplo, atribuir nomes apropriados às variáveis).

Alguns anos atrás, meu empregador usou isso para migrar algum código nativo de mainframe S / 390 para servidores Linux. Nós demos a eles um binário, eles nos deram o código fonte em C.

Se isso é necessário no seu caso, depende de você. Se você se importa apenas com o formato da saída, pode simplesmente massagear a saída depois que ela for produzida. No entanto, como outros salientaram, manter a lógica de negócios oculta em um blob binário pode ser um risco contínuo.

magro
fonte
3

Escreva um wrapper simples ao redor do programa, capturando sua saída. Não é complexo fazer o maior número possível de linguagens ( Java , C ++ , Python , .NET , por exemplo). Analise a saída e gere outra, na forma desejada. O usuário ligará para o seu novo programa. O antigo executável fica próximo a ele ou pode ser extraído automaticamente do recurso antes de invocá-lo.

É claro que esta solução funciona bem o suficiente apenas quando a saída é bem estruturada e fácil de analisar.

O fato de ser um aplicativo GUI não é um problema de bloqueio. Você pode iniciá-lo, gerar saída e, depois, processá-lo automaticamente quando essa GUI terminar.

h22
fonte
3
Como isso é diferente da resposta mais votada do Doc Brown?
Laf 30/05
Não concordo com a suposição de que a resposta de Doc seja mal escrita. É claro e sucinto.
Mast
11
Se você olhar o texto desta resposta, verá que a única parte informativa faz exatamente o final da última frase "que chama seu legado de" exe ", pega a saída e a processa ainda mais".
h22 31/05
2
Não é um downvoter, e não vê por que isso tem -3 ... o Meta está de volta? mas separadamente, eu desaconselharia a resposta de outra pessoa a "contém muito blá que dilui o cérebro" quando (A) é um julgamento subjetivo e (B) na minha opinião subjetiva, o seu contém exatamente isso!
underscore_d
Isso também pode ser reescrito como "contém conversas genéricas não informativas que apenas distraem o tópico que desperdiça o tempo dos leitores", se isso parecer mais útil. Fornece uma dica para a abordagem correta na segunda metade da última frase. Isso não tinha intenção de ser um insulto. Comentário removido.
h22 31/05
1

Escreva alguns testes que exercitem o maior número possível de casos no código antigo. Encontre casos de canto, teste a entrada errada e teste a entrada correta.

Anote a saída correta em vários casos e tente escrever uma implementação que satisfaça os mesmos testes .

Eu não seguiria a rota da engenharia reversa. É incrivelmente complicado reverter o código da máquina, e você já deve saber qual é o objetivo do exe. Engenharia reversa é um pouco de trabalho demais para o que você procura.

Se o software foi desenvolvido por um indivíduo há 20 anos, provavelmente não é algo que requer muita energia moderna. Um programa GUI que estendeu a máquina há 20 anos dificilmente será registrado em uma máquina moderna; portanto, você provavelmente está procurando algo relativamente simples de reproduzir.

Carlos
fonte
0

Tente fazer engenharia reversa do exe. Somente com o objetivo de encontrar a lógica de computação ou, pelo menos, obter uma dica justa do que ela realmente faz e se sua engenharia reversa puder levá-lo a esse ponto, você poderá escrever um novo aplicativo com base nessa lógica de computação. Além disso, não vejo outra saída.

Mais fácil dizer do que fazer, a engenharia reversa de um exe criado há 20 anos é um verdadeiro desafio.

Mukesh Adhvaryu
fonte
12
A datação do exe não deve realmente importa
Ángel
11
De fato, com os otimizadores cada vez mais inteligentes, a engenharia reversa apenas se torna mais difícil.
MSalters