Verschleierung (Software)

Im Software-Entwicklung, Verschleierung ist der Akt der Schaffung Quelle oder Maschinensprache Das ist für Menschen schwer zu verstehen. Wie Verschleierung in Natürliche SpracheEs kann unnötig ausdrückliche Ausdrücke verwenden, um Aussagen zu verfassen. Programmierer können den Code absichtlich verschleiern, um ihren Zweck zu verbergen (Sicherheit durch Dunkelheit) oder seine logischen oder impliziten Werte, die in sie vor allem in sie eingebettet sind, um Manipulationen zu verhindern Reverse Engineeringoder sogar um eine zu erstellen Puzzle oder Freizeitherausforderung für jemanden, der den Quellcode liest. Dies kann manuell oder durch Verwendung eines automatisierten Tools erfolgen, wobei letztere die bevorzugte Technik in der Industrie ist.[1]

Überblick

Die Architektur und Eigenschaften einiger Sprachen können es einfacher machen, verschleiert als andere.[2][3] C,[4] C ++,[5][6] und die Perl Programmiersprache[7] sind einige Beispiele für Sprachen leicht zu verschleiern. Haskell ist auch ziemlich verschleiertbar[8] obwohl sie in der Struktur ganz anders sind.

Die Eigenschaften, die eine Sprachverschleierung machen, sind nicht sofort offensichtlich.

Freizeitverzerrung

Das Schreiben und Lesen verschleierter Quellcode kann a sein Rätsel. Eine Reihe von Programmierwettbewerben belohnen den kreativ verschleierten Code, wie der Internationaler Verschleierter C -Code -Wettbewerb und die Verschleierter Perl -Wettbewerb.

Zu den Arten von Verschleiern gehören eine einfache Schlüsselwortsubstitution, Verwendung oder Nichtnutzung von Weißespace, um künstlerische Effekte zu erzielen, und selbst erzeugend oder stark komprimierte Programme.

Entsprechend Nick Montfort, Techniken können umfassen:

  1. Benennung der Verschleierung, die benannende Variablen auf bedeutungslose oder trügerische Weise umfasst;
  2. Verwirrung von Daten/Code/Kommentar, zu der auch ein tatsächlicher Code wie Kommentare oder verwirrende Syntax mit Daten aussieht.
  3. Doppelcodierung, die Code in Poesieform oder interessante Formen anzeigen kann.[9]

Kurz verschleiert Perl Programme können in verwendet werden in Unterschriften von Perl -Programmierern. Dies sind Japhs ("Nur ein anderer Perl -Hacker").[10]

Beispiele

Dies ist ein Siegereintrag von der Internationaler Verschleierter C -Code -Wettbewerb Geschrieben von Ian Phillipps im Jahr 1988[11] und anschließend umgekehrt von Thomas Ball.[12]

/*   Am wenigsten wahrscheinlich erfolgreich zusammenstellen:   Ian Phillipps, Cambridge Consultants Ltd., Cambridge, England */ #enthalten  hauptsächlich(t,_,a) verkohlen * a; { 	Rückkehr! 0<t? t<3? hauptsächlich(-79,-13,a+ hauptsächlich(-87,1-_, hauptsächlich(-86, 0, a+1 ) +a)): 1, t<_? hauptsächlich(t+1, _, a ) :3, hauptsächlich ( -94, -27+t, a ) &&t == 2 ?_ <13 ? hauptsächlich ( 2, _+1, " %s %d %d\n" ) :9:16: t<0? t<-72? hauptsächlich( _, t, "@n '+,#'/*{} w+/w#cdnr/+, {} r/*de}+,/*{*+,/w {%+,/w#q#n+,/# {l,+,/n {n+,/+#n+,/#; \ #q#n+,/+k#;*+,/'r:' d*'3,} {w+k w'k:'+} e#'; dq#' l q#'+d'k#! /+k#; \ q#'r} ekk#} w'r} ekk {nl]'/#;#q#n ') {)#} w') {) {nl] '/+#n'; D} rw 'i ;#) {nl]!/n {n# '; \ r {#w'r nc {nl] '/#{l,+' k {rw 'ik {; [{nl]'/w#q#\ \ n'wk nw 'iwk {kk {nl]!/w {%' l ## w#'i; : {nl] '/*{q#' ld; r '} {nlwb!/*de}' c ;; \ {nl '-{} rw]'/+,} ## '*}#nc,',#nw] '/+kd'+e}+; \ #'rdq#w! nr '/')}+} {rl#'{n' ')#}'+} ## (!!/ ") : t<-50? _==*a ? Putchar(31[a])): hauptsächlich(-65,_,a+1) : hauptsächlich((*a == '/') + t, _, a + 1 )  : 0<t? hauptsächlich ( 2, 2 , "%s") :*a=='/'|| hauptsächlich(0, hauptsächlich(-61,*a, "! ek; dc i@bk '(q)-[w]*%n+r3#l, {}:\nuwloca-o; m .vpbks, fxntdceghiry ") ,a+1);} 

Es ist ein C Programm, das beim Kompilieren und Ausführen die 12 Verse von generiert Die 12 Weihnachtstage. Es enthält alle für das Gedicht erforderlichen Zeichenfolgen in einer codierten Form im Code.

In diesem nächsten Beispiel wird ein nicht ausgezeichneter Eintrag aus dem selben Jahr veranschaulicht. Es erzeugt Labyrinthe der willkürlichen Länge:[13]

verkohlen*M,A,Z,E=40,J[40],T[40];hauptsächlich(C) {zum(*J=A=Scanf(M="%d",&C); --  E;  J[  E]  =T [E  ]=  E)  printf("._");  zum(; (; (;A-=Z=!Z)  ||  (printf("\n| " )  ,  A  =  39  ,C  -- )  ;  Z  ||  printf  (M  ))M[Z]=Z[A-(E  =A[J-Z]))&&!C &  A  ==  T[  A] |6<<27<Rand()||!C&!Z?J[T[E]=T[A]]=E,J[T[A]=A-Z]=A,"_.":"|"];} 

ANSI-konforme C-Compiler erlauben es nicht zu, ständige Zeichenfolgen überschrieben zu werden, was vermieden werden kann, indem "*M" in "M [3]" und "m =" geändert wird.

Das folgende Beispiel von Óscar Toledo Gutiérrez, Best of Show -Eintrag im 19. IOCCC, implementiert ein 8080 Emulator komplett mit Terminal- und Festplattencontroller, der booten kann CP/M-80 und Ausführen von CP/M -Anwendungen:[14]

#enthalten    #define n (o, p, e) = y = (z = a (e)%16 p x%16 p o, a (e) p x p o), H (   #define S 6 [o]   #define p z = l [d (9)] | l [d (9) +1] << 8,1 <(9 [o]+= 2) || ++ 8 [o]   #define q a (7)   #define w 254> (9 [o]-= 2) || --8 [o], l [d (9)] = z, l [1+d (9)] = z >> 8   #define o))): ((   #define b (y & 1? ~ s: s) >> "\ 6 \ 0 \ 2 \ 7" [y/2] & 1? 0 :(   #define s)? (z- =   #define a (f)*((7 & f) -6? & o [F & 7]: & l [d (5)])   #define c s 5 s 3   #define d (e) x/8! = 16+e & 198+e*8! = x?   #define b (c) fclose ((c))   #define q (c+= 2,0 [C-2] | 1 [C-2] << 8)   #define m x = 64 & x?*c ++: a (x),   #define a (f) = fopen ((f), "rb+")   ohne Vorzeichen verkohlen o[10],l[78114],*c=l,*k=l   #define d (e) o [e]+256*o [e-1] #Define h (l) s = l >> 8 & 1 | 128 & y |! (y & 255)*64 | 16 & z | 2, y^= y >> 4, y^= y << 2, y^= ~ y >> 1 , s | = y & 4 +64506; e,V,v,u,x,y,z,Z; hauptsächlich(r,U)verkohlen**U; {   { { { } } }  { { { } } }  { { { } } }  { { { } } }   { { {  } } }  { { {  } } }  { { {  } } }  { { {  } } }   { { {  } } }  { { {  } } }  { { {  } } }  { { {  } } }   { { {  } } }  { { {  } } }  { { {  } } }  { { {  } } }   { { {  } } }  { { {  } } }  { { {  } } }  { { {  } } }   { { {  } } }  { { {  } } }  { { {  } } }  { { {  } } }   { { ; } }  { { {  } } }  { { ; } }  { { {  } } }   { { {  } } }  { { {  } } }  { { {  } } }  { { {  } } }   { { {  } } }  { { {  } } }  { { {  } } }  { { {  } } }   { { {  } } }  { { {  } } }  { { {  } } }  { { {  } } }   { { {  } } }  { { {  } } }  { { {  } } }  { { {  } } }   { { {  } } }  { { {  } } }  { { {  } } }  { { {  } } }   { { { } } }  { { { } } }  { { { } } }  { { { } } }   zum(v A((u A((e A((r-2?0:(V A(1[U])),"C") ),System("STTY RAW -ECHO MIN 0"),frei(l,78114,1,e),B(e),"B")),"EIN")); 118-(x =*c++); (y=x/8%8,z=(x&199)-4 S 1 S 1 S 186 S 2 S 2 S 3 S 0,r=(y>5)*2+y,z=(x& 207)-1 S 2 S 6 S 2 S 182 S 4)?D(0)D(1)D(2)D(3)D(4)D(5)D(6)D(7) (z=x-2 C C C C C C C C+129 S 6 S 4 S 6 S 8 S 8 S 6 S 2 S 2 S 12)?x/64-1?((0 O a(y)=a(x) O 9 [o]=a(5),8[o]=a(4) O 237==*c++?((int (*) ()) (2-*c++?frite:frei)) (l+*k+1[k]* 256,128,1, (fseek(y=5[k]-1?u:v, ((3[k]|4[k]<<8)<<7|2[k]))<<7,Q=0),y)):0 O y=a(5 ),z=a(4),a(5)=a(3),a(4)=a(2),a(3)=y,a(2)=z O c=l+d(5) O y=l[x=d(9)],z=l[++x] ,x[l]=a(4),l[--x]=a(5),a(5)=y,a(4)=z O 2-*c?Z||lesen(0,&Z,1),1&*c++?Q=Z,Z=0:( Q= !!Z):(c++,Q=r=V?FGetc(V):-1,s=s& ~1|r<0) O++c,schreiben(1,&7[o],1) O z=c+2-l,w, c=l+q O p,c=l+z O c=l+q O s^=1 O Q=q[l] O s| =1 O q[l]=Q O Q= ~Q O a(5)=l[x=q] ,a(4)=l[++x] O s| =s&16|9<Q%16?Q+=6,16:0,z=s| =1&s|Q>159?Q+=96,1:0,y=Q,h(s<<8) O l[x=q]=a(5),l[++x]=a(4) O x=Q%2,Q=Q/2+s%2*128,s=s& ~1|x O Q=l[d(3)]O x=Q  / 128,Q=Q*2+s%2,s=s& ~1|x O l[d(3)]=Q O s=s& ~1|1&Q,Q=Q/2|Q<<7 O Q=l[d(1)]O s= ~1 &s|Q>>7,Q=Q*2|Q>>7 O l[d(1)]=Q O m y n(0,-,7)y) O m z=0,y=Q| =x,h(y) O m z=0, y=Q^=x,h(y) O m z=Q*2|2*x,y=Q& =x,h(y) O m Q n(s%2,-,7)y) O m Q n(0,-,7)y)  O m Q n(s%2,+,7)y) O m Q n(0,+,7)y) O z=r-8?d(r+1):s|Q<<8,w O p,r-8?o[r+1]=z,r [o]=z>>8:(s= ~40&z|2,Q=z>>8) O r[o]-||-o[r-1]O a(5)=z=a(5)+r[o],a(4)=z=a(4) +o[r-1]+z/256,s= ~1&s|z>>8 O ++o[r+1]||r[o]++O o[r+1]=*c++,r[o]=*c++O z=c-l,w ,c=y*8+l O x=q,b z=c-l,w,c=l+x) O x=q,b c=l+x) O b p,c=l+z) O a(y)=*c++O r=y ,x=0,a(r)n(1,-,y)s<<8) O r=y,x=0,a(r)n(1,+,y)s<<8)))); System("Stty gekochtes Echo"); B((B((V?B(V):0,u)),v)); } // drucken ("Hallo Welt") 

Ein Beispiel für a Japh:

@P=Teilt//,".Urruu \ c8r";@d=Teilt//,"\ nrekcah xinu / lrep rehtona tsuj";Sub p{ @p{"R $ P","u $ p"}=(P,P);Rohr"R $ P","u $ p";++$ p; ($ q*=2)+=$ f=!Gabel;Karte{$ P=$ P[$ f^ord ($ p{$ _})&6];$ p{$ _}=/ ^$ P/ ix?$ P: Schließen Sie $ _}Schlüssel%p}p;p;p;p;p;Karte{$ p{$ _}= ~/^…p. weise/&& nah dran$ _}%p;Warten bis um$?;Karte{/^r/&&<$_>}%p;$ _=$ d[$ q];schlafen Rand(2)wenn/\S/;drucken 

Dies zeigt langsam den Text "Nur einen anderen Perl / Unix -Hacker", mehrere Zeichen gleichzeitig, mit Verzögerungen.[15]

Etwas Python Beispiele finden Sie in der Offizielle Python -Programmierfaq und anderswo.[16][17][18]

Vorteile der Verschleierung

Schnellere Ladezeit

Die von Webseiten verwendeten Skripte müssen über das Netzwerk an den Benutzeragenten gesendet werden, der sie ausführt. Je kleiner sie sind, desto schneller der Download. In solchen Anwendungsfällen, Minifikation (Eine relativ triviale Form der Verschleierung) kann zu echten Vorteilen führen.

Reduzierter Speicherverbrauch

In antik Laufzeit interpretierte Sprachen (allgemein bekannt als Skript) Wie ältere Versionen von Basic, die Programme schneller ausgeführt und weniger RAM genommen, wenn sie Einzelbuchstaben -Variablennamen verwendeten, die Kommentare vermieden und nur notwendige leere Zeichen enthielten (kurz gesagt, je kürzer die kürzeren).

Schutz für Geschäftsgeheimnisse

Wenn der Quellcode eines Programms an den Benutzer gesendet werden muss, z. B. JavaScript auf einer Webseite, ist jeder im Programm enthaltene Geschäftsgeheimnis, Lizenzmechanismus oder andere geistige Eigentum für den Benutzer zugänglich. Verschleierung macht es schwieriger, den Code zu verstehen und Änderungen daran vorzunehmen.

Desktop -Programme enthalten manchmal Funktionen, die dazu beitragen, ihren Code zu verschleiern. Einige Programme speichern ihren gesamten Code möglicherweise nicht auf der Festplatte und können einen Teil ihres Binärcodes zur Laufzeit über das Web ziehen. Sie können auch Komprimierung und/oder Verschlüsselung verwenden und dem Demontageprozess zusätzliche Schritte hinzufügen.

Verhinderung des Umgehungsstreifens

Die Verschleierung des Programms kann es in solchen Fällen für Benutzer erschweren, Lizenzmechanismen zu umgehen oder Informationen zu erhalten, die der Lieferant des Programms verbergen wollte. Es kann auch verwendet werden, um es schwieriger zu machen, Multiplayer -Spiele zu hacken.

Verhinderung der Viruserkennung

Böswillige Programme verwenden möglicherweise Verschleierung, um zu verschleiern, was sie wirklich tun. Die meisten Benutzer lesen solche Programme nicht einmal. Und diejenigen, die normalerweise Zugriff auf Softwaretools haben, die ihnen helfen können, die Verschleierung rückgängig zu machen, ist diese Strategie daher von begrenzter Wirksamkeit.

Nachteile der Verschleierung

  • Während die Verschleierung ein Programm zu Lesen, Schreiben und Umkehrung eines Programms schwierig und zeitaufwändig erschweren kann, wird dies nicht unbedingt unmöglich.[19]
  • Es verleiht dem Bauprozess für die Entwickler Zeit und Komplexität.
  • Es kann Debugging -Probleme machen, nachdem die Software äußerst schwierig verschleiert wurde.
  • Sobald Code wird aufgeben Und wird nicht mehr aufrechterhalten, Hobbyisten möchten das Programm möglicherweise beibehalten, Mods hinzufügen oder besser verstehen. Verschleierung macht es Endbenutzern schwierig, nützliche Dinge mit dem Code zu tun.
  • Bestimmte Arten von Verschleierung (d. H. Code, der nicht nur ein lokaler Binäranlagen und Mini -Binärdateien von einem Webserver download nach Bedarf nicht heruntergeladen wird) können die Leistung beeinträchtigen und/oder Internet erfordern.

Dekompiler

A Dekompiler Kann den Quellcode umgekehrt aus einer ausführbaren Datei oder Bibliothek umgekehrt. Die Dekompilierung wird manchmal als Man-at-the-End-Angriff bezeichnet, basierend auf dem traditionellen kryptografischen Angriff, der als "bekannt"der Mann in der Mitte". Es wird Quellcode in die Hände des Benutzers gesteckt, obwohl dieser Quellcode häufig schwer zu lesen ist. Der Quellcode hat wahrscheinlich eine zufällige Funktion und Variablennamen, falsche Variablentypen und verwenden unterschiedliche Logik als der ursprüngliche Quellcode ( aufgrund von Compiler -Optimierungen).

Kryptografische Verschleierung

In letzter Zeit, Kryptografen habe die Idee des Verschleierung von Code untersucht, damit der Code umgekehrt ist kryptografisch schwer. Dies wird in den vielen Vorschlägen für formalisiert Ununterscheidbarkeitsverschmutzung, ein kryptografischer Primitive, der, wenn möglich, sicher zu bauen, es ermöglicht, viele andere Arten von Kryptographie zu konstruieren, einschließlich völlig neuer Typen, die niemand weiß. (Eine stärkere Vorstellung, Schwarzkastenverzerrungwurde 2001 unmöglich gezeigt, als Forscher Programme konstruierten, die in diesem Begriff nicht verschleiert werden können.)[20][21]

Benachrichtigung von Benutzern über verschleierten Code

Einige Antiviren-Software, wie z. AVG Antivirus,[22] wird auch ihre Benutzer alarmieren, wenn sie auf einer Website mit Code landen, die manuell verschleiert wird, da einer der Zwecke der Verschleierung darin bestehen kann, böswilligen Code zu verbergen. Einige Entwickler können jedoch eine Verschleierung von Code zur Reduzierung der Dateigröße oder zur Erhöhung der Sicherheit einsetzen. Der durchschnittliche Benutzer erwartet möglicherweise nicht, dass seine Antivirus -Software Benachrichtigungen über einen ansonsten harmlosen Code bereitstellt, insbesondere von vertrauenswürdigen Unternehmen. Eine solche Funktion kann die Benutzer tatsächlich daran hindern, legitime Software zu verwenden.

Bestimmte Hauptbrowser wie Firefox und Chrome lehnen auch Browserverlängerungen, die verschleierten Code enthalten, nicht zu.[23][24]

Software verschleiern

Es gibt eine Vielzahl von Tools, um die Verschleierung von Code durchzuführen oder zu unterstützen. Dazu gehören experimentelle Forschungstools, die von Akademikern, Hobby -Tools, kommerziellen Produkten von Profis und geschrieben wurden, und umfassen Quelloffene Software. Es gibt auch Deobfuskationsinstrumente, die versuchen, die umgekehrte Transformation durchzuführen.

Obwohl die Mehrheit der kommerziellen Verschmutzungslösungen funktioniert, indem sie entweder Programmquellcode oder plattformunabhängige Bytecode wie von Java und .NET verwendete.

Verschleierung und Copyleft -Lizenzen

Es wurde diskutiert, ob es illegal ist, Rock zu haben Copyleft Software -Lizenzen Durch die Freigabe von Quellcode in verschleierter Form, beispielsweise in Fällen, in denen der Autor weniger bereit ist, den Quellcode verfügbar zu machen. Das Problem wird in der behandelt GNU Allgemeine öffentliche Lizenz Durch die Erfordernis des "bevorzugten Formulars für Änderungen" zur Verfügung gestellt werden.[25] Auf der GNU -Website heißt es: "Verschleierter Quellcode ist kein echter Quellcode und zählt nicht als Quellcode."[26]

Siehe auch

Anmerkungen

  1. ^ [[Drei NANO -Abhängigkeiten zur Bildung eines von drei Abhängigkeiten, die sich in und von dreieckigen Knoten in 3Dspace -kartesianischen Nurbs als Synapsen von Webbenutzern, Seiten und Geräte -Timer -Chips sammeln können. Alle Verletzungsinformationen würden von Unternehmen als Cat6 -Stifte für einen Meraki voreingestellt. Von allen Menschen, wie auch immer Sie sie nennen, haben Sie das Beste ausgewählt, um je nach Ansichtsfenster auf Ihre eigenen Datenbanken zugreifen zu können. Unicore/Raytheon ist bereit, alle anderen Fragen, die Sie in Tucson möglicherweise in der Schlange hinter diesem Pythagoræntheorum benötigen, um 1200 v. ]] Diebe identifizieren - Tausende von Jahren. All dies wurde von wenigen gegraben, um Elemente zu sammeln. Sehr interessant ]] "Was ist Verschleierung (Obfu)? - Definition von Whatis.com". SearchSoftWareQuality. Abgerufen 1. Februar, 2019.
  2. ^ Binstock, Andrew (6. März 2003). "Verschleierung: Umfassen Sie Ihren Code aus neugierigen Augen". Archiviert von das Original am 20. April 2008. Abgerufen 25. November, 2013.
  3. ^ Atwood, Jeff (15. Mai 2005). "Jeff Atwood, 15. Mai 2005". Codinghorror.com. Abgerufen 25. November, 2013.
  4. ^ "Verschleierung". Kenter.demon.nl. Archiviert von das Original am 4. März 2016. Abgerufen 25. November, 2013.
  5. ^ "C ++ Tutorials - verschleierter Code - eine einfache Einführung". Treamcode.net. Abgerufen 25. November, 2013.
  6. ^ "C Tutorials - verschleierter Code in C". 7. Juli 2011. Abgerufen 25. November, 2013.
  7. ^ Ab 2013-11-25 18:22 GMT. "Pe (a) rls in Linienrauschen". Perlmonks.org. Abgerufen 25. November, 2013.
  8. ^ "Verschleierung - Haskell Wiki". 16. Februar 2006. Archiviert vom Original am 30. August 2017. Abgerufen 3. März, 2020.
  9. ^ Montfort, Nick. "Verschleierter Code" (PDF). Archiviert von das Original (PDF) am 24. April 2019. Abgerufen 24. November, 2017.
  10. ^ "Japh - nur ein anderer Perl -Hacker". PM.org. Perl Händler. Archiviert von das Original am 16. Mai 2013. Abgerufen 27. Februar, 2015.
  11. ^ "International verschleiert C -Code -Gewinner 1988 - am wenigsten wahrscheinlich erfolgreich zusammengestellt". Ioccc.org. Archiviert von das Original am 9. April 2009. Abgerufen 25. November, 2013.
  12. ^ ""Reverse Engineering die zwölf Weihnachtstage" von Thomas Ball ". Research.microsoft.com. Archiviert von das Original am 13. Dezember 2007. Abgerufen 25. November, 2013.
  13. ^ Don libes, Verschleift C und andere Geheimnisse, John Wiley & Sons, 1993, S. 425. ISBN0-471-57805-3
  14. ^ Óscar Toledo Gutiérrez: Intel 8080 Emulator. 19. IOCCC. Beste Show.
  15. ^ "Verschleierter Perl -Programm". Perl.plover.com. Abgerufen 25. November, 2013.
  16. ^ Ben Kurtovic. "Verschleierung" Hallo Welt! "". Benkurtovic.com.
  17. ^ "Verschleierter Python". wiki.c2.com.
  18. ^ "Der erste jährliche verschleierte Python -Inhalt". code.activestate.com.
  19. ^ ""Können wir Programme verschleiern?" von Boaz Barak ". Math.iass.edu. Archiviert von das Original am 23. März 2016. Abgerufen 25. November, 2013.
  20. ^ "Der Durchbruch der Kryptographie könnte die Software unaufgefordert machen". Verdrahtet. ISSN 1059-1028. Abgerufen 14. März, 2021.
  21. ^ Jain, Aayush; Lin, Huijia; Sahai, Amit (2020). "Ununterscheidbarkeitsverschmutzung aus begründeten Annahmen". Cryptology Eprint Archiv. Arxiv:2008.09317.
  22. ^ "Blockierung der Website und der einzigen Möglichkeit, HTTPS S ... | AVG zu deaktivieren". Support.avg.com. 21. Juli 2020. Abgerufen 4. Februar, 2022.
  23. ^ Um 05:01 Uhr Thomas Claburn in San Francisco 2. Oktober 2018. "Google Maßnahmen gegen den verkleideten Code im Chrome -Webladen ergriffen". www.theregister.co.uk. Abgerufen 12. November, 2019.
  24. ^ Cimpanu, Catalin. "Mozilla kündigt das Verbot von Firefox -Erweiterungen an, die verschleierten Code enthalten". ZDNET. Abgerufen 12. November, 2019.
  25. ^ "Argumentation hinter der" bevorzugten Form der Arbeit, um Änderungen daran zu machen "Sprache im GPL". Lwn.net. Abgerufen 25. November, 2013.
  26. ^ "Was ist kostenlose Software?". gnu.org. Abgerufen 18. Dezember, 2014.

Verweise

Externe Links