![]() |
InnoSetup und Trojaner-Heuristiken
In der Shoutbox der EE habe ich mich ja schon darüber ausgelassen. Das Topic mache ich mal hier auf, weil ich denke, dass hier ein paar mehr Leute unterwegs sind, die damit evtl. etwas Erfahrung haben.
Ich habe für meinen mp3-Player mit InnoSetup einen Installer gebaut. Dieser wird seit gestern(?) vom Windows Defender als "Trojan:Win32/Ludicrouz.C" erkannt. "False Positives" sind ja nichts neues, und grade bei Delphi kommt das immer wieder mal vor (z.B. auch mit den Indy-Komponenten). Etwas blöd ist, dass es diesmal der Windows Defender ist, der sehr weit verbreitet sein dürfte. Außerdem ist blöd, dass das Microsoft-Formular zur Malware-Analyse den Upload verweigert ("Upload failed, please try again"), und mir somit eine Meldung dieses Fehlers (erstmal) nicht möglich ist (verschiedene Browser probiert, verschiedene OS probiert, verschiedene Varianten probiert, z.B. auch zip mit Passwort wie im Formular angegeben, ...). Dann habe ich mir gedacht: Gut, veränderst du halt das Setup ein bisschen - vielleicht reicht das ja, um die Heuristik dann nicht mehr zu triggern. Interessanterweise hat das beim ersten Versuch geklappt. Ich habe im InnoSetup-Script die Zeile
Code:
ausgetauscht durch
#define MyAppPublisher "Daniel Gaußmann"
Code:
Das hat tatsächlich gereicht, um den Windows Defender stumm zu schalten :shock:. Laut VirusTotal ist eine McAfee-Variante damit immer noch nicht zufrieden, aber das soll mir egal sein.
#define MyAppPublisher "Daniel Gausi Gaußmann"
Jetzt kann ich nachvollziehen, dass eine Malware-Heuristik bei einer nicht signierten Exe Alarm schlägt, wenn als Publisher z.B. "Microsoft" eingetragen ist. Sowas ist "verdächtig", völlig klar. Aber wenn ich einen unbekannten Hobby-Entwickler durch einen anderen ersetze, sollte das doch keinen Unterschied machen, oder? Ich halte Antiviren-Software ja tendenziell eher für Schlangenöl, aber so blöd kann das ja nicht sein ...:? Dann ist mir aufgefallen, dass die neue Version (mit dem längeren Publisher-String) ein paar Bytes kleiner ist als die alte. Beim Blick in die beiden Binaries (z.B. mit HxD) sieht man, dass dieser (und andere) Strings mit einer konstanten Länge (Unicode-String, aufgefüllt mit Leerzeichen) in der Datei zu finden sind - da ändert sich die Dateigröße also nicht. Relativ am Ende (größenordnungsmäßig die letzten 10%) des Installers findet sich dann ein Teil mit größeren Binär-Unterschieden. Die Teile sind dabei echt verschieden, nicht einfach nur um ein paar Bytes verschoben, beginnend mit "Inno Setup Setup Data" (als AnsiString). Ich nehme mal an, dass in diesem Teil die Setup-Daten nochmal(?) in komprimierter(?) Form vorliegen, und dass der längere String in Kombination mit den anderen Strings insgesamt besser komprimiert werden kann. Weiter kann ich mir vorstellen, dass in diesem anderen "Bytehaufen" dann keine Muster mehr vorkommen, die auch in besagtem Trojaner vorkommen. Jetzt ist es natürlich etwas komisch bzw. verdächtig, wenn ich schreibe "Ich hab da nur einen String ausgetauscht", und ein misstrauischer Anwender dann mal ein Diff macht und weitaus mehr Unterschiede findet. :stupid: Hat damit jemand schon Erfahrung gesammelt, bzw. weiß, warum sich dieser letzte Teil im Installer so deutlich unterscheidet, wenn man nur eine String-Konstante ändert? Beide Varianten als Download, falls sich das jemand ansehen möchte: ![]() ![]() |
AW: InnoSetup und Trojaner-Heuristiken
Erstell mal zwei Dateien auf der Kommandozeile:
Code:
echo x x>xx
Code:
Der Unterschied in den Dateien ist genau ein Leerzeichen.
echo x x>xxx
Zippe sie und vergleiche sie. Bei mir finde ich in den Zips 36 Unterschiede. Oder: Marginale Änderungen können in gepackter Form zu absolut unterschiedlichen Ergebnissen führen. Statt 'ner Stringänderung in 'ner Datei füge doch einfach eine weitere, für das Programm nicht erforderliche Datei mit in das Setup ein. Da musst Du Dich dann niemandem gegenüber rechtfertigen. 'ne Datei, die nur die Versionsnummer des Programmes enthält oder die MD5-Checksumme der Exe, jeweils 'ne neue GUID oder sonstein Phantasiewert. Wenn Du diese Datei dann immer im Setup hast, fällt ein Vergleich alte/neue Installation auf Dateiebene dem Anwender sicherlich erstmal nicht auf. Eventuell reicht es ja sogar, in diese Datei immer aktuelles Datum und aktuelle Uhrzeit vom Zeitpunkt der Erstellung des Setups zu nehmen. Damit ist diese Datei garantiert bei jedem Erstellen des Setups anders und Du hast (mit etwas Glück) so den Fehler/Virusverdacht mit dem nächsten Neuerstellen des Setups behoben. Oder ein zusätzliches, für das Setup entbehrliches,
Code:
einfügen.
#define GUID <jedesmal ein neuer Wert>
Einfach mal probieren, welche der Varianten zu einer deutlich anderen Setupdatei führt und diese Variante dann nutzen. Frei nach dem Motto: Erstellprozess des Setups starten. Upps: Virusalarm Erstellprozess des Setups starten. Kein Virusverdacht. |
AW: InnoSetup und Trojaner-Heuristiken
Zitat:
Zitat:
Zitat:
Zitat:
Damit muss man halt mittlerweile leben ... |
AW: InnoSetup und Trojaner-Heuristiken
Zitat:
|
AW: InnoSetup und Trojaner-Heuristiken
Dass beim packen kleine Änderungen massive Auswirkungen haben können, ist mir durchaus klar. Frage ist eher, warum der String einmal im Klartext in der Datei zu lesen ist, und sich dann aber auch anderer Teil weiter verändert. Da gibt es also anscheinend eine Doppelung - oder irgendwelche anderen Wechselwirkungen. Ob da wirklich was komprimiert wird, weiß ich ja nicht einmal. Desweiteren ist die Frage, warum die Malware-Heuristik auf den gepackten(?) Daten läuft (und nicht auf den entpackten), und dann String-Konstanten so einen Einfluss haben können.
Zitat:
Eine nicht verwendete GUID in das Setup-Script zu schreiben bringt übrigens nichts. Wenn die Konstante weiter nicht verwendet wird, wird sie von InnoSetup nicht mit einkompiliert - beide Versionen sind dann binärgleich. Eine Dummy-Datei zum Brechen der Heuristik mit auszuliefern hat allerdings auch im ersten Versuch geklappt. Vielleicht mach ich das, wenn das wieder einmal auftritt :thumb:. Da schreib ich dann irgendeinen Blödsinn rein, und verkauf das als "Easteregg" :stupid:. Zitat:
Zitat:
![]() Zitat:
|
AW: InnoSetup und Trojaner-Heuristiken
Heuristik heißt bei Virenscanner: Wir suchen nach 'ner Ähnlichkeit.
Diese Ähnlichkeit muss Grenzen haben, denn ansonsten wäre alles ähnlich. Wie genau diese "Ähnlichkeitesgrenze" definiert ist, weiß wohl nur der jeweilige "Ähnlichkeitenfindenentwickler". Sprich: Das ist von außen nicht durchschaubar. Aber auf Byteebene kann diese Grenze nur bei einem Byte Unterschied liegen. Entweder etwas passt noch in die Heuristik oder eben nicht. Bei alledem darf man nicht vergessen: Wenn heute eine Datei problemlos durch alle Virenscanner als ok durchgeht, kann morgen schon die gleiche Datei in absolut unveränderter Form nicht mehr durchgehen, einfach, weil in der Heuristik was verändert wurde und nun irgendwas als Treffer interpretiert wird, was gestern noch kein Treffer war. Man muss eigentlich immer damit rechnen, dass ein Virenscanner von heute auf morgen bei einer bestimmten Datei zuschlägt oder eben auch nicht mehr zuschlägt. Das ist ein bisserl wie beim Münzwurf: Kopf oder Zahl. Hatte mal so ein Problem bei einem Konsolenprogramm, dass einfach nur im Batchbetrieb Dateien mit OEM-Zeichensatz in ANSI-Zeichensatz konvertieren sollte. Irgendwann war die Exe plötzlich virenverseucht (auch wenn man sie mit Delphi neu kompilierte). Ein paar Tage später war sie es dann nicht mehr, dazwischen lagen nur ein paar Updates der Signaturdateien des Virenscanners. Andere Virenscanner befanden die Exe die ganze Zeit über als "völlig unauffällig". |
AW: InnoSetup und Trojaner-Heuristiken
Wenn sich die Länge eines Strings in der EXE verändert, dann verschieben dich auch andere nachfolgende Dinge und Referenzen darauf müssen dann ebenfalls angepasst werden usw.
Am "Einfachsten" ist es ja immernoch dem betreffenen Antivierenhersteller seinen False-Positive zu melden und die Viren-Signatur bzw. die Heuristik dementsprechend verbessern zu lassen, anstatt selbst so lange zumzufummeln, bis "aktuell" bei einem selbst das Problem "weg" ist. Auf Entwicklungsrechnern macht es sich auch nicht schlecht, wenn man die Virensoftware nicht alles gleich löschen lässt, sondern nur "sperren und melden" aktiviert, um weniger Arbeit zu haben, mit andauernd verschwindenen Dateien, ohne dass man vom Virenprogramm das "direkt" gesagt bekommt. (sondern es erst später zufällig im Log entdeckt) |
AW: InnoSetup und Trojaner-Heuristiken
Zitat:
Zitat:
Aber gut, ich werde das dann wohl abhaken mit "kann man nix machen". Hätte ja sein können, dass sich jemand schon mal im Detail mit InnoSetup in diesem Sinne auseinandergesetzt hat, oder den Aufbau von solchen Installer-Binaries näher kennt - also z.B. was da im letzten Teil der exe zu finden ist. |
AW: InnoSetup und Trojaner-Heuristiken
In der Setupdatei findest Du eine mehr oder weniger große Anzahl von
Code:
Dahinter folgt die Zeichenfolge zlb + hex 1A. Ab dort ist der gepackte Inhalt Deines Programmes und aller seiner Bestandteile zu finden.
PADDINGXXPADDING
Änderungen an Deinem Programm oder zugehöriger Dateien führen zwangsläufig zu einer Änderung dieses Bereiches. Quelltexte: ![]() |
AW: InnoSetup und Trojaner-Heuristiken
Zitat:
Als irgendwann mal in meinem Forum mal wieder eine Anschuldigung kam, bin ich sehr pampig geworden. Und an ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:09 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz