• Olá Visitante, se gosta do forum e pretende contribuir com um donativo para auxiliar nos encargos financeiros inerentes ao alojamento desta plataforma, pode encontrar mais informações sobre os várias formas disponíveis para o fazer no seguinte tópico: leia mais... O seu contributo é importante! Obrigado.

Patcher source

xor_axax

GF Ouro
Membro Inactivo
Entrou
Jul 16, 2007
Mensagens
689
Gostos Recebidos
0
A quem possa interessar deixo aqui um source de um programazinho que já fiz á uns anos e que pode ser util a quem quiser criar um Patcher para alterar determinados bytes em outro ficheiro.
Foi criado em Borland Visual c++.

Código:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include "Unit2.h"
#include "Main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

unsigned char *Buffer;
unsigned char *TmpBuf;
unsigned int BufferLen=3;


//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ExitBtnClick(TObject *Sender)
{
    Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::DoBtnClick(TObject *Sender)
{
	int File;
	unsigned int I,T,Q,Len,Flag;
	unsigned char Str[10000];
	unsigned int Pos=0xFFFFFFFF;
	AnsiString Str1;
	
    if (OpenDialog1->Execute())
    {
        File = FileOpen(OpenDialog1->FileName, fmOpenRead|fmShareDenyNone);
	    if(File==-1)
    	{
		    Application->MessageBox("Não consigo abrir Arquivo","Erro",MB_OK|MB_ICONERROR);
    		return ;
	    }
        BufferLen= FileSeek(File,0,2);
        FileSeek(File,0,0);

      	if(BufferLen<0x48)
    	{
	    	Application->MessageBox("Arquivo tem que ter mais de 72 bytes","Erro",MB_OK|MB_ICONERROR);
		    FileClose(File);
    		return ;
	    }
    	Buffer=new unsigned char[BufferLen+10];
	    TmpBuf=new unsigned char[BufferLen+10];
    	FileRead(File,Buffer,BufferLen);
    	FileClose(File);

        for(I=0;I<BufferLen-1;I++)
	    {
		    if(Buffer[I+0]==0x55 && Buffer[I+1]==0x60 &&
    		   Buffer[I+13]==0x60 && Buffer[I+15]==0x55)
	    	//   Buffer[I+0]==0x55 && Buffer[I+1]==0xFF &&
		 //      Buffer[I+34]==0x68 && Buffer[I+36]==0x55)
    		{
	    		Pos=I;
                        I+=0;
			*( unsigned int *)(Buffer+I)=0x90C3C033;
                        *(unsigned short *)(Buffer+Pos+4)=0x9090;
               }
               else

                     if(Buffer[I+0]==0x68 && Buffer[I+1]==0x8B &&
		       Buffer[I+34]==0x55 && Buffer[I+36]==0xFF ||
	    	   Buffer[I+0]==0x0E && Buffer[I+1]==0xE8 &&
		       Buffer[I+29]==0xFF && Buffer[I+30]==0x55)


    		{
	    		Pos=I;
                        I+=0;
			*( unsigned int *)(Buffer+I)=0x90CBC033;
                        *(unsigned short *)(Buffer+Pos+4)=0x9090;



		        //	break;
                }
	    }
    	

    	if(Pos==0xFFFFFFFF)
	    {
		    Application->MessageBox("Não encontro os bytes para alterar","Erro",MB_OK|MB_ICONERROR);
    		return ;
	    }
         // *(unsigned int *)(Buffer+Pos+4)=0x909090;


    	Str1=OpenDialog1->FileName;
		Str1+=".ori";
    	RenameFile(OpenDialog1->FileName,Str1);

		File=FileCreate(OpenDialog1->FileName);
		if(File==-1)
		{
		    Application->MessageBox("Não consigo criar Arquivo","Erro",MB_OK|MB_ICONERROR);
			return ;
		}
		FileWrite(File,Buffer,BufferLen);
		FileClose(File);
		delete []Buffer;
		delete []TmpBuf;

	    Application->MessageBox("Concluido!","Informação",MB_OK|MB_ICONINFORMATION);
    }
}
//---------------------------------------------------------------------------
 
Última edição:
Topo