J'ai reçu une notification sur Facebook: " (un de mes amis) vous a mentionné dans un commentaire". Cependant, lorsque j'ai cliqué dessus, Firefox a essayé de télécharger le fichier suivant:
Il s'agit d'un script masqué qui semble télécharger un exécutable (autoit.exe
) et exécutez-le.
C'est la partie que j'ai réussi à désobscurcir:
['Msxml2.XMLhttp', 'onreadystatechange', 'readyState', 'status', 'ADODB.Stream', 'open',
'type', 'write', 'position', 'read', 'saveToFile', 'close', 'GET', 'send',
'Scripting.FileSystemObject', 'WScript.Shell', 'Shell.Application', '%APPDATA%\\',
'ExpandEnvironmentStrings', 'Mozila', 'https://www.google.com',
'http://userexperiencestatics.net/ext/Autoit.jpg', '\\autoit.exe',
'http://userexperiencestatics.net/ext/bg.jpg', '\\bg.js',
'http://userexperiencestatics.net/ext/ekl.jpg', '\\ekl.au3',
'http://userexperiencestatics.net/ext/ff.jpg', '\\ff.Zip',
'http://userexperiencestatics.net/ext/force.jpg', '\\force.au3',
'http://userexperiencestatics.net/ext/sabit.jpg', '\\sabit.au3',
'http://userexperiencestatics.net/ext/manifest.jpg', '\\manifest.json',
'http://userexperiencestatics.net/ext/run.jpg', '\\run.bat',
'http://userexperiencestatics.net/ext/up.jpg', '\\up.au3',
'http://whos.amung.us/pingjs/?k=pingjse346', '\\ping.js',
'http://whos.amung.us/pingjs/?k=pingjse3462', '\\ping2.js', '']
Est-ce un exploit sur Facebook? Est-il possible que mon ami ait un virus qui cible ses contacts en les marquant sur des liens malveillants? Dois-je signaler cela à Facebook? Si c'est le cas, comment?
Il s'agit d'un malware JavaScript masqué typique qui cible l'hôte de script Windows pour télécharger le reste de la charge utile. Dans ce cas, il télécharge ce qui semble être principalement une extension Chrome (manifest.json
Et bg.js
), L'exécutable d'auto Windows et certains scripts d'autoït qui les installent. Tous ces fichiers sont nommés avec des extensions .jpg
Sur le serveur (probablement compromis) où ils sont hébergés, pour être moins visibles.
Le malware semble être partiellement incomplet ou autrement sous-développé ou peut-être basé sur un autre malware (la qualité est très faible). De nombreux scripts d'auto-action ne font rien, et ce qui semble être un Zip destiné à contenir une extension Firefox est en fait vide. Les scripts autoit sont une tonne d'inclusions combinées en un seul fichier, mais un seul (ekl) a en fait une charge utile à la fin.
Le seul script autoit actif qui s'exécute sur l'infection remplace les raccourcis Chrome, IE et éventuellement d'autres navigateurs par un raccourci vers Chrome avec les arguments nécessaires pour exécuter l'extension malveillante Chrome.
L'extension Chrome est principalement la façon dont ce malware est propagé. Il fait des choses désagréables comme la mise sur liste noire des domaines des logiciels antivirus et l'envoi automatique de messages Facebook. En fait, il y avait un back-end de service Web à http://appcdn.co/datajs
Servant certains scripts qui seraient injectés sur n'importe quelle page visitée par un utilisateur en fonction de l'URL actuellement consultée, ce qui était la façon dont les messages Facebook étaient publiés. Ce service est maintenant hors ligne, probablement supprimé.
Est-ce un exploit sur Facebook?
Pas exactement, un abus de Facebook. Le code de Facebook n'a pas été exploité, votre ami a juste un navigateur infecté qui phishing ses contacts en son nom.
Est-il possible que mon ami ait un virus qui cible ses contacts en les marquant sur des liens malveillants?
Oui, c'est exactement ainsi que ce malware se propage.
Dois-je signaler cela à Facebook? Si c'est le cas, comment?
Oui, voir Comment signaler des choses dans le centre d'aide Facebook.
Il serait également utile de mettre les URL suivantes hors ligne en contactant leurs hôtes.
http://userexperiencestatics.net/ext/Autoit.jpg
http://userexperiencestatics.net/ext/bg.jpg
http://userexperiencestatics.net/ext/ekl.jpg
http://userexperiencestatics.net/ext/ff.jpg
http://userexperiencestatics.net/ext/force.jpg
http://userexperiencestatics.net/ext/sabit.jpg
http://userexperiencestatics.net/ext/manifest.jpg
http://userexperiencestatics.net/ext/run.jpg
http://userexperiencestatics.net/ext/up.jpg
http://whos.amung.us/pingjs/?k=pingjse346
http://whos.amung.us/pingjs/?k=pingjse3462
http://appcdn.co/datajs
Malheureusement, CloudFlare n'a toujours pas supprimé l'URL de CloudFlare vient de m'envoyer un e-mail pour me dire qu'ils ont restreint l'accès aux fichiers et dit qu'ils en informeront l'hôte.userexperiencestatics.net
Bien que j'ai contacté peu de temps après avoir posté cette réponse, et je ne sais pas qui héberge réellement ces fichiers.
MISE À JOUR:
Après que moi et probablement d'autres personnes aient signalé l'URL .jse
À Google, ils semblent avoir supprimé le fichier. Si vous en trouvez d'autres, vous devez également les signaler. Il semble que les gens aient reçu les fichiers de nombreuses sources.
PLUS D'INFO:
Ce malware et ce post retiennent beaucoup l'attention, alors j'ajouterai plus d'informations pour répondre aux questions des gens:
Ce fichier s'exécutera-t-il automatiquement lors du téléchargement?
Probablement pas sauf si vous avez configuré votre navigateur pour le faire. Il est destiné à vous inciter à l'ouvrir.
Peut-il infecter mon téléphone ou mon ordinateur non Windows.
Pour autant que je sache, Windows est le seul système d'exploitation qui peut exécuter ce malware. Comme je l'ai mentionné, il utilise l'hôte de script Windows. Je ne crois pas que même Windows Phone soit vulnérable, bien que je ne sache pas grand chose sur Windows Phone.
MISE À JOUR DU RANSOMWARE:
Auparavant, il était supposé que les scripts d'auto contenaient des ransomwares, mais après une inspection plus approfondie, cela ne semble pas être le cas. Il y a juste un tas de fonctions de cryptage inutilisées obscurcissant la charge utile réelle , que j'ai surtout désobfusquée à cela .
MISE À JOUR SUR CHROME EXTENSION:
Le code d'extension Chrome décompressé peut être consulté ici . Détails sur ce qu'il a intégré ci-dessus.
MISE À JOUR DE JSE SCRIPT:
Mon script comment_24016875.jse
Désobscurci peut être consulté ici .
Je n'ai pas le temps de procéder à une rétro-ingénierie complète de ce que fait ce script, mais il semble être lié à plusieurs .jpg
fichiers qui ne sont en fait pas des images mais du texte, puis qui font référence à certains .au3
fichiers, ce qui suggère qu'il enregistre réellement ces .jpg
fichiers sous cette extension.
Ceux .au3
les fichiers semblent correspondre à l'extension de fichier d'AutoIt et, en effet, ils ressemblent à des scripts AutoIt valides. En voici une partie, le ekl.jpg
:
Func _crypt_startup()
If __crypt_refcount() = 0 Then
Local $hadvapi32 = DllOpen("Advapi32.dll")
If $hadvapi32 = -1 Then Return SetError(1, 0, False)
__crypt_dllhandleset($hadvapi32)
Local $iproviderid = $prov_rsa_aes
Local $aret = DllCall(__crypt_dllhandle(), "bool", "CryptAcquireContext", "handle*", 0, "ptr", 0, "ptr", 0, "dword", $iproviderid, "dword", $crypt_verifycontext)
If @error OR NOT $aret[0] Then
Local $ierror = @error + 10, $iextended = @extended
DllClose(__crypt_dllhandle())
Return SetError($ierror, $iextended, False)
Else
__crypt_contextset($aret[1])
EndIf
EndIf
__crypt_refcountinc()
Return True
EndFunc
Func _crypt_shutdown()
__crypt_refcountdec()
If __crypt_refcount() = 0 Then
DllCall(__crypt_dllhandle(), "bool", "CryptReleaseContext", "handle", __crypt_context(), "dword", 0)
DllClose(__crypt_dllhandle())
EndIf
EndFunc
Func _crypt_derivekey($vpassword, $ialg_id, $ihash_alg_id = $calg_md5)
Local $aret = 0, $hbuff = 0, $hcrypthash = 0, $ierror = 0, $iextended = 0, $vreturn = 0
_crypt_startup()
Do
$aret = DllCall(__crypt_dllhandle(), "bool", "CryptCreateHash", "handle", __crypt_context(), "uint", $ihash_alg_id, "ptr", 0, "dword", 0, "handle*", 0)
If @error OR NOT $aret[0] Then
$ierror = @error + 10
$iextended = @extended
$vreturn = -1
ExitLoop
EndIf
$hcrypthash = $aret[5]
$hbuff = DllStructCreate("byte[" & BinaryLen($vpassword) & "]")
DllStructSetData($hbuff, 1, $vpassword)
$aret = DllCall(__crypt_dllhandle(), "bool", "CryptHashData", "handle", $hcrypthash, "struct*", $hbuff, "dword", DllStructGetSize($hbuff), "dword", $crypt_userdata)
If @error OR NOT $aret[0] Then
$ierror = @error + 20
$iextended = @extended
$vreturn = -1
ExitLoop
EndIf
$aret = DllCall(__crypt_dllhandle(), "bool", "CryptDeriveKey", "handle", __crypt_context(), "uint", $ialg_id, "handle", $hcrypthash, "dword", $crypt_exportable, "handle*", 0)
If @error OR NOT $aret[0] Then
$ierror = @error + 30
$iextended = @extended
$vreturn = -1
ExitLoop
EndIf
$vreturn = $aret[5]
Until True
If $hcrypthash <> 0 Then DllCall(__crypt_dllhandle(), "bool", "CryptDestroyHash", "handle", $hcrypthash)
Return SetError($ierror, $iextended, $vreturn)
EndFunc
Func _crypt_destroykey($hcryptkey)
Local $aret = DllCall(__crypt_dllhandle(), "bool", "CryptDestroyKey", "handle", $hcryptkey)
Local $ierror = @error, $iextended = @extended
_crypt_shutdown()
If $ierror OR NOT $aret[0] Then
Return SetError($ierror + 10, $iextended, False)
Else
Return True
EndIf
EndFunc
Func _crypt_encryptdata($vdata, $vcryptkey, $ialg_id, $bfinal = True)
Local $ireqbuffsize = 0, $aret = 0, $hbuff = 0, $ierror = 0, $iextended = 0, $vreturn = 0
_crypt_startup()
Do
If $ialg_id <> $calg_userkey Then
$vcryptkey = _crypt_derivekey($vcryptkey, $ialg_id)
If @error Then
$ierror = @error + 100
$iextended = @extended
$vreturn = -1
ExitLoop
EndIf
EndIf
$aret = DllCall(__crypt_dllhandle(), "bool", "CryptEncrypt", "handle", $vcryptkey, "handle", 0, "bool", $bfinal, "dword", 0, "ptr", 0, "dword*", BinaryLen($vdata), "dword", 0)
If @error OR NOT $aret[0] Then
$ierror = @error + 20
$iextended = @extended
$vreturn = -1
ExitLoop
EndIf
$ireqbuffsize = $aret[6]
$hbuff = DllStructCreate("byte[" & $ireqbuffsize & "]")
DllStructSetData($hbuff, 1, $vdata)
$aret = DllCall(__crypt_dllhandle(), "bool", "CryptEncrypt", "handle", $vcryptkey, "handle", 0, "bool", $bfinal, "dword", 0, "struct*", $hbuff, "dword*", BinaryLen($vdata), "dword", DllStructGetSize($hbuff))
If @error OR NOT $aret[0] Then
$ierror = @error + 30
$iextended = @extended
$vreturn = -1
ExitLoop
EndIf
$vreturn = DllStructGetData($hbuff, 1)
Until True
If $ialg_id <> $calg_userkey Then _crypt_destroykey($vcryptkey)
_crypt_shutdown()
Return SetError($ierror, $iextended, $vreturn)
EndFunc
Func _crypt_decryptdata($vdata, $vcryptkey, $ialg_id, $bfinal = True)
Local $aret = 0, $hbuff = 0, $htempstruct = 0, $ierror = 0, $iextended = 0, $iplaintextsize = 0, $vreturn = 0
_crypt_startup()
Do
If $ialg_id <> $calg_userkey Then
$vcryptkey = _crypt_derivekey($vcryptkey, $ialg_id)
If @error Then
$ierror = @error + 100
$iextended = @extended
$vreturn = -1
ExitLoop
EndIf
EndIf
$hbuff = DllStructCreate("byte[" & BinaryLen($vdata) + 1000 & "]")
DllStructSetData($hbuff, 1, $vdata)
$aret = DllCall(__crypt_dllhandle(), "bool", "CryptDecrypt", "handle", $vcryptkey, "handle", 0, "bool", $bfinal, "dword", 0, "struct*", $hbuff, "dword*", BinaryLen($vdata))
If @error OR NOT $aret[0] Then
$ierror = @error + 20
$iextended = @extended
$vreturn = -1
ExitLoop
EndIf
$iplaintextsize = $aret[6]
$htempstruct = DllStructCreate("byte[" & $iplaintextsize & "]", DllStructGetPtr($hbuff))
$vreturn = DllStructGetData($htempstruct, 1)
Until True
If $ialg_id <> $calg_userkey Then _crypt_destroykey($vcryptkey)
_crypt_shutdown()
Return SetError($ierror, $iextended, $vreturn)
EndFunc
Func _crypt_hashdata($vdata, $ialg_id, $bfinal = True, $hcrypthash = 0)
Local $aret = 0, $hbuff = 0, $ierror = 0, $iextended = 0, $ihashsize = 0, $vreturn = 0
_crypt_startup()
Do
If $hcrypthash = 0 Then
$aret = DllCall(__crypt_dllhandle(), "bool", "CryptCreateHash", "handle", __crypt_context(), "uint", $ialg_id, "ptr", 0, "dword", 0, "handle*", 0)
If @error OR NOT $aret[0] Then
$ierror = @error + 10
$iextended = @extended
$vreturn = -1
ExitLoop
EndIf
$hcrypthash = $aret[5]
EndIf
$hbuff = DllStructCreate("byte[" & BinaryLen($vdata) & "]")
DllStructSetData($hbuff, 1, $vdata)
$aret = DllCall(__crypt_dllhandle(), "bool", "CryptHashData", "handle", $hcrypthash, "struct*", $hbuff, "dword", DllStructGetSize($hbuff), "dword", $crypt_userdata)
If @error OR NOT $aret[0] Then
$ierror = @error + 20
$iextended = @extended
$vreturn = -1
ExitLoop
EndIf
If $bfinal Then
$aret = DllCall(__crypt_dllhandle(), "bool", "CryptGetHashParam", "handle", $hcrypthash, "dword", $hp_hashsize, "dword*", 0, "dword*", 4, "dword", 0)
If @error OR NOT $aret[0] Then
$ierror = @error + 30
$iextended = @extended
$vreturn = -1
ExitLoop
EndIf
$ihashsize = $aret[3]
$hbuff = DllStructCreate("byte[" & $ihashsize & "]")
$aret = DllCall(__crypt_dllhandle(), "bool", "CryptGetHashParam", "handle", $hcrypthash, "dword", $hp_hashval, "struct*", $hbuff, "dword*", DllStructGetSize($hbuff), "dword", 0)
If @error OR NOT $aret[0] Then
$ierror = @error + 40
$iextended = @extended
$vreturn = -1
ExitLoop
EndIf
$vreturn = DllStructGetData($hbuff, 1)
Else
$vreturn = $hcrypthash
EndIf
Until True
If $hcrypthash <> 0 AND $bfinal Then DllCall(__crypt_dllhandle(), "bool", "CryptDestroyHash", "handle", $hcrypthash)
_crypt_shutdown()
Return SetError($ierror, $iextended, $vreturn)
EndFunc
Func _crypt_hashfile($sfile, $ialg_id)
Local $btempdata = 0, $hfile = 0, $hhashobject = 0, $ierror = 0, $iextended = 0, $vreturn = 0
_crypt_startup()
Do
$hfile = FileOpen($sfile, $fo_binary)
If $hfile = -1 Then
$ierror = 1
$vreturn = -1
ExitLoop
EndIf
Do
$btempdata = FileRead($hfile, 512 * 1024)
If @error Then
$vreturn = _crypt_hashdata($btempdata, $ialg_id, True, $hhashobject)
If @error Then
$ierror = @error
$iextended = @extended
$vreturn = -1
ExitLoop 2
EndIf
ExitLoop 2
Else
$hhashobject = _crypt_hashdata($btempdata, $ialg_id, False, $hhashobject)
If @error Then
$ierror = @error + 100
$iextended = @extended
$vreturn = -1
ExitLoop 2
EndIf
EndIf
Until False
Until True
_crypt_shutdown()
If $hfile <> -1 Then FileClose($hfile)
Return SetError($ierror, $iextended, $vreturn)
EndFunc
Func _crypt_encryptfile($ssourcefile, $sdestinationfile, $vcryptkey, $ialg_id)
Local $btempdata = 0, $hinfile = 0, $houtfile = 0, $ierror = 0, $iextended = 0, $ifilesize = FileGetSize($ssourcefile), $iread = 0, $breturn = True
_crypt_startup()
Do
If $ialg_id <> $calg_userkey Then
$vcryptkey = _crypt_derivekey($vcryptkey, $ialg_id)
If @error Then
$ierror = @error
$iextended = @extended
$breturn = False
ExitLoop
EndIf
EndIf
$hinfile = FileOpen($ssourcefile, $fo_binary)
If @error Then
$ierror = 2
$breturn = False
ExitLoop
EndIf
$houtfile = FileOpen($sdestinationfile, $fo_overwrite + $fo_createpath + $fo_binary)
If @error Then
$ierror = 3
$breturn = False
ExitLoop
EndIf
Do
$btempdata = FileRead($hinfile, 1024 * 1024)
$iread += BinaryLen($btempdata)
If $iread = $ifilesize Then
$btempdata = _crypt_encryptdata($btempdata, $vcryptkey, $calg_userkey, True)
If @error Then
$ierror = @error + 400
$iextended = @extended
$breturn = False
EndIf
FileWrite($houtfile, $btempdata)
ExitLoop 2
Else
$btempdata = _crypt_encryptdata($btempdata, $vcryptkey, $calg_userkey, False)
If @error Then
$ierror = @error + 500
$iextended = @extended
$breturn = False
ExitLoop 2
EndIf
FileWrite($houtfile, $btempdata)
EndIf
Until False
Until True
If $ialg_id <> $calg_userkey Then _crypt_destroykey($vcryptkey)
_crypt_shutdown()
If $hinfile <> -1 Then FileClose($hinfile)
If $houtfile <> -1 Then FileClose($houtfile)
Return SetError($ierror, $iextended, $breturn)
EndFunc
Func _crypt_decryptfile($ssourcefile, $sdestinationfile, $vcryptkey, $ialg_id)
Local $btempdata = 0, $hinfile = 0, $houtfile = 0, $ierror = 0, $iextended = 0, $ifilesize = FileGetSize($ssourcefile), $iread = 0, $breturn = True
_crypt_startup()
Do
If $ialg_id <> $calg_userkey Then
$vcryptkey = _crypt_derivekey($vcryptkey, $ialg_id)
If @error Then
$ierror = @error
$iextended = @extended
$breturn = False
ExitLoop
EndIf
EndIf
$hinfile = FileOpen($ssourcefile, $fo_binary)
If @error Then
$ierror = 2
$breturn = False
ExitLoop
EndIf
$houtfile = FileOpen($sdestinationfile, $fo_overwrite + $fo_createpath + $fo_binary)
If @error Then
$ierror = 3
$breturn = False
ExitLoop
EndIf
Do
$btempdata = FileRead($hinfile, 1024 * 1024)
$iread += BinaryLen($btempdata)
If $iread = $ifilesize Then
$btempdata = _crypt_decryptdata($btempdata, $vcryptkey, $calg_userkey, True)
If @error Then
$ierror = @error + 400
$iextended = @extended
$breturn = False
EndIf
FileWrite($houtfile, $btempdata)
ExitLoop 2
Else
$btempdata = _crypt_decryptdata($btempdata, $vcryptkey, $calg_userkey, False)
If @error Then
$ierror = @error + 500
$iextended = @extended
$breturn = False
ExitLoop 2
EndIf
FileWrite($houtfile, $btempdata)
EndIf
Until False
Until True
If $ialg_id <> $calg_userkey Then _crypt_destroykey($vcryptkey)
_crypt_shutdown()
If $hinfile <> -1 Then FileClose($hinfile)
If $houtfile <> -1 Then FileClose($houtfile)
Return SetError($ierror, $iextended, $breturn)
EndFunc
Func _crypt_genrandom($pbuffer, $isize)
_crypt_startup()
Local $aret = DllCall(__crypt_dllhandle(), "bool", "CryptGenRandom", "handle", __crypt_context(), "dword", $isize, "struct*", $pbuffer)
Local $ierror = @error + 10, $iextended = @extended
_crypt_shutdown()
If $ierror OR (NOT $aret[0]) Then
Return SetError($ierror, $iextended, False)
Else
Return True
EndIf
EndFunc
Func __crypt_refcount()
Return $__g_acryptinternaldata[0]
EndFunc
Func __crypt_refcountinc()
$__g_acryptinternaldata[0] += 1
EndFunc
Func __crypt_refcountdec()
If $__g_acryptinternaldata[0] > 0 Then $__g_acryptinternaldata[0] -= 1
EndFunc
Func __crypt_dllhandle()
Return $__g_acryptinternaldata[1]
EndFunc
Func __crypt_dllhandleset($hadvapi32)
$__g_acryptinternaldata[1] = $hadvapi32
EndFunc
Func __crypt_context()
Return $__g_acryptinternaldata[2]
EndFunc
Func __crypt_contextset($hcryptcontext)
$__g_acryptinternaldata[2] = $hcryptcontext
EndFunc
Comme vous pouvez le voir, il existe un code lié à la crypto suggérant qu'il s'agit d'un ransomware (assez merdique et amateur). N'hésitez pas à procéder au reverse engineering de tout le reste.
De ce à quoi il ressemble, un acteur malveillant exploite ce qui est connu comme une vulnérabilité d'entité externe XML ( XXE ), puis une falsification de requêtes côté serveur (SSRF) .
Les serveurs de Facebook ont été incités à lier un fichier XML malveillant à partir d'un autre domaine, à le traiter et à vous le servir. Voici le Aide-mémoire XXE et Aide-mémoire de la bible SSRF t, si vous êtes intéressé, vous pouvez l'étudier.
Pensez-y ... votre script obscurci avait ce qui suit (méthode msxml2.XMLhttp et a déclaré qu'il venait de google).
Plus précisément, il a utilisé " l'objet ADODB.Stream pour envoyer des fichiers binaires au navigateur via ASP ."
En bref, oui, il a exploité un XXE (via asp en écrivant un document xml) et a falsifié (SSRF) en déclarant qu'il provenait de google.
Est-ce un exploit sur Facebook?
Probablement. Les sans scrupules essaient toujours de trouver des moyens d'accéder aux comptes bancaires, aux mots de passe, aux listes d'amis et à tout ce qu'ils peuvent faire pour se retourner.
Est-il possible que mon ami ait un virus qui cible ses contacts en les marquant sur des liens malveillants?
Il n'y a aucune raison de penser le contraire. La majorité des utilisateurs d'ordinateurs ne savent même pas ce qu'est un virus, comment "attraper" un virus ou quoi faire une fois qu'ils ont été infectés. Si c'était moi, je retrouverais l'ami, lui enverrais un lien vers un programme antivirus et lui proposerais de l'aider. Bien sûr, selon vos amis, vous pourriez ne pas être aussi gentils, mais je suis assez convaincu que je suis censé aider l'humanité du mieux que je peux.
Dois-je signaler cela à Facebook?
Absolument. Cela n'attaquera pas vos amis, mais cela peut les aider à retrouver les partages et, finalement, à réduire le nombre de personnes affectées par ce virus/malware/arnaque.
Si c'est le cas, comment?
Accédez au message d'origine, cliquez sur l'option pour marquer le message et passez par l'assistant. Vous serez averti s'ils prennent des mesures, je crois.
Une dernière remarque: Microsoft semble déjà être au courant de ce fichier; lorsque j'ai essayé de le télécharger dans IE Edge, j'ai reçu un avertissement indiquant que le fichier était dangereux et n'a pas pu être enregistré. Toute personne utilisant SmartScreen sera probablement en sécurité et ce virus ne semble pas ciblez les systèmes non-Microsoft. La plupart de vos amis et de votre famille moins avertis devraient être d'accord, à moins qu'ils n'exécutent toujours XP, auquel cas vous devriez leur suggérer de passer à au moins 7.