Mehr als 50 Bilder für Juicebox Lite!

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.

Blog comments

Permalink

Unminify JS (Javascript), XML, JSON, SQL, CSS, HTML tool is used to clear, reformat, deminify, uncompress, and beautify ugly codes online, make it unminified and readable.">

Add new comment

Restricted HTML

  • Allowed HTML tags: <a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • Lines and paragraphs break automatically.
  • Web page addresses and email addresses turn into links automatically.