-------------------------------------------------------------------------------
NoRoute #1  Applic sur RingFence              4759    Pixel4     NoRoute #1
-------------------------------------------------------------------------------


                     Comment degager les     
                    residents empecheur de   
                       Hacker en rond...     
                                             
                     Applic sur RingFence    


                                         Texte et code par PiXel4
                                                  (20/02/97)






        Le hacking nous propose des themes tres varies... mais ds beaucoups
de cas cela necessite 1 acces sur 1 becane relie sur rezo local. 
( cas d'une universite !)   Mais avant de travailler correctement, y fo
installer kelque softs bien puissants :)
Et c'est toujours po evidant, vu que certain sysop de bahu ou d'univ mettent
des protections logicielles sur leurs becannes pour eviter le transfer par
disquettes !
        Bah, tu me dira, on n'a ka faire sauter le prg... po aussi simple ;)

Tout d'abord, fo bien savoir de koa on parle...
-----------------------------------------------

Le logiciel cibler ici est destine a ne laisser "passer" que les disquettes
autorisees a etre utilises sur LE pc, elle sont dites "certifies". Si une autre
disquette venait a etre introduite, le petit prg resident declanche aussi tot 1 
message du genre *Disk etranger !!!* en emettant 1 bruit desagreable et
strident, qui ne manquera po d'attirer l'attention de tout le monde et surtout
ds op !       BIIIIP BIIIP BIIIP       Hehe,  cale :(
Cela peut devenir genant puisque l'on peut meme plus stoker des utils, des
prg, des jeux sur les ordis...

Fo remedier a tout ca !

Analyse methodique :
--------------------

        Le logiciel que je vais decrire s'appelle Ring Fence, mais il en
existe plein d'autres comme celui ci et ils marchent generalement tous de la 
meme facon, alors l'adaptation n'est po tres complique !
A vous de la faire en fonction de ce que vous avez. Mais pour vous aider, un
fichier Zip a ete inclus avec l'article, pour vous permettre de vous faire la
main, et de mieux comprendre sont fonctionnement  :)

        Ring Fence (RF) est un petit residant en .COM, et il se charge en
memoire, appele par l'autoexec.bat, et se trouve ds la racine du hdd en
fichier cache.

        Certains ont bien essaye de l'effacer pour supprimer le probleme,
mais c'est la qu'est le probleme !!! RF est se compose de 2 parties !
L'une visible, le fichier com, et l'autre sur les secteurs d'amorce du dur.
Donc si vous enlever RF.com ,1 partie de rf se charge quand meme, et resultat:
quand vous arrivez sous le dos, ben on ne peux rien faire (HDD en Read Only)
Po moyen d'ecrire sur le dur ! et bien sur il reconnait po les autres lecteurs
que le c:


Recapitulons:

- la partie cache de RF bride le hdd (read only)
- le fichier fr.com debride le hdd ( hdd ok) mais en plus ajoute 1 vecteur qui 
  controle si on place bien 1 disk certifie ds le lecteur A: ou B:
  (Int 13h)

Actions :
---------

Il existe plein de methode pour contourner ce petit pb...

Je ne vais en developper qu'une... celle qui pour moa est la plus propre, car
apres votre passage, un autre utilisateur trouvera le hdd,  et la memoire
intacte comme si le crack n'avait jamais eu lieu ( cas ds 1 univ.)

C'est donc une intervention en memoire et non 1 modif sur 1 fichier.
On pourrait aussi penser a 1 modif du fichier, en contournant le code implique
ds la verif du disk, (ce qui necessite de localiser le test CRC du logiciel,
car en principe ce genre de soft en on 1, pour eviter l'infection par ds virus
ou la modif par 1 petit malin ... mais ca c'est po 1 pb le CRC ! )

Ou alors, carrement degager l'integralite de RF sur le hdd
Mais alors la, c'est voyant et tout le monde peux faire ce qu'il veux avec les
lecteurs, et vous n'aurez plus d'acces privilegi :(

Ou tout simplement si vous ne savez po programmer, charger rf.com en memoire
et formater des diskquettes, qui seront donc certifier.
(tout ca chez vous, pour mettre les prg dont vous avez besion... )
Mais c'est certainement la solution la plus chiante... car elle necssite plein
d'op de formatage a chaque fois de l'on veux modifier qque chose !!!
(Ne marche po forcement avec un autres soft comme RF...)

Et j'en oubli encore, parceque yen a plein !



La technique que nous allons utiliser necessite quelques conaisances en ASM
et c'est la plus simple d'emploi, car on peut ensuite passer toutes les
disquettes "normales".

Alons bon, RF n'est po long, nous allons donc le dessember en integralite !
Pour ce genre 2 petit prg residant, c'est la sol qui s'impose...

Vous trouverez join a ce fichier TxT le prg RF.COM et son code desass, ds le
Zip. Les essais avec RF.com se font sans pb ! Il ne va po toucher o disk !
Il se charge juste en mem et controles les disks, comme ca vous pourrez voir
si le crack marche !

Je ne detaille que les parties interessantes du code, vous avez le fichier
RF.asm ds son integralite (source de desassemblage) !

START !!!
  (commence a 100, c'est 1 com... bien sur...)

     0100  E9 0C1A				jmp	real_start		; (0D1D)

# Bahhh, ca commence bien... ! on nous balance deja a la fin du prg...
# allons bon... vers le 0D1D

#    0D1D  0E                                   push    cs  
#    0D1E  1F                                   pop     ds
# initialisation du seg de donnees
# ici on place les textes ( les messages d'err et l'ecran de presentation...)

     0D1F  B4 0D				mov	ah,0Dh
     0D21  CD 21				int	21h			; DOS Services  ah=function 0Dh

#    0D23  B4 09                                mov     ah,9
#    0D25 BA 0874                              mov     dx,offset data_64       ; (815C:0874=20h)
#    0D28  CD 21                                int     21h                     ; DOS Services  ah=function 09h
# Affiche l'ecran de presentation RF

#    0D2A  B4 62                                mov     ah,62h
#    0D2C  CD 21                                int     21h                     ; DOS Services  ah=function 62h
# la c'est....                             ... get Program Segment Prefix bx
#
# argggg... et puis merde, si je commence a tout detailler comme ca, je vais
# po m'en sortir ! alors je vais a l'essentiel !

     0D2E  8E C3				mov	es,bx
     0D30  26: 8B 1E 002C			mov	bx,es:data_1e		; (0000:002C=0EF6Fh)
     0D35  8E C3				mov	es,bx
     0D37  33 DB				xor	bx,bx			; Zero register
# gna gna gna... tout ca on s'en fou... jusqu'a : 0D6B
# ben vi, c'est les tests d'integritee....
# important selon la methode de crack choisie... ou autrement si vous voulez
# ecrire des conneries a la place de l'ecran de presentation... :)

#    0D6B BA 0C54                              mov     dx,offset data_86       ; (815C:0C54='')
#    0D6E  B4 09                                mov     ah,9
#    0D70  CD 21                                int     21h                     ; DOS Services  ah=function 09h
# La il a affiche les tests d'integritees.

#    0D72  B8 3D00                              mov     ax,3D00h
#    0D75 BA 0C66                              mov     dx,0C66h                ; (815C:0C66=0)
#    0D78  CD 21                                int     21h                     ; DOS Services  ah=function 3Dh
# Ici, le prg ouvre le fichier fr.com (pour test CRC)
										;  open file, al=mode,name@ds:dx
     0D7A  8B D8				mov	bx,ax
     0D7C  C7 06 0157 0000			mov	data_24,0		; (815C:0157=0)
     0D82  BF 0001				mov	di,1
     0D85			loc_94:						;  xref 815C:0DBA

#    0D85 B4 3F                                mov     ah,3Fh                  ; '?'
#    0D87  B9 0200                              mov     cx,200h
#    0D8A BA 0874                              mov     dx,offset data_64       ; (815C:0874=20h)
#    0D8D  CD 21                                int     21h                     ; DOS Services  ah=function 3Fh
# La il lit le fichier...
										;   cx=bytes to ds:dx buffer
     0D8F  73 03				jnc	loc_95			; Jump if carry=0
     0D91  E9 003F				jmp	loc_98			; (0DD3)
     0D94			loc_95:						;  xref 815C:0D8F
     0D94  3D 0000				cmp	ax,0
     0D97  74 23				je	loc_97			; Jump if equal

# et ici, si le test est bon, il poursuit... vers...   cs:0DBC

     0DBC			loc_97:						;  xref 815C:0D97
     0DBC  B4 3E				mov	ah,3Eh
     0DBE  CD 21				int	21h			; DOS Services  ah=function 3Eh
# Ici, il vient de fermer le fichier fr.com

# Et alors, c'est la partie la + interessante du prg pour le test CRC                                                                                 ;  close file, bx=file handle
     0DC0  A1 0157				mov	ax,data_24		; (815C:0157=0)
     0DC3  03 06 0104				add	ax,data_5		; (815C:0104=0BB0Dh)
     0DC7  3D FFFF				cmp	ax,0FFFFh
#    0DCA  74 0B                                je      loc_99                  ; Jump if equal
# VOILA ce qui le perdra :)))
# cet petit saut conditionnel !
# si il est po verifie , le prg quitte !
# alors remplacer le par 1 JMP 
# soit JMP 0DD7, ce qui pour 1 modif en editeur hexa donne : EB 0B
# au lieu de 74 0B :)

{
Explic pour les neuneux...
A l'aide d'1 editeur HEXA, ouvez le fichier RF.COM.
Il fo ensuite remplacer notre branchement je par 1 jmp ! (jump...)
On recherche donc un 74 0B, mais il se peux qu'il y ai plusieur 74 0B ds le
prg.
Alors on rallonge la chaine... on prend ce qui est devant ou derriere !
par exemple :
 - on va chercher        : 04 3D FF FF 74 0B
 - pour le remplacer par : 04 3D FF FF EB 0B
Et c'est tout !
}

#    0DCC BA 0CB6                              mov     dx,offset data_88       ; (815C:0CB6='')
#    0DCF  B4 09                                mov     ah,9
#    0DD1  CD 21                                int     21h                     ; DOS Services  ah=function 09h
# la il affiche que le prg est altere... utiliser 1 copie saine...
# o cas ou le crc soit po bon !
										;  display char string at ds:dx
#    0DD3                       loc_98:                                         ;  xref 815C:0D4B, 0D91
#    0DD3  B4 00                                mov     ah,0
#    0DD5  CD 21                                int     21h                     ; DOS Services  ah=function 00h
# et fin du prg... termnaison 
                                                                                ;  terminate, cs=progm seg prefx
#    0DD7                       loc_99:                                         ;  xref 815C:0DCA
#    0DD7 BA 0CF6                              mov     dx,offset data_90       ; (815C:0CF6='- OK')
#    0DDA  B4 09                                mov     ah,9
#    0DDC  CD 21                                int     21h                     ; DOS Services  ah=function 09h
# et ici , le fameux 0DD7 pour notre JMP !
# le prg affiche OK !
# et il continu normalement meme si le test est po bon !!!


Bon ben voila c'est fini pour la partie controle de l'integrite !
On attaque maintenant la partie hack du sys de controle des disquettes.
Et ya du boulot !

Bon tout d'abord, on remarque que losque l'on charge RF,le prg place 1 vecteur
d'interruption : 13 2F (chez moa vers l'adrs 0510:0)

Ben pour ceux qui connaisse deja bien les verteurs d'interuption, le compte
est bon... on le degage !
(Apres quand on se casse, on relance rf.com [ex d'univ])

Mais y une autre solution plus subtile... Si on continue a desass le prg, on
voit 1 petit truc interessant, en ce qui concerne la creation et la modif de
vecteurs.

En effet, le prog va intervenir sur l'int 13h (acces lecteurs etc...) et va
creer de nouvelle fct. Reste donc plus qu'a analyser le code et a voir si ya
po des fct qui pourrait nous interesser !

Trace Start !
(suite)
     0DDE BB 013A				mov	bx,offset data_8	; (815C:013A=6Eh)
     0DE1  BA 0000				mov	dx,0
     0DE4 BE 0082				mov	si,data_4e		; (815C:0082=0)
     0DE7			loc_100:					;  xref 815C:0DEE, 0E11, 0E3D, 0E45
										;            0E4D, 0E55
#    0DE7 AC                                   lodsb                           ; String [si] to al
#    0DE8  3C 0D                                cmp     al,0Dh
#    0DEA  74 6B                                je      loc_109                 ; Jump if equal
#    0DEC  3C 2F                                cmp     al,2Fh                  ; '/'
#    0DEE  75 F7                                jne     loc_100                 ; Jump if not equal
# Le prg se casse generalement vers le loc 109... et ne continu po sur le
#  0E62...
# De toute facon on se retrouvera sur le loc 109.


# On va donc faire 1 tour du cote du loc 109...
										;            0E3B
#    0E57  B8 3080                              mov     ax,3080h
#    0E5A  BF 5349                              mov     di,5349h
#    0E5D  BE 4E47                              mov     si,4E47h
#    0E60  CD 13                                int     13h                     ; ??int non-standard interrupt
# AHHHH... Ici on n'a le droit de se poser des questions....
# Vois la connaisser cette fct de l'int 13h... non, ben moa non plus !
# Continuons 1 peu pour voir...

     0E62  3C FF				cmp	al,0FFh
     0E64  74 03				je	loc_110			; Jump if equal
     0E66  E9 000C				jmp	loc_111			; (0E75)
     0E69			loc_110:					;  xref 815C:0E64
#    0E69  B4 09                                mov     ah,9
#    0E6B BA 0CFD                              mov     dx,offset data_91       ; (815C:0CFD='')
                                                           (RF deja inst...)
#    0E6E  CD 21                                int     21h                     ; DOS Services  ah=function 09h
# Ici, c'est tres clair... Le logiciel RF utilise 1 fonction qu'il definit lui
# meme, mais comme il ne l'a pas encore definit, le test est negatif !
# ce qui signifie que c'est le permier lancement... il peut s'installer !

# Je reprend, la fonction 30h, sous fct 80h de l'int 13h est cree par RF.
# Donc, on lance RF pour la premiere fois, le soft ne connait po cette fct
# puisqu'il ne l'a po encore inst !
# Or, si il est deja resident, il reconnait cette fonction, et place donc
# 0FFh ds AL, et suite a la comparaison, le test est positif, il saute donc
# sur loc 110 et quitte vers le dos ! (message -RF deja installe-) 
#
# Ici, on a avanc, on connait 1 fct posee par RF ds l'int 13h !
# mais elle ne nous sert po a grand chose! En grattant un peu on va trouver
# des trucs plus interessant !


										;  display char string at ds:dx
#    0E70  B8 4C01                              mov     ax,4C01h
#    0E73  CD 21                                int     21h                     ; DOS Services  ah=function 4Ch
# termine le prg
                                                                                ;  terminate with al=return code
     0E75			loc_111:					;  xref 815C:0E66
#    0E75  B8 4BFD                              mov     ax,4BFDh
#    0E78  CD 13                                int     13h                     ; ??int non-standard interrupt
# encore 1 op non conforme hehehe :))
# avec l'int 13h... a approfindir !

     0E7A BB 013A				mov	bx,offset data_8	; (815C:013A=6Eh)
     0E7D  8B 07				mov	ax,[bx]
     0E7F  33 47 02				xor	ax,[bx+2]
     0E82  33 47 04				xor	ax,[bx+4]
     0E85  33 47 06				xor	ax,[bx+6]
     0E88  A3 0143				mov	data_13,ax		; (815C:0143=0)

#    0E8B  B8 3513                              mov     ax,3513h
#    0E8E  CD 21                                int     21h                     ; DOS Services  ah=function 35h
# lit notre lecteur d'int
                                                                                ;  get intrpt vector al in es:bx
     0E90  89 1E 0198				mov	word ptr ds:[198h],bx	; (815C:0198=0)
     0E94  89 1E 019F				mov	word ptr ds:[19Fh],bx	; (815C:019F=0)
     0E98  8C 06 019A				mov	word ptr ds:[19Ah],es	; (815C:019A=0EF6Fh)
     0E9C  8C 06 01A1				mov	word ptr ds:[1A1h],es	; (815C:01A1=0EF6Fh)
#    0EA0 BA 0177                              mov     dx,offset int_13h_entry
#    0EA3  B8 2513                              mov     ax,2513h
#    0EA6  CD 21                                int     21h                     ; DOS Services  ah=function 25h
# Et la, c'est 1 partie super importante !!!
# noter bien le : dx,offset int_13h_entry
# ce sont les routine qui vont etre pose ds notre vecteur.
# je vous renvoye donc a cette adresse qui compose les 2.4ko du soft charge
# en memoire.
# (c'est a peu pres tout ce qu'il y a avant 0D1D ;
# sans les messages de presentations...bien sur )

                                                                               ;  set intrpt vector al to ds:dx
#    0EA8  B8 3513                              mov     ax,3513h
#    0EAB  CD 21                                int     21h                     ; DOS Services  ah=function 35h
# Lit le vecteur

# 1 peu + loin...

#    0EBD BA 0242                              mov     dx,offset int_13h_ent_1
#    0EC0  B8 2513                              mov     ax,2513h
#    0EC3  CD 21                                int     21h                     ; DOS Services  ah=function 25h
# Encore 1 adressage qui compose le resident...
# que l'on retrouve aussi a :
# (pour la 2Fh)

     0EF9  B4 25				mov	ah,25h			; '%'
     0EFB  B0 2F				mov	al,2Fh			; '/'
     0EFD BA 0712				mov	dx,offset int_2Fh_entry
     0F00  CD 21				int	21h			; DOS Services  ah=function 25h

# Apres + rien d'important... le programme se termine en restant residant.

Pour ceux qui touche deja po mal, y ont du se faire chier jusqu'ici...
Mais je voulais que cette article soit accessible a tout le monde. Alors
les experts pourrons chercher ds la premiere partie du prog les fonctions
interessante si ca les amuses...    :)
Pour les autres, ca commence a se corser, et mon article commence a etre long,
vu que j'ai po encore traite la partie sur le crack !

Ha, la je sens que yen a qui vont dire... il se defile :))
Mais non, j'ai tous simplement prevu d'ecrire 1 article specialement oriente
sur les vecteurs et les interruptions ! Et je reparlerais du cas de RF qui
est tres interessent, (et bien sur je reprendrais la permiere partie du prg.
Mais la, 1 connaissance parfaite de l'ASM est exig et se sera 1 article
plutot pour les experts en crk ;) Avis aux amateurs...
Ben ouaip, jusque la yen a eu que pour les newbies :))


En attendant je vais vous filer du tout cuit ;)

On connait deja la 3080h qui verifie si le prg est installe, mais ya aussi :

- 3000h ,qui desactive RF !!!
- 3002h ,qui reactive RF
- 3009h ,qui certifie 1 disquette

et yen a peut-etre d'autres... ( a vous de chercher =)


Passons maintenant a l'elaboration du crack !
---------------------------------------------

Ben c'est po bien complique, il suffit d'appeler l'int 13h avec les bonnes
valeurs ds les registres :

mov di,5349h  ;# Reportez vous a la loc 109 !
mov si,4e47h  ;#       "         "
mov ax,3000h  (pour desactiver par exemple...)
int 13h

C'est TOUT !!!  Tout compte fait, c'etait po si long !
Le plus rapide etant de faire 1 petit fichier com.

Rmq: Le di et si doivent etre imperativement pos... sinon ca marche po.

Ya des exemples ds le fichier ZIP:
 - ACTIV_RF.ASM
 - DESAC_RF.ASM
 - CERTIF.ASM
 - TESTRF.ASM
Et les COM respectif.

On peut aussi tout inclure ds 1 seul fichier... mais ca c'est de la prog
classique : fichier KSILLY.COM (c'est qu'1 exemple, on peut faire 10 *
mieux... mais aussi 10 * + long ... ;)

Ben voila, c'est a peu pres tout ce que j'avais a dire sur RF :))

Je remercie tout particulierement Berth ( /MINE\ ), avec qui on s'est bien
amus a cracker cette petite merde hehehe :)

GREETINGS: SD,Sorcery,CoD4,MikaSoft,Fft,Kwel,Doc.


                                        PiXel4
