Resultados 1 a 3 de 3
  1. #1

    Thumbs up Source Mult-Patcher

    Bom fiz este programa somente para matar o tempo.





    É um Patcher para múltiplos programas, ele carrega as informações de um XML com o seguinte formato.
    • <App> = Nó base de cada aplicação.
      • Atributo Name = Nome da aplicação.
      • Atributo MD5 = Opcional Hash MD5 do arquivo para evitar que um arquivo incorreto seja escolhido.
      • <Binary> (Podem existir múltiplos nós para um mesmo arquivo) = Dados a serem inseridos formatados byte a byte "AA FF 11"...
        • Atributo Offset = Posição a partir dá qual inserir os dados.


    Obs: Os Bytes e o Offset devem ser informados em formato Hexadecimal.

    Código PHP:
    <Applications>
        <
    App Name="AppName" MD5="6271587C9C3067E16D857BAA4AC59004">
            <
    Binary Offset="00000000">00 11 22 33 44 55 66 77 88 99</Binary>
            <
    Binary Offset="000000FF">AA BB CC DD EE FF</Binary>
        </
    App>
        <
    App Name="Teste">
            <
    Binary Offset="00000000">01 02 03 04 04 05 06 07 08 09</Binary>
        </
    App>
    </
    Applications





    Somente para constar utilizei o Delphi XE2

    Código PHP:
    unit UnitPatcher;

    interface

    uses
      Winapi
    .WindowsWinapi.MessagesSystem.SysUtilsSystem.VariantsSystem.ClassesVcl.Graphics,
      
    Vcl.ControlsVcl.FormsVcl.DialogsVcl.StdCtrlsVcl.ExtCtrlsGenerics.Collections,
      
    Vcl.Imaging.jpeg;

    type
      TFrmPatcher 
    = class(TForm)
        
    Image1TImage;
        
    CmbAppsTComboBox;
        
    Label1TLabel;
        
    BtnPatchTButton;
        
    procedure FormCreate(SenderTObject);
        
    procedure BtnPatchClick(SenderTObject);
        
    procedure FormDestroy(SenderTObject);
      private
        { Private 
    declarations }
      public
        { Public 
    declarations }
      
    end;
      
      
    OffsetData record
        Offset
    Integer;
        
    DataTList<Byte>;
      
    end;

      
    AppInfo record
        Name
    string;
        
    MD5string;
        
    OffsetsTList<OffsetData>;
      
    end;
      
    var
      
    FrmPatcherTFrmPatcher;

    implementation

    uses
      System
    .StrUtilsSystem.TypesIdHashMessageDigestXml.XMLDocXml.XMLIntf;

    var
      
    AppsTList<AppInfo>;

    {
    $R *.dfm}

    procedure TFrmPatcher.BtnPatchClick(SenderTObject);
    var
      
    DialogTOpenDialog;
      
    AppStreamTFileStream;
      
    OffsetOffsetData;
      
    MD5HashTIdHashMessageDigest5;
      
    BByte;
      
    IInteger;
      
    NInteger;
    begin
      Dialog
    := TOpenDialog.Create(Self);
      
    MD5Hash:= TIdHashMessageDigest5.Create;
      try
        
    Dialog.Options:= [ofOverwritePromptofHideReadOnlyofFileMustExistofExtensionDifferent];
        
    Dialog.Filter:= 'Executable|*.exe|Any|*.*';
        if(
    Dialog.Execute(Self.Handle))then
        begin
          CopyFile
    (PWideChar(Dialog.FileName), PWideChar(Dialog.FileName '.bkp'), false);

          
    AppStream:= TFileStream.Create(Dialog.FileNamefmOpenReadWrite);

          if((
    MD5Hash.HashStreamAsHex(AppStream) = Apps.Items[CmbApps.ItemIndex].MD5) or (Apps.Items[CmbApps.ItemIndex].MD5 ''))then
          begin
            
    for := 0 to Apps.Items[CmbApps.ItemIndex].Offsets.Count -do
            
    begin
              Offset
    := Apps.Items[CmbApps.ItemIndex].Offsets[I];
              
    AppStream.Seek(Offset.OffsetsoFromBeginning); 

              for 
    := 0 to Offset.Data.Count -do
              
    begin
                B
    := Offset.Data.Items[N];
                
    AppStream.Write(B1);
              
    end;
            
    end;
            
            
    Application.MessageBox('Patch Successfully!''Patched'MB_OK MB_ICONINFORMATION);
          
    end
          
    else
          
    begin
            Raise
    (Exception.Create('Invalid MD5 hash'));
          
    end;
        
    end;
      
    except on EException do
        
    Application.MessageBox(PWideChar(E.Message), 'Patch Failed'MB_OK MB_ICONERROR);  
      
    end;
      
      
    Dialog.Free;
      
    MD5Hash.Free;
      
    AppStream.Free;
    end;

    procedure TFrmPatcher.FormCreate(SenderTObject);
    var
      
    DocTXMLDocument;
      
    NodeAppIXMLNode;
      
    AppAppInfo;
      
    OffsetOffsetData;
      
    BytesTStringDynArray;
      
    IInteger;
      
    NInteger;
      
    BInteger;
    begin
      Apps
    := TList<AppInfo>.Create;
      
    Doc:= TXMLDocument.Create(Self);
      
      try
        
    Doc.LoadFromFile('.\Applications.xml');
      
    except on EException do
        
    begin
          Doc
    .Free;
          
    Application.MessageBox(PWideChar(E.Message), 'Fatal Error'MB_OK MB_ICONERROR);
          
    Application.Terminate;
        
    end
      end
    ;

      try
        for 
    := 0 to Doc.ChildNodes['Applications'].ChildNodes.Count -do
        
    begin
          App
    .Offsets:= TList<OffsetData>.Create;
          
    NodeApp:= Doc.ChildNodes['Applications'].ChildNodes[I];
          
    App.Name:= NodeApp.Attributes['Name'];

          try
            
    App.MD5:= NodeApp.Attributes['MD5'];
          
    except
            App
    .MD5:= '';
          
    end;

          for 
    := 0 to NodeApp.ChildNodes.Count -do
          
    begin
            Offset
    .Data:= TList<Byte>.Create;
            
    Offset.Offset:= StrToInt('$' NodeApp.ChildNodes[N].Attributes['Offset']);
            
    Bytes:= SplitString(NodeApp.ChildNodes[N].Text' ');
      
            for 
    := 0 to Length(Bytes) -do
            
    begin                              
              Offset
    .Data.Add(StrToInt('$' Bytes[B]));
            
    end;

            
    App.Offsets.Add(Offset);

            
    SetLength(Bytes0);
            
    Offset.Offset:= 0;
          
    end;

          
    Apps.Add(App);
          
    App.Name:= '';
          
    App.MD5:= '';
        
    end;
      
    except on EException do
        
    begin
          App
    .Offsets.Free;
          
    Offset.Data.Free;
          
    Doc.Free;
          
          
    Application.MessageBox(PWideChar(E.Message), 'Fatal Error'MB_OK MB_ICONERROR);

          
    Application.Terminate;
        
    end
      end
    ;

      for 
    := 0 to Apps.Count -do
      
    begin
        CmbApps
    .Items.Add(Apps.Items[I].Name);
      
    end;
      
    CmbApps.ItemIndex:= 0;

      
    Doc.Free;
    end;

    procedure TFrmPatcher.FormDestroy(SenderTObject);
    var
      
    IInteger;
      
    NInteger;
    begin
      
    for := 0 to Apps.Count -do
      
    begin
        
    for := 0 to Apps.Items[I].Offsets.Count -do
        
    begin
          Apps
    .Items[I].Offsets.Items[N].Data.Free;
        
    end;
        
    Apps.Items[I].Offsets.Free;
      
    end;
      
    Apps.Free;
    end;

    end
    Espero que seja útil á alguém .

  2. #2
    Gray Hat Avatar de CoderSc
    Data de Ingresso
    Jan 2011
    Localização
    #!/bin/bash
    Posts
    1.736
    Irei testar aqui , e também só o fato de ser desenvolvido em Delphi XE2 é show de bola =)
    Når du føler flove over at se på tras eller bange for at se fremad, se venstre eller højre I be altid ved din side.

    H
    aters Gonna Hate

  3. #3
    Newbie
    Data de Ingresso
    Aug 2011
    Posts
    116
    Obrigado , estava precisando de um exemplo do mesmo , para uma coisa que irei fazer.

Tags para este Tópico

Permissões de Postagem

  • Você não pode iniciar novos tópicos
  • Você não pode enviar respostas
  • Você não pode enviar anexos
  • Você não pode editar suas mensagens
  •