Traduit pascal code en c code aide

Résolu
zilot2 Messages postés 8 Date d'inscription samedi 25 octobre 2008 Statut Membre Dernière intervention 15 novembre 2009 - 22 août 2009 à 14:55
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 - 28 août 2009 à 18:55
Bonjour,et pardonnez mon francais
j'ai un code source en pascal et j'ai pas reusii a le traduire en c si quelq'un peut m'aide
Program patch; //juste pour indiquer le nom du prog

Uses CRT, DOS; //indique quelle bibliothèque on va utiliser des
//routines graphiques DOS

Const //indique que l' on va charger des constantes
//en mémoire pour les réutiliser par la suite

FileN : String = 'progde~1.exe'; //FileN va donc indiquer
//le fichier 'progde~1.exe'
//dès que l' en aurat besion

BytesToChange : Integer = 2; //2 indique le nombre d' octects à
//patcher

FileS : LongInt = 564132; //564132 indique la taille du fichier.
//Elle s' éxprime en octects

A : Array[1..2] of Record //indique que l' on va donner
//de modification allant de
//1 à 2, ici en octects


A : Longint;
B : Byte;


End =

(
(A:$303e6;B:$90), //adresses héxadécimales à modifier et leurs octects
(A:$47274;B:$90) //attention !! sur la derniere ligne=> pas de virgule !!!!
);


Var

F : File;
Ch : Char;
Attr : Word;
I : LongInt;

If (FSearch(FileN,FExpand(FileN))='') then //cherche le fichier FileN,
//S'il est non présent,
//alors => Message d'erreur...

Begin


Writeln('oOOPS!: File ',FileN,' not found !!!');
Writeln('-Current bad size has: ', FileSize (F),' bytes.');
Writeln('-Good size should be : ', FileS ,' bytes.');

Halt(1);

end;
Assign(F,FileN);
Reset(F,1); //pour ouvrir un fichier

TextColor(8);
Write('Checking FileSize...');

If FileSize(F)<>FileS then //FileSize verifie la taille du fichier...

begin //début du mesage d' erreur
//(si le fichier cible n'a pas la bonne taille..)


Writeln('ERROR!');

Writeln('');

Writeln('File ',FileN,' has an invalid Size !!!');
Writeln('Crack aborted...');

Close(F); //on ferme le fichier
Halt(1); //on arrete le prog
end //fin du passage affichant une erreur...

Else

begin //ce qui suit est le "patchage" des octets...



end; //fin de la reconnaissance le la taille du fichier


TextColor(8);
Write('pat ',FileN,'...'); //Et hop!, on réutilise encore ',FileN,'


For I := 1 to BytesToChange do //change les octect de 1 à...'x'

begin
Seek(F,A[I].A); //repere l'offset a patcher

Ch:=Char(A[I].B); //on identifie la nouvelle valeur de l'offset
//et on la stock dans 'Ch'

Blockwrite(F,Ch,1); //ouf! Après toutes les conditions remplis, le prog va
//enfin pouvoir modifier le fichier cible en inscrivant
//des octects par blocs de 1, tels qu'ils sont indiqués
//par (A:$303e6;B:$00) et (A:$47274;B:$00) dans l'exemple.

end;
Close(F)
end.

4 réponses

cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
24 août 2009 à 18:02
Salut,

Mais dis moi, mais c'est un crack pour patcher un .exe ça !
Bon, au moins, c'est pour cracker un crackme d'un cours de hacking...
Il met deux nop (Opcode 0x90), l'un à 0x303e6 et l'autre à 0x47274.

Et le code est écrit pour être facilement réutilisable pour un autre crack : il suffit de modifier A pour indiquer où et quels octets à mettre en place, de changer BytesToChange, de changer la taille, fileN... Bref pour près pour du travail à la chaîne. Les infos de A sont finalement exploitées dans une boucle.

Il n'y a pas de difficulté dans la traduction. Faut juste remplacer BlockWrite par un petit coup de pointeur.
Pour le reste...
Write/WriteLn -> printf
Assign -> fopen
Seek -> fseek
Close -> fclose
FileSize -> un fseek pour aller au bout, un ftell pour avoir la taille.
Halt -> Fonction déconseillée. Mieux vaut architecturer le programme autrement (if, goto...)
FSearch -> Remplacé par un test sur le fopen.
TextColor -> On oublie
3
zilot2 Messages postés 8 Date d'inscription samedi 25 octobre 2008 Statut Membre Dernière intervention 15 novembre 2009
26 août 2009 à 19:11
merci rt15 je pense que tu as vu les cours de pifoman en faite pas seulement fwrite(&shellcode,sizeof(shellcode),1,f);
il faut ouvrir aussi comme ca fopen("prog.exe","r+");
il faut r+ pas w ou a
These constants specify the access type ("a", "r", or "w") requested for the file. Both the translation mode ("b" or "t") and the commit-to-disk mode ("c" or "n") can be specified with the type of access.

The access types are described below.

"a"
Opens for writing at the end of the file (appending); creates the file first if it does not exist. All write operations occur at the end of the file. Although the file pointer can be repositioned using fseek or rewind, it is always moved back to the end of the file before any write operation is carried out.

"a+"
Same as above, but also allows reading.

"r"
Opens for reading. If the file does not exist or cannot be found, the call to open the file will fail.

"r+"
Opens for both reading and writing. If the file does not exist or cannot be found, the call to open the file will fail.

"w"
Opens an empty file for writing. If the given file exists, its contents are destroyed.

"w+"
Opens an empty file for both reading and writing. If the given file exists, its contents are destroyed.

When the "r+", "w+", or "a+" type is specified, both reading and writing are allowed (the file is said to be open for "update"). However, when you switch between reading and writing, there must be an intervening fflush, fsetpos, fseek, or rewind operation. The current position can be specified for the fsetpos or fseek operation.
svp rt15 c'est quoi l'equivalent de FSearch et fexpand en c?pour trouver le path d'un fichier et merci
3
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
24 août 2009 à 18:05
Heu... J'ai dit une ânerie moi. Remplacer BlockWrite par fwrite.
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
28 août 2009 à 18:55
FSearch et fexpand -> teste simplement le retour de fopen. S'il est null, le fichier existe pas (Ou ne peut être ouvert), s'il est différent de null, le fichier existe.

FILE* lpToto;

lpToto = fopen("lefichierquisertarien.txt", "Un mode d'ouverture");
if (! lpToto)
  printf("Impossible d'ouvrir le fichier lefichierquisertarien.txt\n");
else
  fclose(lpToto);


Si tu veux vraiment tester proprement l'existence d'un fichier, utilise FindFirst.
0
Rejoignez-nous