Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

DouglasP

[Resolvido] Alterar dado interno de um exe

Recommended Posts

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

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

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

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

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

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

: 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

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

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

@ 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

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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.