Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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.
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');
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; 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
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.
Resolvi o problema,
deixei o codigo assim:
procedure AlteraArquivo(Arquivo : AnsiString; ByteStart: Integer; Buffer: AnsiString);
var
Arq : File of Char;
Cont : Integer; 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
: 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..
Aqui ta erro quando tento alterar o arquivo, File Access Denied, sabe como resoler?
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:
Veja se é mais ou menos isso que você esperava...
Abraço!!
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.
;)
@ 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?
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...
Ei pessoal, vamos apenas tomar cuiado para não levantar tópicos muito antigos. Ok.
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
begin
try
if (FileExists(Arquivo)) then
begin
Para funcionar, declare na sessão "Type" da sua unit:
TBuffer = array of byte;
:D