Lizenzdatei laden

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

Best-Code-in-Use
Posts: 184
Joined: 01 Dec 2015, 05:13
Location: Germany

Lizenzdatei laden

14 Oct 2016, 23:32

Hallo liebe Mitstreiter,

nur eine theoretische Erwägung=

Ich habe ein AHK-Skript das den NinitePro Service= https://ninite.com/pro auf diversen Kundenrechner ausführt, funktioniert auch Super.
Allerdings ist dieser Service Maschinenbasierend, heißt man zahlt pro Kontingent, in meinem Fall für maximal 100 PC´s im Monat, passt.

Wäre es theoretisch möglich ein AHK Skript praktisch mit Passwortabfrage auszuführen?

1.) Ich hinterlege auf meinem Server eine Textdatei mit jeweils einem Passwort pro Zeile per .htaccess und .htpasswd geschützt
2.) Im jeweiligen AHK Script wird dann auch ein Passwort hinterlegt, z.B.: iDvTW+Cn3x78fYDinfVYntHj2
3.) Das Script logt sich Online ein und vergleicht dann ob das Passwort in der Textdatei vorhanden ist
4.) Wird das Passwort nicht gefunden, bricht das Skript ab...

Folgende Probleme sehe ich hier allerdings grundsätzlich:
Um Zugriff zu erhalten, muss ich ja den Benutzernamen und das Passwort für den Server, bzw. für das betreffende Verzeichnis im Skript hinterlegen.
Weiterhin muss dann ja noch das entsprechende Passwort im Skript hinterlegt sein.
Gibt es überhaupt eine Möglichkeit kompilierte AHK Dateien halbwegs zu verschlüsseln?

Ich habe zu dem Thema hier im Forum schon einige Artikel gefunden die aber eigentlich alle die gleiche Aussage haben: Es geht nicht...
Aber vielleicht hat Jemand eine Idee dazu?

P.S.= Ich habe da gerade noch ein interessantes Projekt gefunden=
https://github.com/davidmalia/autohotkey-obfuscator
Leider wird das Ganze wohl nicht mehr weiterentwickelt und funktioniert jetzt auch nicht mehr, guckst Du hier=
https://autohotkey.com/board/topic/8935 ... y-scripts/
Greetings Best-Code-in-Use
User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: Lizenzdatei laden

15 Oct 2016, 01:52

So wie du das vor hast geht das nicht.
Zudem wird dir selbst der beste Obfuscator nichts nützen, denn am Ende muss der AutoHotkey Interpreter das ganze noch ausführen können.
Die Daten des Passworts werden also immer leserlich bleiben wenn du es irgendwo auf dem lokalen Rechner speicherst.

Du müsstest das Passwort von außen beziehen.
Wenn du deine Textdatei verschlüsseln würdest und ansonsten nichts wichtiges auf dem Server ist und der unerlaubte Zugriff auf den Server niemanden stört, dann könntest du das Passwort einfach reinschreiben.
Da es sich aber so anhört als wäre dies nicht der Fall musst du etwas an deiner Infrastruktur ändern.

Zudem würde ich in deiner Textdatei nicht Passwörter direkt vergleichen, sondern stattdessen Hashes verwenden. Zudem könnte jemand einfach deine If Abfrage entfernen sodass dein Programm auch ohne Passwort weiterläuft.
Recommends AHK Studio
Best-Code-in-Use
Posts: 184
Joined: 01 Dec 2015, 05:13
Location: Germany

15 Oct 2016, 07:12

Hallo nnnik,

vielen Dank für Deine Hilfe.
Also der Serverzugriff ist überhaupt kein Problem. Ich könnte zum Beispiel eine Subdomain einrichten, diese mit einem SSL Zertifikat ausrüsten und per .htaccess schützten.
Deine Idee mit dem Hashwert ist Spitze...

Es geht hier auch nicht um den Schutz vor Profis und Programmierern. Sondern nur um einen Grundschutz... Als Beispiel habe ich einen Kunden der nach Norwegen ausgewandert ist und so für mich nicht mehr greifbar ist. Allerdings läuft der Updateservice weiter, ich hätte also nur die Möglichkeit meine E-Mail Adresse bei Ninite.com zu ändern, um den Service abzuschalten.
Das würde dann aber bedeuten, dass ich ich auf zig anderen PCs auch die Mailadresse ändern müsste.
Daher mein Ansatz um das Ganze zukünftig zumindest etwas abzusichern.

Gibt es denn nicht wenigstens die Möglichkeit die Passwörter unleserlich abzuspeichern, so dass Sie eben nur vom Interpreten gelesen werden können, aber eben nicht in Notepad in der kompilierten AHK exe Datei?? Das die Passwörter über den Arbeitsspeicher ausgelesen werden könnten ist natürlich auch klar.

Aber wie schon geschrieben, es geht hier nur um eine grundlegende Absicherung. Das Profis die Sache leicht umgehen können, ist mir klar, aber darum geht es mir auch nicht....
:thumbup:
Greetings Best-Code-in-Use
just me
Posts: 9490
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Lizenzdatei laden

15 Oct 2016, 11:05

Moin,
... ich hätte also nur die Möglichkeit meine E-Mail Adresse bei Ninite.com zu ändern, um den Service abzuschalten.
Soll heißen, der Client identifiziert sich allein mit einer E-Mail-Adresse?

Nur mal so als Hirnsturm: Du könntest diese Adresse individuell veschlüsselt in den jeweiligen Installationen ablegen. Den Schlüssel zum Entschlüsseln müsste sich das Skript dann bei Dir über das Netz abholen. Ist zwar nicht übermäßig sicher gegen Manipulationen, aber immerhin ein Grundschutz.

Grüße

just me
Best-Code-in-Use
Posts: 184
Joined: 01 Dec 2015, 05:13
Location: Germany

15 Oct 2016, 12:33

Hallo Just me,

schön von Dir zu hören... :D

Es läuft dort so=
Du buchst bei Ninite.com einen entsprechenden Pro Account.
"Pricing is based on how many machines you use Ninite with each month."
Ich habe den 1-100 PC´s Account. Nach dem Login bei Ninite.com wird dort eine inviduelle NinitePro.exe Datei generiert. Und diese Datei ist mit meiner Mailadresse verknüpft. Gezählt wird nun die Anzahl der Rechner pro Monat über eine Hardware-ID oder Ähnliches bei ninite.com. Diese habe ich nun auf diversen Kundenrechnern per AHK Skript am Start.
Nach dem Hochfahren des jeweiligen PC´s werden dann automatisch im Hintergrund und ohne Interaktion sämtliche verfügbaren Updates für Firefox, Thunderbird, Flash, Java, etc, etc, etc. durchgeführt. Eine Liste gibt es hier= https://ninite.com/... bei Interesse... Auch ideal bei Neuinstallation eines PC´s um diverse Programme ganz einfach und in Minuten zu installieren!

Bisher ist es tatsächlich nur 1 Kunde der Problemchen macht. Allerdings geht es da dann dort auch nur um 2 PC´s, das ist natürlich zu verschmerzen...
Du könntest diese Adresse individuell veschlüsselt in den jeweiligen Installationen ablegen. Den Schlüssel zum Entschlüsseln müsste sich das Skript dann bei Dir über das Netz abholen. Ist zwar nicht übermäßig sicher gegen Manipulationen, aber immerhin ein Grundschutz.
Ja, so hätte ich es gerne, aber wie könnte ein derartiger Ansatz aussehen?
Greetings Best-Code-in-Use
just me
Posts: 9490
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Lizenzdatei laden

16 Oct 2016, 01:26

Moin,
Nach dem Login bei Ninite.com wird dort eine inviduelle NinitePro.exe Datei generiert. Und diese Datei ist mit meiner Mailadresse verknüpft.
Ich kenne mich mit dem Webgeraffel nicht sonderlich gut aus. Dashalb noch ein paar Fragen:
Wird die 'individuelle NinitePro.exe' direkt auf die Kundenrechner verteilt und dort direkt gestartet?
Oder läuft da ein AHK-Skript, das die Verbindung zu ninite aufbaut und dabei auch die E-Mail-Adresse oder andere Identitätsdaten übergibt?

Nur im letzten Fall sehe ich überhaupt die Möglichkeit, in den Prozess einzugreifen. Wenn die NinitePro.exe auf den Kundenrechnern liegt und dort auch ohne AHK-Hilfe direkt gestartet werden kann, sehe ich keinen Ansatz. Die Verbindung zu Deiner E-Mail-Adresse wird dann in der exe abgelegt sein.

Schönen Sonntag noch!

just me
Best-Code-in-Use
Posts: 184
Joined: 01 Dec 2015, 05:13
Location: Germany

16 Oct 2016, 08:45

Na, da bringst Du mich doch direkt auf eine Idee=
Bisher läuft es so, dass die entsprechende Datei bereits auf dem PC des Kunden gespeichert ist, zusammen mit dem Skript und einem Mailer der ebenfalls per AHK Skript bedient wird.
Alles natürlich portable Versionen.

Hier wäre es doch das Einfachste das Skript dann jeweils über meinen Server zu laden. Die NinitePro.exe hat nur ca. 300 kb. Jeder Kunde bekommt eine eigene verschlüsselte Subdomain. Zum Abschluss der Updates lasse ich dann jeweils die NinitePro.exe wieder löschen. Sollte ein Kunde dann abspringen, lösche ich die zugehörige Subdomain und das Skript kann nicht mehr heruntergeladen werden.

Aber wie kann ich die Logindaten obskuren? Für das Mailpasswort und die Adresse wäre das natürlich auch mehr als sinnvoll...


Und Dir natürlich auch einen schönen Sonntag!
Greetings Best-Code-in-Use
just me
Posts: 9490
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Lizenzdatei laden

16 Oct 2016, 11:22

Kannst Du beschreiben, welche Aufgaben das Skript und der Mailer haben?
Best-Code-in-Use
Posts: 184
Joined: 01 Dec 2015, 05:13
Location: Germany

17 Oct 2016, 05:04

Die NinitePro.exe lädt dann Ninite.exe und kann dann entweder über eine GUI (inklusive), oder Silent ausgeführt werden.

Code: Select all

RunWait, "%Ninite_exe_Datei%" /nocache /updateonly /disableshortcuts /disableautoupdate /silent ""%Ninite_Log_Text_mit_Pfad%"", , ; starte ninite.exe
So, nach der Ausführung werden dann verschiedene Meldungen, je nach Zustand, geschrieben.

Zum Beispiel=
OK (= es gab keine neuen Updates)
Nachfolgendes Protokoll ist schon etwas Älter und stammt auch von einem Kunden:
Partial
Chrome : OK
Flash (IE) : OK
Flash : OK
Java 7 : OK
Java : OK
Java x64 : OK
K-Lite Codecs x64 : Skipped (64-bit version has been merged into K-Lite)
IrfanView : OK
Revo : OK
Auslogics : OK
Picasa : OK
Thunderbird : OK
VLC : OK
K-Lite Codecs : OK
Skype : OK
Leider ist nicht vorgesehen diese Meldungen per E-Mail zu versenden. Und genau dort kommt mein Mailer ins Spiel.
Damit ich im Problemfall, der übrigens seit über 1,5 Jahren noch auf keinem Rechner eingetreten ist, entsprechend reagieren kann.

Dies beendet den Updatewahnsinn wenn Jemand zum Beispiel nach einer Woche im Urlaub den Rechner wieder hochfährt!

Den Mailer würde ich aber gerne auf Blat wechseln, allerdings müssten dann zumindest einige Angaben unkenntlich gespeichert werden können!

Code: Select all

RunWait, %Blat_Exe_Datei% -to "%Empfaenger%" -f "%Absender_Mail_Adresse%" -u "%Benutzername%" -pw "%Passwort%" -server "%Server%"
-subject "%Betreff_der_Mail%" -bodyF "%BodyTextDatei%" -attacht "%Dateianhang%", , Hide
Greetings Best-Code-in-Use
just me
Posts: 9490
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Lizenzdatei laden

17 Oct 2016, 10:38

Wenn ich das richtig verstehe, gibt es also eine AHK.exe, die dann die Ninite.exe startet. Wie sicherst Du ab, dass ein experimentierfreudiger Benutzer die Ninite.exe einfach direkt startet?

Mir kommt da als einfache Lösung FileInstall in den Sinn, das eine Datei nur dann auf die Platte schreibt, wenn die Anweisung im Skript auch tatsächlich ausgeführt wird. Nach dem RunWait kann sie dann wieder gelöscht werden. Riskant wird das nur, wenn der werte Benutzer Dein Skript absichtlich zum richtigen Zeitpunkt killt.

Dein Skript könnte sich mit einer von Dir vergebenen Kennung auf einem von Dir bereitgestellten Server melden und nur bei einer bestimmten Antwort loslegen. Das wird allerdings recht kompliziert, falls ein experimentierfreudiger Benutzer den Netzverkehr belauscht, dabei aber nichts Verwertbares erkennen können soll.

Wie gesagt, das Welt-Weite-Web ist nicht mein Spezialgebiet.
Best-Code-in-Use
Posts: 184
Joined: 01 Dec 2015, 05:13
Location: Germany

Lizenzdatei laden

17 Oct 2016, 16:57

Wie sicherst Du ab, dass ein experimentierfreudiger Benutzer die Ninite.exe einfach direkt startet?
Das war bisher nicht notwendig, da es hauptsächlich auf Firmen-PC's läuft und die User für so etwas eigentlich keine Zeit haben. Und wegen eingeschränkter Zugriffsrechte, auch kein Zugriff auf die Daten möglich ist.

Und ja die AHK Datei startet Ninite.exe...
Die Idee mit dem Serverzugriff ist sicherlich das einfachste... Ninite.exe laden, ausführen und wieder löschen...

#########################################################################################################
Als weitaus wichtiger würde ich allerdings erachten Passwörter und Mailadressen zumindest
ausschließlich maschinenlesbar zu speichern und nicht im Klartext in der exe Datei sichtbar abgespeichert zu wissen...


Vielleicht hast Du ja zu diesem Thema eine Idee?
#########################################################################################################
Greetings Best-Code-in-Use
just me
Posts: 9490
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Lizenzdatei laden

18 Oct 2016, 02:59

Moin,

Du kannst das natürlich individuell verschlüsselt im Skript ablegen. Den Schlüssel würde ich dann aber von Deinem Server holen. jNizM sollte etwas zum Ver/Entschlüsseln haben.

Wenn es nur darum geht, den Text 'unleserlich' zu machen, geht auch so etwas. Das kann man natürlich noch 'verfeinern'.

Code: Select all

#NoEnv
MailAddr := "max.mustermann@provider.de"
Len := (StrLen(MailAddr) << !!A_IsUnicode)
VarSetCapacity(Addr, Len + 8, 0)
Addr := MailAddr
I := 0
A := []
While (I <= Len) {
   A.Push(NumGet(Addr, I, "Int64"))
   I += 8
}
Msg := "["
For I, V In A
   Msg .= V . (I = A.Length() ? "]" : ", ")
MsgBox, 0, Array, %Msg%
MsgBox, 0, String, % A2S(A)
ExitApp

A2S(A) {
   VarSetCapacity(S, A.Length() * 8, 0)
   P := &S
   For I, V In A
      P := NumPut(V, P + 0, "Int64")
   VarSetCapacity(S, -1)
   Return S
}
Best-Code-in-Use
Posts: 184
Joined: 01 Dec 2015, 05:13
Location: Germany

18 Oct 2016, 05:25

Vielen Dank, das wird schon einmal ---sehr--- weiterhelfen.
Ich habe es schon ein wenig verändert, allerdings habe ich nun in der settings.ini den Wert doppelt, wahrscheinlich ein kleiner Syntax-Fehler.
Verschluesselung
Gehe ich recht in der Annahme das es ausreicht das Array als E-Mail-Adresse im "echten" Skript zu speichern?

Also in Deinem Beispiel anstatt
MailAddr := "max.mustermann@provider.de"
MailAddr := "[12948364331122797, 32651591227342957, 27303540899840101, 31525472276709486, 29555379368034418, 12948338561581156, 6619236]"
Und der AHK-Interpreter "übersetzt" es dann wieder?"
jNizM sollte etwas zum Ver/Entschlüsseln haben.
Ja, das habe ich schon, und nutze es auch, allerdings nicht zum direkten Login:
https://autohotkey.com/boards/viewtopic.php?f=6&t=87

Mit dem Login und Download bin ich mir noch nicht sicher, einige geniale Ansätze, zumindest zum Download, finden sich hier:
https://autohotkey.com/boards/viewtopic.php?f=6&t=10843

Allerdings erschließt sich mir das nicht vollständig, ich werde aber direkt mal im Forum den Entwickler fragen...
Greetings Best-Code-in-Use
just me
Posts: 9490
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Lizenzdatei laden

18 Oct 2016, 05:38

Ja, Du legst die Mailadresse im Skript als Array ab. Der AHK-Interpreter hilft Dir dann allerdings nicht von selbst. Du brauchst dafür die Funktion A2S(). Deren Returnwert kannst Du dann als E-Mail-Adresse verwenden, wo immer Du sie brauchst.

Ich habe das noch mal etwas 'geheimnisvoller' gemacht:

Code: Select all

#NoEnv
MailAddr := "max.mustermann@provider.de"
L := (StrLen(MailAddr) << !!A_IsUnicode)
VarSetCapacity(M, L + 4, 0)
M := MailAddr
I := 0
A := [CRC32(MailAddr)]
While (I <= L) {
   A.Push(NumGet(M, I, "UInt") ^ A[1])
   I += 4
}
Msg := "["
For I, V In A
   Msg .= V . (I = A.Length() ? "]" : ", ")
MsgBox, 0, Array, %Msg%
MsgBox, 0, String, % A2S(A)
ExitApp

A2S(A) {
   VarSetCapacity(S, A.Length() * 4, 0)
   P := &S
   For I, V In A
      (I > 1) ? (P := NumPut(V ^ X, P + 0, "UInt")) : X := V
   VarSetCapacity(S, -1)
   Return S
}

CRC32(String) {
   Return DllCall("Ntdll.dll\RtlComputeCrc32", "UInt", 0, "Ptr", &String, "UInt", StrLen(String) << !!A_IsUnicode, "UInt")
}
Die Funktion CRC32() brauchst Du nur, um das Array zu erstellen.
Best-Code-in-Use
Posts: 184
Joined: 01 Dec 2015, 05:13
Location: Germany

18 Oct 2016, 06:01

Ich habe das noch mal etwas 'geheimnisvoller' gemacht:
Vielen Dank, das finde ich gut!!!!!
Du brauchst dafür die Funktion A2S().
Okay, gut zu wissen, aber in der AHK Hilfe finde ich dazu nichts ... :-(

Kannst Du es mir an diesem konkreten Beispiel zeigen=

Code: Select all

#NoTrayIcon ; Das AHK Symbol wird nicht angezeigt
#NoEnv ; Nicht nachsehen, ob leere Varibalen evtl. Umgebungsvariablen sind, beschleunigt die Laufzeit
#SingleInstance force ; Bei Neustart des Scriptes die alte Instanz ohne Nachfrage ersetzen
SetWorkingDir %A_ScriptDir%  ; Setzt das Ausfuehrungsverzeichnis auf das Verzeichnis des Scriptes - Der letzte umgekehrte Schrägstrich wird weggelassen (auch bei Stammverzeichnissen).

/*
####################################################################
Credits:
Mein besonderer Dank gilt: just me!!!
Und natuerlich autohotkey.com und der gesamten Community!
####################################################################
*/


/*
Blat muss sich in diesem Beispiel im gleichen Verzeichnis befinden, inkl. dll und Co!!
Aus Gruenden der Abwaertskompatibilitaet empfehle ich die 32 Bit Version!
Download hier: https://sourceforge.net/projects/blat/files/Blat%20Full%20Version/
Blat Syntax (https://www.administrator.de/frage/mail-blat-versenden-batch-261852.html)=
%directory%\%mailclient% -body "%mailbody%" -subject "%mailsubject%" -attacht
"%logfile%" -to "%mailto%" -f "%mailcompany% %computername% <%mailfrom%>" -server
"%mailserver%" -port "%mailport%" -u "%mailuser%" -pw "%mailpassword%"

-subject <subj> : subject line, surround with quotes to include spaces(also -s)
-bodyF <file>   : file containing the message body -- Sorgt dafuer das eine Textdatei im Body als Text ausgegeben wird!!!

*/


; ------------ Variablen fuer den Mailversand - immer an den Anfang eines Scriptes -----------------------------------
; ------------ Die Bezeichnungen duerfen keine Bindestriche enthalten ------------------------------------------------
; --------------------------------------------------------------------------------------------------------------------
Blat_Exe_Datei 			:= "blat.exe" ; der Name der Blat exe Datei, z.B. für individuelle Dateinamen -- nicht getestet!!!
Empfaenger 				:= "datensicherung@beispieldomain.com" ; -to
Absender_Mail_Adresse 	:= "muster-pc@beispieldomain.com" ; -f   E-Mail-Adresse, Absender Mail, kann Fantasiename sein - ABER die Domainendung MUSS korrekt sein!!!
Benutzername 			:= "datensicherung@beispieldomain.com" ; -u 
Passwort 				:= "XXXXXXXXXXXXX" ; -pw
Server					:= "xxxxx.beispieldomain.com" ; -server
Serverport				:= "587" ; -port
E_Mail_von 				:= "NinitePro_Updates_Muster_PC" ; -f   [also '/name'] name displayed
Betreff_der_Mail 		:= "Updates_NinitePro_Muster_PC" ; -subject = ACHTUNG Der Betreff muss mit Binde- oder Unterstrichen verbunden sein!!!!!
BodyTextDatei 			:= "updates-muster-pc.txt" ; -bodyF = sorgt dafür das eine Textdatei auch als Text im Body steht
Dateianhang 			:= "updates-muster-pc.txt" ; -attacht (nur Textdatei, jede andere Datei ist ebenfalls moeglich, Syntax dann aber= -attach ohne "t" am Ende)
; ---------------------------------------------------------------------------------------------------------------------
; ---------------------------------------------------------------------------------------------------------------------

RunWait, %Blat_Exe_Datei% -to "%Empfaenger%" -f "%Absender_Mail_Adresse%" -u "%Benutzername%" -pw "%Passwort%" -server "%Server%"
-subject "%Betreff_der_Mail%" -bodyF "%BodyTextDatei%" -attacht "%Dateianhang%", , Hide

ExitApp
Greetings Best-Code-in-Use
Best-Code-in-Use
Posts: 184
Joined: 01 Dec 2015, 05:13
Location: Germany

Re: Lizenzdatei laden

18 Oct 2016, 06:54

...wer lesen kann, ist klar im Vorteil!!!! Sorry... :dance: :dance:

....

Code: Select all

A2S(A) {
   VarSetCapacity(S, A.Length() * 4, 0)
   P := &S
   For I, V In A
      (I > 1) ? (P := NumPut(V ^ X, P + 0, "UInt")) : X := V
   VarSetCapacity(S, -1)
   Return S
}
Allerdings erschließt sich mir der Einbau und die Verwendung der A2S(A) nicht vollständig.
Es handelt sich ja offenbar um eine Funktion, soweit, so gut!!!
Greetings Best-Code-in-Use
just me
Posts: 9490
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Lizenzdatei laden

18 Oct 2016, 07:01

Okay, gut zu wissen, aber in der AHK Hilfe finde ich dazu nichts ... :-(
Die AHK Hilfe weiß ja auch nichts davon, dass ich eine Funktion A2S() geschrieben habe (s.o.). ;)

Code: Select all

A2S(A) {
   VarSetCapacity(S, A.Length() * 4, 0)
   P := &S
   For I, V In A
      (I > 1) ? (P := NumPut(V ^ X, P + 0, "UInt")) : X := V
   VarSetCapacity(S, -1)
   Return S
}
Welche Werte sollen denn 'vergeheimnist' werden?

Edit: Jetzt habe ich Deine Antwort verpasst!
just me
Posts: 9490
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Lizenzdatei laden

18 Oct 2016, 08:14

Gut, wenn Du es denn nutzen willst, hätte ich noch einen anderen Vorschlag, allerdings - was die Ausführung betrifft - ungetestet:

Code: Select all

#NoEnv
P := "blat.exe"
   . " -to datensicherung@beispieldomain.com"
   . " -f muster-pc@beispieldomain.com"
   . " -u datensicherung@beispieldomain.com"
   . " -pw XXXXXXXXXXXXX"
   . " -server xxxxx.beispieldomain.com"
   . " -subject Updates_NinitePro_Muster_PC"
   . " -bodyF updates-muster-pc.txt"
   . " -attacht updates-muster-pc.txt"
L := (StrLen(P) << !!A_IsUnicode)
VarSetCapacity(M, L + 8, 0)
M := P
I := 0
C := CRC32(P) << 24
A := [C]
While (I <= L) {
   A.Push(NumGet(M, I, "Int64") ^ A[1])
   I += 8
}
Msg := "["
For I, V In A
   Msg .= V . (I = A.Length() ? "]" : ", ")
MsgBox, 0, Array, %Msg%
MsgBox, 0, String, % A2S(A)
ExitApp

A2S(A) {
   VarSetCapacity(S, A.Length() * 8, 0)
   P := &S
   For I, V In A
      (I > 1) ? (P := NumPut(V ^ X, P + 0, "Int64")) : X := V
   VarSetCapacity(S, -1)
   Return S
}

CRC32(String) {
   Return DllCall("Ntdll.dll\RtlComputeCrc32", "UInt", 0, "Ptr", &String, "UInt", StrLen(String) << !!A_IsUnicode, "UInt")
}
Der Blat Aufruf sähe dann für Unicode in etwa so aus:

Code: Select all

#NoEnv
; ...
A := [58442309892571136, 52812402343542882, 48027220364820526, 45212522133651488, 52812402343018528, 46901367703208037
    , 53375369476571235, 40427529138208885, 53093842960056418, 46057020082159728, 49153210466631780, 48590539686019177
    , 63790197018263663, 52530910181982310, 53375369477357683, 40427511958470701, 53093842960056418, 46057020082159728
    , 49153210466631780, 48590539686019177, 63790197018263663, 49153240526225525, 53093864434892916, 48027289084166249
    , 47464364901728370, 46901445011832896, 48027293379985523, 45775519335317612, 63508438573449313, 67449083952824419
    , 67449058183086125, 42679333245419608, 42679333245419608, 42679333245419608, 53094135013310552, 48027280495214693
    , 51686395057537138, 63508344085151864, 53093842960056418, 46057020082159728, 49153210466631780, 48590539686019177
    , 63790197018263663, 46619957151465587, 67449045297332325, 49153240531468373, 40708918214983796, 46901414947520590
    , 53375416721014900, 52531047625064559, 53375369477357683, 67449247159550047, 48308794125582381, 52531197947281529
    , 52812402343018608, 45775785624272997, 48027271905345653, 48590204674310258, 52812294969884718, 52812402339414048
    , 47182911398543476, 53938250705797236, 48027271904165988, 52530910182834291, 53375369477357683, 63508460048744493
    , 58441846043967604]
RunWait, % A2S(A), , Hide
; ...
ExitApp
A2S(A) {
   VarSetCapacity(S, A.Length() * 8, 0)
   P := &S
   For I, V In A
      (I > 1) ? (P := NumPut(V ^ X, P + 0, "Int64")) : X := V
   VarSetCapacity(S, -1)
   Return S
}
Es hält natürlich keinem ernsthaften Angriff stand. Und wenn das Array mehr als 120 Elemente hat, muss man noch etwas tricksen.


Edit: Habe ich vergessen. Wenn Du beabsichtigst, die Ninite.exe von einem Fileserver zu holen, könntest Du die Logs doch auch dorthin hochladen.
User avatar
jNizM
Posts: 3183
Joined: 30 Sep 2013, 01:33
Contact:

Re: Lizenzdatei laden

18 Oct 2016, 08:31

Zum hochladen auf einen Fileserver (auf dem du Berechtigung hast) benötigt man in der Regel auch Zugangsdaten (welche dann auch per script definiert und abfangbar sind).
Um das abzusichern (ohne Zugangsdaten) müsste / könnte man die:
- FileExtensions beschränken (nur .txt)
- IP-Adressen vom Kunden Whitelisten

Anonsten könntest du auch einfach ein Gist Profil Anlegen und die GitHub-Gist-API benuzten zum hochladen.
Dort ist es weniger schmerzhaft wenn die Zugangsdaten veröffentlicht werden.

Falls doch über FTP, habe ich natürlich auch da eine fertige Klasse zur Verfügung =)
[AHK] v2.0.5 | [WIN] 11 Pro (Version 22H2) | [GitHub] Profile
Best-Code-in-Use
Posts: 184
Joined: 01 Dec 2015, 05:13
Location: Germany

18 Oct 2016, 08:41

Vielen Dank, muss ich mal testen.
Es hält natürlich keinem ernsthaften Angriff stand.
Ja, wie bereits erwähnt, ist es ja auch nicht als echter Schutz gedacht...

Also die Logdatei wird dann ja sowieso bei jedem Aufruf lokal überschrieben. Ich überlege noch ob es Sinn machen könnte, diese auf manchen Rechnern zu archivieren. Wobei ich ja die Listen sowieso per Mail archiviere.

Das Ablegen der Logfiles auf meinem Server würde ich jedoch lieber vermeiden wollen, da ich auf dem Download Verzeichnis nur Leserechte vergeben möchte...
Greetings Best-Code-in-Use

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: Ragnar and 28 guests