Meine liebe Freundin Anne hat einen Blog. Der ist bei mir gehostet und nutzt für die Darstellung von Bildern die Bibliothek „Juicebox“ in der Lite-Version.
Dort ist die Anzahl der Bilder auf 50 limitiert. Weil Kommerz. Das störte die Anne, und sie fragte mich, ob ich da was machen könne. Also schaute ich mir die Sache mal an:
Die Website bindet das Script juicebox.js ein.
Hier sieht man im Wesentlichen erstmal nur eine lange Zeile. Diese habe ich durch einen Entpacker gejagt und bekam zu sehen:
Wenige Zeilen Code, an die ein langes String-Literal angehängt ist.
Hier ist also der eigentliche Code chiffriert und wird erst durch den Aufruf der eval
-Funktion ganz am Anfang entpackt.
Wie kommt man nun an den unchiffrierten Text? Man ersetzt eval
durch console.log
und schaut sich an, was der Browser in der Debug-Konsole von sich gibt:
Unsortieren Buchstabensalat.
Aber: wenn man diesen abermals durch den Entpacker schickt, erhält man feinsten Javascript-Code. Hierin suchte ich nach verdächtigen Vorkommen der Zahl 50, also des zu brechenden Limits. Und wurde fündig. Irgendwo mittendrin lauert die Zeile
var limit = context.config_manager.isp ? (100000) : 50;
Jetzt galt es herauszufinden, wo sich dieser Quellcode im chiffrierten Code versteckt. Um zu verstehen, wie die Chiffre arbeitet, verglich ich also Anfang der chiffrierten und der unchiffrierten Datei:
1a 3R=3R?3R:{};(1c(ao,an){1a al=ao.1Q,bH=ao.3f,by=ao.3Y;1a aj=(1c(){1a bN=1c(bY,bX){1b 3a bN.fn.3G(bY,bX,E)}...
und
var juicebox_lib = juicebox_lib ? juicebox_lib : {};
(function(ao, an) {
var al = ao.document,
bH = ao.navigator,
by = ao.location;
var aj = (function() {
var bN = function(bY, bX) {
return new bN.fn.init(bY, bX, E)
},
Die Methode des scharfen Hinschauens verrät: Hier finden Wortersetzungen statt:
1a = var
1b = return
1c = function
1Q = document
3a = new
3f = navigator
3G = init
3R = juicebox_lib
3Y = location
Am Ende der chiffrierten Datei findet man die einzusetzenden Worte in der Reihenfolge:
[...]var|return|function|config|context[...]
Limit
kommt in dieser Liste sehr weit hinten vor, und es nicht einfach ersichtlich, welche Buchstabenkombination dazu gehört. Aber in unserer zu ändernden Zeile kommt das Wort config_manager
vor, und das steht in einem Block mit schon bekannten Worten:
[...]new|jQuery|Math|parseFloat|1000|navigator|overlay_visible|case|addEventListener|continue|_data|config_manager|padding|event[...]
Schon bekannt sind die Codes für new
(3a
) und navigator
(3f
). Damit lässt sich durch Abzählen ermitteln: config_manager
ist 3l
. Und context
steht im oberen Block nach var
, return
, function
und config
, Ist also 1e
.
Wir suchen im chiffrierten Code die Zeile
var limit = context.config_manager.isp ? (100000) : 50;
also
1a <irgendwas>=1e.3l.<irgendwas>?(<irgendwas>):<irgendwas>;
Und wenn man nach =1e.3l.
sucht, findet man die Stelle 1a pQ=1e.3l.4g?(Dn):50;
.
Treffer! Wie man sieht, ist die 50 also hart codiert.
Wie man an der Zeile sieht, wird Dn
durch 100000 ersetzt. Wenn man also an Stelle der 50
ein Dn
einsetzt...
Ihr seht schon.
Also im Terminal
sed -e 's|pQ=1e.3l.4g?(Dn):50|pQ=1e.3l.4g?(Dn):Dn|g' juicebox.js > juicebox.js.alterd
mv juicebox.js juicebox.js.orig
mv juicebox.js.alterd juicebox.js
und der Drops ist gelutscht.
Neuen Kommentar hinzufügen