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++.
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: