Ergebnis 1 bis 10 von 10

Thema: Hacking Browser Add-Ons for fun and profit

  1. #1
    \''; DROP TABLE user; --

    Moderator

    Avatar von electric.larry
    Registriert seit
    Dec 2014
    Ort
    Raum 43
    Beiträge
    1.182
    ngb:news Artikel
    78

    Hacking Browser Add-Ons for fun and profit

    Oder: Eine Zeitreise zum Mittelpunkt des Internets - Reverse Code Engineering von SoftICE bis Firebug

    Warum Browser Add-Ons zerlegen?

    Warum sollte jemand ein Browser Add-On überhaupt reversen wollen? Die meisten Leute nutzen z. B. einen Adblocker oder ähnliche Tools, die es erlauben, gewisse Inhalte auszufiltern, Screenshots zu erstellen oder Seiten zu teilen. Installiert man Browser Plugins, räumt man ihnen eine Vielzahl an Berechtigungen ein, die von einem "bösen" Anbieter genutzt werden könnten, um Daten über besuchte Seiten zu sammeln und ohne dass wir es bemerken, nach Hause zu telefonieren. Im einfachsten Fall bindet der Anbieter des Plugins z. B. Google Analytics in sein Add-On ein, um Nutzungsstatistiken zu sammeln. Reverse engineering erlaubt uns, zu überprüfen, was ein Browser Add-On im Hintergrund tut, Funktionen die uns nicht gefallen zu entfernen oder fehlende Möglichkeiten nachträglich einzubauen.

    Der seltsame Junge aus dem vorletzen Haus am Ende der Straße

    An verregneten Tagen konnte man die Kinder aus der Nachbarschaft im vorletzen Haus am Ende der Straße hinter der großen Wiese treffen. Und eigentlich war der Junge, der dort wohnte, schon ein mittlerer Teenager, ein wenig zu alt um mit Zehn- bis Zwölfährigen ein interessantes Gespräch führen zu können und wahrscheinlich nervte es ihn sogar ein wenig, wenn wir Jüngeren sein Zimmer belagerten. Mangels gleichaltriger Leidensgenossen im abgelegenen Dorfleben begnügte er sich aber geduldig mit den kleinen Besuchern.
    Für uns aber war es "the place to be", hatte dieser Nachbarsjunge schließlich etwas, das man in den späten 80ern bei niemandem sonst in der Gegend finden konnte: The great Giana Sisters, Bubble Bobble, Platoon, Skate or Die, Outrun, R-Type, The Last Ninja und viele Kisten voller Floppy Disks und Kasetten mit Spielen für den 64er.

    Damals hatte ich keine Ahnung, dass man Spiele auch im Geschäft kaufen konnte, kannte ich schließlich nur diese kopierten Floppys, die er von irgend einem Typ aus Deutschland per Post bestellte. Einmal im Monat bekam der Nachbarsjunge eine Liste, die offensichtlich selbst gedruckt und wiederum per Post an ihn verschickt worden war. Auf dieser Liste suchte man sich ein Spiel aus, bettelte bei den Eltern um ein paar Schilling, überwies den Betrag auf ein Konto und bekam nach ein paar Wochen einen braunen, gepolsterten Brief voll mit handbeschrifteten Disketten.

    So landete eines Tages auch eine Kopie von Ski or Die bei uns, die wie verrückt so lange gezockt wurde, bis die Mutter des Nachbars an die Zimmertür klopfte um uns nach Hause zu jagen. LOAD "*", 8, 1 ... RUN. Was das genau bedeutete, wurde nicht hinterfragt. Wir wussten nur, wenn der Nachbar Hausaufgaben machen musste und man alleine vor seinem Rechner saß, musste man diese Zeilen eintippen, damit der Spaß beginnen konnte. Tat man das mit der eingelegten Ski or Die Floppy, erschien eine kleine Grafik am Bildschirm und die Aufforderung, irgendeinen Code einzutippen. Welchen Code man verwendete, war egal und es erschien die Nachricht "Garfield was here", bevor das Spiel startete.
    Das erschien irgendwie sinnlos, aber der große Junge erklärte, das wäre ein GECRACKTER Kopierschutz. Hätte man das Spiel in einem Laden gekauft, hätte man ein kleines Büchlein, in dem man die Codes findet. Was das genau bedeutete, war uns damals nicht klar, wir wussten nur, wir verdanken die schönen, verregneten Zocker-Tage mit unseren Freunden Garfield und seiner Crew.

    Die Jahre vergingen, der blaue Commodore Prompt war durch die schwarze DOS Commandline ersetzt und schließlich gegen einen bunten Windows 95 Desktop getauscht worden und wir hatten begonnen, die Telefonrechnungen unserer Eltern mit pfeifenden und piepsenden 56K Modems zu strapazieren. Flatrates waren noch in weiter Ferne, der Internetzugang wurde minutengenau abgerechnet und so hockten wir noch immer gemeinsam in einem Zimmer und zockten F22 Lightning 3 online, immer dort, wo es ein Internet gab und die Eltern nicht gerade schimpften, weil die Telefonleitung schon wieder blockiert war. Obwohl das Spiel komplett auf die Festplatte installiert wurde, brauchte man die CD-Rom um das Game zu starten. Wenn es aber lief, konnte man das Laufwerk mit Gewalt öffnen, mit der CD ins Nachbarhaus rennen um es auch dort zu starten. Das funktionierte, aber gemeinsam online zu spielen war eine logistische Herausforderung.

    Irgendwann traf ich den älteren Jungen aus der Nachbarschaft, der inzwischen in einer anderen Stadt lebte um dort Informatik zu studieren. Ich erzählte ihm von unserem Problem und fragte, ob es von Garfield nicht auch einen Crack für F22 Lightning 3 gäbe. Da ihn Spiele nicht mehr zu interessierten schienen, konnte er nicht mit einem Crack dienen und erklärte: "Wenn es keinen Crack gibt, musst du das Spiel halt selbst cracken". "Das geht?", frage ich. "Klar, dafür brauchst du einen Debugger", antwortete er. "Und was ist das?", fragte ich, ohne zu ahnen, dass mich seine Antwort die nächsten 20 Jahre beschäftigen würde. "Das ist ein Programm, mit dem du dein Betriebssystem jederzeit unterbrechen und nachsehen kannst, was deine anderen Programme gerade tun", erklärte er, "such im Internet einfach nach SoftICE".

    Die Altavista Suche - Google kannte ich damals nicht - führte von SoftICE über HIEW zu W32DASM und weiter zu +ORC, The Old Red Cracker. Dieser führte zur +HCU die wiederum zu Fravia, Mammon's Tales To His Grandson, den Searchlores und weiter zu astalavista.box.sk und Crackstore.pl leitete. Dort erfuhr man, dass es eine Webscene und eine 0day-Welt gab, man hörte von Crackern die den Kopierschutz umgingen und Couriers, die fertige Releases prüften und zwischen den privaten Servern verschoben. Zugang hatte, wer sich in der Szene einbrachte und es schaffte, genügend Credibility aufzubauen. Laxity, Oddity, Manifest Destiny, CORE, Razor 1911, Radium, die Liste der Groups war riesig und wer wusste, wo man suchen musste, landete bei einer unüberschaubaren Füllle an Tutorials und Tools um Copy Protections auszuhebeln. Die Papers wurden ausgedruckt, am Schulweg und während langweiliger Unterrichtsstunden studiert, viele davon zu kompliziert um wirklich zu verstehen, worum es genau ging. Klar war nur, es war verführerisch, in dieser Ecke des Internets zu wandern und ihre teils seltsamen Bewohner kennenzulernen.

    Aber die Papers von Fravia und seinem Dunstkreis beschäftigten sich mit viel mehr, als dem technischen Aushebeln eines Kopierschutzes. Sie erklärten, die Zusammenhänge des Internets, öffneten Türen, die aus dem WWW hinaus in den IRC und zu public FTP Sites und Newsgroups führten. Es ging neben technischen Skills um Social Engineering, darum wie Werbung manipuliert, wie Supermärkte aufgebaut sind, um Menschen zu überlisten und was es bedeutet, die Gesellschaft mit kritischen Augen zu betrachten.

    Am Anfang blieb von den Details aus den Papers nicht viel Verständliches hängen, nur die Bedeutung der wichtigsten Assembler Befehle JMP, JNZ, JZ, MOV, CALL, RET und dass man Anwendungen mit einem Disassembler in Assembler Code übersetzen (sogn. Deadlistings) oder mit einem Debugger live beobachten konnte, was im Speicher passierte, wenn das Programm an einer bestimmten Stelle unterbrochen wurde.

    Nach einiger Zeit wurde auch klar, dass der Ablauf im Großen und Ganzen immer ähnlich ist:

    Suche deinen Hook. Im einfachsten Fall die Messagebox, die dir verrät, dass du die F22 Lightning CD-Rom einlegen musst um das Spiel zu starten, oder dass deine Seriennummer für die Shareware, die du gerne verwenden möchtest, nicht stimmt.
    Setze einen Breakpoint dort im Programm, wo die Nachricht angezeigt wird.
    Such in den Zeilen oberhalb der Messagebox nach einem konditionalen Sprung wie JZ, JNZ, JE, JNE oder JE, der über den Code, der die "böse" Fehlermeldung anzeigt, hinwegspringt.
    Hast du den Sprung gefunden, nimm deinen Hexeditor und ändere zB. 0x75, also JNE (Jump if not Equal) zu 0xEB, also JMP (Jump always).

    Für einen großen Teil der Programme, die man auf Tucows oder ähnlichen Sharewareseiten finden konnte, genügte dieses Wissen. Ich kannte einen Typ aus Toronto, der alleine damit an manchen Tagen 30 Releases und mehr veröffentlichte. Mit ein bisschen Interesse lernte man aber nach einiger Zeit die Zusammenhänge zu verstehen, es wurde klar, dass, um den eingegebenen Schlüssel auf Korrektheit zu prüfen, irgendwo der Code versteckt sein musste, der einen gültigen Schlüssel produzierte. Mit etwas Glück konnte man auch die Stelle finden, an der die eingegebene Seriennummer mit dem korrekten Serial verglichen wurde, wodurch man zu gültigen Seriennummern kam. Schaffte man es, sich mit MASM oder TASM anzufreunden, gelang es manchmal sogar, die Funktionen, die korrekte Schlüssel berechneten, aus der App zu extrahieren und daraus einen Keygen zu basteln.

    Ein Compiler übersetzt also z. B. C++ Quellcode in Befehle, die der Prozessor ausführen kann und speichert diese als .exe oder .dll Dateien (zumindest auf einem Windows Rechner), die mit einem Disassembler in ihren Assembler Code übersetzt werden können. Um in kompilierte Anwendungen "hinein zu schauen", ist es somit notwendig, Assembler zu verstehen und zu lernen, wie API Funktionen des Betriebssystems eingesetzt und Daten im Arbeitsspeicher verwaltet werden. Mit der zunehmenden Geschwindigkeit von Rechnern wurden aber Anwendungen immer populärer, die einen Interpreter zur Ausführung nutzen - so zu sagen ein Programm, das vor oder während der Ausführung die Anwendung liest und erst dann in Prozessorbefehle übersetzt. Diese lassen sich mit verschiedenen Tools meist in ihren Quellcode zurück übersetzen oder liegen in unverschlüsseltem Quellcode auf dem Rechner. Das Auffinden einer Protection oder das Ändern von Funktionen wird dadurch um ein Vielfaches einfacher, weil das Programm in von Menschen lesbarem Code vorliegt. Es genügt die Programmiersprache zu verstehen ohne sich mit der inneren Funktionsweise des Rechners herumschlagen zu müssen.

    Ein Beispiel für solche interpretierten Programme sind Chrome Browser Extensions, die wir auf den nächsten Paar Seiten gemeinsam zerlegen, genauer betrachten und wieder zusammenschrauben wollen.


    Browser Extensions herunterladen, zerlegen und wieder zusammenbauen

    Eines meiner favourite Chrome Add-Ons ist "Explain & Send Screenshots". Da ich das Add-On ständige nutze, erlaube ich die Ausführung auch im Incognito Mode. Dieses Plugin kann somit alle(!) Seiten sehen, die ich mit diesem Browser besuche. Grund genug, es genauer unter die Lupe zu nehmen und zu prüfen, ob dieses Plugin nach Hause telefoniert. Dabei kümmern wir uns auch gleich darum, die Funktionen, die in der Demo deaktiviert sind, freizuschalten.

    Man findet "Explain & Send Screenshots" im Chrome Store. Schon der Download OHNE das Add-On automatisch im Browser zu installieren gestaltet sich nicht ganz einfach, findet man schließlich nirgendwo auf der Seite einen Link zur .CRX Datei, in der das Add-On vom Chrome Store ausgeliefert wird.

    Glücklicherweise erlaubt Chrome, extrahierte Add-Ons von der Festplatte zu laden und bringt alle Werkzeuge mit, um unseren Code auch wieder in einem Installer im .CRX Format zu verpacken.

    Dafür installieren wir das Add-On vom Chrome Web Store und suchen das Verzeichnis, in das es bei der Installation vom Browser extrahiert wurde. Normalerweise befindet sich das Verzeichnis, in dem der Browser seine Dateien ablegt im Homedir eures Users.

    Chrome unter Windows
    C:\Users\<USER_NAME>\AppData\Local\Google\Chrome\User Data\Default\Extensions

    Chrome bzw. Chromium unter Linux / Mac
    ~/.config/google-chrome/Default/Extensions/
    ~/Library/Application\ Support/Google/Chrome/Default/Extensions
    ~/.config/chromium/Default/Extensions

    Alternativ liefert eine Suche nach einem Verzeichnis mit der ID des Add-Ons als Name den gesuchten Ort. Unter Linux oder Mac im Terminal liefert z. B.
    Code (Bash):
    1. find -type d -iname "<EXTENSION ID HIER>"
    das gewünschte Verzeichnis. Der Code des Add-Ons kann dort direkt bearbeitet werden. Um Änderungen zu übernehmen ist ein Reload über den Extension Manager notwendig. Die ID des Add-Ons wird im Chrome Extension Manager angezeigt.

    Name:  ngb_extension_manager_id.jpg
Hits: 263
Größe:  26,7 KB



    .CRX Dateien manuell entpacken

    Du sagst, "ich will aber die .CRX Datei haben!"? Man findet im Netz einige Scripts, die den Download der .crx Dateien ermöglichen. Ein bequemer Weg, um an die Installationsdatei unserer Extension zu kommen, ist die Seite http://crxextractor.com/. Dort wird der Pfad zum Chrome Store eingefügt und der Download des Plugins beginnt automatisch.

    Name:  ngb_notsupported.jpg
Hits: 259
Größe:  12,9 KB


    CRX Dateien sind grundsätzlich zip-komprimierte Archive, die die einzelnen Dateien des Add-Ons enthalten. Warum manche Zip-Programme Schwierigkeiten haben, das Archiv zu extrahieren, liegt daran, dass am Beginn der Datei einige Meta-Informationen stehen, bevor das eigentliche Zip-Archiv beginnt. Wir müssen also das ZIP Archiv aus der CRX Datei extrahieren, bevor wir sie wie normale Archive extrahieren können.

    Wenn es schnell gehen soll, bietet http://crxextractor.com/ dafür eine fertige Funktion, wir wollen es aber genau wissen. Schauen wir uns die CRX Datei im Hexeditor an. Unter Linux verwende ich dafür GHex, unter Windows sollte z. B. HexEdit können, was wir brauchen.

    Name:  ngb_addon_header.jpg
Hits: 262
Größe:  240,7 KB


    Um aus diesem Durcheinander von Zahlen und Wortfetzen etwas Sinnvolles machen zu können, müssen wir zunächst wissen, wie CRX und ZIP Files aufgebaut sind. Um herauszufinden, mit welchem Dateityp man es zu tun hat, schaut man vielleicht auf die Extension, .exe, .docx, .zip. Fehlt diese aber, kann bei komplexeren Dateitypen über den File Header geprüft werden, worum es sich handelt. Eine .exe Datei beginnt z. B. mit MZ, eine .zip Datei mit PK.

    Schauen wir uns das ein bisschen genauer an. Die Spezifikation von PK Zip Files beschreibt, dass der File Header einer Zip Datei mit den Zeichen 0x50 0x4B 0x03 0x04 beginnt. Umgewandelt in einen Ascii String liest sich diese Kombination als "PK..".

    Name:  ngb_zip_header.jpg
Hits: 259
Größe:  70,5 KB


    Die Chrome Developer Dokumentation erklärt, dass die "Magic Number" am Beginn von CRX Dateien 0x43 0x72 0x32 0x34, sprich: "Cr24", ist.

    Name:  ngb_crx_header.jpg
Hits: 257
Größe:  65,1 KB


    Wenn unser Zip Programm die CRX Datei öffnet, findet es am Beginn der Datei nicht den Zip Header "PK..", sondern den Header der CRX Datei, "Cr24" und verweigert die Arbeit. Um den Add-On-Installer extrahieren zu können, müssen wir nur den gesamten CRX Header entfernen und die Datei mit einer .zip Endung speichern:

    Name:  ngb_cut.jpg
Hits: 253
Größe:  253,3 KB


    Nachdem die Meta Daten am Beginn der .CRX Datei entfernt wurden, sollte sie so aussehen:

    Name:  ngb_crx_header_removed.jpg
Hits: 252
Größe:  238,6 KB


    Das Add-On kann jetzt aus dem Zip Archiv in ein beliebiges Verzeichnis extrahiert werden, um den Source Code genauer zu durchforsten.


    Entpackte Add-Ons laden und wieder in ein .CRX verpacken

    Über welchen der beschriebenen Wege ihr zum Source des Add-Ons gekommen seid, von hier an erlaubt uns der Extension Manager von Chrome, die entpackte Extension zu laden und am Ende mit unseren Änderungen auch wieder als .CRX Chrome Erweiterung zu speichern.

    Die Erweiterungsverwaltung ist im Browser über chrome://extensions oder den Menüpunkt "Weitere Tools > Erweiterungen" erreichbar. Um das entpackte Add-On über den Button "Entpackte Erweiterung laden" zu öffnen, muss zuerst der Entwicklermodus aktiviert werden.

    Danach wird das Verzeichnis, in das im vorherigen Schritt das Add-On extrahiert wurde, ausgewählt und das Add-On aktiviert. Versucht man, ein selbst extrahiertes Add-On über den Extension Manager von Chrome zu laden, zeigt der Browser möglicherweise einen "Fehler beim Laden der Erweiterung". Im Verzeichnis, in das unsere Extension extrahiert wurde, muss das Unterverzeichnis _metadata gelöscht werden, bevor das Plugin geladen werden kann.

    Hinter dem Button "Erweiterung packen ..." verbirgt sich - wie wahrscheinlich vermutet - die Funktion um unseren Code wieder in einen Add-On-Installer im .CRX Format zu verpacken.


    Zeig mir deine Files und ich sag dir wer du bist

    Das extrahierte Add-On liegt nun also nackt vor uns, Änderungen können direkt in diesem Verzeichnis gemacht werden. Um diese wirksam zu machen, muss die Extension neu geladen werden.

    Wenn der Entwicklermodus im Extension Manager aktiviert ist, kann die Erweiterung aber auch direkt im Debugger des Browsers beobachtet werden. Ein Rechtsklick auf das Symbol der Erweiterung in der Menubar des Browsers zeigt dafür den Eintrag "Pop-up prüfen". Manche Add-Ons zeigen auch im Extension Manager (chrome://extensions) den Eintrag "Ansicht prüfen". Ein Klick darauf öffnet das Add-On im Debugger.

    Name:  ngb_addon_im_debugger_starten.png
Hits: 255
Größe:  24,6 KB


    Im Debugger kann live beobachtet werden, wie sich das Programm verhält, Breakboints können gesetzt und Änderungen am Code gemacht werden. Alles was hier passiert ist jedoch nur temporär. Um Änderungen dauerhaft zu speichern, muss der Code in unserem Verzeichnis gepatcht und das Add-On im Browser neu geladen werden.


    Tracking Funktionen entfernen

    Die Datei analytics.js springt zunächst ins Auge. Hier findet man ähnlichen Code, wie auf Websites, die auf Tracking mit Google Analytics setzen. Im Code wird ein GoogleAnalyticsObject instantiiert und der UA-Code des Owners definiert, viel mehr passiert hier aber noch nicht.

    Beim Durchsuchen der restlichen Code Files nach auffälligen Keywords, stoßen wir auf die Funktion analytics(), die analytics.js ausführt und für die eigentliche Einbindung des Google Trackers verantwortlich ist.

    Name:  ngb_debugger_analytics.png
Hits: 257
Größe:  105,0 KB


    Wir wissen jetzt also an welcher Stelle das Plugin unsere Aktivitäten verfolgt, wie können wir es davon abhalten? Wir könnten den Quellcode nach dem Namen der Funktion durchsuchen und alle Aufrufe löschen oder auskommentieren. Dabei laufen wir aber Gefahr, dass wir eine Stelle übersehen, weil die Funktion zum Beispiel auch in einem anderen File ausgeführt wird. Die Funktion komplett zu löschen, würde in einem Ausführungsfehler enden. Bleibt uns also die Möglichkeit die Funktion zu behalten aber den gesamten Code zu löschen, oder einfach ein
    Code (JavaScript):
    1. return;
    an die erste Stelle der Funktion zu setzen, um die Ausführung zu unterbrinden. Welcher Weg gewählt wird, ist grundsätzlich egal, hauptsache der Code, der das GoogleAnalyticsObject erstellt wird nicht mehr ausgeführt.

    Das Tracking ist somit deaktiviert, kümmern wir uns darum, die eingeschränkten Funktionen zu aktivieren.


    Einschränkungen der kostenlosen Version entfernen

    Das kostenlose Add-On beschränkt einige seiner Funktionen, um uns zu einer Spende zu motivieren. In diesem Fall ist der Entwickler überaus Fair und bietet an, einen beliebigen Betrag zu bezahlen um seine Extension in vollem Umfang zu nutzen. Bedenkt man, wie viel Zeit er wahrscheinlich in die Entwicklung der Erweiterung gesteckt und mit Supportanfragen vergeudet hat, sollte man als aufrechter Nutzer das auch tatsächlich tun.

    Unter dem Vorwand das später zu erledigen, versetzen wir uns aber in die Situation eines nicht ehrenwerten Blackhats, der die Sicherung umgehen möchte.

    Wie bereits am Beginn dieses Tutorials beschrieben, brauchen wir einen Hook - einen Einstiegspunkt - um uns Schritt für Schritt der Funktion, die entscheidet ob das Plugin bereits bezahlt wurde, anzunähern. In diesem konkreten Fall, zeigt das Programm einen Spendenaufruf, sobald wir eine Funktion verwenden, die in der Demoversion nicht verfügbar ist. Eine davon ist die Änderung der Schriftgröße:

    Name:  ngb_demo_message.jpg
Hits: 254
Größe:  64,3 KB


    In unserem Browser erscheint die Meldung: "Die ausgegrauten Optionen sind zusätzliche Funktionen, die ich lange entwickelt habe. Wenn Sie Ihnen gefallen, spenden Sie einen BELIEBIGEN Betrag, um sie freizuschalten und mich zu unterstützen.". Spätestens jetzt sollten wir ein schlechtes Gewissen bekommen und ein paar Euro überweisen.

    Um unseren Einstiegspunkt zu finden, durchsuchen wir common.js nach Teilen dieses Strings. Nichts. Schauen wir uns explainAndSendScreenshots.js an; wieder nichts. Da der Text irgendwo sein muss, durchsuchen wir das gesamte Add-On-Verzeichnis nach diesem Text. Im Linux oder Mac Terminal z. B. mit dem Befehl
    Code (Bash):
    1. grep -lir "ausgegrauten Optionen" ./*
    und werden in der Datei ./_locales/de/messages.json fündig:

    Code (JavaScript):
    1. "extraFeaturesPopup1": {
    2.      "message": "Die ausgegrauten Optionen sind zusätzliche Funktionen, die ich lange entwickelt habe."
    3. },
    Das Tool wurde in viele Sprachen übersetzt. Anstelle den Text hardcoded in die Logik zu verpacken, werden Nachrichten in externe Files verschoben und bekommen einen sprachunabhängigen Platzhalter. In diesem Fall extraFeaturesPopup1.

    Bei einer weiteren Suche in common.js nach extraFeaturesPopup1 landen wir letztendlich an der Stelle, die für die Anzeige unseres Spendenaufrufs verantwortlich ist.

    Code (JavaScript):
    1. function openContributeDialog(key) {
    2.     openGenericDialog({
    3.         title: getMessage("extraFeatures"),
    4.         content: getMessage("extraFeaturesPopup1") + "<br>" + getMessage("extraFeaturesPopup2"),
    5.         otherLabel: getMessage("contribute")
    6.     }).then(function (response) {
    7.         if (response == "other") {
    8.             openUrl("donate.html?action=" + key);
    9.         }
    10.     });
    11. }
    Wir sehen, hier wird nicht entschieden, ob das Programm bereits bezahlt wurde, es wird lediglich eine Dialogbox angezeigt. Diesen Code zu löschen oder mit einem
    Code (JavaScript):
    1. return;
    zu umgehen, würde uns nicht weiterbringen, wir könnten lediglich die Anzeige der Nachricht verhindern, das Programm würde aber weiterhin die Ausführung des gewünschten Codes verhindern.

    Suchen wir also im Code nach der Stelle, an der openContributeDialog aufgerufen wird, dort entscheidet sich wahrscheinlich, ob der Code ausgeführt oder diese Nachricht angezeigt wird.

    Wir finden diesmal zwei Stellen, function setStorage und function donationClicked. Beide klingen vielversprechend, da sie nach einem Check entweder nichts tun, true retournieren und enden, oder den Spendenaufruf zeigen und false zurückliefern.

    Code (JavaScript):
    1. function donationClicked(action, storage) {
    2.     // not passed then get global storage object
    3.     if (!storage) {
    4.         storage = window.storage;
    5.     }
    6.     if (storage.get("donationClicked")) {
    7.         return true;
    8.     } else {
    9.         openContributeDialog(action);
    10.         return false;
    11.     }
    12. }
    13.  
    14. //----------------------------------------------
    15.  
    16. function setStorage(storage, element, params) {
    17.     if (($(element).closest("[mustDonate]").length || params.mustDonate) && !pref("donationClicked")) {
    18.         params.event.preventDefault();
    19.         openContributeDialog(params.key);
    20.         return false;
    21.     } else {
    22.         storage.set(params.key, params.value);
    23.         return true;
    24.     }
    25. }
    26.  
    Schauen wir uns function donationClicked an. Der Name klingt vielversprechend. Die Vermutung liegt nahe, dass diese Funktion immer aufgerufen wird, bevor eine der gesperrten Funktionen verwendet wird. Sind wir in der Vollversion, wird TRUE zurückgeliefert, ansonsten erscheint der Spendenaufruf.
    Lasst uns das testen indem wir ein return true; an den Beginn dieser Funktion setzen:


    Code (JavaScript):
    1. function donationClicked(action, storage) {
    2.     return true; //unser patch
    3.     // not passed then get global storage object
    4.     if (!storage) {
    5.         storage = window.storage;
    6.     }
    7.     if (storage.get("donationClicked")) {
    8.         return true;
    9.     } else {
    10.         openContributeDialog(action);
    11.         return false;
    12.     }
    13. }
    14.  
    Wir öffnen den Extension Manager (chrome://extension), deaktivieren und reaktivieren das Plugin und machen einen Screenshot. Nach einem Rechtsklick auf den Screenshot erscheint der Button "Kopf- und Fusszeile entfernen" unter dem Bild.

    Name:  ngb_test_patch_01.jpg
Hits: 255
Größe:  76,6 KB


    Ein Klick auf den Button zeigt in der unregistrierten Anwendung den Donation Dialog. Klick ... und yess! Kein Spendenaufruf aber Kopf und Fußzeile verschwinden. Wars das? Testen wir eine andere Funktion, die in der unregistrierten Anwendung gesperrt ist und versuchen die Schriftgröße zu ändern. Klick ... und ... oh noes, der Spendenaufruf ist wieder da.

    Es muss also noch weitere Stellen geben, an denen geprüft wird, ob die Anwendung bereits bezahlt wurde. Welche Optionen bleiben uns?

    Schauen wir uns zunächst an, wie donationClicked entscheidet, ob true oder false zurückgeliefert wird.

    Code (JavaScript):
    1. if (storage.get("donationClicked"))
    Es muss also mit dieser Variable donationClicked in der Chrome Storage zu tun haben. Eine schnelle Textsuche im Verzeichnis des Add-Ons zeigt uns, dass fünf Files an irgendeiner Stelle diese Variable prüfen. Wir könnten nun alle Stellen in diesen Files suchen, an denen die letzte Prüfung passiert und dort patchen, aber gerade in umfangreichen Anwendungen könnte das eine eher zeitaufwendige Angelegenheit werden. Viel eleganter wäre es also, wenn wir diese Variable direkt manipulieren. Wir müssen nur einen geeigneten Ort im Code finden, um das zu tun. Das sollte natürlich eine Stelle ganz am Beginn des Codes sein, sodass wir wirklich sicher sein können, dass jede Funktion, die diese Variable prüft, auch bereits die Information erhält, dass wir eine registrierte Version nutzen.

    Irgendwo muss diese storage Variable definiert werden. Um diese Stelle zu finden, können wir entweder viel Zeit investieren und versuchen, den Code des Add-Ons vom Anfang bis zum Ende zu durchforsten und zu verstehen, was das Add-On genau macht, oder wir nutzen unsere Zen-Fähigkeiten und suchen auf gut Glück nach Funktions- oder Variablennamen, die uns in die Nähe der gewünschten Stelle bringen könnten.

    Suchen wir also nach "storage =" im File common.js: Es gibt nur einen Treffer und wir landen wieder in der Funktion donationClicked. Hier wird zwar storage gesetzt, wenn sie noch nicht zuvor definiert wurde, wir wissen aber von unserem ersten Versuch, dass uns ein Patch an dieser Stelle nur ein paar Funktionen freischaltet. Wir müssen tiefer hinein.

    Versuchen wir es in der nächsten Datei explainAndSendScreenshots.js. Gleich der zweite Treffer bringt uns zur Funktion getStorage und diese sieht vielversprechend aus. Hier wird das Storage Objekt mit Default-Werten befüllt ... der Zen-Cracker spürt gleich, das ist der gesuchte Platz:

    Code (JavaScript):
    1. function getStorage(storageArea) {
    2.     // must declare ALL defaults or they are NOT retrieved when calling storage.get
    3.     var storageDefaults = {};
    4.     storageDefaults.uploadedImgurFiles = [];
    5.     storageDefaults.presetButtonAction = "popupWindow";
    6.     storageDefaults.imageFormat = "image/jpeg";
    7.     storageDefaults.buttonIcon = "default";
    8.     storageDefaults.afterGrabAction = "openEditor";
    9.     storageDefaults.fontFamily = "cambria";
    10.     storageDefaults.fontSize = "normal";
    11.     storageDefaults.lineWeight = 5;
    12.     storageDefaults.fontBackground = "semi-transparent";
    13.  
    14.     storageDefaults.downloadButton = true;
    15.     storageDefaults.uploadButton = true;
    16.     storageDefaults.saveToDriveButton = true;
    17.     storageDefaults.copyToClipboardButton = true;
    18.     storageDefaults.editInPixlrButton = true;
    19.     storageDefaults.shareButton = true;
    20.     storageDefaults.openButton = true;
    21.     storageDefaults.pdfButton = true;
    22.     storageDefaults.searchImageButton = true;
    23.     storageDefaults.grabEntireScreenButton = true;
    24.     storageDefaults.openFromClipboardButton = false;
    25.     storageDefaults.openFileButton = true;
    26.  
    27.     var storage = new ChromeStorage({defaults:storageDefaults, storageArea:storageArea});
    28.     return storage.load().then(items => {
    29.         // load return items but we want to return storage object
    30.         return storage;
    31.     });
    32.  
    33. }
    Testen wir unsere Theorie und fügen unsere donationClicked Variable direkt hinter storageDefaults.openFileButton = true hinzu:

    Code (JavaScript):
    1. storageDefaults.donationClicked = true;
    Es fühlt sich schon sehr gut an, lasst uns das Add-On über den Extension-Manager neu starten (disable/enable). Wir machen einen neuen Screenshot, klicken auf das Text-Symbol, wählen die Schriftgröße und stellen mit Entzücken fest, wir haben "das Biest" bezwungen.

    Hoffe ihr hattet Spaß beim Lesen und Basteln. Wenn euch der Text gefällt, darf ich noch ein bisschen Werbung für eine kleine Gute-Nacht-Geschichte machen, die ich hier vor einiger Zeit gedropt hab:

    Woher kommt eigentlich Spam? (Analyse eines Hacks)

    Um gleich zwei der großen Meister zu zitieren: "There is a crack, a crack in everything, that's how the light gets in".

    https://www.youtube.com/watch?v=6wRYjtvIYK0
    Geändert von electric.larry (02.12.17 um 08:55 Uhr)

  2. #2
     Avatar von Meta
    Registriert seit
    Feb 2017
    Ort
    Ostberlin
    Beiträge
    587

    Re: Hacking Browser Add-Ons for fun and profit

    Es gab damals™ auch Programme, für die ein Dongle an der Centronics-Schnittstelle angebracht werden mußte. Später wurde Code in diese Dongles verlagert und bevor sie ausstarben, war dieser Code nicht mehr statisch. Das war richtig „lustig‟, du denkst, du hast es, es geht aber nur 1 Mal
         

  3. #3
    Nackt vor dem PC Avatar von Sibi
    Registriert seit
    Jul 2013
    Ort
    Schwobaländle
    Beiträge
    1.607

    Re: Hacking Browser Add-Ons for fun and profit

    **Beitrag verfassen, um daheim den spannenden Text am PC weiterlesen zu können**
    Bitte machen Sie Platz für die Karriereleiter! [JR - Kopf oder Zahl]

  4. #4

    Re: Hacking Browser Add-Ons for fun and profit

    Was wir hier definitiv nicht wünschen:

    Anleitungen zum Hacken anderer Leute Rechner, Mail- oder Messengeraccounts und ähnlichem
    Mhmmmm,...

  5. #5
    \''; DROP TABLE user; --

    Moderator

    (Threadstarter)

    Avatar von electric.larry
    Registriert seit
    Dec 2014
    Ort
    Raum 43
    Beiträge
    1.182
    ngb:news Artikel
    78

    Re: Hacking Browser Add-Ons for fun and profit

    @HoneyBadger: For educational purpose only!

    Allen Anderen vielen Dank für die Blumen!
    Für diesen Beitrag bedanken sich Meta, HoneyBadger

  6. #6

    Re: Hacking Browser Add-Ons for fun and profit

    Dein Artikel hat übrigens natürlich trotzdem ein "Danke" erhalten.
    Liest sich kurzweilig. Musste nur etwas schmunzeln.

  7. #7
    Defender of Freedom

    Administrator

    Avatar von Metal_Warrior
    Registriert seit
    Aug 2013
    Ort
    /dev/mapper/home
    Beiträge
    2.148
    ngb:news Artikel
    3

    Re: Hacking Browser Add-Ons for fun and profit

    @HoneyBadger:
    Was wir hier definitiv nicht wünschen:

    Anleitungen zum Hacken anderer Leute Rechner, Mail- oder Messengeraccounts und ähnlichem
    Ich hab dir die relevante Stelle mal markiert. Dein Computer = deine Software = deine Spielwiese.
    GCM/IT/S/O d-(--) s+:- a? C++(+++) UL+++(++++)$ P L+++>++++ W++ w@$ M--$ PS+(++) PE(-) Y+(++) PGP++(+++) t+ 5(+) R* !tv b+(++++) DI(++) G++ e+>++++ h(--) y?
    Das Ende ist nahe: Dem Harleyschen Kometen folgt der Gammablitz beim Scheißen.

  8. #8
    Danke für den Fisch

    Veteran

    Avatar von WoodstockimWeb
    Registriert seit
    Jul 2013
    Ort
    Münsterland
    Beiträge
    1.452

    Re: Hacking Browser Add-Ons for fun and profit

    Schön geschrieben und weckt Erinnerungen.

    Gruß
    Woodstock
    Danke Hubi, für Alles, genieße die Zeit mit Hezu.
    Time Machine, Demolicious, Wonderland XII, Sidelined, Artillery, Deus Ex Machina, Demomania, Revolved, Artphosis, 8 Bit Legend, MOS 6510A, VIC 6566, SID 6581

  9. #9

    Re: Hacking Browser Add-Ons for fun and profit

    Ich habe mir das aus "und ähnlichem" abgeleitet. Außerdem sagte ich doch schon, dass ich lediglich etwas darüber schmunzeln musste...
    Für diesen Beitrag bedankt sich electric.larry

  10. #10
    in Schwarz

    Moderator

    Avatar von LadyRavenous
    Registriert seit
    Dec 2016
    Ort
    hello world
    Beiträge
    740

    Re: Hacking Browser Add-Ons for fun and profit

    Ich musste beim Lesen lachen und grinsen - super geschrieben und erinnert mich an früher.
    "Das Internet? Gibts diesen Blödsinn immer noch?"
    Homer Simpson, Sicherheitsinspektor im Kernkraftwerk Springfield

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •