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 é:
- Desenvolvido há mais de 20 anos
- Desenvolvedor aposentado 10 anos atrás
- Aplicativo GUI
- Executa autônomo
- 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?
Respostas:
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.
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.
fonte
subprocess.run()
pessoalmente.PIPE
constante mágica . Caso contrário, você não o faz e ele é descartado. O que há para entender?Shell
chamar 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.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
.exe
arquivo 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
.exe
parar 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.
fonte
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.
fonte
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.
fonte
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.
fonte
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.
fonte
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.
fonte
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.
fonte