Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Kompilierung trotz fehlender Bibliothek/Quellcodes

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 18.05.2021, 14:58    Titel: Kompilierung trotz fehlender Bibliothek/Quellcodes Antworten mit Zitat

Gibt es eine Möglichkeit, ein Programm zu kompilieren, trotz fehlender .bi/.bas Datei? Normalerweise kommt immer eine Fehlermeldung, wenn ich versuche ein Programm zu kompilieren und eine Datei fehlt. Ich stelle mir das so vor, dass in dem Quellcode eine .bi oder .bas Datei nur dann eingebunden bzw. ausgeführt wird, wenn die Datei vorhanden ist! Gibt es da einen Befehl, der das
Code:
#INCLUDE "TEST.BAS"
überspringt? Ich möchte ein Programm schreiben, aber einen Teil vom Quellcode nicht mitliefern oder mitgeben. Ich könnte zwar die entsprechende Stelle im Quellcode als Kommentar versehen, aber das will ich wenn möglich vermeiden. Vor allem, da es zu aufwendig ist, jedes mal 100 Zeilen zu ändern.
_________________
SHELL SHUTDOWN -s -t 05
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 18.05.2021, 17:02    Titel: Antworten mit Zitat

Vielleicht so etwas in der Art;
Code:
#DEFINE INCLUDEHIDDENFILES
#IF DEFINED INCLUDEHIDDENFILES
  #INCLUDE "only4themaster.bi"
#ENDIF

und dann mittels #DEFINE alle Stellen so umformen, dass sie für den Fall, dass INCLUDEHIDDENFILES nicht definiert ist, auf irgendeinde Fallback-Option zurückfallen.

Allerdings erschließt sich mir der Sinn nicht ganz - wenn man auch ohne die geheimen Codeabschnitte ein compilierbares und funktionsfähiges Programm erhält, braucht es diese geheimen Codebschnitee offenbar gar nicht?
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 18.05.2021, 17:19    Titel: Antworten mit Zitat

nemored hat Folgendes geschrieben:
Vielleicht so etwas in der Art;
Code:
#DEFINE INCLUDEHIDDENFILES
#IF DEFINED INCLUDEHIDDENFILES
  #INCLUDE "only4themaster.bi"
#ENDIF

und dann mittels #DEFINE alle Stellen so umformen, dass sie für den Fall, dass INCLUDEHIDDENFILES nicht definiert ist, auf irgendeinde Fallback-Option zurückfallen.

Allerdings erschließt sich mir der Sinn nicht ganz - wenn man auch ohne die geheimen Codeabschnitte ein compilierbares und funktionsfähiges Programm erhält, braucht es diese geheimen Codebschnitee offenbar gar nicht?

Vielen herzlichen Dank für die Antwort! Maul schauen, ob das funktioniert?
Der Sinn des Ganzen ist ganz einfach: In der exe-Datei fehlt ein Teil der Funktionen, da diese beim Kompilieren nicht gelesen bzw. eingebunden wurden. Jene Funktion sollte nur bei mir vorhanden sein, da ich den fehlenden Quellcode besitze. Jemand der den fehlenden Quellcode nicht besitzt, sollte das Programm auch ohne dem fehlenden Quellcode kompilieren können. Es ist quasi eine Funktion, die nicht für jeden freigegeben ist.

Edit:
Funktioniert leider nicht! Der Compuiler meldet mir immer, dass die Datei fehlt...
_________________
SHELL SHUTDOWN -s -t 05
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1837
Wohnort: [JN58JR]

BeitragVerfasst am: 18.05.2021, 17:54    Titel: Antworten mit Zitat

Du musst auch alle abschnitte, welche auf diese .bi zugreifen, mit einem
Code:
#if defined INCLUDEHIDDENFILES
    aufruf von funktionen aus der .bi
'ENDIF


einkapseln.


beispiel:

.test.bi
Code:
sub def()
Print "def"
end sub


test.bas
Code:
#define HIDDENBI 'Auskommentieren, wenn test.bi nicht vorhanden ist.
#if defined HIDDENBI
    #include once "test.bi"
#END IF

sub abc()
print "abc"
end sub

abc()
#if defined HIDDENBI
    def()
#end if


MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 18.05.2021, 18:24    Titel: Antworten mit Zitat

Zitat:
#define HIDDENBI 'Auskommentieren, wenn test.bi nicht vorhanden ist.
Genau das will ich vermeiden! Es sollte kompiliert werden können ohne dass ich etwas als Kommentar versehe. Aber mein Plan funktioniert eh nicht. Habe gerade gesehen, dass man Texte in der exe-Datei, durch öffnen der exe-Datei mit einem Texteditor lesen kann. Anscheinend werden die in der Datei als Klartext gespeichert? Wahrscheinlich bleibt mir nichts anderes übrig, dass ich ein 2. separates Programm schreibe. Ich könnte mit FreeBasic nicht einmal ein Programm schreiben, wo man einen Lizenzschlüssel braucht, weil dieser in der exe-Datei in Klarschrift lesbar ist.
_________________
SHELL SHUTDOWN -s -t 05
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1837
Wohnort: [JN58JR]

BeitragVerfasst am: 18.05.2021, 18:44    Titel: Antworten mit Zitat

du musst doch den kommentar nicht hinzufügen .. der war nur für dich, damit du weist, was du auskommentieren / löschen musst, damit das, was du vor hast, funktioniert.

Und, dieses verfahren ist expliziet genau das, was du suchst. Es verhindert, das der compiler diese elemente rein kompiliert. Du kannst (wenn du willst) auch die Kommentare in die #if defined rein packen. Dann werden sie beim kompilieren ebenfalls ignoriert.


MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 18.05.2021, 19:12    Titel: Antworten mit Zitat

ThePuppetMaster hat Folgendes geschrieben:
du musst doch den kommentar nicht hinzufügen .. der war nur für dich, damit du weist, was du auskommentieren / löschen musst, damit das, was du vor hast, funktioniert.

Und, dieses verfahren ist expliziet genau das, was du suchst. Es verhindert, das der compiler diese elemente rein kompiliert. Du kannst (wenn du willst) auch die Kommentare in die #if defined rein packen. Dann werden sie beim kompilieren ebenfalls ignoriert.


MfG
TPM
Funktioniert leider nicht. Zuerst bekomme ich ein paar Fehlermeldungen. Diese sind weg, wenn ich die fehlenden Klammern reinschreibe.

Code:
#if defined (HIDDENBI)


Allerdings meldet mir der Kompiler jedes mal, dass die Test.bi fehlt!

Ich habe folgenden Quellcode:

Code:
SCREENRES 640, 320, 32

#DEFINE HIDDENBI 'Auskommentieren, wenn test.bi nicht vorhanden ist.
#if defined (HIDDENBI)
    #include once "test1.bi"
#ENDIF

DECLARE SUB ABC()

ABC()
#if defined (HIDDENBI)
    def()
#ENDIF

SLEEP
END


SUB ABC()
   PRINT "abc"
END SUB
Wie muss der Quellcode jetzt aussehen, dass das ganze bei mir ohne Test.bi funktioniert? Welchen Compiler verwendet ihr? Ich habe Version 1.07.1
_________________
SHELL SHUTDOWN -s -t 05
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
hhr



Anmeldungsdatum: 15.07.2020
Beiträge: 84

BeitragVerfasst am: 18.05.2021, 19:21    Titel: Antworten mit Zitat

Kann man nicht zusätzlich FileExists gebrauchen?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 18.05.2021, 20:15    Titel: Antworten mit Zitat

FILEEXISTS funktioniert während der Laufzeit, nicht während des Compiliervorgangs.

@ALWIM: Natürlich muss Test.bi - oder in deinem Fall test1.bi - existieren, damit das laufen kann. Wenn die Datei nicht existiert, musst du die Zeile mit dem #DEFINE HIDDENBI auskommentieren, damit es trotzdem läuft. Das ist ja der Sinn des Ganzen.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 18.05.2021, 20:23    Titel: Antworten mit Zitat

Nachtrag - die vielleicht deutlich einfachere Lösung:

Du erstellst eine test1.bi mit den Funktionen, die nur du nutzen willst und die nicht weitergegeben werden sollen, und eine test2.bi mit Dummy-Funktionen zum Weitergeben. D. h. wenn test1.bi eine Funktion namens strengGeheimeAuswertungsmethode() enthält, bekommt die test2.bi ebenfalls diese Funktion, aber ohne funktionalen Inhalt - sie gibt dann halt z. B. immer den Wert 0 zurück. Dann kannst du im Quelltext, den du weitergeben willst, einfach ein #INCLUDE "test2.bi" einfügen, und wenn du für dich selbst kompilieren willst, änderst du die Zeile in #INCLUDE "test1.bi" ab.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 18.05.2021, 21:05    Titel: Antworten mit Zitat

nemored hat Folgendes geschrieben:
FILEEXISTS funktioniert während der Laufzeit, nicht während des Compiliervorgangs.

@ALWIM: Natürlich muss Test.bi - oder in deinem Fall test1.bi - existieren, damit das laufen kann. Wenn die Datei nicht existiert, musst du die Zeile mit dem #DEFINE HIDDENBI auskommentieren, damit es trotzdem läuft. Das ist ja der Sinn des Ganzen.
Danke für die Antwort. Das ist ja genau das, was ich vermeiden wollte, dass ich das jedes Mal als Kommentar versehen muss oder eben auch nicht! Der Trick mit "FILEEXISTS" bei #DEFINE funktioniert auch nicht. Dann muss ich das wirklich jedes Mal als Kommentar versehen.
Beschissen irgendwie...
_________________
SHELL SHUTDOWN -s -t 05
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
hhr



Anmeldungsdatum: 15.07.2020
Beiträge: 84

BeitragVerfasst am: 18.05.2021, 21:08    Titel: Antworten mit Zitat

Man kann aber auch eine leere Datei mitliefern.
Code:
#include "Leere Datei.bi"
Print "Testversion"
Sleep
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 18.05.2021, 21:21    Titel: Antworten mit Zitat

ALWIM hat Folgendes geschrieben:
nemored hat Folgendes geschrieben:
FILEEXISTS funktioniert während der Laufzeit, nicht während des Compiliervorgangs.

@ALWIM: Natürlich muss Test.bi - oder in deinem Fall test1.bi - existieren, damit das laufen kann. Wenn die Datei nicht existiert, musst du die Zeile mit dem #DEFINE HIDDENBI auskommentieren, damit es trotzdem läuft. Das ist ja der Sinn des Ganzen.
Danke für die Antwort. Das ist ja genau das, was ich vermeiden wollte, dass ich das jedes Mal als Kommentar versehen muss oder eben auch nicht! Der Trick mit "FILEEXISTS" bei #DEFINE funktioniert auch nicht. Dann muss ich das wirklich jedes Mal als Kommentar versehen.
Beschissen irgendwie...

Wenn du dir den Kommentar sparen willst, kannst du den Präprozessor auch explizit mit der Compiler-Option -d setzen (https://www.freebasic-portal.de/befehlsreferenz/der-compiler-458.html, Abschnitt "Bedingtes Compilieren und Präprozessor"). Ob das letztendlich bequemer ist, lasse ich dahin gestellt.
Oder du schreibst dir ein Programm, das prüft, ob eine bestimmte Datei existiert, und dann abhängig davon eine andere Datei mit speziellen Einstellungen kompiliert oder nicht.

Zur anderen Frage, die ich vorher übersehen habe: Daten, die du deinem Programm einprogrammierst, müssen auch so abgelegt werden - Strings im Quellcode werden auch wieder auffindbar sein. Aber wenn es z. B. um einen Lizenzschlüssel geht - warum liest du den nicht mittels OPEN aus einer externen Datei, die du dann bei dir behältst?
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1837
Wohnort: [JN58JR]

BeitragVerfasst am: 18.05.2021, 21:30    Titel: Antworten mit Zitat

Noch eine alternative:

Du schreibst eine .dll / .so welche du dynamisch zur laufzeit einbinden kannst. Dadurch kannst du vorab prüfen, ob diese dll existiert. Wenn nicht, dann lädst du sie halt nicht, und die Funktionen stehen nicht zur Verfügung. Wenn Si existiert, dann entsprechend wird sie geladen und eingebunden.

Dann brauchst du keien anpassungen im source vornehmen, weil es überall gleich bleiben kann.


MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
hhr



Anmeldungsdatum: 15.07.2020
Beiträge: 84

BeitragVerfasst am: 18.05.2021, 22:01    Titel: Antworten mit Zitat

Vielleicht könnte man in jedem Fall eine bi-Datei einbinden.
Eine bi-Datei könnte unter anderem die Zeile #DEFINE HIDDENBI enthalten, die andere nicht.
So könnte man dem Programm verschiedene Funktionen verleihen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 19.05.2021, 08:57    Titel: Antworten mit Zitat

ThePuppetMaster hat Folgendes geschrieben:
Du schreibst eine .dll / .so welche du dynamisch zur laufzeit einbinden kannst...
Das wäre auf jeden Fall die sauberste Lösung (und wohl auch die einzige, die funktioniert).

Gruß
grindstone

EDIT
Hier mal ein ganz einfaches Beispiel:

Die DLL (unter dem Namen "unglaublichGeheimeMathematischeOperation.bas" im selben Verzeichnis wie das Hauptprogramm abspeichern und mit Option "-dll" compilieren):
Code:
'Die Prozedur (Function oder Sub) MUSS deklariert werden. Der Name vor dem Alias ist der Name der Prozedur
' innerhalb der .dll, mit dem Namen hinter dem Alias wird die Prozedur vom aufrufenden Programm aus
' angesprochen. Die Namen können, müssen aber nicht unterschiedlich sein.
 
Declare Function wurzel Alias "wurzel" (x As Double) As Double

Function wurzel(x As Double) As Double Export
   Return Sqr(x)
End Function

und hier das Hauptprogramm:
Code:
Dim As Any Ptr geheimeDll
Dim As Double x

Dim wurzelaus As Function(wert As Double) As Double 'abbild der prozedur aus der .dll mit DIM statt DECLARE

geheimeDll = DylibLoad("unglaublichGeheimeMathematischeOperation") 'pointer auf die .dll

wurzelaus = DylibSymbol(geheimeDll, "wurzel") 'pointer auf die prozedur innerhalb der .dll

? geheimeDLL
? wurzelaus
?

x = 144

If geheimeDLL Then
   '.dll ist vorhanden
   Print "Wurzel aus"; x; " ist"; wurzelaus(x)
Else
   'dll ist nicht vorhanden
   Print "Woher soll ich das denn wissen?"
EndIf

Sleep

_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 19.05.2021, 16:08    Titel: Antworten mit Zitat

hhr hat Folgendes geschrieben:
Man kann aber auch eine leere Datei mitliefern.
Code:
#include "Leere Datei.bi"
Print "Testversion"
Sleep
Diese Lösung, gefällt mir am allerbesten! Und funktioiert auch noch. Keine Ahnung, wieso ich da nicht selber drauf gekommen bin? Mal schauen, wie ich der Parameter übergeben kann?

Zitat:
Aber wenn es z. B. um einen Lizenzschlüssel geht - warum liest du den nicht mittels OPEN aus einer externen Datei, die du dann bei dir behältst?
Wenn mir jemand erklärt, wie ich in der EXE-Datei den Schlüssel verstecken kann? Das Dumme ist, dass ich die EXE-Datei bloß mit einem Texteditor öffnen muss, um an den Schlüssel zu kommen!!! Egal was ich im Programm an Texte drin habe, ich kann jedes Mal den Text ganz einfach auslesen. Der ist immer sichtbar...
_________________
SHELL SHUTDOWN -s -t 05
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2507
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 19.05.2021, 17:12    Titel: Antworten mit Zitat

Vielleicht für die Profis interessant:

https://www.heise.de/newsticker/meldung/Ghidra-NSA-stellt-quelloffenes-Software-Analyse-Tool-vor-4327737.html

https://ghidra-sre.org/

Am besten einmal bei .EXEs vom FreeBasic-Compiler ausprobieren - gibt jedem ein Gefühl, was alles möglich ist.

@Alwin: An Deiner Stelle würde ich mich mit asymmetrischer Verschlüsselung beschäftigen: .EXE-Datei soll nur öffentlicher Schlüssel enthalten und Lizenzdatei damit verifizieren. Lizenzdateien kannst dann nur Du mit Hilfe des ausschliesslich bei Dir bleibenden privaten Schlüssels erstellen.

Und natürlich steht es Dir frei, Deine .EXE mittels Code-Verschleierung sog. Reverse Engineering zu erschweren.
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz