Häufig gestellte Fragen
Teilen:
Allgemeines
- Diese Fehlermeldung resultiert aus einem standardmäßig aktivierten Sicherheitsfeature, der Code-Integritätsprüfung. Diese kann in AxProtector für Ihre geschützte Anwendung aktiviert oder deaktiviert werden. In der AxProtector GUI finden Sie diese Option auf der Seite "Sicherheitsoptionen |Erweitert“. Auf der Kommandozeile aktiviert der Parameter -cav dieses Feature.
Bitte beachten Sie, dass die Option -cav bei der Verwendung der Gnu Compiler Collection (GCC) unter Windows derzeit nicht verwendet werden kann bzw. sollte. Zur Laufzeit kompiliert GCC in einer Weise, dass eine Vorberechnung der Checksummen zur späteren Prüfung nicht möglich ist.
Der Code-Integritätscheck überprüft die Integrität Ihrer geschützten Anwendung und DLL’s, sodass zur Laufzeit sichergestellt werden kann, dass es sich bei den Dateien auch um Ihre Originaldateien handelt und keine manipulierten Dateien verwendet werden. Außerdem wird bei jeder 2. Überprüfung zur Laufzeit (runtime check) auch die Integrität des Speichers im Prozessraum Ihrer Anwendung überprüft. Verändert dann z.B. ein Drittprogramm zur Laufzeit etwas im Prozessraum am Speicher Ihrer Anwendung, beendet der "Code Integrity Check" Ihre Anwendung aus Sicherheitsgründen, um z.B. Reverse Engineering und das Manipulieren der Anwendung zur Laufzeit zu verhindern.
Eine Beschreibung und nähere Informationen zur Code-Integritätsprüfung können Sie auch dem separaten CodeMeter-Entwicklerhandbuch in den Kapiteln "Automatischer Softwareschutz mit AxProtector | AxProtector Karteireiter | Windows Anwendung oder DLL | Sicherheitsoptionen | Erweiterte Sicherheitsoptionen" und "Automatischer Softwareschutz mit AxProtector | Kommandozeilen-Optionen für AxProtector | Einstellungen zu Verschlüsselungsvorgängen“ entnehmen.
Schlägt der "Code Integrity Check" fälschlicherweise zu, kann dies z.B. auch durch ein Antiviren-Programm ausgelöst worden sein, da diese durchaus öfter Mechanismen aufweisen, die den Speicherbereich von laufenden Anwendungen prüfen und oft auch Daten darin verändern. In so einem Fall empfiehlt es sich, Ihre geschützte Anwendung aus einer Überprüfung des Antivirenprogramms herauszunehmen und die Anwendung als Ausnahme einzutragen. - AxProtector besitzt die Option --isprotected <file>, die Informationen zur AxProtector-Verschlüsselung einer beliebigen Datei liefert.
Damit können Sie z.B. kontrollieren, ob eine Anwendung bereits geschützt ist oder ggf. mit welcher Version von AxProtector diese geschützt wurde.
Je nach AxProtector-Variante erhalten Sie dann für eine geschützte Datei z.B. folgende Ausgaben:
Native:
AxProtector: warning 6004 - Image is already protected with Ax-/Ex- or IxProtector version 10.70.4402.
.NET Framework:
Image is already protected with AxProtector .NET.
.NET Standard:
Error 201: Using AxProtectorNet for Netstandard requires "-ui" or "-um" parameter to be set.
Java:
Info: Application is already protected with Ax- or IxProtector version 10.200a Build 3164 of 2018-Sep-26. - Mit einer AxProtector-Version 11.10 oder neuer aus dem CodeMeterSoftware Development Kit (SDK) Version 7.50 oder neuer erscheint eine Warnung, wenn die Lizenz für die Verwendung von AxProtector demnächst abläuft. Sie sollten daher die neueste lizenzierte AxProtector-Version verwenden.
Die dafür benötigten Lizenzen können Sie selbst über unser License Portal verlängern bzw. abholen. Bitte öffnen Sie dazu den https://license.wibu.com/portal/-Link und gehen wie folgt vor:
1. Anmelden an License Portal an, falls Sie bereits einen Zugang haben.
Alternativ Eingeben der notwendigen Ticketnummer in das Ticket-Feld.
Die Ticketnummer finden Sie in der Regel im COLI-Feld (Customer Owned License Information) in der Lizenz
in Ihrer Firm Security Box (FSB) angezeigt.
Dieses Feld können Sie zum Beispiel über CodeMeter WebAdmin auslesen.
2. Klicken der Schaltfläche "Lizenzen erneuern" (renew licenses), um die Lizenzen zu verlängern bzw. abzuholen.
Das Abholen der Lizenen funktioniert entweder direkt, indem Sie den betreffenden CmContainer anstecken oder
eine aktuelle Context-Datei (WibuCmRaC) des betreffenden CmContainers verwenden.
Sollten keine Schaltfläche "Lizenzen erneuern" angezeigt werden, obwohl die Lizenz nicht verlängert wurde, oder sonstige Fragen/Schwierigkeiten auftreten, wenden Sie sich bitte an unseren Vertrieb via sales@wibu.com.
Sie können diese Meldung ignorieren, wenn Sie die AxProtector Lizenzen bereits verlängert haben. - Wird der UserMessage-Dialog ohne Bild angezeigt, kann dies folgende Gründe haben:
- Die in der verwendeten UserMessageXX.ini angegebene Bilddatei ist nicht vorhanden.
- Das verwendete Bild hat die falschen Maße. Das Bild muss 160*385 Pixel groß sein.
- Das verwendete Bild hat eine Bittiefe ungleich 24-Bit. - Um das Aufpoppen der MessageBoxen bei Fehlern in AxProtector (z.B. keine FSB gefunden) zu verhindern, gehen Sie bitte wie folgt vor:
- Kopieren der beiden Dateien UserMsgUs.dll und UserMessage.ini aus dem Verzeichnis C:\Program Files (x86)\WIBU-SYSTEMS\AxProtector\Devkit\bin\UserMessage in das Verzeichnis, aus dem Sie AxProtector verwenden (Standardmäßig "C:\Program Files (x86)\WIBU-SYSTEMS\AxProtector\Devkit\bin)
- Öffnen der UserMessage.ini-Konfigurationsdatei
- Editieren der folgenden Einträge in Sektion [Service]
--
[Service]
Gui=off
;[on/off]
Logging=on
;[on/off]
; Destination for log files - current user requires write privileges to that directory
; Gui=off should be set to disable message boxes and redirect error messages to log files
LogPath="C:\Users\Default\AppData\Local\Temp"
---
Damit wird die GUI-Oberfläche und das Logging aktiviert. Keine graphischen Fehlermeldungen mehr ausgegeben. - Wenn Sie eine eigene UserMessage.dll erstellen wollen, finden Sie im angehängten PDF-Dokument die benötigten Informationen dazu.
Ein einfaches Beispiel, einer selbst erzeugten UserMessge.dll finden Sie für C++ unter "UserMessage | UserMessageSimpleGUI" und für C# unter "UserMessage | UserMessageSimple" seit CodeMeter Version 6.80 in unseren Beispielen im CodeMeter Software Development Kit (SDK).
Wenn Sie die UserMessage ohne *.ini-Dateien verwenden wollen, empfehlen wir dieses Beispiel als Vorlage zu verwenden.
Den Quelltext der Standard UserMessage.dll, die *.ini-Dateien verwendet, finden Sie ebenfalls in unseren Beispielen, für C++ unter "UserMessage | UserMessage" und für C# unter "UserMessage | UserMessage". - Um IP Protection (ausschließlicher Schutz ohne Lizenzierung) testen zu können, benötigen Sie eine zusätzliche Lizenz in ihrer Firm Security Box (FSB): 100021:1600. Diese Lizenz bekommen Sie als Demo-Variante auf Anfrage aus dem Sales-Team (sales@wibu.com).
Weitere Informationen zu IP Protection entnehmen Sie dem CodeMeter Entwickler Handbuch: "Automatischer Softwareschutz mit AxProtector (Werkzeug der CodeMeter Protection Suite-Sammlung) | Erweiterte AxProtector-Optionen | IP Protection - Know-how schützen".
Die beschriebenen Optionen unter "Verwendung" werden in der *.wbc-Datei eingetragen, die aus der AxProtector-GUI exportiert wird.
Aus dem Anhang erfahren Sie, wie die *.wbc-Datei dann aussehen könnte, wenn die komplette Anwendung über IP Protection verschlüsselt wird. - Zum Anpassen des Lizenz-Fehlerhandlings, gehen Sie je nach AxProtector-Projekt-Typ bitte wie folgt vor:
AxProtector Windows & AxProtector .NET
1. Gehen Sie in der AxProtectorGUI in den Reiter "Fehlermeldungen".
2a. In AxProtector Windows wählen Sie die Option "User Message DLL" und behalten den Standard Dateinamen (-u:"UserMsg").
2b. In AxProtector .NET wählen Sie die Option "Inline messages" (-ui).
3. Nach der Verschlüsselung befinden sich im Zielverzeichnis der verschlüsselten Anwendung neben der Anwendung auch
UserMessage *.ini-Dateien für verschiedene Sprachen.
4. Passen Sie die UserMessage.ini-Datei an und ändern:
Gui=off
Logging=on
LogPath="C:\Temp\Logs"
5. Optional können Sie auch noch das Retry-Verhalten anpassen:
RetryTimeOut=1
NumberOfRetries=10
AxProtector Java
1. Wählen in AxProtectorGUI im Reiter "Fehlermeldungen" die Option "User Message Klasse".
2. Eintragen von Klassenname 'com.wibu.xpm.MessageHandler' (-u:"com.wibu.xpm.MessageHandler").
Hinweis:
Die Dateinamen der *.ini Dateien müssen den gleichen Namen besitzen, wie die Dll. Wenn Ihre Dll den Namen UserMsg.dll trägt, müssen auch die verwendeten *.Ini-Dateien die Namen UserMsg*.ini tragen. - Durch die Verschlüsselung kann es sein, dass die dabei zufällig erzeugten Muster dazu führen, dass diese von einem Anti-Viren Programm als Virus erkannt werden.
Kurzfristige Lösungsmaßnahmen
Sie können die Einstellungen des Anti-Virus-Programms überprüfen. Eventuell sind sehr strikte Einstellungen oder spezielle Zusatzoptionen der Grund für die Erkennung.
Darüber hinaus können Sie die Anwendung als Ausnahme im entsprechenden Anti-Virus-Programm eintragen.
Mittelfristige Lösungsmaßnahmen
Sie können Ihre Anwendung an den entsprechenden Hersteller schicken, sodass dieser mit den nächsten Aktualisierungen dafür sorgt, dass das Anti-Viren-Programm Ihre Anwendung nicht mehr als Virus erkennt. Ihr nächstes Programm bzw. neue Version könnte dann aber wieder betroffen sein.
Andauernde Lösungsmaßnahmen
Viren-Scanner beurteilen Anwendungen anhand bestimmter Verhaltensmuster oder Auffälligkeiten. Dabei wird in der Regel ein Punkte-System verwendet.
Die Details, welche Verhaltensmuster erkannt werden, wie diese gewichtet und ab welchem Schwellwert die Anwendungen als Virus eingestuft werden, ist das Betriebsgeheimnis der Anti-Viren-Programm-Anbieter. Die in der Verschlüsselung verwendeten Mechanismen zum Schutz addieren vermutlich einige Punkte zum Punkte-System. Gespräche mit mehreren Anti-Viren-Programm-Anbietern haben dies bestätigt. Viren verwenden nämlich genau diese Mechanismen, um sich zu maskieren. Dies erklärt, warum schnell Schwellenwerte erreicht und vor allem geschützte Anwendungen oft als falsche Positiv-Befunde deklariert werden.
Es gibt auch Möglichkeiten, in diesem Punkte-System Pluspunkte zu sammeln, z.B. wenn der Hersteller eine Anwendung mit Authenticode signiert, wirkt sich das positiv aus. Das Risiko der Viren-Einstufung wird damit zwar deutlich minimiert, aber eine 100%ige Garantie der korrekten Einstufung existiert nicht. - Wibu-Systems empfiehlt, die Verschlüsselung mit AxProtector durchzuführen.
Präziser: legen Sie mit Hilfe der AxProtector GUI-Benutzeroberfläche die Verschlüsselungsparameter fest, mit denen dann die eigentlichen AxProtectoren aufgerufen werden.
Unsere AxProtectoren sind alle reine Kommandozeilen-Programme.
Um beispielsweise die Verschlüsselung automatisiert durchführen zu können, können Sie die festgelegten Verschlüsselungsparameter über das Menü "Datei | Exportieren" der AxProtectorGUi in eine Datei <ExportierteDatei> auslagern.
Anschließend können Sie mit den Parametern AxProtector.exe @<ExportierteDatei>.wbc die Verschlüsselung per Kommandozeile, Batch-Aufruf, Post-Build Event im Visual Studio, etc. durchführen.
Die Vorgehensweise für die Verschlüsselung von .NET Assemblies oder Java 'Jar'Files ist identisch mit AxProtectorNet.exe @<ExportierteDatei>.xml bzw. java –jar AxProtector.jar @<ExportierteDatei>.xml.
Änderungen an den Verschlüsselungsparametern sollten Sie weiter in Ihrem AxProtector-Projekt über die AxProtectorGUI vornehmen und am besten auch damit testen.
Anschließend können Sie dann einfach erneut die Verschlüsselungsparameter exportieren.
Verwenden Sie die gleichen Optionen für unterschiedliche Dateien können Sie auch die XML anpassen und die letzten beiden Parameter bzgl. der Quell/Ziel-Datei löschen und noch in die Kommandozeile mit übernehmen:
AxProtector.exe -o:"protected\App.exe" "toprotect/App.exe" @<ExportierteDatei>.xml - Um WupiData zu verwenden, muss ein HiddenData-Feld ohne Abhängigkeiten in den CmContainer programmiert werden.
Eine Product Item Option hat standardmäßig Abhängigkeiten, deren Werte bekannt sein müssen, damit die Programmiersequenz zum Aktualisieren der Product Item Option berechnet werden kann. Die Standard Abhängigkeiten sind dsu (data, serial, update counter).
Daher kann normalerweise mit einer Programmiersequenz nur im Ziel-Container exakt diese Product Item Option im aktuellen Zustand verändert werden. Wenn das Firm Item im Ziel-Container verändert wird und der Aktualisierungszähler (Update Counter) hochzählt, funktioniert diese Programmiersequenz nicht mehr.
Durch das Entfernen dieser Abhängigkeiten ist es AxProtector möglich, eine allgemein-gültige Programmierseuqenz für das Hidden Data-Feld-Ziel vorzuberechnen. Diese kann dann zur Laufzeit auf beliebige CmContainer mit beliebigen Daten eingespielt werden. Dadurch wird es möglich, Daten zur Laufzeit zu schreiben.
Das Kommandozeilenerkzeug CmBoxPgm besitzt zum Programmieren von HiddenData für die Verwendung von WupiData eine spezielle Option (-pwupidata), die verwendet werden kann:
Syntax:
/pwupidata:[e<ext. type>][,b<block size>][,a<acc. code>]:<file>
Allocates WUPI Data storage, filled with the contents of file <file>.
/pwupidata:s<size>[,e<ext. type>][,b<block size>][,a<acc. code>][,f<fill byte>]
Allocates <size> bytes of WUPI Data storage, initialized with the value <fill byte>.
Alternativ kann auch mit der Programmier-API (HIP) programmiert werden. Hierbei muss dann explizit HiddenData ohne Abhängigkeiten programmiert werden. Mit CodeMeter License Central oder CodeMeter License Editor ist die Programmierung ohne Abhängikeiten derzeit nicht möglich.
Bei der Verschlüsselung ihrer Anwendung müssen Sie dann beim Verschlüsseln eine Lizenzliste mit dem gleichen Product Code anlegen und dort WupiData konfigurieren. Wichtig ist dabei, dass beim Programmieren und Verschlüsseln der gleiche HiddenDataAccessCode (HDAC) verwendet wird. Wenn Sie diesen sowohl beim Programmieren und Verschlüsseln weglassen, wird dieser automatisch im Hintergrund abgelegt und sollte ebenfalls identisch, allerdings unbekannt sein. Wenn Sie explizit einen HDAC setzen, können Sie diesen nachher verwenden, um HiddenData auch über das CodeMeter Kern-API auszulesen. Wenn Sie nur geplant haben, das WUPI API zu verwenden, ist dies aber nicht zwingend nötig.
Im Code können Sie dann die WUPI API-Funktionen WupiReadData und WupiWriteData verwenden, um Daten zu lesen oder schreiben.
Hinweis: Das WUPI API funktioniert erst nach der Verschlüsselung des Codes. Davor wird durch die WupiEngine Bibliothek nur eine Dummy-Implementierung bereitgestellt, sodass es nicht zu Fehlern kommt.
Anbei finden Sie noch ein kleines Beispielprojekt für die Verwendung von WupiData.