/*************************************************************************/
/* Cracks tips                                                           */
/* by GonE                                                               */
/*                                                                       */
/* public vise : tous ceux qui s'interessent au crack                    */
/*************************************************************************/

1) D'abord, il faut savoir comment pensent les programmeurs, et connaitre
les methodes qu'ils utilisent pour proteger un prog : Les methodes anti-hack
(note : c'est strictement impossible d'empecher un hack, mais on peut
le freiner).
Ben il doit y en avoir des chiees mais voici celles que j'ai trouvees
(je les ai pas toutes testees, et bcp sont sans effets) :

** Les methodes anti-debugging

- On lit l'heure, on fait un petit truc, on lit a nouveau l'heure,
  et si il y a une difference de plus de 100 ms, on quitte discretement.
- On peut essayer de detourner l'interruption 3 (Pas a pas) qui pourrait
  empecher un debugger de fonctionner (mais je suis pas sur, j'ai pas essaye).
- Chercher dans toute la memoire (enfin, 640 Ko) une chaine du genre
  "Turbo Debugger", ou "Debug" et dans ce k, quitter. (je c, ca peut
  etre un prog qui ct fini mais ca doit etre verifiable en regardant
  la table d'allocation de la memoire).
- On cherche la variable d'environnement du dos CMDLINE. Si c'est par exemple
  "td prog.exe", eh ben ca quitte. Malin, non ?
- On pklite le prog et on note sa taille pklite. Alors on le reecrit en testant
  sa taille. S'il est superieur a un certain quotat, ben il quitte.
- Apres les fonctions pour quitter on met quelques fonctions pour faire
  tout planter, histoire de faire chier le hacker.
- On teste la memoire disponible. Si elle est anormalement basse (si par ex
  td est en memoire), en on quitte.

** Les methodes anti-decompile (aussi antidebug parfois)

- On code son code et ses data (par exemple par un not tout con, ou un add),
  sauf la routine pour le decoder, au debut. On peut aussi le pkliter, cela
  revient plus ou moins au meme.
- On met plein d'octets compliques (choisis au prealable), entre 2 lignes
  de code qui font croire a des mnemoniques de la mort qui tue, et avec
  de la chance, la 2e ligne de code sera associee avec des octets
  precedents pour faire une supermnemonique.
- On se fabrique un programme pour masquer le nom des fonctions et des
  variables, si votre compilateur a la mauvaise habitude de les stoquer
  dans le exe. (c'est le k du BC31)
- Mettre du code un peu partout, par exemple dans les donnees, le stack,
  le far heap, ou un autre fichier carrement. Mais bon c pa vraiment pratique.

** Les methodes anti-crack

- On a plein de variables globales qui sont modifiees lors de
  l'appel de fonctions. Si apres l'appel de la fonction, on ne remarque
  pas de modif, on quitte discretement.

** Les methodes anti-copy

- (Si on veut bien s'encombrer d'une disquette) on formate une disquette
  non formatee (dur a trouver je c) sauf 1 secteur, le dernier, ou un
  autre... Le prog verifie que ce secteur soit illisible.
- Ben mettre un dongle mais bon c'est depasse ca !

Dans les 2 k, il faut savoir modifier le .EXE et non pas la disquette, ou
se creer un dongle a la con.

** Les autres methodes

- Essayer de foutre la merde discretement chez le hacker quand on decouvre
  une modif. Par ex, effacer toutes les fat du disque dur. Mais bon ils ne
  font jamais ca, c'est vraiment salop. (mais efficace!!) Le hacker finira
  bien par prendre sa revenche... Ou alors, on peut faire planter son
  systeme totalement (DEF Bond pourra vous dire comment).
- S'envoyer un mail donnant les coordonnees du hacker (mais bon s'il a un
  modem, ca se voit. Pas s'il est sur numeris ou cable)...
- Et puis si ca vous suffit pas, allez voir les methodes de ce programme, qui
  detourne pas mal d'interruptions. Remercions son auteur anonyme. 'parait
  que ca stoppe td.

>> ANTIDEBUG.ASM qui doit etre linke avec un prog en pascal
 .386p
 .MODEL TPASCAL
 .DATA
 oldint3 dd ?
 anc_interrupt3 dd ?

 .CODE

 public PIQ_Stop_System
 public Keyboard_off
 public Keyboard_on
 public No_Stepping

 keyb_off macro
 push ax
 in  al,21h
 or  al,02
 out 21h,al
 pop ax
 endm

 keyb_on macro
 push ax
 in  al,21h
 and al,0Fdh
 out 21h,al
 pop ax
 endm

 PIQ_Stop_System proc near
 push ds
 push ax
 push bx
 push cs
 pop  ds                             ; CS en DS
 mov  cs:word ptr [@int_21_fonct],4CB4h  ; Fonction arreter le Programme
 @int_21_fonct:
 mov  ah,30h                         ; Fonction lire la version du DOS
 int  21h
 pop  bx
 pop  ax
 pop  ds
 ret
 PIQ_Stop_System endp

 Keyboard_off proc near
 keyb_off
 ret
 Keyboard_off endp

 Keyboard_on proc near
 keyb_on
 ret
 Keyboard_on endp

 No_Stepping proc near
 push ax
 jmp @Nostep+2
 @Nostep:
 mov ds:byte ptr [06EBh],00
 mov ax,4C01h
 int 21h
 pop ax
 ret
 No_Stepping endp

 public protected_stopping
 protected_stopping proc pascal
 pusha
 cli                         ; inhibe les interruptions
 mov eax,cr0                 ; active le mode prot,g,
 or eax,1
 mov cr0,eax
 jmp PROTECTION_ENABLED      ; efface le canal d'ex,cution
 PROTECTION_ENABLED:

 and al,0FEh                 ; r,tablit le mode r,el
 mov cr0,eax                 ; ne remet pas _ z,ro le processeur
 jmp PROTECTION_DISABLED     ; efface le canal d'ex,cution
 PROTECTION_DISABLED:
 sti                         ; restaure les interruptions
 popa
 ret
 protected_stopping endp

 public Check_vector
 Check_vector proc pascal check : dword;
 mov bx,0
 mov es,bx
 mov bx,18
 mov eax,es:[bx]
 mov oldint3,eax
 mov eax,check
 mov es:[bx],eax
 ret
 Check_vector endp

 public Vector_ok
 Vector_ok proc pascal check : dword;
 mov bx,0
 mov es,bx
 mov bx,18
 mov eax,es:[bx]
 cmp eax,check
 je  @check_ok
 mov al,0
 jmp @check_fin
 @check_ok:
 mov al,1
 @check_fin:
 ret
 Vector_ok endp

 public restore_Checkvector
 restore_Checkvector proc pascal
 mov bx,0
 mov es,bx
 mov bx,18
 mov eax,oldint3
 mov es:[bx],eax
 ret
 restore_Checkvector endp

 public Copy_int21_int3
 Copy_int21_int3 proc pascal
 mov bx,0
 mov es,bx
 mov bx,18
 mov eax,es:[bx]
 mov anc_interrupt3,eax                ; sauvegarde l'ancienne int 3
 mov bx,84                             ; charge l'int 21
 mov eax,es:[bx]
 mov bx,18                             ; et la m,morise en int3
 mov es:[bx],eax
 ret
 Copy_int21_int3 endp

 end

>> Le .PAS qui y lie
BEGIN
clrscr;
writeln('Checksum sur Int3-Vector');
check_Vector(12345678);
writeln('desactiver Keyboard');
keyboard_off;
writeln('Stepping-piege');
no_stepping;
writeln('PIQ-Trick');
PIQ_Stop_System;
writeln('Protected-Mode switching');
Protected_stopping;
writeln('Vector-Checking');
If NOT Vector_Ok(12345678) then begin;
clrscr;
writeln('Non non, n''allez pas debugger !');
halt(0);
end;
writeln('retablir check-Vector');
Restore_checkVector;
writeln('Keyboard reconnecte');
keyboard_on;
writeln('Et voila ! Nous sommes dans le programme');
readln;
end.



2) Cracker un EXE, c'est aussi reperer quelques fonctions elementaires.

/*                                                             */
/*** Borland C++ DOS *******************************************/
/*                                                             */


//// REPERER MAIN

En general, il est assez proche du debut du fichier exe.

void main(int argc,char **argv)
  cs:03AC 55             push   bp
  cs:03AD 8BEC           mov    bp,sp
 il se finit par
  cs:03B6 5D             pop    bp
  cs:03B7 C3             ret
 bon, je c presque toutes les fonctions se finissent comme ca..

 ou alors
void main(void)
  cs:034B C8120000       enter  0012,00 <- locals
  cs:034F 56             push   si
  cs:0350 57             push   di
 il se finit par
  cs:040A 5F             pop    di
  cs:040B 5E             pop    si
  cs:040C C9             leave
  cs:040D C3             ret
attention : apres le ret de main(), en general, il y a plein de trucs
qui ne signifient rien.

//// QUAND ON QUITTE MAIN

fonction de sortie du programme : apres le ret de main
  cs:015B 50             push   ax
  cs:015C E80303         call   _exit
void exit(int status) c'est la fonction la plus rentable a reconnaitre.
  cs:0462 55             push   bp
  cs:0463 8BEC           mov    bp,sp
  cs:0465 33C0           xor    ax,ax
  cs:0467 50             push   ax  // bien noter les 2 push ax et push pile
  cs:0468 50             push   ax
  cs:0469 FF7604         push   word ptr [bp+04]
  cs:046C E8A6FF         call   0415 <- varie // et encore une fct..
  cs:046F 5D             pop    bp
  cs:0470 C3             ret

/// QUELQUES FONCTIONS CLEFS

int printf(...);
  cs:1EC8 55             push   bp
  cs:1EC9 8BEC           mov    bp,sp
  cs:1ECB B82E20         mov    ax,202E
  cs:1ECE 50             push   ax
  cs:1ECF B81402         mov    ax,0214
  cs:1ED2 50             push   ax
  cs:1ED3 FF7604         push   word ptr [bp+04]
  cs:1ED6 8D4606         lea    ax,[bp+06]
  cs:1ED9 50             push   ax
  cs:1EDA E852E8         call   __VPRINTER
  cs:1EDD 5D             pop    bp
  cs:1EDE C3             ret

int getch();
  cs:101A 803E8E0400     cmp    byte ptr [__cFlag],00
  cs:101F 740A           je     102B
  cs:1021 C6068E0400     mov    byte ptr [__cFlag],00
  cs:1026 A08F04         mov    al,[__cChar]
  cs:1029 EB05           jmp    1030
  cs:102B B80007         mov    ax,0700
  cs:102E CD21           int    21
  cs:1030 B400           mov    ah,00
  cs:1032 C3             ret

  et si on cherche B8??4C, on a des chances de trouver ou le programme
  quitte.
.. et vous pouvez continuer si ca vous amuse. Moi je prefere essayer de
debugger les progs a la con de defbond...

/*************************************************************************/
/*                       CONCLUSION ET MORALE                            */
/*                                                                       */
/* Proverbe d'outrequeben : pierre qui roule n'amasse pas mousse         */
/* Si vous elucidez la quadrature du cercle, emailez-moi                 */
/* Et reportez les bugs et les conseils a gone@caramail.com              */
/**************************************************** GonE98 *************/
