/ Forside / Teknologi / Udvikling / Delphi/Pascal / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Delphi/Pascal
#NavnPoint
oldwiking 603
jrossing 525
rpje 520
EXTERMINA.. 500
gandalf 460
gubi 270
DJ_Puden 250
PARKENSS 230
technet 210
10  jdjespers.. 200
Patching... på en måde [dette ER et eksper~
Fra : Thomas P


Dato : 23-12-00 12:58

Hej,

Dette må altså siges at være et ekspertspørgsmål, selvom jeres erfaringer
med min spørgsmål af den slags måske er anderledes ;) Jeg har gået lidt og
tænkt over om det egentlig ikke ville være muligt at lave et program, der
løber en exe-fil igennem og finder det der er identisk med en nyere version
af exe-filen. Det, som så ikke er identisk bliver så gemt i en fil, hvor
positionen også står - derved bør man da kunne lave det man så fint kalder
en patch, ikke ? Imidlertid har jeg ingen ide om hvordan det kan laves, men
det kan jeg så bare håbe I har; måske et hint til at bringe mig på sporet ?

- Thomas



 
 
Brian Jørgensen (23-12-2000)
Kommentar
Fra : Brian Jørgensen


Dato : 23-12-00 13:12

> Hej,
>
> Dette må altså siges at være et ekspertspørgsmål, selvom jeres erfaringer
> med min spørgsmål af den slags måske er anderledes ;) Jeg har gået lidt og
> tænkt over om det egentlig ikke ville være muligt at lave et program, der
> løber en exe-fil igennem og finder det der er identisk med en nyere
version
> af exe-filen. Det, som så ikke er identisk bliver så gemt i en fil, hvor
> positionen også står - derved bør man da kunne lave det man så fint kalder
> en patch, ikke ? Imidlertid har jeg ingen ide om hvordan det kan laves,
men
> det kan jeg så bare håbe I har; måske et hint til at bringe mig på sporet
?

Der findes en del programmer, som kan finde forskellen på to exe filer. Jeg
er stødt på sådanne filer på forskellige Cracking websites. Eftersom
crackere
normalt blot ændrer nogle bytes i exe filerne, vil det være nemt at lave et
sådan
patche program, men hvis du f.eks. har tilføjet nye billeder, funktioner
osv. så
vil store dele af exe filen være ændret (så vidt jeg ved) og det vil derfor
være
noget svære.


Hvis du har lyst, så kan du jo kigge nærerme på sider så som
http://www.suddendischarge.com/
og under deres Patching sektion, der indeholder forskellige programmer til
formålet.

--
Brian Jørgensen
redaktion@get2net.dk



Thomas P (23-12-2000)
Kommentar
Fra : Thomas P


Dato : 23-12-00 13:31

Jeg fandt også denne C++ kode... måske kunne en eller anden uddrage noget af
den ? (ved INTET om C++)

-------------------------------------------------

#include <io.h>
#include <ctype.h>
#include <fcntl.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <windows.h>

#define PATCHMAX 16384
#define COPYBUFSIZE 1024

// identification line in .dif file
const char szIDAHeader[]="This difference file is created by The Interactive
Disassembler";
// filecopy buffer
char buf[COPYBUFSIZE];
// holds patch information
struct {
DWORD addr;
unsigned char original,patched;
} patch[PATCHMAX];



/* file copy */
int copyfile(char *from_file, char *to_file)
{
FILE *from_fp, *to_fp;
size_t num;

if ((from_fp = fopen(from_file, "rb")) == NULL) return 1;
if ((to_fp = fopen(to_file, "wb")) == NULL) {
fclose(from_fp);
return 1;
}
while ((num = fread(buf, sizeof(char), COPYBUFSIZE, from_fp)) > 0) {
if (fwrite(buf, sizeof(char), num, to_fp) != num) {
fclose(from_fp);
fclose(to_fp);
return 1;
}
}
fclose(from_fp);
fclose(to_fp);
return 0;
}


/* main */
int main(int argc, char *argv[])
{
FILE *stream;
int inhandle,outhandle;
int patchcount,i;
char szLine[256],inname[256],outname[256];
unsigned char inchar;


_fmode=_O_TEXT;

// print info and check cmdline parameters
fprintf(stderr,"IDAPAT v1 by SE (built %s)\n\n",__DATE__);
if (argc==1) {
fprintf(stderr,"Syntax: %s [IDA .dif-file] <output-file>\n",argv[0]);
return -1;
}

// open diff-file
stream=fopen(argv[1],"rt");
if (!stream) {
fprintf(stderr,"Cannot open input file %s.\n",argv[1]);
return -1;
}

// read header and check
fgets(szLine,256,stream);
if (!strstr(szLine,szIDAHeader)) {
fprintf(stderr,"File is no IDA diff-file.\n");
fclose(stream);
}

fgets(szLine,256,stream); // empty line skip
fgets(szLine,256,stream); // original file name
sscanf(szLine,"%s",inname);

if ((inhandle=_open(inname,O_RDONLY|O_BINARY))==-1) {
fprintf(stderr,"Cannot open %s. Stop.\n",inname);
fclose(stream);
return -1;
}

// run through diff file and check original for exact match
fprintf(stdout,"PASS 1: Verifying original file...");
patchcount=0;
while (!feof(stream)) {
fscanf(stream,"%08lX: %02X %02X", // read single line
&patch[patchcount].addr,
&patch[patchcount].original,
&patch[patchcount].patched);
// end of file, exit
if
((!patch[patchcount].addr)&&(!patch[patchcount].original)&&(!patch[patchcoun
t].patched)) {
fprintf(stdout," %u bytes to be patched.\n",patchcount);
break;
}
// seek into original and check byte
lseek(inhandle,patch[patchcount].addr,SEEK_SET);
_read(inhandle,&inchar,1);
if (inchar!=patch[patchcount].original) {
fprintf(stderr,"\nByte mismatch at %08lX, byte %02X should be %02X!",
patch[patchcount].addr,inchar,
patch[patchcount].original);
}
// increment byte counter and check for overflow
patchcount++;
if (patchcount==PATCHMAX) {
fprintf(stderr," patch too big (>%u).\n",PATCHMAX);
close(inhandle);
fclose(stream);
return -1;
}
}

// close files we no longer need
close(inhandle);
fclose(stream);

// copy original file to output file
if (argc<3) {
strcpy(outname,inname);
strcat(outname,".patched");
} else strcpy(outname,argv[2]);

fprintf(stdout,"PASS 2: Copying file (%s -> %s)...",inname,outname);
if (copyfile(inname,outname)) {
fprintf(stderr," failed!\n");
return -1;
}

// open new file r/w mode
if ((outhandle=_open(outname,_O_RDWR,_S_IREAD|_S_IWRITE))==-1) {
fprintf(stderr,"\nHuh!? Cannot open %s. Stop.\n",outname);
return -1;
}

// patch bytes
fprintf(stdout,"\nPASS 3: Patching bytes...");
for (i=0;i<patchcount;i++) {
lseek(outhandle,patch[i].addr,SEEK_SET);
_write(outhandle,&patch[i].patched,1

Kurt Bilde (27-12-2000)
Kommentar
Fra : Kurt Bilde


Dato : 27-12-00 13:24

Hej Thomas !

Thomas P wrote:

> Jeg fandt også denne C++ kode... måske kunne en eller anden uddrage noget af
> den ? (ved INTET om C++)

Gå på Delphi Super Page og søg efter Gegory L Bullock og hans MakeUpd - skrevet
i 100 % Delphi !

-Kurt


Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408929
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste