• Hallo liebe Userinnen und User,

    nach bereits längeren Planungen und Vorbereitungen sind wir nun von vBulletin auf Xenforo umgestiegen. Die Umstellung musste leider aufgrund der Serverprobleme der letzten Tage notgedrungen vorverlegt werden. Das neue Forum ist soweit voll funktionsfähig, allerdings sind noch nicht alle der gewohnten Funktionen vorhanden. Nach Möglichkeit werden wir sie in den nächsten Wochen nachrüsten. Dafür sollte es nun einige der Probleme lösen, die wir in den letzten Tagen, Wochen und Monaten hatten. Auch der Server ist nun potenter als bei unserem alten Hoster, wodurch wir nun langfristig den Tank mit Bytes vollgetankt haben.

    Anfangs mag die neue Boardsoftware etwas ungewohnt sein, aber man findet sich recht schnell ein. Wir wissen, dass ihr alle Gewohnheitstiere seid, aber gebt dem neuen Board eine Chance.
    Sollte etwas der neuen oder auch gewohnten Funktionen unklar sein, könnt ihr den "Wo issn da der Button zu"-Thread im Feedback nutzen. Bugs meldet ihr bitte im Bugtracker, es wird sicher welche geben die uns noch nicht aufgefallen sind. Ich werde das dann versuchen, halbwegs im Startbeitrag übersichtlich zu halten, was an Arbeit noch aussteht.

    Neu ist, dass die Boardsoftware deutlich besser für Mobiltelefone und diverse Endgeräte geeignet ist und nun auch im mobilen Style alle Funktionen verfügbar sind. Am Desktop findet ihr oben rechts sowohl den Umschalter zwischen hellem und dunklem Style. Am Handy ist der Hell-/Dunkelschalter am Ende der Seite. Damit sollte zukünftig jeder sein Board so konfigurieren können, wie es ihm am liebsten ist.


    Die restlichen Funktionen sollten eigentlich soweit wie gewohnt funktionieren. Einfach mal ein wenig damit spielen oder bei Unklarheiten im Thread nachfragen. Viel Spaß im ngb 2.0.

Hacking Browser Add-Ons for fun and profit

electric.larry

\''; DROP TABLE user; --
Teammitglied

Registriert
13 Dez. 2014
Beiträge
4.549
Ort
Raum 43
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. [src=bash]find -type d -iname "<EXTENSION ID HIER>"[/src] 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.

ngb_extension_manager_id.jpg



.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.

ngb_notsupported.jpg


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.

ngb_addon_header.jpg


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..".

ngb_zip_header.jpg


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

ngb_crx_header.jpg


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:

ngb_cut.jpg


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

ngb_crx_header_removed.jpg


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.

ngb_addon_im_debugger_starten.png


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.

ngb_debugger_analytics.png


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 [src=javascript]return;[/src] 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:

ngb_demo_message.jpg


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 [src=bash]grep -lir "ausgegrauten Optionen" ./*[/src] und werden in der Datei ./_locales/de/messages.json fündig:

[src=javascript]"extraFeaturesPopup1": {
"message": "Die ausgegrauten Optionen sind zusätzliche Funktionen, die ich lange entwickelt habe."
},[/src]

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.

[src=javascript]function openContributeDialog(key) {
openGenericDialog({
title: getMessage("extraFeatures"),
content: getMessage("extraFeaturesPopup1") + "<br>" + getMessage("extraFeaturesPopup2"),
otherLabel: getMessage("contribute")
}).then(function (response) {
if (response == "other") {
openUrl("donate.html?action=" + key);
}
});
}[/src]

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 [src=javascript]return;[/src] 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.

[src=javascript]function donationClicked(action, storage) {
// not passed then get global storage object
if (!storage) {
storage = window.storage;
}
if (storage.get("donationClicked")) {
return true;
} else {
openContributeDialog(action);
return false;
}
}

//----------------------------------------------

function setStorage(storage, element, params) {
if (($(element).closest("[mustDonate]").length || params.mustDonate) && !pref("donationClicked")) {
params.event.preventDefault();
openContributeDialog(params.key);
return false;
} else {
storage.set(params.key, params.value);
return true;
}
}
[/src]

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:


[src=javascript]function donationClicked(action, storage) {
return true; //unser patch
// not passed then get global storage object
if (!storage) {
storage = window.storage;
}
if (storage.get("donationClicked")) {
return true;
} else {
openContributeDialog(action);
return false;
}
}
[/src]

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.

ngb_test_patch_01.jpg


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.

[src=javascript]if (storage.get("donationClicked"))[/src]

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:

[src=javascript]function getStorage(storageArea) {
// must declare ALL defaults or they are NOT retrieved when calling storage.get
var storageDefaults = {};
storageDefaults.uploadedImgurFiles = [];
storageDefaults.presetButtonAction = "popupWindow";
storageDefaults.imageFormat = "image/jpeg";
storageDefaults.buttonIcon = "default";
storageDefaults.afterGrabAction = "openEditor";
storageDefaults.fontFamily = "cambria";
storageDefaults.fontSize = "normal";
storageDefaults.lineWeight = 5;
storageDefaults.fontBackground = "semi-transparent";

storageDefaults.downloadButton = true;
storageDefaults.uploadButton = true;
storageDefaults.saveToDriveButton = true;
storageDefaults.copyToClipboardButton = true;
storageDefaults.editInPixlrButton = true;
storageDefaults.shareButton = true;
storageDefaults.openButton = true;
storageDefaults.pdfButton = true;
storageDefaults.searchImageButton = true;
storageDefaults.grabEntireScreenButton = true;
storageDefaults.openFromClipboardButton = false;
storageDefaults.openFileButton = true;

var storage = new ChromeStorage({defaults:storageDefaults, storageArea:storageArea});
return storage.load().then(items => {
// load return items but we want to return storage object
return storage;
});

}[/src]

Testen wir unsere Theorie und fügen unsere donationClicked Variable direkt hinter storageDefaults.openFileButton = true hinzu:

[src=javascript]storageDefaults.donationClicked = true;[/src]

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
 
Zuletzt bearbeitet:

Meta

gesperrt

Registriert
11 Feb. 2017
Beiträge
1.379
Ort
Ostberlin
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 :cool:
 

Sibi

Benutzerdefinierter Titel

Registriert
14 Juli 2013
Beiträge
5.475
**Beitrag verfassen, um daheim den spannenden Text am PC weiterlesen zu können**
 

HoneyBadger

Aktiver NGBler

Registriert
7 Sep. 2015
Beiträge
1.956
Dein Artikel hat übrigens natürlich trotzdem ein "Danke" erhalten.
Liest sich kurzweilig. Musste nur etwas schmunzeln. ;)
 

HoneyBadger

Aktiver NGBler

Registriert
7 Sep. 2015
Beiträge
1.956
Ich habe mir das aus "und ähnlichem" abgeleitet. Außerdem sagte ich doch schon, dass ich lediglich etwas darüber schmunzeln musste...
 
Oben