PDA

Ver la Versión Completa : Agregar peso vacio a un ejecutable


JuanOrtega
26-08-2014, 23:34:13
Hola estoy por volverme loco con este problema , hace dos dias que estoy tratando de buscar informacion de como abrir un archivo y agregarle peso vacio a un archivo ejecutable que es lo que originalmente hace este codigo en C#.

Codigo C#

byte[] b = new byte[50 * 1024]; /* 50 kb */
FileStream fS = File.Open("test.exe", FileMode.Append);
fS.Write(b, 0, b.Length);
fS.Close();

Lo peor es que el codigo en C# funciona perfecto y son solo cuatro lineas cuando en delphi eh hecho mas y termino arruinando el archivo ejecutable.

Inicialemente intente con :


procedure SaveBytesToFile(const Data: TBytes; const FileName: string);
var
stream: TMemoryStream;
begin
stream := TMemoryStream.Create;
try
if length(data) > 0 then
stream.WriteBuffer(data[0], length(data));
stream.SaveToFile(FileName);
finally
stream.Free;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
SaveBytesToFile(1024,'test.exe');
end;


Pero el problema con este codigo es que no encuentro y no se que tengo que poner en el valor TBytes en el primer argumento que supongo que
es el peso que quiero agregar puse 1024 pero da error y no encuentro informacion de que valor tengo que poner.

Tambien intente con este codigo :

procedure TForm1.Button1Click(Sender: TObject);
var fs:tfilestream;
buffer:integer;
begin

fs.create('test.exe',fmcreate);
fs.writebuffer(buffer,'1024');
fs.free;

end;

Intente en este codigo agregar 1024 bytes pero en este intento termino arruinando el ejecutable.

¿ Que estoy haciendo mal ?

ecfisa
26-08-2014, 23:56:10
Hola Lepuke.

Intenta de este modo:

var
buf: array[0..50*1024] of Byte;
begin
with TFileStream.Create('test.exe', fmOpenReadWrite) do
try
Seek(0, soFromEnd);
FillChar(buf, SizeOf(buf), 0);
Write(buf, SizeOf(buf));
finally
Free;
end;
end;


Saludos :)

JuanOrtega
27-08-2014, 00:14:20
funciona excelente ecfisa , gracias por la ayuda , te queria preguntar sobre esta linea :
var buf: array[0..50*1024] of Byte;el tema es que cuando haga personizable el programa necesito tener el valor 1024 en un edit1 y desde el var parece que no puedo hacerlo porque hago :

var buf: array[0..50*edit1.Text] of Byte;

¿ hay alguna forma de establecer el valor del byte buf en otro lado donde pueda ponerle el valor de 1024 desde una caja de texto ? , te lo pregunto porque creo que no se puede poner el valor justo cuando esta en la parte de var.

Acabo de tratar de hacer lo que queria pero esta mal mira :


procedure TForm1.Button1Click(Sender: TObject);
var
buf: array of Byte;
begin
buf:= array[0..50*edit1.Text];
end;


gracias por responder

mamcx
27-08-2014, 00:29:15
No entiendo como te pones a modificar binarios y no sabes lo elemental de tipos de datos en pascal. "Text" no multiplica con numeros...

Afortunadamente tengo la solucion *.




---
*PD: Ves? Es como decir "Algo sale mal".

ecfisa
27-08-2014, 01:12:18
Hola Lepuke.
¿ hay alguna forma de establecer el valor del byte buf en otro lado donde pueda ponerle el valor de 1024 desde una caja de texto ?


procedure InflateExe(const aFileName: string; const NoBytes: LongWord);
var
buf: array of Byte;
i: Integer;
begin
with TFileStream.Create(aFileName, fmOpenReadWrite) do
try
SetLength(buf, NoBytes);
ZeroMemory(@buf[1], Length(buf));
Seek(0, soFromEnd);
Write(buf[0], Length(buf));
finally
Free;
end;
end;


Uso:

procedure TForm1.Button1Click(Sender: TObject);
begin
InflateExe('test.exe', StrToInt(Edit1.Text));
end;


Saludos :)

JuanOrtega
27-08-2014, 01:16:14
en serio ecfisa , gracias por la ayuda.

orodriguezca
27-08-2014, 15:15:30
Me pica la curiosidad: Para que "inflar" un .exe?

ecfisa
27-08-2014, 22:07:29
Hola orodriguezca.

No lo ha comentado, pero supongo que deseará incrustar algo en el espacio adicionado.

Saludos :)

cloayza
28-08-2014, 17:11:21
Comparto tu comentario...
No entiendo como te pones a modificar binarios y no sabes lo elemental de tipos de datos en pascal.

Sin comentarios al código que escribió...:mad:
procedure TForm1.Button1Click(Sender: TObject);
var
buf: array of Byte;
begin
buf:= array[0..50*edit1.Text];
end;
Te aconsejo que leas y documentes sobre lo básico antes de emprender este tipo de tareas.