Personalausweis - Lesegerät

Hardware- und Elektronikbasteleien, Ansteuerung von Schnittstellen und Peripherie.
Fragen zu "Consumer"-Problemen kommen in Offtopic.
Benutzeravatar
Rings
Beiträge: 971
Registriert: 29.08.2004 08:48

Re: Personalausweis - Lesegerät

Beitrag von Rings »

Ich mag das. Alleine den Spass diesen Code zu schreiben waren
die 4 Euronen wert. Auch wenn das Heft einfach nur Dreck ist.


Tada, Purebasic Code für den 'KartenTresor' lesen und schreiben

Code: Alles auswählen

 
     
#DF_APP_ID_OWOK_OFFLINE = $808301
#OI_DF_FID_AESKEY = "(BYTE) 0x01"
#OI_DF_FID_AESKEY_LEN = $20
#OI_DF_FID_PWD = "(BYTE) 0x02"
#OI_DF_FID_PWD_LEN = $20
#OI_DF_FID_PWD_UNPROT = "(BYTE) 0x08"
#OI_DF_FID_PWD_UNPROT_LEN = $20
#OI_DF_FID_SECURE_NOTEPAD = "(BYTE) 0x11"
#OI_DF_FID_SECURE_NOTEPAD_LEN= $400
#OI_ERR_CARD_AUTH = 13
#OI_ERR_CARDLOCKED = 4
#OI_ERR_CHANGE_KEY = 14
#OI_ERR_CREATE_DATA_FILE = 15
#OI_ERR_DEACTIVATE = 6
#OI_ERR_ENETWORK = 3
#OI_ERR_NO_READER = 2
#OI_ERR_NOT_INIT = $13
#OI_ERR_NOT_REGISTED = 5
#OI_ERR_PARAM = $12
#OI_ERR_PCSC_CONNECT = 10
#OI_ERR_PCSC_TRANSMIT = 11
#OI_ERR_READ_CARD = 20
#OI_ERR_READ_DATA_FILE = $10
#OI_ERR_SELECT_APP = 12
#OI_ERR_TIMEOUT_PIN = 8
#OI_ERR_UNKNOWN = $3E8
#OI_ERR_USER_CANCEL = 1
#OI_ERR_WRITE_DATA_FILE = $11
#OI_ERR_WRONG_PIN = 7
#OI_LOGIN_OPTION_DEBUG = $40
#OI_LOGIN_OPTION_RETURN_ON_CARD_LOCKED = 2
#OI_LOGIN_OPTION_RETURN_ON_CARD_NOT_REG = $10
#OI_LOGIN_OPTION_RETURN_ON_NO_READER = 1
#OI_LOGIN_OPTION_RETURN_ON_PIN_TIMEOUT = $80
#OI_LOGIN_OPTION_RETURN_ON_WRONG_CARD = 8
#OI_LOGIN_OPTION_RETURN_ON_WRONG_PIN = 4
#OI_LOGIN_OPTION_SHOW_BUT_CARD_DEACTIVATE = $20
#OI_OK = 0
#OI_REG_ENT_DEF_READER_NAME = "DefReaderName"
#OI_REG_ENT_DONT_ASK_SET_PWD = "DontAskSetPwd"
#OI_REG_ENT_DONT_ASK_SET_PWD_DEF = 0
#OI_REG_ENT_MIN_PWD_LEN= "MinPwdLen"
#OI_REG_ENT_MIN_PWD_LEN_DEF = 6
#OI_REG_PATH_MAIN = "SOFTWARE\\REINER SCT\\OWOK\\OI"



; Public Structure CMemRef
;     Public m_pData As IntPtr
;     Public m_nBufferLen As UInt32
; End Structure
Structure  CMemRef
  m_pData.l
  m_nBufferLen.l
EndStructure  




; Public Structure COiReqObj

;     Public m_nSize As UInt32

;     <MarshalAs(UnmanagedType.LPStr)> _
;     Public m_zServerName As String

;     <MarshalAs(UnmanagedType.ByValArray, SizeConst:=3, ArraySubType:=UnmanagedType.SysUInt)> _
;     Public m_zSites As IntPtr()

;     Public m_nPort As UInt16

;     Public m_nOptions As UInt32

;     <MarshalAs(UnmanagedType.LPStr)> _
;     Public m_zDialogTitle As String

;     <MarshalAs(UnmanagedType.LPStr)> _
;     Public m_zLabelButtonCancel As String

;     <MarshalAs(UnmanagedType.LPStr)> _
;     Public m_zLabelButtonDeactivate As String

; End Structure
Structure COiReqObj
  m_nSize.l
  m_zServerName.s
  m_zSites.l
  m_nPort.w
  m_nOptions.l
  m_zDialogTitle.s
  m_zLabelButtonCancel.s
  m_zLabelButtonDeactivate.s
EndStructure
  


 
Procedure.s CardError(code)
     Select code
      Case 0
        ProcedureReturn  "OK"
      Case 1
            ProcedureReturn "Abbruch durch Benutzer"
            
        Case 2
            ProcedureReturn "Kein Kartenleser"
            
        Case 3
            ProcedureReturn "Netzwerkfehler"
            
        Case 4
            ProcedureReturn "Karte gesperrt"
            
        Case 5
            ProcedureReturn "Nicht registriert"
            
        Case 6
            ProcedureReturn "Deaktiviert"
            
        Case 10
            ProcedureReturn "PC/SC Connect"
            
        Case 11
            ProcedureReturn "PC/SC Transmit"
            
        Case 12
            ProcedureReturn "Anwendungsauswahl"
            
        Case 13
            ProcedureReturn "Authentifikation"
            
        Case 14
            ProcedureReturn "Schlüsseländerung"
            
        Case 15
            ProcedureReturn "Erzeugen der Datendatei"
            
        Case $10
            ProcedureReturn "Lesen der Datendatei"
            
        Case $11
            ProcedureReturn "Schreiben der Datendatei"
            
        Case $12
            ProcedureReturn "Parameter"
            
        Case $13
            ProcedureReturn "Nicht initialisiert"
            
        Case $3E8
            ProcedureReturn "unbekannt"
            
        Default
           ProcedureReturn "Unbekannter Fehlercode" 
     EndSelect
     
   EndProcedure
   
  

;     <DllImport("oi32.dll")> _
;     Public Shared Function OiChangePassword() As UInt32

;     <DllImport("oi32.dll")> _
;     Public Shared Function OiInitCard() As UInt32

;     <DllImport("oi32.dll")> _
;     Public Shared Function OiLogin(ByRef p_pcOiReqObj As COiReqObj, ByRef p_pcUserId As CMemRef, ByRef p_pcCardId As CMemRef, ByRef p_pcUnProtected As CMemRef, ByRef p_pcProtected As CMemRef) As UInt32

;     <DllImport("oi32.dll")> _
;     Public Shared Function OiReadFile(ByVal p_nFileId As Byte, ByRef p_pcData As CMemRef) As UInt32

;     <DllImport("oi32.dll")> _
;     Public Shared Function OiResetPassword() As UInt32

;     <DllImport("oi32.dll")> _
;     Public Shared Function OiWriteFile(ByVal p_nFileId As Byte, ByRef p_pcData As CMemRef) As UInt32
     


 Prototype.l OiNew()
 Prototype.l OiChangePassword() 
 Prototype.l OiInitCard() 
 
 
 ;Damit hab ich noch Probleme
 ;Prototype.l OiLogin( p_pcOiReqObj.COiReqObj, p_pcUserId.CMemRef, p_pcCardId.CMemRef, p_pcUnProtected.CMemRef, p_pcProtected.CMemRef) 
 Prototype.l OiReadFile( p_nFileId.b, p_pcData) 
 Prototype.l OiResetPassword()
 Prototype.l OiWriteFile(p_nFileId.b, p_pcData) 
 
 If OpenLibrary(0, "oi32.dll")
   
    OiChangePassword.OiChangePassword= GetFunction(0, "OiChangePassword")
    OiInitCard.OiInitCard=GetFunction(0,"OiInitCard")
 ;   OiLogin.OiLogin=GetFunction(0,"OiLogin")
    OiReadFile.OiReadFile=GetFunction(0,"OiReadFile")
    OiResetPassword.OiResetPassword=GetFunction(0,"OiResetPassword")
    OiWriteFile.OiWriteFile=GetFunction(0,"OiWriteFile")
    
    Result=OiInitCard() ;initialisieren
    Debug Result
    
    ref2.CMemRef
    ref2\m_pData = AllocateMemory($400)
    ref2\m_nBufferLen = $400
    Code=OiReadFile($11,@ref2)
    Debug Code
    If Code=0 
      
      Debug ref2\m_pData
      Debug PeekS(ref2\m_pData) ;hier kommt der Text !
      
      
      PokeB(ref2\m_pData,'P')
      ;wieder runterschreiben 
      
      
      Code=OiWriteFile($11,@ref2)
      
    Else
      Debug CardError(Code)
    EndIf  
  Else
     Debug "lib not found"
     
  EndIf
Zuletzt geändert von Rings am 10.12.2010 14:33, insgesamt 1-mal geändert.
Rings hat geschrieben:ziert sich nich beim zitieren
Benutzeravatar
Rings
Beiträge: 971
Registriert: 29.08.2004 08:48

Re: Personalausweis - Lesegerät

Beitrag von Rings »

weitere Infos:

Die Karte hat 'sogenannte' 32 slots(Bänke) .
Das heisst man kann mit

Code: Alles auswählen

Code=OiReadFile(Slot,@ref0)
  
auf 32 Bänke zugreifen(geht sicherlich auch mit OiWriteFile...) .
Allerdings sind nicht alle belegt.
Belegt sind:
1: AES Key , $20 lang
2: Passwort, $20 lang
8: Leer , $20 lang
17: Datenspeicher $400
18: Datenspeicher (Keine Ahnung wie groß)

Alle Anderen sind zur Zeit nicht initialisiert.
Rings hat geschrieben:ziert sich nich beim zitieren
Benutzeravatar
R4z0r1989
Beiträge: 521
Registriert: 12.06.2005 18:06
Kontaktdaten:

Re: Personalausweis - Lesegerät

Beitrag von R4z0r1989 »

Kanns sein dass ich die DLL nicht benutzten kann wenn ich ein 64 bit system hab?

Code: Alles auswählen

If FileSize("oi32.dll") >= 0
  Debug "is doch da"
EndIf

If OpenLibrary(0, "oi32.dll")
   
    OiChangePassword.OiChangePassword= GetFunction(0, "OiChangePassword")
    OiInitCard.OiInitCard=GetFunction(0,"OiInitCard")
;   OiLogin.OiLogin=GetFunction(0,"OiLogin")
    OiReadFile.OiReadFile=GetFunction(0,"OiReadFile")
    OiResetPassword.OiResetPassword=GetFunction(0,"OiResetPassword")
    OiWriteFile.OiWriteFile=GetFunction(0,"OiWriteFile")
   
    Result=OiInitCard() ;initialisieren
    Debug Result
   
    ref2.CMemRef
    ref2\m_pData = AllocateMemory($400)
    ref2\m_nBufferLen = $400
    Code=OiReadFile($11,@ref2)
    Debug Code
    If Code=0
     
      Debug ref2\m_pData
      Debug PeekS(ref2\m_pData) ;hier kommt der Text !
     
     
      PokeB(ref2\m_pData,'P')
      ;wieder runterschreiben
     
     
      Code=OiWriteFile($11,@ref2)
     
    Else
      Debug CardError(Code)
    EndIf 
  Else
     Debug "lib not found"
     
  EndIf
gibt folgendes aus:

Code: Alles auswählen

is doch da
lib not found
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Personalausweis - Lesegerät

Beitrag von ts-soft »

R4z0r1989 hat geschrieben:Kanns sein dass ich die DLL nicht benutzten kann wenn ich ein 64 bit system hab?
Wenn es sich um einen Treiber handelt, dann nicht. Ansonsten natürlich nur in einer 32-Bit Anwendung.

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Rings
Beiträge: 971
Registriert: 29.08.2004 08:48

Re: Personalausweis - Lesegerät

Beitrag von Rings »

Ja, habt recht.
Die Fehlermeldung sollte richtig lauten:
"cannot load library"

Ja, du kannst mit einer 64 Bit Anwendung keine 32 Bit dll laden.

oi32.dll

obs da ne oi64.dll gibt weis ich nicht.
Rings hat geschrieben:ziert sich nich beim zitieren
D.J.Peters
Beiträge: 87
Registriert: 28.11.2010 13:07
Computerausstattung: P4 2x3.2GKz.1GB WIXP 32Bit NVIDEA GT240 1GB DDR3, AMD XP 1.8GHz Linux 32Bit NVIDEA GT240 TIi3200
Wohnort: Germany
Kontaktdaten:

Re: Personalausweis - Lesegerät

Beitrag von D.J.Peters »

Hallo Rings,
verrate mir doch bitte woher Du die NET Deklarationen hast ?

Ich habe mir den Krämpel mühselig zusammen "gebastelt" in dem ich die oi32.dll Disambliert habe
und auf Grund der jeweiligen Stackframes geschaut habe (unabhängig vom genauen Datentype) wieviele Parameter welche Funktion erwartet.

z.B. OiWriteFile(p1,p2)
Da kann ich unter anderem erkennen das zwei Parameter übergeben werden und vom ersten nur das low byte benutzt wird (SlotNumber)
was aber doch sehr sehr merkwürdig ist das am Ende aller Funktionen mit "retn" keine Parameter vom Stack genommen werden
und das ist normaler weise nur bei C Funktionen der Fall CDECL = der Aufrufer restauriert den Stack.

Code: Alles auswählen

################################################
 10006810                           OiWriteFile:
################################################
 10006810  55                          push ebp
 10006811  8BEC                        mov ebp,esp
 10006813  83E4F8                      and esp,FFFFFFF8h
 10006816  6AFF                        push FFFFFFFFh
 10006818  686B7A0410                  push L10047A6B
 1000681D  64A100000000                mov eax,fs:[00000000h]
 10006823  50                          push eax
 10006824  81EC18040000                sub esp,00000418h
 1000682A  A110CC0510                  mov eax,[L1005CC10]
 1000682F  33C4                        xor eax,esp
 10006831  89842410040000              mov [esp+00000410h],eax
 10006838  56                          push esi
 10006839  A110CC0510                  mov eax,[L1005CC10]
 1000683E  33C4                        xor eax,esp
 10006840  50                          push eax
 10006841  8D842420040000              lea eax,[esp+00000420h]
 10006848  64A300000000                mov fs:[00000000h],eax
 1000684E  8B750C                      mov esi,[ebp+0Ch]
 10006851  8D44240C                    lea eax,[esp+0Ch]
 10006855  50                          push eax
 10006856  E825150000                  call SUB_L10007D80
 1000685B  C744240C64F00410            mov dword ptr [esp+0Ch],L1004F064
 10006863  8A4D08                      mov cl,[ebp+08h]
 10006866  C7842428040000000000+       mov dword ptr [esp+00000428h],00000000h
 10006871  888C240C040000              mov [esp+0000040Ch],cl
 10006878  8D4C240C                    lea ecx,[esp+0Ch]
 1000687C  89B42410040000              mov [esp+00000410h],esi
 10006883  FF15B0F10410                call [L1004F1B0]
 10006889  C7842428040000FFFFFF+       mov dword ptr [esp+00000428h],FFFFFFFFh
 10006894  8D4C240C                    lea ecx,[esp+0Ch]
 10006898  8BF0                        mov esi,eax
 1000689A  C744240C64F00410            mov dword ptr [esp+0Ch],L1004F064
 100068A2  E819160000                  call SUB_L10007EC0
 100068A7  8BC6                        mov eax,esi
 100068A9  8B8C2420040000              mov ecx,[esp+00000420h]
 100068B0  64890D00000000              mov fs:[00000000h],ecx
 100068B7  59                          pop ecx
 100068B8  5E                          pop esi
 100068B9  8B8C2410040000              mov ecx,[esp+00000410h]
 100068C0  33CC                        xor ecx,esp
 100068C2  E826550200                  call SUB_L1002BDED
 100068C7  8BE5                        mov esp,ebp
 100068C9  5D                          pop ebp
 100068CA  C3                          retn
Grüsse Joshy

EDIT
Bist Du Dir bei "m_zSites.l" sicher ?
Könnte doch auch ein Pointer auf Pointers sein oder ein Array mit Pointers !

Was könnte der fehlende ErrorCode 9 sein, eine Idee ?

Code: Alles auswählen

Procedure.s ErrorString(ErrCode.l)
  Select ErrCode
  Case #OI_ERR_OK                : ProcedureReturn "$00_ERR_OK"
  Case #OI_ERR_USER_CANCEL       : ProcedureReturn "$01_ERR_USER_CANCEL"
  Case #OI_ERR_NO_READER         : ProcedureReturn "$02_ERR_NO_READER"
  Case #OI_ERR_ENETWORK          : ProcedureReturn "$03_ERR_ENETWORK"
  Case #OI_ERR_CARDLOCKED        : ProcedureReturn "$04_ERR_CARDLOCKED"
  Case #OI_ERR_NOT_REGISTED      : ProcedureReturn "$05_NOT_REGISTED"
  Case #OI_ERR_DEACTIVATE        : ProcedureReturn "$06_ERR_DEACTIVATE"
  Case #OI_ERR_WRONG_PIN         : ProcedureReturn "$07_ERR_WRONG_PIN"
  Case #OI_ERR_TIMEOUT_PIN       : ProcedureReturn "$08_ERR_TIMEOUT_PIN"
  Case #OI_ERR_PCSC_CONNECT      : ProcedureReturn "$0A_ERR_PCSC_CONNECT"
  Case #OI_ERR_PCSC_TRANSMIT     : ProcedureReturn "$0B_ERR_PCSC_TRANSMIT"
  Case #OI_ERR_SELECT_APP        : ProcedureReturn "$0C_ERR_SELECT_APP"
  Case #OI_ERR_CARD_AUTH         : ProcedureReturn "$0D_ERR_CARD_AUTH"
  Case #OI_ERR_CHANGE_KEY        : ProcedureReturn "$0E_ERR_CHANGE_KEY"
  Case #OI_ERR_CREATE_DATA_FILE  : ProcedureReturn "$0F_ERR_CREATE_DATA_FILE"
  Case #OI_ERR_READ_DATA_FILE    : ProcedureReturn "$10_ERR_READ_DATA_FILE"
  Case #OI_ERR_WRITE_DATA_FILE   : ProcedureReturn "$11_ERR_WRITE_DATA_FILE"
  Case #OI_ERR_PARAM             : ProcedureReturn "$12_ERR_PARAM"
  Case #OI_ERR_NOT_INIT          : ProcedureReturn "$13_ERR_NOT_INIT"
  Case #OI_ERR_READ_CARD         : ProcedureReturn "$14_ERR_READ_CARD"
  Case #OI_ERR_UNKNOWN           : ProcedureReturn "$3E8_ERR_UNKNOWN"
  Default                        : ProcedureReturn "UNKNOW_ERR_CODE " + str(code)
  EndSelect
EndProcedure
PS. meine vielen Fehler der Rechtschreibung auf dem Forum könnt Ihr gerne ignorieren.
Benutzeravatar
Rings
Beiträge: 971
Registriert: 29.08.2004 08:48

Re: Personalausweis - Lesegerät

Beitrag von Rings »

D.J.Peters hat geschrieben:Hallo Rings,
verrate mir doch bitte woher Du die NET Deklarationen hast ?

Ich habe mir den Krämpel mühselig zusammen "gebastelt" in dem ich die oi32.dll Disambliert habe
Der 'Kartentresor' ist ne -NET Anwendung,
also nimmt man den DotNetReflector.
Rings hat geschrieben:ziert sich nich beim zitieren
DarkDragon
Beiträge: 6267
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: Personalausweis - Lesegerät

Beitrag von DarkDragon »

Anscheinend bekommt man auch Informationen wenn man ReinerSCT eine E-Mail schreibt. :lol: Aber disassemblen geht wohl schneller.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Polarwolf.eu
Beiträge: 7
Registriert: 07.12.2010 17:55

Re: Personalausweis - Lesegerät

Beitrag von Polarwolf.eu »

Das Thema schein ja doch auf reges Interesse zu stoßen! :)

Den Perso werde ich natürlich nicht kaputt machen... aber.. naja. Bestimmt legt den mein kleiner Bruder zufällig in die Mikrowelle. ;D


Vielen Dank für den Code... werde mich jetzt weiter damit beschäftigen. Danke.
Benutzeravatar
KatSeiko
Beiträge: 367
Registriert: 19.07.2008 07:47

Re: Personalausweis - Lesegerät

Beitrag von KatSeiko »

ts-soft hat geschrieben:
Polarwolf.eu hat geschrieben:Also der RFID-Chip in meinem neuen Perso wird definitiv zerstört. :> (Kommt im März..)

Ich bin einfach skeptisch was die Sicherheit angeht...
Bild
Aber drann denken, der Ausweis gehört nicht Dir, es handelt sich also um vorsätzliche Sachbeschädigung :wink:
Stimmt zwar nicht so ganz (es muss sich dem Gesetz nach dir gehören, da sich ein Ausweisdokument "in deinem Besitz befinden" muss), aber nun ja. Das Teil ist selbst bei "beschädigtem" Chip noch gültig. Der Polizist muss halt selber tippen statt einfach die Karte "tippen zu lassen".

Hat eigentlich einer von euch mal darüber nachgedacht, dass es in Deutschland nicht Pflicht ist, einen Perso zu haben? Nur ein Ausweisdokument ist nötig. Das kann auch ein Reisepass sein, der in Fragen der Sicherheit bestimmt noch etwas anders behaftet ist.

Irgendwie mag ich da schon meine I-Card auf den Philippinen. Das Teil hat nen Barcode mit einer Unmenge an Informationen, aber es hat bestimmt noch für lange Zeit kein RFID.
Win7 Ultimate x64, PureBasic 5.11

There is no substitute..
BildBildBild
Antworten