Seite 2 von 3

Verfasst: 31.01.2006 10:14
von MVXA
> und bei der funktion XOrByte(), wobei er bei jeder Zeile hinschreibt, dies sei kein gültiger Operator.
Hast du die Inline Assembler Option aktiv?

Verfasst: 31.01.2006 10:19
von HeX0R
@DarkDragon:
Nur für den Fall, dass du irgendwann haareraufend einen Bug suchst, du weisst schon, dass deine InvertLong()-Procedure unvollständig ist ?

Verfasst: 31.01.2006 17:48
von DarkDragon
HeX0R hat geschrieben:@DarkDragon:
Nur für den Fall, dass du irgendwann haareraufend einen Bug suchst, du weisst schon, dass deine InvertLong()-Procedure unvollständig ist ?
Hab ich mir schon gedacht, das liegt daran, dass ich so gut wie nie diese shiftoperatoren benutze und es einfach von der InvertWort Procedure(von jemandem aus dem IRC) abgeschaut hab.

[EDIT]
Lösch einfach die RecSNAC prozedur, braucht man da sowieso gerade nicht(wollte es mal übersichtlicher machen, aber da HeXOr oder wer auch immer schon eine DLL dafür geschrieben hab brauch ich ja nichtmehr weiterarbeiten daran).

Verfasst: 31.01.2006 21:24
von AND51
Hat sonst noch einer Ideen, bzw. Tipps o. Ä. ?

Verfasst: 27.01.2007 19:17
von onny
Der Code von DarkDragon sah echt super aus, leider funktionierte er bei mir nicht. Ich würde gerne übeprüfen, ob Login erfolgreich oder fehlgeschlagen....

Verfasst: 28.01.2007 03:44
von Falko
Vielleicht hilft diese Seite wegen der Bytes zu ICQ - OSCAR - Protokoll weiter

http://iserverd.khstu.ru/docum_ext/icqv5.html

Gruß Falko

Verfasst: 28.01.2007 06:05
von MVXA
Ich danke dir :praise:. War schon immer auf der Suche nach irgend
welchen brauchbaren Quellen für das ICQ Protokoll.

Ist aber auch schon wieder total veraltet. Das Protokoll hat sich in letzter
Zeit sehr verändert. Man bräuchte Quellen die mindestens aus dem Jahr
2006 kommen.

Verfasst: 28.01.2007 10:15
von mknjc
Ich finde die Dokumentation auf http://iserverd1.khstu.ru/oscar/ sehr gut aber man sollte zusätzlich noch http://www.oilcan.org/oscar/ benutzen.

Leider sind meine Versuche mich mit dem ICQ Server zu verständigen im Mülleimer gelandet aber der Login ging schon.

Im Moment hab ich auch keine Zeit es nochmal nachzubauen. Das einzige was ich noch weiß ist das der Sichere Login (MD5 based authorization) nicht funktioniert da eine MD5 FUnktion benutzt wird die ich nicht verstehe.

Mfg mknjc

Verfasst: 02.02.2007 22:47
von onny
ist mir alles zu kompliziert :(

Verfasst: 03.02.2007 12:20
von DarkDragon
Mir ehrlich gesagt auch, ich hab bei den Families aufgegeben(Ich bin doch nicht plemm plemm und tipp 100 verschiedene families allein fürs login ein).

Ich hab meinen Code nochmals verändert vor ner Weile und bin soweit gekommen:

Code: Alles auswählen

;- Structures and constants
#TIMEOUT = 5000

Structure S_TLV
  Type.w
  Len.w
  StructureUnion
    TLV_Word.w
    *TLV_Data
  EndStructureUnion
EndStructure

Structure S_Family
  id.w
  version.w
EndStructure

Global NewList ICQ_Families.S_Family()

;- Misc. methods
Procedure XOrByte(sText.l, TextLen.l, Key.b)
  !MOV ecx, [p.v_TextLen]
  !MOV esi, [p.v_sText]
  !MOV edi, [p.v_sText]
  !CLD
  !l_cipher:
  !lodsb
  !XOR al, [p.v_Key]
  !stosb
  !LOOP l_cipher
  ;MOV straddr, edx
EndProcedure

Procedure.w InvertWord(Word.w)
  ProcedureReturn ((Word & $FF)<<8) | ((Word & $FF00)>>8)
EndProcedure

Procedure InvertLong(Long.l)
  !MOV   Eax, dword [p.v_Long]
  !BSWAP Eax
  ProcedureReturn
EndProcedure

Procedure RoastPassword(*Pass, Length, *RoastArray)
  Length-1
  For k=0 To Length
    char.l = PeekB(*Pass+k)
    mod.l = (k%16)
    key.b = PeekB(*RoastArray+mod)
    XOrByte(*Pass+k, 1, key)
  Next
EndProcedure

Procedure AttachTLVData(*Buffer, *BufferSize.LONG, Type.w, Len.w, *pData)
  *Buffer = ReAllocateMemory(*Buffer, *BufferSize\l+4+Len)
  
  If *Buffer
    PokeW(*Buffer+*BufferSize\l  , InvertWord(Type) )
    PokeW(*Buffer+*BufferSize\l+2, InvertWord(Len)  )
    CopyMemory(*pData, *Buffer+*BufferSize\l+4, Len )
    
    *BufferSize\l + (4 + Len)
  EndIf
  
  ProcedureReturn *Buffer
EndProcedure

Procedure AttachTLVWord(*Buffer, *BufferSize.LONG, Type.w, Word.w)
  *Buffer = ReAllocateMemory(*Buffer, *BufferSize\l+6)
  
  If *Buffer
    PokeW(*Buffer+*BufferSize\l  , InvertWord(Type) )
    PokeW(*Buffer+*BufferSize\l+2, InvertWord(2)    )
    PokeW(*Buffer+*BufferSize\l+4, Word )
    
    *BufferSize\l + 6
  EndIf
  
  ProcedureReturn *Buffer
EndProcedure

Procedure SendFLAP(ConnectionID, channel, seq, size, pData)
  *FLAP_SendingBuffer = AllocateMemory(size+6)
  PokeB(*FLAP_SendingBuffer   , $2A       )
  PokeB(*FLAP_SendingBuffer+1 , channel   )
  PokeW(*FLAP_SendingBuffer+2 , InvertWord(seq) )
  PokeW(*FLAP_SendingBuffer+4 , InvertWord(size))
  CopyMemory(pData, *FLAP_SendingBuffer+6, size)
  
  If CreateFile(0, "C:\TestICQ2.bin")
    WriteData(0, *FLAP_SendingBuffer, size+6)
    CloseFile(0)
  EndIf
  SendNetworkData(ConnectionID, *FLAP_SendingBuffer, size+6)
  
  FreeMemory(*FLAP_SendingBuffer)
EndProcedure

Procedure SendFLAPSNAC(ConnectionID, channel, seq, id, subid, flags, requestid, size, pData)
  *SNAC_SendingBuffer = AllocateMemory(size+10)
  PokeW(*SNAC_SendingBuffer   , id        )
  PokeW(*SNAC_SendingBuffer+2 , subid     )
  PokeW(*SNAC_SendingBuffer+4 , flags     )
  PokeL(*SNAC_SendingBuffer+6 , requestid )
  CopyMemory(pData, *SNAC_SendingBuffer+10, size)
  
  SendFLAP(ConnectionID, channel, seq, size+10, *SNAC_SendingBuffer)
  
  FreeMemory(*SNAC_SendingBuffer)
EndProcedure

Procedure ReceiveFlapHeader(Connection, *channel.BYTE, *seq.WORD, *len.WORD)
  t = ElapsedMilliseconds()
  While byte.b <> $2A
    If ElapsedMilliseconds()-t >= #TIMEOUT
      ProcedureReturn 0
    EndIf
    ReceiveNetworkData(Connection, @byte, 1)
    Delay(10)
  Wend
  Delay(10)
  *Buffer = AllocateMemory(5)
  ReceiveNetworkData(Connection, *Buffer, 5)
  If *channel
    *channel\b = PeekB(*Buffer)
  EndIf
  If *seq
    *seq\w = InvertWord(PeekW(*Buffer+1))
  EndIf
  If *len
    *len\w = InvertWord(PeekW(*Buffer+3))
  EndIf
  FreeMemory(*Buffer)
  
  ProcedureReturn 1
EndProcedure

Procedure RecTLVHeader(Connection, *TLV.S_TLV)
  ReceiveNetworkData(Connection, *TLV, 4)
  
  *TLV\Type = InvertWord(*TLV\Type)
  *TLV\Len  = InvertWord(*TLV\Len )
  
  ProcedureReturn *TLV
EndProcedure

Procedure RecSNACHeader(Connection, *family.WORD, *subtype.WORD, *flags.WORD, *reqid.LONG)
  t = ElapsedMilliseconds()
  While NetworkClientEvent(Connection) <> 2
    If ElapsedMilliseconds()-t >= #TIMEOUT
      ProcedureReturn 0
    EndIf
    Delay(10)
  Wend
  Delay(10)
  
  *Buffer = AllocateMemory(10)
  ReceiveNetworkData(Connection, *Buffer, 5)
  If *family
    *family\w   = InvertWord(PeekW(*Buffer))
  EndIf
  If *subtype
    *subtype\w  = InvertWord(PeekW(*Buffer+2))
  EndIf
  If *flags
    *flags\w    = InvertWord(PeekW(*Buffer+4))
  EndIf
  If *reqid
    *reqid\l    = InvertLong(PeekL(*Buffer+6))
  EndIf
  FreeMemory(*Buffer)
  
  ProcedureReturn 1
EndProcedure

Procedure RecDATA(Connection, Size.l)
  Cursor.l = 0
  RecSize.l = 0
  *Buffer = AllocateMemory(Size)
  
  If *Buffer
    t = ElapsedMilliseconds()
    While Cursor < Size
      If ElapsedMilliseconds()-t >= #TIMEOUT
        FreeMemory(*Buffer)
        ProcedureReturn 0
      EndIf
      RecSize = ReceiveNetworkData(Connection, *Buffer+Cursor, Size-Cursor)
      If RecSize > 0
        Cursor + RecSize
        t = ElapsedMilliseconds()
      EndIf
      Delay(1)
    Wend
  EndIf
  
  ProcedureReturn *Buffer
EndProcedure

;- Login
Procedure LoginStage2(ConnectionID)
  BOS.s = ""
  Port.l = 0
  CookieSize.l = 0
  TLV.S_TLV
  
  ReceiveFlapHeader(ConnectionID, @channel.b, 0, @len.w)
  
  recvDataSize = 0
  t = ElapsedMilliseconds()
  While recvDataSize < len
    If ElapsedMilliseconds()-t > #TIMEOUT
      CloseNetworkConnection(ConnectionID)
      ProcedureReturn 0
    EndIf
    
    RecTLVHeader(ConnectionID, @TLV)
    recvDataSize + TLV\Len + 4
    *pData = AllocateMemory(TLV\Len)
    ReceiveNetworkData(ConnectionID, *pData, TLV\Len)
    
    Select TLV\Type
      Case $0004
        BOS.s = PeekS(*pData)
        
        Port.l = Val(StringField(BOS, 2, ":"))
        BOS.s  = StringField(BOS, 1, ":")
        
      Case $0006
        *Cookie = AllocateMemory(TLV\Len)
        
        CopyMemory(*pData, *Cookie, TLV\Len)
        CookieSize = TLV\Len
    EndSelect
    FreeMemory(*pData)
  Wend
  
  CloseNetworkConnection(ConnectionID)
  
  Connection = OpenNetworkConnection(BOS, Port)
  If Connection
    
    ReceiveFlapHeader(Connection, @channel.b, 0, 0)
    
    *Buffer = 0
    Size.l  = 0
    
    *Buffer = AllocateMemory(4)
    
    ; version
    CopyMemory(?version, *Buffer, 4) : Size + 4
    
    AttachTLVData(*Buffer, @Size, $0006, CookieSize, *Cookie)
    
    SendFLAP(Connection, $01, $101F, Size, *Buffer)
    
    FreeMemory(*Buffer)
    
    If ReceiveFlapHeader(Connection, @channel.b, @seq.w, @len.w)
      
      If channel = $02
        
        If RecSNACHeader(Connection, @family.w, @subtype.w, @flags.w, @reqid.l)
          
          len - 10 ; len - sizeof(SNAC)
          If len > 0
            ; Receive the SNAC data...
            *Buffer = RecDATA(Connection, len)
            If *Buffer
              
              For k=0 To len-SizeOf(WORD)
                AddElement(ICQ_Families())
                ICQ_Families()\id = PeekW(*Buffer+k)
              Next k
              
              FreeMemory(*Buffer)
            EndIf ; *Buffer
          EndIf ; len > 0
          
        EndIf ; RecSNACHeader(Connection, @family.w, @subtype.w, @flags.w, @reqid.l)
        
      EndIf ; channel = $02
      
    EndIf ; ReceiveFlapHeader(Connection, @channel.b, @seq.w, @len.w)
    
  EndIf ; Connection
  
  FreeMemory(*Cookie)
  
  ProcedureReturn Connection
EndProcedure


;- Main methods

;** Login-Method
;* Simple login-request
ProcedureDLL ICQ_Login(Host.s, Port.l, UIN.s, Pass.s)
  ConnectionID = OpenNetworkConnection(Host, Port)
  If ConnectionID
    
    ReceiveFlapHeader(ConnectionID, @channel.b, 0, 0)
    
    If channel = 1
      
      Info.s = "ICQ Inc. - Product of ICQ (TM).2000b.4.65.1.3281.85"
      Distribution_Nr.l = $55000000
      
      Size.l  = 0
      *Buffer = AllocateMemory(4)
      
      ; version
      CopyMemory(?version, *Buffer, 4) : Size + 4
      
      ; UIN
      *Buffer = AttachTLVData(*Buffer, @Size, $0001, Len(UIN), @UIN)
      
      ; Roasted Password
      RoastPassword(@Pass, Len(Pass), ?roast_array)
      *Buffer = AttachTLVData(*Buffer, @Size, $0002, Len(Pass), @Pass)
      
      ; Client ID string
      *Buffer = AttachTLVData(*Buffer, @Size, $0003, Len(Info), @Info)
      
      ; Client ID number
      *Buffer = AttachTLVWord(*Buffer, @Size, $0016, $010A)
      
      ; Client mayor version
      *Buffer = AttachTLVWord(*Buffer, @Size, $0017, $0004)
      
      ; Client minor version
      *Buffer = AttachTLVWord(*Buffer, @Size, $0018, $0041)
      
      ; Client lesser version
      *Buffer = AttachTLVWord(*Buffer, @Size, $0019, $0001)
      
      ; Client build number
      *Buffer = AttachTLVWord(*Buffer, @Size, $001A, $0CD1)
      
      ; Distribution number
      *Buffer = AttachTLVData(*Buffer, @Size, $0014, 4, @Distribution_Nr)
      
      ; Client language
      *Buffer = AttachTLVData(*Buffer, @Size, $000F, 2, @"en")
      
      ; Client country
      *Buffer = AttachTLVData(*Buffer, @Size, $000E, 2, @"us")
      
      SendFLAP(ConnectionID, $01, $135A, Size, *Buffer)
      
      FreeMemory(*Buffer)
      
      Connection = LoginStage2(ConnectionID)
      
      ProcedureReturn Connection
      
    EndIf ; channel = 1
    
    CloseNetworkConnection(ConnectionID)
  EndIf ; ConnectionID
EndProcedure

ProcedureDLL ICQ_CloseConnection(Connection)
  CloseNetworkConnection(Connection)
EndProcedure


DataSection
  version:
    Data.b $00, $00, $00, $01
  
  roast_array:
    Data.b $F3, $26, $81, $C4, $39, $86, $DB, $92, $71, $A3, $B9, $E6, $53, $7A, $95, $7C
EndDataSection


InitNetwork()

Connection = ICQ_Login("login.icq.com", 5190, "777777", "password")

Delay(3000)

If Connection
  ICQ_CloseConnection(Connection)
EndIf
[EDIT]

Alle die das Passwort gerade gesehen haben: Bitte vergessen!