DouglasP 1 Denunciar post Postado Janeiro 14, 2010 Boa noite, queria saber como posso fazer para alterar um certo trecho de um executavel, no caso sei qts caracteres tem antes dele, olhei pelo notepad++. ai preciso alterar esse trecho. como fazer? grato. Compartilhar este post Link para o post Compartilhar em outros sites
Raficcha 1 Denunciar post Postado Janeiro 14, 2010 Pode explicar um pouco melhor amigo? você gostaria de abrir o arquivo e alterar alguns bytes, isto? se for isto você pode utilizar esta função: procedure AlteraArquivo(Arquivo : AnsiString; ByteStart: Integer; Buffer: TBuffer); var Arq : File of Byte; Cont : Integer; begin try if (FileExists(Arquivo)) then begin AssignFile(Arq, Arquivo); Reset(Arq); //abre o arquivo para edição Seek(Arq, ByteStart); //posiciona o arquivo no byte apartir do qual se deseja alterar for Cont := 0 to Length(Buffer)-1 do //gravar byte a byte (existem outros metodos) begin Write(Arq, Buffer[Cont]); //grava um byte no arquivo end; CloseFile(Arq); //fecha o arquivo end else MessageBox(0, 'O Arquivo não existe!', 'Erro', MB_OK+MB_ICONERROR); except try CloseFile(Arq); except end; MessageBox(0, 'Ocorreu um erro ao alterar o arquivo!', 'Erro', MB_OK+MB_ICONERROR); end; end; Para funcionar, declare na sessão "Type" da sua unit: TBuffer = array of byte; :D Compartilhar este post Link para o post Compartilhar em outros sites
DouglasP 1 Denunciar post Postado Janeiro 14, 2010 Tipo eu tenho um arquivo x, abri ele com o notepad++ procurei pelo texto "AAAAAAAAAAAAAAAA", ai do começo dos "A" ate o começo do programa sei que tem 1357500 bytes, ai eu queria mudar o "AAAAAAAAAAAAAAAA" para por exemplo "BBBBBBBBBBBBBBBB". grato. ---------- deu erro: [Error] Unit1.pas(56): Incompatible types: 'String' and 'TBuffer' chamei assim: AlteraArquivo('main.exe', 1367500, 'BBBBBBBBBBBBBBBB'); Compartilhar este post Link para o post Compartilhar em outros sites
Raficcha 1 Denunciar post Postado Janeiro 14, 2010 Esta rotina faz o que você quer e na verdade deu erro pq ela espera um vetor de bytes, e você passou uma string. Para colocar uma string sem ter que converter em vetor de bytes, fiz uma adaptação: procedure AlteraArquivo(Arquivo : AnsiString; ByteStart: Integer; Buffer: AnsiString); var Arq : File of Char; Cont : Integer; begin try if (FileExists(Arquivo)) then begin AssignFile(Arq, Arquivo); Reset(Arq); //abre o arquivo para edição Seek(Arq, ByteStart); //posiciona o arquivo no byte apartir do qual se deseja alterar for Cont := 0 to Length(Buffer)-1 do //gravar byte a byte (existem outros metodos) begin Write(Arq, Buffer[Cont]); //grava um byte no arquivo end; CloseFile(Arq); //fecha o arquivo end else MessageBox(0, 'O Arquivo não existe!', 'Erro', MB_OK+MB_IConerror); except try CloseFile(Arq); except end; MessageBox(0, 'Ocorreu um erro ao alterar o arquivo!', 'Erro', MB_OK+MB_IConerror); end; end; se for usar string, pode tirar o "TBuffer = Array of byte" da sessão Type. :D Compartilhar este post Link para o post Compartilhar em outros sites
DouglasP 1 Denunciar post Postado Janeiro 14, 2010 Procurei pelo codigo, ele alterou so que em outro lugar e não onde pedi, e não foi a qtd de caracteres que coloquei foi um a menos. Compartilhar este post Link para o post Compartilhar em outros sites
DouglasP 1 Denunciar post Postado Janeiro 14, 2010 Resolvi o problema, deixei o codigo assim: procedure AlteraArquivo(Arquivo : AnsiString; ByteStart: Integer; Buffer: AnsiString); var Arq : File of Char; Cont : Integer; begin try if (FileExists(Arquivo)) then begin AssignFile(Arq, Arquivo); Reset(Arq); //abre o arquivo para edição Seek(Arq, ByteStart); //posiciona o arquivo no byte apartir do qual se deseja alterar for Cont := 0 to Length(Buffer) do //gravar byte a byte (existem outros metodos) begin Write(Arq, Buffer[Cont]); //grava um byte no arquivo end; CloseFile(Arq); //fecha o arquivo end else MessageBox(0, 'O Arquivo não existe!', 'Erro', MB_OK+MB_IConerror); except try CloseFile(Arq); except end; MessageBox(0, 'Ocorreu um erro ao alterar o arquivo!', 'Erro', MB_OK+MB_IConerror); end; end; e em vez de usar o sel usei os proprios bytes - 1 Compartilhar este post Link para o post Compartilhar em outros sites
Raficcha 1 Denunciar post Postado Janeiro 14, 2010 : D, que bom que consegiu.. você arrumou esta linha "for Cont := 0 to Length(Buffer)-1 do" para "for Cont := 0 to Length(Buffer) do" hehe.. eu não tinha visto o "-1" quando adaptei.. Compartilhar este post Link para o post Compartilhar em outros sites
DouglasP 1 Denunciar post Postado Agosto 11, 2010 Aqui ta erro quando tento alterar o arquivo, File Access Denied, sabe como resoler? Compartilhar este post Link para o post Compartilhar em outros sites
ispiriquidiberto 0 Denunciar post Postado Agosto 13, 2010 Isso ae Raficcha!! String começa da posição 1 neh?!?!? rsrs... Isso q é triste, String começa em 1, enquanto por padrão a maioria dos arrays começa do Zero... Quanto ao erro de File Access Denied, você não está tentando trocar os dados do próprio executável, correto??? Pq se sim, acredito que você não vai conseguir alterar os dados do arquivo em execução... Segurança de S.O. Agora... O que você poderia fazer (não sei se é a solução mais inteligente) é o seguinte: - Tenha em mente dois aplicativos: O padrão (app1), que é o que você quer alterar e um auxiliar (app2), que só vai fazer a alteração e iniciar o seu aplicativo padrão. - Quando for necessário "se alterar", o app1 inicializa o app2 e se finaliza (application.terminate). - O app2, quando ver que o app1 já se finalizou, abre o executável e faz as alterações necessárias. - O app2 executa novamente o app1. - O app2 se auto-finaliza, ao ver que o app1 já se inicializou corretamente. Veja se é mais ou menos isso que você esperava... Abraço!! Compartilhar este post Link para o post Compartilhar em outros sites
Raficcha 1 Denunciar post Postado Agosto 13, 2010 Opa pessoal, beleza? Quem bom que o tópico esta sendo pesquisado e vizualiza-lo. Mas vamos concordar, este tópico é um pouco antigo.. do começo do ano. Peço que façam um novo tópico no fórum para novas dúvidas. Este tópico ja foi resolvido e aqui não é um bom lugar para postar dúvidas. ;) Compartilhar este post Link para o post Compartilhar em outros sites
DouglasP 1 Denunciar post Postado Outubro 29, 2010 @ Raficcha, Aqui quando tento alterar um arquivo txt ele da erro no arquivo, coloca espaços onde não deve ou simbolos. sabe oque pode ser? Compartilhar este post Link para o post Compartilhar em outros sites
bdexterholland 0 Denunciar post Postado Novembro 4, 2010 para arquivos text, voce precisa declarar a variável para o arquivo como sendo do tipo text. Se isto não resolver, temos que ter mais detalhes sobre as etapas do problema ou mesmo o source para analisar-mos... Compartilhar este post Link para o post Compartilhar em outros sites
Raficcha 1 Denunciar post Postado Novembro 5, 2010 Ei pessoal, vamos apenas tomar cuiado para não levantar tópicos muito antigos. Ok. Compartilhar este post Link para o post Compartilhar em outros sites