Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Como escribir ciertos bytes en un exe y eliminarlos luego ! (https://www.clubdelphi.com/foros/showthread.php?t=93941)

wonderDev 20-05-2019 05:45:56

Como escribir ciertos bytes en un exe y eliminarlos luego !
 
Estimados, hacia años que no entraba a este increible foro. Un abrazo enorme a todos.


Resulta que necesito simplemente corromper un exe y solo mi aplicacion debe ser capaz de devolerlo al estado original y ejecutarlo. Supuse que escribiendo unos bytes al inicio corrompo el exe y eso justamente es lo que sucedio. Pero no supe como eliminar esos bytes y volverlo a su estado original. Por favor si me pueden ayudar les agradeceria demasiado.


Un par de metodos como EscribirBytes y que escribiera amoclubdelphi y otro que simplemente se llamara RemoverBytes y eliminara amoclubdelphi del archivo y lo volviera a su original. Gracias de antemanos y de nuevo agradecido de que en nuestro planeta tierra exista un foro tan increible como este.

Casimiro Notevi 20-05-2019 10:00:40

Hola, ¿cómo lo escribiste? muestra tu código y explica exactamente dónde tienes la duda.

wonderDev 20-05-2019 17:26:28

Escribir Bytes !
 
Cita:

Empezado por Casimiro Notevi (Mensaje 532076)
Hola, ¿cómo lo escribiste? muestra tu código y explica exactamente dónde tienes la duda.


Hola Casimiro, gracias por responder. El codigo que tengo para escribir algunos bytes viene quedando mas o menos asi:


Código Delphi [-]
procedure TfrmMain.cxButton1Click(Sender: TObject);
var
  vClientStream: TFileStream;
  var nombre: String;
begin

  vClientStream := TFileStream.Create('C:\Juegos\buscaminas.exe', fmOpenReadWrite);

  nombre := 'Casimiro';

  try
    //vClientStream.Position := 0;
    vClientStream.Seek(0, 0);
    vClientStream.WriteBuffer(nombre, Length(nombre));
  finally
    vClientStream.Free;
  end;

end;


Lo que sucede es que con ese codigo corrompo ese .exe, pero necesito de alguna forma volver a deshacer eso. O si tienen alguna idea mejor pues la utilizaria.

ecfisa 20-05-2019 20:06:45

Hola.

Si te entendí bién, supongo que este ejemplo te servirá de guía:
Código Delphi [-]
...
implementation 

const
  FNAME = 'C:\Temp\notepad.exe'; // copia de C:\windows\notepad.exe

var
  OriginalString: string;

function ChangeChain(AFileName, Chain: string): string;
var
  Stream: TFileStream;
  sz   : Integer;
begin
  sz := Length(Chain);
  SetLength(Result, sz);
  Stream := TFileStream.Create(AFileName, fmOpenRead);
  try
    Stream.Position := 0;
    Stream.Read(Pointer(Result)^, sz);
  finally
    Stream.Free;
  end;
  Stream := TFileStream.Create(AFileName, fmOpenWrite);
  try
    Stream.Position := 0;
    Stream.Write(Pointer(Chain)^, sz);
  finally
    Stream.Free;
  end;
end;

// Corromper el archivo 
procedure TForm1.btChangeClick(Sender: TObject);
begin
  OriginalString := ChangeChain(FNAME,
    '012345678901234567890123456789012345678901234567890123456789'+ // cualquier valor
    '012345678901234567890123456789012345678901234567890123456789');
   // luego de aquí no podrás ejecutar "c:\temp\notepad.exe"
end;

// Restaurarlo
procedure TForm1.btRestoreClick(Sender: TObject);
begin
  ChangeChain(FNAME, OriginalString);
  // luego de aquí podras ejecutar "c:\temp\notepad.exe"
end;

end.
Para que sea mas funcional, a diferencia del ejemplo, deberías almacenar la cadena que corrompe el archivo en un medio perdurable, de modo que puedas recuperarla luego.

Saludos :)

wonderDev 20-05-2019 21:39:50

gracias !
 
Gracias amigo, voy a probar a ver como va y te dejo saber. Muchisimas gracias !

wonderDev 20-05-2019 22:18:19

@ecfisa muchas gracias por la ayuda, pero ese metodo no me conviene. La idea es tener unos bytes fijos que de antemano conozcamos, escribirlos al inicio. Y en futuras ejecuciones de mi Sowftware, simplemente borrarlos. O sea romper cierto exe una sola vez, y luego solamente eliminar eso cada ves que se ejecute mi app.

Te explico: Yo estoy haciendo un launcher para un juego y te voy a distribuir el launcher con el ejecutable del juego ya con ciertos bytes al inicio o al final, impidiendote que lo ejecutes directamente. Por debajo mi launcher lo que hara es cojer ese .exe, copiarlo hacia otro lugar, eliminarle esos bytes y ejecutarlo desde ese lugar (la carpeta temp por ejemplo). Lo que te quiero decir es que necesito romper el exe una sola vez y que sea fijo lo que le tenga que eliminar para poderlo restaurar, me entiendes mas o menos?. Segun estuve testeando esa funcion que hiciste si, funciona genial, pero no me conviene tener que estar guardando ese valor constantemente ni mucho menos y ademas, ya ese exe el del juego se le va a dar a los usuarios roto, el launcher lo que tendria es que revertirle lo que tenga agregado, o sea los bytes para volverlo ejecutable de nuevo. Me explico mas o menos?

Lo ideal seria, escribirle 5 bytes fijos y luego de haberlo corrompido, tener la funcion que le elimine esos 5 bytes (fijos) y ya lo vuelva a su estado original. Puede ser 1 byte, 10 bytes, lo que sea, al inicio o al final, donde sea, pero que sean fijos y que yo pueda simplemente eliminarlos cuando estime necesario. Gracias de nuevo y espero me entiendas.

ecfisa 21-05-2019 02:19:45

Hola.

¿ Y no te sirve entregar el ejecutable con la cadena ya alterada ?

Podes usar (o modificar) la función del ejemplo anterior dentro de tu lanzador, para cambiar la cadena alterada por la original que previamente hayas obtenido. La cadena original podrías almacenarla como constante o como recurso en tu lanzador...

Saludos :)

wonderDev 23-05-2019 21:48:49

Ok si entiendo lo que dices, muchas gracias y te dejo saber. El metodo que me diste funciona excelente, solo es adaptarlo. Thanks u !


La franja horaria es GMT +2. Ahora son las 01:23:37.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi