Ir para conteúdo

Modificando Execultavel feito em Delphi


PmoshBR

Posts Recomendados

Ola pessoal, 

Tenho um aplicativo que desenvolvi a muito tempo (2003) no Delphi que utilizo diariamente, porem a um ano atrás meu HD de backup (onde estava o código fonte) pifou e não consegui restaurar 100% dos arquivos desse código fonte, apenas arquivos parciais.
Já com a ideia de que vou ter que reescrever todo o programa de novo, já comecei o projeto em uma outra plataforma. Mais ainda vai demorar até estar 100%. Enquanto isso vou usando a ultima versão compilada.

Precisava de uma ajuda para alterar um PATH onde o programa salva e lê arquivos na rede, que foi compilada dentro da linha de código. a função em questão seria essa abaixo:
(Esse foi um dos arquivos do código fonte que consegui recuperar)

procedure TFrm_EntDocumentos.BtAdicionarClick(Sender: TObject);
var
nomefinal,pathfinal:string;
ano,mes,dia,hora,minuto,segundo,extensao:string;
begin
    hora:=Copy(TimeToStr(Time),0,2);
    minuto:=Copy(TimeToStr(Time),4,2);
    segundo:=Copy(TimeToStr(Time),7,2);
    hora:=Copy(TimeToStr(Time),0,2);
    ano:=Copy(DateToStr(Date),7,4);
    mes:=Copy(DateToStr(Date),4,2);
    dia:=Copy(DateToStr(Date),0,2);
    extensao:=ExtractFileExt(EdNomeArquivo.Text);
    nomefinal:=ano+mes+dia+'-'+hora+minuto+segundo+'-'+EdPedido.Text+'-'+InttoStr(Random(100))+extensao;
    pathfinal:='\\SERVIDOR\producao$\'+EdTipoArquivo.Text+'\'+nomefinal;
  try
    if EdTipoArquivo.Text='CVC' then
    begin
      Dm.SQLComando.ConnectionString:=Dm.SQLCvc.ConnectionString;
      DM.SQLComando.CommandText:=('INSERT INTO TbArquivos (NomeArquivo, CodModVeiculo) VALUES ('+
        #39+nomefinal+#39+','+
        #39+EdPedido.Text+#39+');');
      DM.SQLComando.Execute;
    end else
    begin
      Dm.SQLComando.ConnectionString:=Dm.SQLProducao.ConnectionString;
      DM.SQLComando.CommandText:=('INSERT INTO TbArquivos (CodPedido, Data, ' +
        'NomeArquivo, Observacao, Tipo) VALUES ('+
        #39+EdPedido.Text+#39+','+
        #39+ano+'/'+mes+'/'+dia+#39+','+
        #39+nomefinal+#39+','+
        #39+MObservacao.Lines.Text+#39+','+
        #39+EdTipoArquivo.Text+#39+');');
      DM.SQLComando.Execute;
    end;
    if EdTipoArquivo.Text='PRE-CADASTRO IMPLEMENTO' then
    begin
      Dm.SQLComando.ConnectionString:=Dm.SQLProducao.ConnectionString;
      DM.SQLComando.CommandText:=('UPDATE TbProducao SET Pre_Cadastro = 1 WHERE CodPedido = '+#39+EdPedido.Text+#39);
      DM.SQLComando.Execute;
    end;
    try
      FileSetReadOnly(EdNomeArquivo.Text,true);
      if CBMover.Checked then
      begin
        if not MoveFile(PChar(EdNomeArquivo.Text),PChar(pathfinal)) then
          raise Exception.Create('Erro ao tentar salvar o arquivo!');
      end else
        if not CopyFile(PChar(EdNomeArquivo.Text),PChar(pathfinal),False) then
          raise Exception.Create('Erro ao tentar salvar o arquivo!');
    except
      DM.SQLComando.CommandText:=('DELETE FROM TbArquivos WHERE NomeArquivo = '+#39+nomefinal+#39);
      Dm.SQLComando.Execute;
      raise Exception.Create('Erro ao tentar salvar o arquivo!');
    end;
  except
    on E : Exception do
    begin
      ShowMessage('Tipo do Erro = '+E.ClassName+#13+'Messagem do Erro = '+E.Message);
    end else ShowMessage('Erro desconhecido!');
  end;
end;

No começo da função tem a variável "pathfinal" e esta direcionando os arquivos para o diretório \\SERVIDOR\producao$, queria poder alterar esse path, pois a topologia da rede aqui foi alterada e não existe mais esse caminho.

Já tentei utilizar os programas abaixo para tentar achar a "string" para modifica-la no executável, mais sem sucesso.

  • Win32dasm
  • dede32
  • Resource Hacker
  • Hex-Rays IDA Pro
  • Ollydbg
  • Hiew32

Não sou um conhecedor de assembly de PC x86 ou x64, inclusive estou assistindo os cursos aqui do site para ver se ajuda. Mais tenho conhecimento de asm de microcontroladores com PIC e Atmel.

Alguém poderia me dar uma luz de como alterar esse executável ?? precisava resolver isso enquanto o novo programa não fica pronto....

Obrigado!!!!

Link para o comentário
Compartilhar em outros sites

Humm.. neste caso em específico eu acho mais fácil criar um registro para o SERVIDOR no DNS interno e simplesmente mapear producao$ para o novo lugar. Assim nem precisa alterar o programa. ?

Se realmente for partir pra engenharia reversa, bem, já passei por um caso parecido. Eu diria que sua linha de pensamento de buscar a string no executável está certa. O que eu faria:

  1. Usaria o IDR para buscar o endereço do evento BtAdicionarClick.
  2. Usaria o x64dbg para colocar um breakpoint no endereço conseguido no passo acima.
  3. Seguiria a execução até encontrar onde a string é carregada.

Certamente o CERO vai te ajudar. Se preferir ler, tem o livro gratuito Fundamentos de Engenharia Reversa também.

Se tiver dúvidas durante o processo, pode postar aqui que a galera ajuda (screenshots, trechos de código, etc são bem vindos). ?

Abraço e boa sorte!

 

Link para o comentário
Compartilhar em outros sites

Ola Fernando,

Obrigado pela ajuda, não conhecia o IDR... foi rodar ele e achar na hora a localização da String, muito bom esse software...
Usei o x64dbg e realmente confirmei a localização da string...

Agora só falta uma coisa, qual programa posso usar para alterar a string e salvar o exe corrigido? pois a quantidade de caracteres não são iguais... teria que alterar o tamanho do arquivo...

Estou gostando bastante do curso CERO...!!

Abraço e obrigado pela resposta...

Link para o comentário
Compartilhar em outros sites

Em 08/07/2021 em 19:06, PmoshBR disse:

Obrigado pela ajuda, não conhecia o IDR... foi rodar ele e achar na hora a localização da String, muito bom esse software...

De nada. É, pra Delphi acho que é o melhor.

Em 08/07/2021 em 19:06, PmoshBR disse:

Agora só falta uma coisa, qual programa posso usar para alterar a string e salvar o exe corrigido? pois a quantidade de caracteres não são iguais... teria que alterar o tamanho do arquivo...

Não precisa de outro programa. Dá pra encontrar uma code cave com o próprio x64dbg. No canal temos um vídeo sobre injeção de código, mas serve para injeção de dados também:

Se não houver "holes" utilizáveis (o que é raro), dá pra criar uma seção também (assunto coberto no vídeo da parte 2).

Mas não deixa de seguir o CERo até o final. Tu vai curtir!

Abraço e boa sorte!

Link para o comentário
Compartilhar em outros sites

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...