Hallo erstmel... Und meine erste Frage

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

just me
Posts: 9453
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Hallo erstmel... Und meine erste Frage

06 Jul 2014, 10:31

So, dank HotKeyIts Hilfe scheint es mir gelungen zu sein, einen ersten Teil nach AHK 1.1 zu portieren.

Es ist schon beeindruckend, wie geschmeidig die Portierung von C-Code mit AHK_H möglich ist. Wenn Du das ausprobieren kannst/willst, solltest Du es unbedingt mal versuchen.

Ich bleibe lieber bei AHK 1.1 und habe mich deshalb an einer Portierung der Portierung versucht. Die Funktion SGL_Authent() habe ich etwas umgestaltet, weil mir das, was der Programmierer der Fa. SG in der Header-Datei abgelegt hat, etwas zu umständlich erscheint. Auch in SGL_TeaEncipher() waren für AHK (das gilt sowohl für 1.1 als auch für H) noch Anpassungen nötig, weil AHK nur 64-bittige numerische Werte kennt und deshalb bei der Shifterei zusätzliche Bits ins Spiel gebracht wurden.

Bei mir scheint die Authentisierung gegen die DLL so zu klappen, der Anfang scheint gemacht. Mehr kann ich jetzt mangels Dongle auch nicht testen. Es gibt übrigens unter Support -> Download auch eine 64-Bit DLL.
SGL.ahk
Mein Test Skript
User avatar
Gucky_87
Posts: 375
Joined: 03 Jul 2014, 05:09

Re: Hallo erstmel... Und meine erste Frage

07 Jul 2014, 03:07

Einen wunderschönen Montag Morgen,

mein liebe just me, DU solltest WOCHENENDE machen (lacht laut)
und Dich nicht mit meinen Problemen rumärgern! :D :D
Natürlich werde ich Deinen Code sofort ausprobieren und Dir
Bericht erstatten.

VIELEN, LIEBEN DANK!!!

Gucky.
User avatar
Gucky_87
Posts: 375
Joined: 03 Jul 2014, 05:09

Re: Hallo erstmel... Und meine erste Frage

07 Jul 2014, 04:01

IT WORKS!

Wenn ich in das Testscript den folgenden Code einfüge, erhalte ich
bei eingestecktem Dongle eine "0" (= Ok), ansonsten eine "1" (= Kein Dongle gefunden).

Code: Select all

DongleID := 1234
Result := DllCall(SGLDLL . "\SglSearchLock", "Uint", DongleID)
MsgBox, 0, SglSearchLock, %RESULT%
Ich werde nun mit anderen Funktionen noch Tests surchlaufen, aber
ich denke, da die Abfrage nach einem Dongle bereits einwandfrei
klappt, sollte alles andere auch funktionieren.

Daher nochmals
D A N K E
just me
Posts: 9453
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Hallo erstmel... Und meine erste Frage

07 Jul 2014, 05:19

Moin moin,

freut mich, dass es funktioniert. Wenn Du Dich jetzt durch die weiteren Funktionen testest, wäre es vielleicht gut, SGL.ahk stückweise mit Allem zu ergänzen, was fehlerfrei läuft. Für den (nicht gänzlich auszuschließenden) Fall, dass sich ein anderer AHK-Programmierer auch mal mit dem Problem konfrontiert sieht, könntest Du dann Deine Lösung unter 'Skripte & Funktionen' oder auch der Fa. SG zur Verfügung stellen.

Viel Erfolg weiterhin!

just me

P.S.: Ich gehöre bereits zu den Glücklichen, deren Wochenende 7 Tage dauert. Ich kann es mir deshalb nicht leisten, am Wochenende nichts zu tun. ;)
User avatar
Gucky_87
Posts: 375
Joined: 03 Jul 2014, 05:09

Re: Hallo erstmel... Und meine erste Frage

07 Jul 2014, 09:07

Yep XD

Ich kann die ersten Funktionen (ReadData, WriteData, Counter, etc.)
erfolgreich ansprechen und somit benutzen.
Könnte sein, dass ich zu einigen Funktionen der DLL (u.A. Verschlüsselung)
noch Fragen habe, aber ich teste selbst erstmal, bevor sich weiter nerve ;)
Will ja auch was dazu lernen.

Gucky.
just me
Posts: 9453
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Hallo erstmel... Und meine erste Frage

07 Jul 2014, 09:55

Alles roger! ;)

just me
User avatar
Gucky_87
Posts: 375
Joined: 03 Jul 2014, 05:09

Re: Hallo erstmel... Und meine erste Frage

11 Jul 2014, 12:20

Soooooooo ;)
Hab die letzten Tage an den einzelnen Funktionen gearbietet und bis auf eine einzige (SglSignData) alle am Laufen.

Bevor sich das aber nun ins "Scripte & Funktionen" Forum stelle, könntest Du mal drüber schauen, wenn Du Zeit, Lust und Laune hast. Ich habe die entsprechenden Stellen, wie man verbessern könnte, kommentiert.
Sicher gibt es aber einige Stellen, die ich übersehen habe und die vllt. noch verbesserungswürdig sind...?

Code: Select all

; This program shows how to use the SG-Lock together with AutoHotKey

; IMPORTANT NOTE:
; With the Demo Authent Key it´s impossible to read/write data from/to
; the memory or counter and/or to encrypt/decrypt data, because the
; demo locks (U2 type) don´t hav any memory to store data.

#NoEnv
#Include SglAuth.AHK

; This is the DEMO authentication code, every  regular SG-Lock user gets its own unique authentication code.
 AuthentCode := [0xF574D17B, 0xA94628EE, 0xF2857A8F, 0x69346B4A
                ,0x4136E8F2, 0x89ADC688, 0x80C2C1D4, 0xA8C6327C
                ,0x1A72699A, 0x574B7CA0, 0x1E8D3E98, 0xD7DEFDC5]


SGL_Init()    ; Load the SGL.DLL

; Authentification with SGL.DLL (Returns 0x0000 when successful)
MsgBox, 0, SGL_Authent(), % SGL_Authent(AuthentCode)


; Read Product ID from SG-Lock
DllCall(SGLDLL . "\SglReadProductId", "UIntP", SGL_ProductID)
MsgBox, 0, SglReadProductID, Current product ID: %SGL_ProductID%

; Search for a specified SG-Lock
; ========================================================================================
; Uncomment the following six lines only if you want to use a specified
; SG-Lock product id instead of the id which was read above.
; ========================================================================================

; SGL_ProductID := 1234 ; Can be 0 ... 65535. This SG-Lock ID will be used in all following examples
; Result := DllCall(SGLDLL . "\SglSearchLock", "UInt", SGL_ProductID)
; If Result = 0
;     MsgBox, 0, SglSearchLock, SG-Lock found.`nProductID: %SGL_ProductID%
; else
;     MsgBox, 0, SglSearchLock, Specified SG-Lock product id #%SGL_ProductID% not found!`nProgram will be terminated.

   
; ########################################################################################


; Read SG-Lock configuration data
VarSetCapacity(ConfigData, 32, 0)
Addr := &ConfigData
DllCall(SGLDLL . "\SglReadConfig", "UInt", SGL_ProductID, "UInt", 0, "Ptr", &ConfigData)
Loop, 8
    {
    Addr := A_Index - 1
    Data := NumGet(ConfigData, (A_Index - 1) * 4, "UInt")
    }
SG_Lock_Type       := NumGet(ConfigData,  0, "UInt") + 1
SG_Lock_Interface  := NumGet(ConfigData,  4, "UInt")
SG_Lock_SoftVer    := "00" . NumGet(ConfigData,  8, "UInt") & 0xFFFF
SG_Lock_SoftVer    := "1." . SubStr(SG_Lock_SoftVer, StrLen(SG_Lock_SoftVer) - 1)
SG_Lock_HardVer    := "00" . NumGet(ConfigData, 12, "UInt") & 0xFFFF
SG_Lock_HardVer    := "1." . SubStr(SG_Lock_HardVer, StrLen(SG_Lock_HardVer) - 1)
SG_Lock_SerailNo   := NumGet(ConfigData, 16, "UInt")
SG_Lock_MemSize    := NumGet(ConfigData, 20, "UInt")
Sg_Lock_MemBytes   := SG_Lock_MemSize * 4
SG_Lock_CounterNum := NumGet(ConfigData, 24, "UInt")
SG_Lock_KeyNum     := NumGet(ConfigData, 28, "UInt")
MsgBox, 0, SglReadConfig, #0: Modul type: U%SG_Lock_Type%`n#1: Interface: %SG_Lock_Interface%`n#2: Software version: v%SG_Lock_SoftVer%`n#3: Hardware version: v%SG_Lock_HardVer%`n#4: Serial number: %SG_Lock_SerailNo%`n#5: Memory size: %SG_Lock_MemSize% Cells [%SG_Lock_MemBytes% Byte]`n#6: Number of counters: %SG_Lock_CounterNum%`n#7: Number of 128 bit keys: %SG_Lock_KeyNum%


; Read serial number from SG-Lock
DllCall(SGLDLL . "\SglReadSerialNumber", "UInt", SGL_ProductID, "UIntP", SerialNumber)
MsgBox, 0, SglReadSerialNumber, Serial no: %SerialNumber%


; ########################################################################################


; Write value into memory of SG-Lock
Addr := 0
Random, WriteValue, 10000000000 99999999999
DllCall(SGLDLL . "\SglWriteData", "UInt", SGL_ProductID, "UInt", Addr, "UInt", 1, "UIntP", WriteValue)
MsgBox, 0, SglWriteData, Write to address #%Addr%: %WriteValue%

; Read memory value from SG-Lock
Addr := 0
DllCall(SGLDLL . "\SglReadData", "UInt", SGL_ProductID, "UInt", Addr, "UInt", 1, "UIntP", ReadValue)
MsgBox, 0, SglReadData, Read from address #%Addr%: %ReadValue%


; ########################################################################################


; Write counter value into counter memory of SG-Lock
CountNum := 5
Random, CountWrite, 10000000000, 99999999999
DllCall(SGLDLL . "\SglWriteCounter", "UInt", SGL_ProductID, "UInt", CountNum, "UInt", CountWrite)
MsgBox, 0, SglWriteCounter, Write to counter #%CountNum%: %CountWrite%

; Read counter value from SG-Lock
CountNum := 5
DllCall(SGLDLL . "\SglReadCounter", "UInt", SGL_ProductID, "UInt", CountNum, "UIntP", CountRead)
MsgBox, 0, SglReadCounter, Read from counter #%CountNum%: %CountRead%


; ########################################################################################


; Write 128 Bit key to SG-Lock
VarSetCapacity(NewKey, 16, 0)
KeyNum    := 0
Key       := [Dec2Hex(SGL_Rand()), Dec2Hex(SGL_Rand()), Dec2Hex(SGL_Rand()), Dec2Hex(SGL_Rand())]
Addr      := &NewKey
Clipboard := Key[1] . "  " . Key[2] . "  " . Key[3] . "  " . Key[4]

Loop, 4
    Addr := NumPut(Key[A_Index], Addr + 0, "UInt")

Result := DllCall(SGLDLL . "\SglWriteKey", "UInt", SGL_ProductID, "UInt", KeyNum, "Ptr", &NewKey)
If Result = 0
    MsgBox, 0, SglWriteKey, % Key[1] . "  " . Key[2] . "  " . Key[3] . "  " . Key[4] . "`nfor key #" . KeyNum . " successfully stored and copied to clipboard."
else
    MsgBox, 0, SglWriteKey, Unable to store key #%KeyNum%!`nError: %Result%


; ########################################################################################


; Encrypt Data
KeyNum   := 0                      ; Which key should be used?
Mode     := 0                      ; 0 = Encrypt | 1 = Decrypt
BlockCnt := 3                      ; Number of crypted data blocks
VarSetCapacity(DataBlock, BlockCnt * 8, 0)
Data  := [0x11111111, 0x22222222, 0x33333333, 0x44444444, 0x55555555, 0x66666666]  ; Datablock to encrypt

Addr     := &DataBlock
Loop, % BlockCnt * 2
    Addr := NumPut(Data[A_Index], Addr + 0, "UInt")

Result   := DllCall(SGLDLL . "\SglCryptLock", "UInt", SGL_ProductID, "UInt", KeyNum, "UInt", Mode, "UInt", BlockCnt, "Ptr", &DataBlock)

If Result = 0
    {
    ; #### Das hier könnte man vllt mit einem Loop besser machen?
    ; #### Allerdings funktioniert das Golgende bei mir nicht.
    ; #### Ich bekomme in einer MagBos leere Werte zurück?!
    ; #### Loop, % BlockCnt * 2
    ; ####     {
    ; ####     Enc%A_Index% := NumGet(DataBlock, (A_Index - 1) * 4, "UInt")
    ; ####     }
     
    Enc1 := Dec2Hex(NumGet(DataBlock,  0, "UInt"))
    Enc2 := Dec2Hex(NumGet(DataBlock,  4, "UInt"))
    Enc3 := Dec2Hex(NumGet(DataBlock,  8, "UInt"))
    Enc4 := Dec2Hex(NumGet(DataBlock, 12, "UInt"))
    Enc5 := Dec2Hex(NumGet(DataBlock, 16, "UInt"))
    Enc6 := Dec2Hex(NumGet(DataBlock, 20, "UInt"))
    MsgBox, 0, SglCryptLock (encrypt), % "Encryption of " . BlockCnt . " data blocks successful.`nUsed encryption key: #" . KeyNum . "`n`nOriginal data:`t`t Encrypted data:`n" . Dec2Hex(Data[1]) . " `t==>`t " . Enc1 . "`n" . Dec2Hex(Data[2]) . " `t==>`t " . Enc2 . "`n" . Dec2Hex(Data[3]) . " `t==>`t " . Enc3 . "`n" . Dec2Hex(Data[4]) . " `t==>`t " . Enc4 . "`n" . Dec2Hex(Data[5]) . " `t==>`t " . Enc5 . "`n" . Dec2Hex(Data[6]) . " `t==>`t " . Enc6
    }
else
    MsgBox, 0, SglCryptLock, Encryption failed!`nErrorcode: #%Result%


; ########################################################################################


; Decrypt Data
KeyNum   := 0                      ; Which key should be used?
Mode     := 1                      ; 0 = Encrypt | 1 = Decrypt
BlockCnt := 3                      ; Number of crypted data blocks
VarSetCapacity(DataDec, BlockCnt * 8, 0)
EncData  := [Enc1, Enc2, Enc3, Enc4, Enc5, Enc6]  ; Datablock to encrypt (filled with values we just have encrypted above)

Addr     := &DataDec
Loop, % BlockCnt * 2
    Addr := NumPut(EncData[A_Index], Addr + 0, "UInt")

Result   := DllCall(SGLDLL . "\SglCryptLock", "UInt", SGL_ProductID, "UInt", KeyNum, "UInt", Mode, "UInt", BlockCnt, "Ptr", &DataDec)

If Result = 0
    {
    ; #### Hier ist es ebenso, wie in dem Teil oben. Im Loop klappt das
    ; #### Auslesen nicht?!
    ; #### Loop, % BlockCnt * 2
    ; ####    {
    ; ####    Dec%A_Index% := NumGet(DataDec, (A_Index - 1) * 4, "UInt")
    ; ####    }

    SetFormat, Integer, H
    Dec1 := Dec2Hex(NumGet(DataDec,  0, "UInt"))
    Dec2 := Dec2Hex(NumGet(DataDec,  4, "UInt"))
    Dec3 := Dec2Hex(NumGet(DataDec,  8, "UInt"))
    Dec4 := Dec2Hex(NumGet(DataDec, 12, "UInt"))
    Dec5 := Dec2Hex(NumGet(DataDec, 16, "UInt"))
    Dec6 := Dec2Hex(NumGet(DataDec, 20, "UInt"))
    MsgBox, 0, SglCryptLock, % "Decryption of " . BlockCnt . " data blocks successful.`nUsed decryption key: #" . KeyNum . "`n`nEncrypted data:`t`t Decrypted data:`n" . Dec2Hex(EncData[1]) . " `t==>`t " . Dec1 . "`n" . Dec2Hex(EncData[2]) . " `t==>`t " . Dec2 . "`n" . Dec2Hex(EncData[3]) . " `t==>`t " . Dec3 . "`n" . Dec2Hex(EncData[4]) . " `t==>`t " . Dec4 . "`n" . Dec2Hex(EncData[5]) . " `t==>`t " . Dec5 . "`n" . Dec2Hex(EncData[6]) . " `t==>`t " . Dec6
    }
else
    MsgBox, 0, SglCryptLock (decrypt), Decryption failed!`nErrorcode: #%Result%


; ########################################################################################


ExitApp




; #################################  Subroutnes  #########################################

; Converts a decimal value to hex
; Example:    x := Dec2Hex(10) will return "0A".
Dec2Hex(h)
    {
    format = %A_FormatInteger%
    SetFormat, Integer, hex
    H += 0
    SetFormat, Integer, d
    StringLeft, C, H, 2
    If C = 0x
        {
        L := StrLen(h) -2
        StringRight, h, h, L
        }

    If StrLen(h) < 2
        H = 0%h%
    StringUpper, h, h
    SetFormat Integer, %format%
    Return, "0x" . h
    }
Außerdem arbeite ich an einem Tool, das quasi die SGLMGR.EXE verkörpert, aber
evtl. noch ein paar Dinge mehr, bzw. anders machen soll. Das GUI dafür steht schon fast. Wird natürlich dann später auch unter 'Scripte & Funktionen' veröffentlicht.

Auch würde ich gern die einzelnen Programmteile noch si umgestalten, dass Funktionen daraus werden (z.B. Sgl_CryptLock(InputText, KeyNumber) ).
Das aber erst dann, wenn der bisherhige Code 'sauber' ist.


Gucky.
just me
Posts: 9453
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Hallo erstmel... Und meine erste Frage

11 Jul 2014, 20:55

Hallo,

ich schaue mir das am Wochenende mal genauer an.

Grüße!

just me
User avatar
Gucky_87
Posts: 375
Joined: 03 Jul 2014, 05:09

Re: Hallo erstmel... Und meine erste Frage

12 Jul 2014, 04:28

Hehe, nur keine Eile. :D
Bin schon wieder weiter am basteln ;)

Gucky
just me
Posts: 9453
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Hallo erstmel... Und meine erste Frage

12 Jul 2014, 04:48

Sodele, Antwort #1:
  1. SglReadConfig:

    Code: Select all

    ; Read SG-Lock configuration data
    VarSetCapacity(ConfigData, 32, 0)
    Addr := &ConfigData
    DllCall(SGLDLL . "\SglReadConfig", "UInt", SGL_ProductID, "UInt", 0, "Ptr", &ConfigData)
    Loop, 8
        {
        Addr := A_Index - 1
        Data := NumGet(ConfigData, (A_Index - 1) * 4, "UInt")
        }
    SG_Lock_Type       := NumGet(ConfigData,  0, "UInt") + 1
    SG_Lock_Interface  := NumGet(ConfigData,  4, "UInt")
    SG_Lock_SoftVer    := "00" . NumGet(ConfigData,  8, "UInt") & 0xFFFF
    SG_Lock_SoftVer    := "1." . SubStr(SG_Lock_SoftVer, StrLen(SG_Lock_SoftVer) - 1)
    SG_Lock_HardVer    := "00" . NumGet(ConfigData, 12, "UInt") & 0xFFFF
    SG_Lock_HardVer    := "1." . SubStr(SG_Lock_HardVer, StrLen(SG_Lock_HardVer) - 1)
    SG_Lock_SerailNo   := NumGet(ConfigData, 16, "UInt")
    SG_Lock_MemSize    := NumGet(ConfigData, 20, "UInt")
    Sg_Lock_MemBytes   := SG_Lock_MemSize * 4
    SG_Lock_CounterNum := NumGet(ConfigData, 24, "UInt")
    SG_Lock_KeyNum     := NumGet(ConfigData, 28, "UInt")
    MsgBox, 0, SglReadConfig, % "#0: Modul type: U" . SG_Lock_Type . "`n"
                              . "#1: Interface: " . SG_Lock_Interface . "`n"
                              . "#2: Software version: v" . SG_Lock_SoftVer . "`n"
                              . "#3: Hardware version: v" . SG_Lock_HardVer . "`n"
                              . "#4: Serial number: " . SG_Lock_SerailNo . "`n"
                              . "#5: Memory size: " . SG_Lock_MemSize . " Cells [" . SG_Lock_MemBytes . " Byte]`n"
                              . "#6: Number of counters: " . SG_Lock_CounterNum . "`n"
                              . "#7: Number of 128 bit keys: " . SG_Lock_KeyNum
    *Die MsgBox habe ich wegen der Zeilenlänge verändert und dabei hoffentlich nicht beschädigt.*

    Code: Select all

    Addr := &ConfigData
    und

    Code: Select all

    Loop, 8
        {
        Addr := A_Index - 1
        Data := NumGet(ConfigData, (A_Index - 1) * 4, "UInt")
        }
    machen so keinen Sinn.

    Code: Select all

    SG_Lock_SoftVer    := "00" . NumGet(ConfigData,  8, "UInt") & 0xFFFF
    In der C Headerdatei steht dazu:
    // Data[2] = Software Version of SG-Lock ( high word = major version, low word = minor version )
    'Richtiger' wäre deshalb meiner Meinung nach

    Code: Select all

    SG_Lock_SoftVer    := ((Ver := NumGet(ConfigData,  8, "UInt") >> 16) . "." . (Ver & 0xFFFF)
    Dasselbe gilt für die Hardwareversion.
  2. Encrypt/Decrypt Data:
    1. Für mich laufen die auskommentierten Schleifen einwandfrei und ich sehe auch keinen Grund, warum das nicht funktionieren sollte. Ich musste allerdings auf den Aufruf von SglCryptLock() verzichten. Die Variable BlockCnt sollte aber dabei nicht überschrieben werden.
    2. Die Funktion Dec2Hex() brauchst Du allenfalls für die Präsentation der Werte. Den SGL-API-Funktionen ist das Format Wurst.
Falls mir noch etwas auffällt, melde ich mich noch einmal.
User avatar
Gucky_87
Posts: 375
Joined: 03 Jul 2014, 05:09

Re: Hallo erstmel... Und meine erste Frage

12 Jul 2014, 07:35

Bin schon am werkeln... :)

Dank Dir!

Gucky.
User avatar
Gucky_87
Posts: 375
Joined: 03 Jul 2014, 05:09

Re: Hallo erstmel... Und meine erste Frage

14 Jul 2014, 10:25

Hierzu hätte ich noch eine Frage:

Code: Select all

SG_Lock_HardVer    := ((Ver := NumGet(ConfigData, 12, "UInt") >> 16) . "." . (Ver & 0xFFFF)
Die aktuelle Hardware Version ist 1.04.
Nun wird mir aber, wenn ich es so auslese, 1.4 angezeigt.
Meiner Meinung nach nicht korrekt, da 1.4(0) und 1,04 doch unterschiedlich sind. Oder interpretiere ich es nur falsch?

Gucky.
just me
Posts: 9453
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Hallo erstmel... Und meine erste Frage

15 Jul 2014, 00:43

Hallo Gucky,

die Versionsnummer ist in zwei Teile aufgeteilt ("major version" und "minor version"), von denen jeder eine Zahl ist. So entstehen hier eine 1 und eine 4. Wenn man beide Teile wieder zu einer Zeichenfolge zusammenführt, ergibt das"1.4" mit nur einer Stelle hinter dem Punkt. Und weil das eine Zeichenfolge und keine Zahl ist, ist es auch korrekt.

Wenn die Fa. SG Ihre Versionsnummern offiziell mit zwei Stellen für die "minor version" darstellt und Du das auch so machen willst:

Code: Select all

SG_Lock_HardVer    := ((Ver := NumGet(ConfigData, 12, "UInt") >> 16) . "." . Substr("0" . (Ver & 0xFFFF), -1)
just me
User avatar
Gucky_87
Posts: 375
Joined: 03 Jul 2014, 05:09

Re: Hallo erstmel... Und meine erste Frage

15 Jul 2014, 08:25

Halli hallo,

laut der originalen Software (SGLMGR.exe) wohl ja, denn diser zeigt
nach dem Komma 2 Stellen an.

Danke für Deine Kurzfassung des SubStr, denn das war bei mir (noch) ein 2 Zeiler ;)


Gucky.
User avatar
Gucky_87
Posts: 375
Joined: 03 Jul 2014, 05:09

Re: Hallo erstmel... Und meine erste Frage

30 Oct 2017, 08:48

Hallo zusammen,

ich muss diesen alten Thread doch nochmal bemühen, da ich mit der Crypt Funktion nicht zu Rande komme.

Die DLL Funktion wird wie folgt aufgerufen

Code: Select all

    Result := DllCall(SGLDLL . "\SglCryptLock", "UInt", ProdID, "UInt", KeyNum, "UInt", Mode, "UInt", 2, "Ptr", &Text)
Dabei sind:
ProdID = Product ID
KeyNum = Schlüsselnummer (0/1)
Mode (0 = Encrypt / 1 = Decrypt)
Text = Pointer der Variable, die den zu ver-/entschlüsselnden Text enthält.

Woran ich verzweifle ist folgendes:
Ich verstehe die Sache mit "NumGet", bzw. "NumPut" nicht.
Was diese Befehle machen, ist klar, aber ich weiß nicht, wie ich sie hier einsetzen muss?

Wenn ich z.B. einen String habe (Text := "Hallo Welt") und diesen zum Verschlüsseln an die DLL senden will, muss ich den Text zuerst in ASCII Codes umwandeln, sodass A dann z.B. 0x41 (65) ergibt?
Dies bedeutet, ich müsste den zu bearbeitenden Text in 8 Byte Stücke zerschneiden, da die DLL und das dongle immer 8 Byte lange Zeichenfolgen verarbeitet.

Oder mach ich ´nen Denkfehler?

Ich möchte folgendes erreichen:
Der Benutzer soll sein Dongle mit bestimmten Optionen frei schalten können, indem er von mir einen Code bekommt.
Dieser soll, wenn er korrekt ist, ins Dongle geschrieben werden und im Programm bestimmte Funtionen erlauben/verbieten.

Ein Beispiel:
Ich habe den Text: "Hallo" und möchte aus dem nachher einen Code wie "FFCA00128F9D0FCB" erzeugen, den der Benutzer dann bekommt.
Gibt er diesen auf Anfrage ein, soll wieder "Hallo" raus kommen und das Programm weiß, was es damit zu tun hat.

Laut Beschreibung (s. unten) werden 64 Bit Werte benötigt. Daraus schlussfolgere ich, dass ich pro Datenblock also 8 ASCII Zeichen übertragen, bzw. verarbeiten könnte...?

Ich probiere jetzt mehreren Tagen die verschiedensten Möglichkeiten durch, bislang leider ohne Erfolg.

Mein aktueller Stand (nicht funktionierend) sieht so aus:

Code: Select all

SGL_Crypt_Data(ByRef ProdID, ByRef Text, ByRef KeyNum, ByRef Mode)
{
    Bytes_Char := A_IsUnicode ? 2 : 1               ; Speichergröße für String berechnen
    L          := StrLen(Text)                      ; Textlänge ermitteln
    BlockCnt   := L // 4                            ; Wieviele 4 Byte Blöcke sind das?
    X          := L - (BlockCnt * 4)                ; Bleiben weniger als 4 Zeichen am Ende übrig?
    If X > 0
        BlockCnt += 1                               ; Ja, dann 1 Block dazu.
    BufLen     := L * Bytes_Char                    ; Bufferlänge errechnen
    EncText := ""
    Loop, %L%
        EncText .= Asc(SubStr(Text, A_Index, 1))

    msgbox % "U: " . Dec2Hex(EncText)    
    Result := DllCall(SGLDLL . "\SglCryptLock", "UInt", ProdID, "UInt", KeyNum, "UInt", Mode, "UInt", 2, "Ptr", &EncText)
    msgbox % "V: " . Dec2Hex(NumGet(&EncText, 0, "UInt"))
    ;Return %EncText%
}

Hier noch ein Auszug aus der API Beschreibung:

Code: Select all

Funktion: SglCryptLock
Ver- oder entschlüsselt einen oder mehrere 64-Bit Datenblöcke mit 128-Bit
Schlüssel. Algorithmus ist TEA.
Deklaration
ULONG SglCryptLock (
ULONG ProductId ,
ULONG KeyNum ,
ULONG CryptMode ,
ULONG BlockCnt ,
ULONG * Data ) ;
Parameter
ProductId Gibt die ProductId des gesuchten SG-Locks an
KeyNum Nummer des zu verwendenden Schlüssels
0 bis 1 - SG-Lock U3
0 bis 15 - SG-Lock U4
CryptMode Arbeitsmodus
0 - Verschlüsseln
1 - Entschlüsseln
BlockCnt Anzahl der zu bearbeitenden 64-Bit-Datenblöcke
Data Zeiger auf Datenbereich, in dem die zu bearbei-
tenden Datenblöcke stehen (der Entwickler muss
die ausreichende Größe hinsichtlich des Parame-
ters BlockCnt sicherstellen)
just me
Posts: 9453
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Hallo erstmel... Und meine erste Frage

30 Oct 2017, 11:45

Funktion: SglCryptLock
Ver- oder entschlüsselt einen oder mehrere 64-Bit Datenblöcke mit 128-Bit
Wie ich das lese, werden 64-Bit Böcke ver- bzw. entschlüsselt. Das sind 8 Bytes pro Block, und die Anzahl der Blöcke wird im Parameter BlockCnt übergeben. Die Funktion erwartet deshalb einen Datenbereich, dessen Länge in Bytes ein Vielfaches von 8 ist.

Wenn Du Texte verschlüsseln willst, kannst Du den Datenbereich einfach mit binären Nullen auffüllen, denn die dürfen innerhalb von Texten nicht auftauchen. Ich würde das so versuchen, konnte hier aber nicht testen:

Code: Select all

SGL_EnCrypt_Data(ProdID, KeyNum, ByRef String, ByRef Data)
{  ; gibt im Erfolgsfall die Anzahl der Blöcke in Data zurück
   Static CharSize := A_IsUnicode ? 2 : 1
   Size := (StrPut(InputData) * CharSize) + 8
   VarSetCapacity(OutputData, Size, 0)
   StrPut(InputData, &OutputData)
   BlockCnt := Size // 8
   Result := DllCall(SGLDLL . "\SglCryptLock", "UInt", ProdID, "UInt", KeyNum, "UInt", 0, "UInt", BlockCnt, "Ptr", &Data)
   Return (Result = ???) ? BlockCnt : 0 ; ??? mit Wert für 'korrekt ausgeführt' ersetzen
}

SGL_DeCrypt_Data(ProdID, KeyNum, BlockCnt, ByRef Data)
{  ; gibt im Erfolgsfall den entschlüsselten Text zurück
   Result := DllCall(SGLDLL . "\SglCryptLock", "UInt", ProdID, "UInt", KeyNum, "UInt", 1, "UInt", BlockCnt, "Ptr", &Data)
   Return (Result = ???) ? StrGet(&Data) : "" ; ??? mit Wert für 'korrekt ausgeführt' ersetzen
}
User avatar
Gucky_87
Posts: 375
Joined: 03 Jul 2014, 05:09

Re: Hallo erstmel... Und meine erste Frage

02 Nov 2017, 09:56

Ich schau mir das natürlich gleich mal an.
Lieben Dank für Deine Hilfe (wieder mal).

Das "ByRef Data" muss ich aber vermutlich noch in "ByRef InputData" ändern, oder? ;)
just me
Posts: 9453
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Hallo erstmel... Und meine erste Frage

02 Nov 2017, 10:11

Sorry, SGL_EnCrypt_Data() ist wegen Namensänderungen verwurschtelt. So sollte es sein:

Code: Select all

SGL_EnCrypt_Data(ProdID, KeyNum, ByRef String, ByRef Data) ; String -> Eingabe, Data -> Ausgabe
{  ; gibt im Erfolgsfall die Anzahl der Blöcke in Data zurück
   Static CharSize := A_IsUnicode ? 2 : 1
   Size := (StrPut(String) * CharSize) + 8
   VarSetCapacity(Data, Size, 0)
   StrPut(String, &Data)
   BlockCnt := Size // 8
   Result := DllCall(SGLDLL . "\SglCryptLock", "UInt", ProdID, "UInt", KeyNum, "UInt", 0, "UInt", BlockCnt, "Ptr", &Data)
   Return (Result = ???) ? BlockCnt : 0 ; ??? mit Wert für 'korrekt ausgeführt' ersetzen
}
Noch etwas: Die Variable SGLDLL muss entweder Global sein oder innerhalb der Funktion definiert/deklariert werden.
just me
Posts: 9453
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Hallo erstmel... Und meine erste Frage

09 Nov 2017, 10:49

Siehe hier:
Gucky_87 wrote:Das habe ich ausprobiert, es scheint auch zu klappen, aber offenbar mach ich noch was falsch, denn die Zeichen, die mir ausgegeben werden, sind irgendwelche "japanisch" aussehenden Zeichen, die ASCII Codes mit 39000 + irgendwas haben.
Bevor ich aber die Pferde scheu mache, such ich meinen Fehler erstmal.
Die Funktion SGL_EnCrypt_Data() (korrigierte Version) verschlüsselt einen Speicherbereich unabhängig davon, ob er einen String oder binäre Daten enthält. Wenn Du für einen String den zurückgegebenen Wert für BlockCnt und die im Parameter Data übergebene Variable unverändert an SGL_DeCrypt_Data() übergibst, sollte diese Funktion den Originalstring zurückgeben. Z.Zt. wird dabei auch die im Parameter Data übergebene Variable verändert, so dass das nur genau einmal klappt. Wenn SGL_DeCrypt_Data() 'irgendwelche "japanisch" aussehenden Zeichen' liefert, arbeiten die Funktionen nicht korrekt.

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 47 guests