[..] Script Anti-copie

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
saltan
Niveau 2
Niveau 2
Messages : 27
Enregistré le : dim. 30 sept. 2007 15:58
Status : Hors ligne

[..] Script Anti-copie

#1

Message par saltan »

Bonsoir !

J'avais besoin il y a peu de temps de créé un "anti-copie" a integrer dans un de mes scripts. Pour ça, j'ai utiliser une méthode simple, mais peu sur:
La vérification au début du lancement du prog si une clé du registre existait, clé que j'avais préalablement créée grace a un mini script (deux lignes :D)

En effet, si quelqu'un utilisait le prog sans avoir utiliser le mini-script avant ça ne marchait pas.

Je croyais ma protection éfficace. Sauf que le mini-prog, qui devait s'auto-détruire après avoir créé la clé registre, ne s'auto-détruit pas. Il est donc facil d'envoyé ce mini-prog d'un ordi a un autre :(

Hum... je ne suis pas clair.
Disons qu'en fait, lors de mes test, le mini-prog se suprimait de lui même. Or, quand il est compiler, il ne se suprime plus. Ce qui rend ma protection (déjà peu fiable) completement inutile.

Vous avez une meilleure idée ? Comment empêcher la copie ?

Merci.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

#2

Message par Tlem »

Voici deux exemples de scripts qui s'auto-détruisent, même compilés.

Rajouter les fonctions dans votre code, et faites y appel quand vous en avez besoin.

Code : Tout sélectionner

Func _SelfDelete($iDelay = 0)
    Local $sCmdFile
    FileDelete(@TempDir & "\scratch.bat")
    $sCmdFile = 'ping -n ' & $iDelay & '127.0.0.1 > nul' & @CRLF _
            & ':loop' & @CRLF _
            & 'del "' & @ScriptFullPath & '"' & @CRLF _
            & 'if exist "' & @ScriptFullPath & '" goto loop' & @CRLF _
            & 'del ' & @TempDir & '\scratch.bat'
    FileWrite(@TempDir & "\scratch.bat", $sCmdFile)
    Run(@TempDir & "\scratch.bat", @TempDir, @SW_HIDE)
EndFunc

Func SuiCide()
    $SC_File = @TEMPDIR & "\suicide.bat"
    FileDelete($SC_File)
    $SC_batch = 'loop:' & @CRLF & 'del "' & @SCRIPTFULLPATH & '"'  & @CRLF & _
         'ping -n 1 -w 250 zxywqxz_q' & @CRLF & 'if exist "' & @SCRIPTFULLPATH & _
        '" goto loop' & @CRLF & 'del suicide.bat' & @CRLF

    FileWrite($SC_File,$SC_batch)
    Run($SC_File,@TEMPDIR,@SW_HIDE)
    Exit
EndFunc
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
saltan
Niveau 2
Niveau 2
Messages : 27
Enregistré le : dim. 30 sept. 2007 15:58
Status : Hors ligne

#3

Message par saltan »

Pouvez vous (excusez moi si je reviens involontairement au tutoiement, c'est instinctif sur un forum pour moi, question d'habitude 8) ) décrire un peu le fonctionnement de l'une de ces fonctions ?

Par ce que j'avoue ne pas y comprendre grand chose... Et recopier bêtement ce script serait surement efficace, mais pas très profitable.

Merci !

Edit: Ca marche très bien, merci ! :D
Avatar du membre
Voodoo
Niveau 6
Niveau 6
Messages : 298
Enregistré le : ven. 20 juil. 2007 20:45
Status : Hors ligne

#4

Message par Voodoo »

[HorSujet]Une de ces deux fonctions sera dans forum Color 1.5 :D

merci Tlem. [/hs]
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

#5

Message par Tlem »

saltan a écrit :Pouvez vous décrire un peu le fonctionnement de l'une de ces fonctions ?

Par ce que j'avoue ne pas y comprendre grand chose... Et recopier bêtement ce script serait surement efficace, mais pas très profitable.
Alors, par exemple la fonction _SelfDelete(5) permettra d'auto-détruire le script en cours d'éxecution, après un délais de 5 secondes.

Le principe de la fonction, est de créer un script batch qui détruira l'exe compiler ou le script AU3, de lancer le batch, et de sortir du script AutoIt.

voici le code du batch créer :

Code : Tout sélectionner

ping -n 0127.0.0.1 > nul
:loop
del "C:\Documents and Settings\Tlem\Bureau\AutoDestruction.au3"
if exist "C:\Documents and Settings\Tlem\Bureau\AutoDestruction.au3" goto loop
del C:\DOCUME~1\Tlem\LOCALS~1\Temp\scratch.bat
Le batch lancé, détruit le script AutoIt, et ce détruit lui même ...
Modifié en dernier par Tlem le lun. 01 oct. 2007 22:24, modifié 1 fois.
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
saltan
Niveau 2
Niveau 2
Messages : 27
Enregistré le : dim. 30 sept. 2007 15:58
Status : Hors ligne

#6

Message par saltan »

Merci :D
saltan
Niveau 2
Niveau 2
Messages : 27
Enregistré le : dim. 30 sept. 2007 15:58
Status : Hors ligne

#7

Message par saltan »

Mais vous connaissez un autre mode anti copie ?

Parce que bon, un simple copier coller avant l'exécution du programme et l'anti copie est cracké ^^
Avatar du membre
Voodoo
Niveau 6
Niveau 6
Messages : 298
Enregistré le : ven. 20 juil. 2007 20:45
Status : Hors ligne

#8

Message par Voodoo »

Tu crées 2 valeurs dans le registre. Une contient la date à lequel le script a été lancé pour la premiére fois, l'autre que le programme ce lance pour la premiere fois (1 ou 0).

Quand le programme se lance pour la premiére fois, il inscrit la date dans le registre. Cette date correspond donc la date de compilation.( ce qui supppose que l'utilisateur lance le script des que tu lui passes).il suffit donc de verifié a chaque lancement si la date de lancement est égale à la date de compilation.

Si le programme est copié, la date dans le registre et la date de compilation ne correspondent pas. Le programme ne se lancera pas.

Compliquer mais efficace.
saltan
Niveau 2
Niveau 2
Messages : 27
Enregistré le : dim. 30 sept. 2007 15:58
Status : Hors ligne

#9

Message par saltan »

J'ai pas compris... :roll:
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1550
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

#10

Message par sylvanie »

une méthode de réaliser un anticopie est de patcher l'exe avec des infos propres
à la plateforme. Cependant on ne peut pas demander avant à l'utilisateur de
donner des infos sur sa machine ...
Donc il faut récupérer ses infos via l'execution, les enregistrer en registie
par exple, le tout chiffré pour que ce ne soit ni évident à comprendre ni
falscifiable.
Ensuite il faut faire comprendre à l'exe qu'il a déjà créé cette clé de registre
afin qu'en cas d'effacement il en déduise que c'est une tentative de bidouillage
et donc pour celà, on patch l'exe lui même avec un info fixe, qu'on appelle tag,
magic, ou autre terme.
Lorsque l'exe se lance il regarde si il contient cette valeur au bon endroit et
dans ce cas en déduit qu'il a déjà été lancé / installé.

L'exple ci dessous se compote ainsi :

un script externe à compilet, est à embarquer dans l'exe finale par fileinstall qui
patchera son hôte lors de sa première execution.

déroulement :
l'exe se lance, il regarde à la fin si il se termine par 0x1111111128021977
(c'est le tag que j'ai pris). Je l'ai mis à la fin pour simplifier l'exple, mais
il est préférable de trouver une zone fixe de l'exe proche d'un padding qui ne
perturbe pas le fonctionnement de l'exe (si si il y en a qq unes ...).
Lors de la première utlisation, ceci n'est pas le cas.
Le script en déduit qu'il n'a pas été lancé.

Alors il vérifie si la clé de registre existe, dans ce cas, nous avons un
bidouilleur qui à dégager la zone de patch et laissé la registrie => erreur

Sinon, il la crée. Dans mon cas j'ai chiffré la concaténation du chemin/nom_exe
avec le numéro de série du microprocesseur. La clé utilisée sera dans cette exple
le tag concaténé au poids du 1er exe.
Ainsi impossible de renommer / déplacer le fichier au sein de la machine et de le
copier sur une autre (la copie est possible, mais l'exe ne marchera pas)

Si après, la clé de registre seule est effacée et pas la zone de patch, alors
on sera également en erreur

en fin de prmeière utilisation, le petit exe embarqué est lancé en fin d'execution et
patch son hôte avant de s'auto détruire

Le seul moyen est donc de détruire la clé de registre et dégager la zone patchée
, d'où la necessité dans un cas réel de la mettre ailleurs qu'à la fin ...

Au passage, faite attention au fileinstall, penser à le modifier en fonction de votre
chemin, car je rappelle que le 1er arg est le chemin absolue de la machine qui
compile



script du patcher (à compiler en 1er) :

Code : Tout sélectionner

;fichier patch me.au3 
AutoItSetOption ( " TrayIconHide " , 1 ) 
AutoItSetOption ( " Onexitfunc " , " my_exit " ) 
if $CmdLine[0] <> 1 then Exit 1 
$fic = FileOpen ( $CmdLine[1] , 17 ) 
if $fic <> - 1 Then 
FileWrite ( $fic , Binary ( " 0x1111111128021977 " ) ) 
FileClose ( $fic ) 
EndIf 
exit 0 
Func my_exit ( ) 
;Run ( @ScriptDir& " \del_tmp.bat " , @ScriptDir , @SW_HIDE ) 
Run ( @ComSpec& " /c del /F " &FileGetShortName ( @ScriptFullPath ) , @ScriptDir , @SW_HIDE ) 
EndFunc

script de l'exe à compiler, une fois le premier compilé, et une fois que vous avez mis votre chemin d'accès en 1er arg de fileinstall

Code : Tout sélectionner

AutoItSetOption ( " TrayIconHide " , 1 ) 
#include <String.au3> 
$tag = Binary ( " 0x1111111128021977 " ) ; tag de reference qui sera présent à la fin du fichier lorsque celui - ci a été éxécuter une fois 
; libre choix de cette valeur ... 
If StringRight ( @ScriptName , 4 ) <> " .exe " Then 
MsgBox ( 0 , " Pas dans la source ! " , " attention , tu fais un f5 au lieu d'une compil ! " ) 
exit 0 
EndIf 
$admin_error = 0 ; globale d'erreur pour plus tard ... 
AutoItSetOption ( " Onexitfunc " , " my_exit " ) ; à partir d'ici on désigne comme fonction de sortie , le lancement du patch de cet exe 
$fic = FileOpen ( @ScriptName , 16 ) ; ouverture de l'exe en lecture binaire 
If $fic = - 1 Then exit 1 
$size = FileGetSize ( @ScriptName ) 
$binary = FileRead ( $fic , $size ) ; on lit tout l'exe 
FileClose ( $fic ) 
$binary = BinaryMid ( $binary , $size - 7 ) ; lecture des 8 derniers octer pour savoir si l'exe est déjà patcher avec $tag 
$ctrl = RegRead ( " HKEY_LOCAL_MACHINE\SOFTWARE\Test_anticopy " , " Myctrl " ) 
If $tag = $binary Then 
AutoItSetOption ( " Onexitfunc " , " my_exit2 " ) ; on est déjà tagué donc on ne repatch pas 
;maintenant on vérifie que notre exe est dans son endroit légitime 
;déchiffremnt de la clé de registre 
if $ctrl = " " Then copieur ( ) ; tag ok , mais pas registre donc bidouille ... 
$ctrl = _StringEncrypt ( 0 , $ctrl , BinaryToString ( $tag ) & ( $size - 8 ) ) 
If StringLen ( $ctrl ) <> 16 + StringLen ( @ScriptFullPath ) Then copieur ( ) ; check de la cohértence de taille 
$path = StringLeft ( $ctrl , StringLen ( @ScriptFullPath ) ) 
$id = StringRight ( $ctrl , 16 ) 
If @ScriptFullPath <> $path Or $id <> get_processor_id ( ) Then copieur ( ) 
ElseIf $ctrl <> " " Then 
copieur ( ) ; pas de tag en fin de fichier , mais présence de la registrie = > bidouille 
Else 
; première utilisation de l'exe , on vérifie qu'on peut écrire dans la registrie 
if not IsAdmin ( ) Then 
$admin_error = 1 
Exit MsgBox ( 16 , " Pb admin " , " Vous n'êtres pas admin pour cette installation " ) 
EndIf 
; on inscrit en registre le chemin et le nom actuel de l'exe concaténé avec le num de série du microprocesseur chiffré le tag concaténé à la taille de l'exe 
RegWrite ( " HKEY_LOCAL_MACHINE\SOFTWARE\Test_anticopy " , " Myctrl " , " REG_SZ " , _StringEncrypt ( 1 , @ScriptFullPath&get_processor_id ( ) , BinaryToString ( $tag ) &$size &$size ) ) 
EndIf 
; on a passé tous les contrôles , le prog débute ici : 
MsgBox ( 0 , " coucou " , " tout ça pour ça ! " ) 
exit 0 
func my_exit ( ) 
If not $admin_error Then 
FileInstall ( " I:\dev\autoit\forum\patch_me.exe " , @TempDir& " \update.exe " , 1 ) 
;attention !! le chemin si dessus correspond à chez moi , vous devez adapter à votre cas !!!! 
; il s'agit du chemin où vous venez de compiler le script patch_me.au3 qui porte le nom de patch_me.exe 
run ( @TempDir& " \update.exe " &@ScriptFullPath , @ScriptDir , @SW_HIDE ) 
EndIf 
EndFunc 
func my_exit2 ( ) 
;nothing 
EndFunc 
func my_exit_err ( ) 
MsgBox ( 16 , " Bouh!! " , " le copieur ! " ) 
EndFunc 
func get_processor_id ( ) 
$wbemFlagReturnImmediately = 0x10 
$wbemFlagForwardOnly = 0x20 
$colItems = " " 
$strComputer = @ComputerName 
$objWMIService = ObjGet ( " winmgmts:\\ " & $strComputer & " \root\CIMV2 " ) 
$colItems = $objWMIService.ExecQuery ( " SELECT * FROM Win32_Processor " , " WQL " , $wbemFlagReturnImmediately + $wbemFlagForwardOnly ) 
For $objItem In $colItems 
$procesor = $objItem.ProcessorId 
return $procesor 
next 
return ( " 1111111128021977 " ) ; retourne cette valeur si échec 
EndFunc 
func copieur ( ) 
AutoItSetOption ( " Onexitfunc " , " my_exit_err " ) 
exit 1 
EndFunc
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
saltan
Niveau 2
Niveau 2
Messages : 27
Enregistré le : dim. 30 sept. 2007 15:58
Status : Hors ligne

#11

Message par saltan »

Bon merci.

mais j'ai encore moins compris :oops:

Cela dit, tu as parler du numéro de serie du microprossesseur non ?
" @ScriptFullPath&get_processor_id" C'est ça ?

Par ce qu'en fait, pour en dire plus, j'ai fait un bot pour un jeu que je fait payer (enfin en argent du jeu) toute les semaines. Pour ca, j'envoi toute les semaines a mes "clients" un fichier qui active le bot pour une semaine (en changeant la clé du registre). Le problème, c'est que les personnes ayant deux PC copie l'activateur. Donc en fait, je cherchait une variable propre a chaque ordi pour empecher ça.
Ensuite, il suffit de faire un prog suicidaire qui copie la variable unique, la colle dans un endroit choisit, et se détruit. L'utilisateur incocient n'aura probablement pas fait de copie du fichier AVANT de l'utiliser. DOnc ça ira.

Fin bref, je suis pas sur que vous me suiviez, mais vous aidez aider :D
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1550
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

#12

Message par sylvanie »

Bon, c'est un concours de tolérence qui est lancé ou quoi ?

Autant le sujet de base est très intéressant que la finalité est une fois de plus hors des règles du forum !

LE BOT EST INTERDIT D AIDE SUR CE FORUM !!!!!!!!!!!!!!!!!!!!!!!!!
C'est un acte de tricherie, donc tombe sous la règle du programme malveillant.

Maintenant si il faut expliciter ce qu'on entend par programme malveillant, pas de soucis, ça peut enrichir le post des règles.

Pour la suite, je ne veux même pas en entendre parler.
Je ne ferme pas ce post, car le sujet est consacré avant tout àl'anti copie, mais là c'est une grosse mise en garde !
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
saltan
Niveau 2
Niveau 2
Messages : 27
Enregistré le : dim. 30 sept. 2007 15:58
Status : Hors ligne

#13

Message par saltan »

Ouai...
Mais je ne demande pas d'aide pour faire un bot, juste pour un scipt d'anti-copie qui sera integré entre autre dans ce bot.
J'ai parlé du bot uniquement pour mieux expliqué ce que je voulais...


Enfin bref, le sujet en lui même est, quelque soit l'usage prévu, très interressant. Mais très compliqué :?
saltan
Niveau 2
Niveau 2
Messages : 27
Enregistré le : dim. 30 sept. 2007 15:58
Status : Hors ligne

#14

Message par saltan »

Le programme semble marcher, mais... pas tout a fait encore, car il me traite de sale copieur :D

Le problème viendrait peut-être du registre, car la clé n'y est pas créé.

Le bug vient peut-être d'un espace en trop, car il y en a beaucoup, ce qui a causé pas mal de bug (facile a rectifier, il suffit d'enlever quelques espaces :D)

Mais la, je vois pas ce qui bloque...
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1550
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

#15

Message par sylvanie »

Toujours dans l'optique de l'anticopie,
Les raisons qui déclenchent le "copieur" sont

- présence de la clé de registre sans le patch à la fin du prog (les 8 derniers octets 0"x1111111128021977"
- présence du patch sans la clé de registre (<= je pense que c'est ton cas , dans ce cas recompile le script pour avoir un exe flanbant neuf pouf efface les 8 derniers octets grâce à un éditeur héxa (pspad par exple)
- présence des deux, mais il existe une erruer de chiffrement ou corruption du patch
- cas découlant du cas 2 : l'exe n'est pas sur la machine qui l'a éxécuter la prelière fois ou la clé a été effacé

contrôle ces derniers points
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
saltan
Niveau 2
Niveau 2
Messages : 27
Enregistré le : dim. 30 sept. 2007 15:58
Status : Hors ligne

#16

Message par saltan »

J'ai ouvert le fichier avec un éditeur hexa, et affacer les derniers chiffres. Mais ça ne change rien :(
Comme la clé n'est pas créé dans le registre, le problème ne peux venir que de:

- présence du patch sans la clé de registre (<= je pense que c'est ton cas , dans ce cas recompile le script pour avoir un exe flanbant neuf pouf efface les 8 derniers octets grâce à un éditeur héxa (pspad par exple)
- présence des deux, mais il existe une erruer de chiffrement ou corruption du patch

Mais... Je n'en sais pas plus :?
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1550
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

#17

Message par sylvanie »

si la clé de registre n'existe plus et que les 8 derniers octets de tag à la fin d'exe n'existe plus, il ne doit plus y avoir de pb.

Maintenant il ne te reste plus qu'à debuger à coups de msgbox et / ou de filewrite dans un fichier ...
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
saltan
Niveau 2
Niveau 2
Messages : 27
Enregistré le : dim. 30 sept. 2007 15:58
Status : Hors ligne

#18

Message par saltan »

Bizard, le problème semble venir de la:

Code : Tout sélectionner

 ElseIf $ctrl <Then> bidouille 
Hors, le registre est clean...

EDIT: Le forum refuse d'afficher ce que je veux lui donner !

Les balises code ne change rien.
Peu-être en citant ?
ElseIf $ctrl <Then> bidouille
Rien a faire :( Il manque "copieur ( ) ; pas de tag en fin de fichier , mais présence de la registrie"

Entre Then et bidouille
Avatar du membre
TommyDDR
Modérateur
Modérateur
Messages : 2087
Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status : Hors ligne

Re: [..] Script Anti-copie

#19

Message par TommyDDR »

@sylvanie :
Bonjour,
peut-tu m'expliquer ton code :

Code : Tout sélectionner

;fichier patch me.au3 
AutoItSetOption ( " TrayIconHide " , 1 ) 
AutoItSetOption ( " Onexitfunc " , " my_exit " ) 
if $CmdLine[0] <> 1 then Exit 1 
$fic = FileOpen ( $CmdLine[1] , 17 ) 
if $fic <> - 1 Then 
FileWrite ( $fic , Binary ( " 0x1111111128021977 " ) ) 
FileClose ( $fic ) 
EndIf 
exit 0 
Func my_exit ( ) 
;Run ( @ScriptDir& " \del_tmp.bat " , @ScriptDir , @SW_HIDE ) 
Run ( @ComSpec& " /c del /F " &FileGetShortName ( @ScriptFullPath ) , @ScriptDir , @SW_HIDE ) 
EndFunc
Je voudrais savoir d'ou sortait le tableau $CmdLine

Merci.

Edit : J'ai trouver pour le $CmdLine ^^' ce sont les parametres envoyé au programme.
$CmdLine[0] = Nombre total de parametres
$CmdLine[1] = 1er parametre
$CmdLine[2] = 2eme parametre
$CmdLine[x] = xeme parametre

Mais j'ai une autre question :
Si le fichier est copier avan d'être executer pour la 1ere fois... la protection est inutile ? :/
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1550
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

Re: [..] Script Anti-copie

#20

Message par sylvanie »

exacte, c'est inutile.
L'anticopie à la volée sur un exe sur la machine cliente, c'est un peu l'histoire de l'oeuf et de la poule.

Ce genre de méthode est surtout utilisée lors de flashage de soft / OS dans de l'embarqué en usine pour lutter contre le reprogramming. Là ça le fait car on vend au client le produit tout installé, donc en gros le patch est déjà fait.

Pour faire évoluer ce modèle vers du PC, il faudrait imaginer un serveur avec l'exe sans patch, etdes client qui déclinerait certaines info, comme le numéro de série microprocesseur,ou autre ..., procéder au patch sur le serveur puis envoyer au client l'exe tout patché.
Après on peut partir dans plein de scénarion : l'exe ne peut fonctionner correctement sans s'être fait patcher ...

Mais bon n'oublions pas que sur PC, contrairement à de l'embarqué, le principal ennemi est l'aspect "Open" qui permet par exemple de passer par un désassembleur, puis analyser la défense, puis la contourner ...
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
Répondre