1. #1

    Registriert seit
    28.10.2011
    Beiträge
    625
    Thanked 279 Times in 168 Posts

    Beitrag KScriptExtractor

    Wie bereits im K3-Thread, bin ich derzeit dabei etwas mit Lappen³ herum zu dödeln.

    Dabei ist der KScriptExtractor herausgekommen.

    Warum ich hier Java benutze, liegt an Rhino, da ich sonst die inner functions nicht iterieren kann und mit RegEx das ganze ziemlich komplex wäre.

    Name:  screen.PNG
Hits: 282
Größe:  75,2 KB

    Was macht der Extractor?
    Er verbindet sich mit preview.knuddels.de und sucht nach der aktuellen Build-Version. Danach wird die main.js gezogen und extrahiert/aufbereitet um es besser lesen zu können. Alle Dateien sind in /temp/<build>/ vorhanden.

    Wie kann ich die Daten nun einsetzen?
    hast du Besipielsweise die HTML und deren Resourcen vom K3-Clienten gezogen, ersetzt du die main.<build>.min.js durch folgenden Part (PHP):
    PHP-Code:
    <?php
        $bundle 
    '4e71efd3';
    ?>
    <script>
        let files = <?php print json_encode(glob('temp/' $bundle '/functions/*.js')); ?>;
        let finished = 0;
        
        files.forEach(function(file) {
            var script = document.createElement('script');
            script.src = file + '?t=<?php print time(); ?>'
            script.charset = 'utf-8';
            script.onload = function() {
                console.info('Loading', file, (finished++ + 1), '/', files.length);
            };
            document.body.appendChild(script);
        });
        
        var _watcher = setInterval(function() {
            if(finished >= files.length) {
                clearInterval(_watcher);
                var script = document.createElement('script');
                script.src = 'temp/<?php print $bundle?>/manipulated.js?t=<?php print time(); ?>'
                script.onload = function() {
                    console.info('Inject main routine');
                };
                document.body.appendChild(script);
            }
        });
    </script>
    Anstelle, dass nun die "Obfuscated" main.js geladen wird, wird nun das extrahierte Zeugs genutzt.

    P.S. der JavaScript beautifier läuft derzeit über ein Online-Script, da ich kein Bock hatte einen komplett eigenen zu schreiben - Wäre jetzt zu aufwändig, wird aber sicher noch geschehen. Leider gibt es da keine gescheiten Dinger für Java (außer das von eclipse, was zu viele depencies hätte) und irgendwelche anderen Online-Tools some limitations haben...

    Download
    Have fun!
    Geändert von Bubble Gum (10.03.2019 um 01:07 Uhr)

  2. #2

    Registriert seit
    28.10.2011
    Beiträge
    625
    Thanked 279 Times in 168 Posts

    Standard AW: KScriptExtractor

    Ich habe den Extractor noch einmal etwas angepasst, da er die leeren Einträge nicht hinzugefügt hatte.

    Das ganze habe ich auch als OpenSource auf GitHub gestellt: https://github.com/PineappleK3/KScriptExtractor

    Wer auf das beautify über den Server verzichten will, kann es auch im Code deaktivieren, dann läuft das ganze innerhalb Sekunden durch, andernfalls dauert das ganze bei 935 Funktionen etwas.

    Vielleicht werde ich später, wenn ich einiges analysiert habe noch die Funktionen durch den Extractor benennen lassen. Dadurch wird die Source wenigstens bei den externisierten Funktionen etwas lesbarer/nachvollziehbarer.

    Die Binarys können in den GitHub Releases gezogen werden (https://github.com/PineappleK3/KScri...actor/releases)

    Download

  3. #3

    Registriert seit
    28.10.2011
    Beiträge
    625
    Thanked 279 Times in 168 Posts

    Standard AW: KScriptExtractor

    Ich habe nun auch einen Resolver implementiert, der Stichpunkte die in einer Datei vorhanden seien müssen überprüft. Wenn die Prüfung korrekt ist, wird die Datei nach den jeweiligen Namen benannt.

    Wer also Interesse daran hat, eine Map mit den ganzen Informationen zu erstellen, kann das gerne tun
    Ich bin gerade nur dabei (weil das noch als Object direkt implementiert ist), das zu externalisieren, dass eine named.map Datei existiert.

    Der Inhalt ist einfach eine simple Java-Properties, mit Klassennamen als Key und Komma-Separiert die Stichwörter:
    <Class> = <Text>,<Text>,<Text>,<...>

    StyleLoader = [Style Loader],style-loader, text/css,stylesheet
    ReactXP_ActivityIndicator = rx-activity,.rx-activity,animation,text/css

    [...]
    Das ganze schaut im Extractor dann wie folgt aus:
    Version: 4e71efd3
    Original already downloaded.
    Found Loader,...
    function t(t){for(var n,o,i=t[0],a=t[1],s=0,c=[];s<i.length;s++)o=i[s],r[o]&&c.push(r[o][0]),r[o]=0;for(n in a)Object.prototype.hasOwnProperty.call(a,n)&&(e[n]=a[n]);for(u&&u(t);c.lengthc.shift()()}var n={},r={3:0};function o(t){if(n[t])return n[t].exports;var r=n[t]={i:t,l:!1,exports:{}};return e[t].call(r.exports,r,r.exports,o),r.l=!0,r.exports}o. e=function(e){var t=[],n=r[e];if(0!==n)if(n)t.push(n[2]);else{var i=new Promise(function(t,o){n=r[e]=[t,o]});t.push(n[2]=i);var a,s=document.createElement("script");s.charset="ut f-8",s.timeout=120,o.nc&&s.setAttribute("nonce",o.nc ),s.src=function(e){return o.p+"js/"+({0:"ads",1:"app",2:"channellist",4:"resetpasswo rd",5:"vendors~app"}[e]||e)+".4e71efd3.chunk.min.js"}(e),a=function(t){s. onerror=s.onload=null,clearTimeout(u);var n=r[e];if(0!==n){if(n){var o=t&&("load"===t.type?"missing":t.type),i=t&&t.tar get&&t.target.src,a=new Error("Loading chunk "+e+" failed.\n("+o+": "+i+")");a.type=o,a.request=i,n[1](a)}r[e]=void 0}};var u=setTimeout(function(){a({type:"timeout",target:s })},12e4);s.onerror=s.onload=a,document.head.appen dChild(s)}return Promise.all(t)},o.m=e,o.c=n,o.d=function(e,t,n){o. o(e,t)||Object.defineProperty(e,t,{enumerable:!0,g et:n})},o.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty( e,Symbol.toStringTag,{value:"Module"}),Object.defi neProperty(e,"__esModule",{value:!0})},o.t=functio n(e,t){if(1&t&&(e=o(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(o.r(n),Object.definePrope rty(n,"default",{enumerable:!0,value:e}),2&t&&"str ing"!=typeof e)for(var r in e)o.d(n,r,function(t){return e[t]}.bind(null,r));return n},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,"a",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p="/",o.oe=function(e){throw console.error(e),e};var i=window.webpackJsonp=window.webpackJsonp||[],a=i.push.bind(i);i.push=t,i=i.slice();for(var s=0;s<i.length;s++)t(i[s]);var u=a;o(o.s=509)}([]);
    Extract Functions,...
    Extract all Functions,...
    .................
    [Resolver] func_017 to ReactIntl
    ...........
    [Resolver] func_028 to StyleLoader
    ...............
    [Resolver] func_043 to ClientProtocol
    ........
    [Resolver] func_051 to ReactTransducer
    .................................................. .................................................. .................................................. ...............................................
    [Resolver] func_248 to ChannelProtocol
    .................................................. .................................................. .................................................. .................................................. .................................................. ........
    [Resolver] func_506 to Language
    .
    [Resolver] func_507 to Language
    .............................................
    [Resolver] func_552 to ReactTimeLanguage
    .......................
    [Resolver] func_575 to ReactJS
    .................................................. .................................................. .................................................. ..................
    [Resolver] func_743 to ReactXP_ActivityIndicator
    .................................................. .................................................. .................................................. ............................
    [Resolver] func_921 to TrackJS
    ...
    [Resolver] func_924 to ClientUI
    .
    [Resolver] func_925 to Registration
    .
    [Resolver] func_926 to ChatboxComponent
    ...
    [Resolver] func_929 to LoginProtocol
    ......Execute POST-Process...
    Available Functions: 935
    Process Finished!

Diese Seite nutzt Cookies, um das Nutzererlebnis zu verbessern. Klicken Sie hier, um das Cookie-Tracking zu deaktivieren.