ICQ Protokoll "OSCAR"
- HeX0R
- Beiträge: 3056
- Registriert: 10.09.2004 09:59
- Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3 - Kontaktdaten:
@DarkDragon:
Nur für den Fall, dass du irgendwann haareraufend einen Bug suchst, du weisst schon, dass deine InvertLong()-Procedure unvollständig ist ?
Nur für den Fall, dass du irgendwann haareraufend einen Bug suchst, du weisst schon, dass deine InvertLong()-Procedure unvollständig ist ?
{Home}.:|:.{Codes}.:|:.{Downloads}.:|:.{History Viewer Online}.:|:.{Bier spendieren}
-
DarkDragon
- Beiträge: 6291
- Registriert: 29.08.2004 08:37
- Computerausstattung: Hoffentlich bald keine mehr
- Kontaktdaten:
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.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 ?
[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).
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.
Hat sonst noch einer Ideen, bzw. Tipps o. Ä. ?
PB 4.30
Code: Alles auswählen
Macro Happy
;-)
EndMacro
Happy EndDer Code von DarkDragon sah echt super aus, leider funktionierte er bei mir nicht. Ich würde gerne übeprüfen, ob Login erfolgreich oder fehlgeschlagen....
gruß oNNy
http://www.onnsoft.de
http://www.onnsoft.de
- Falko
- Admin
- Beiträge: 3535
- Registriert: 29.08.2004 11:27
- Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit) - Kontaktdaten:
Vielleicht hilft diese Seite wegen der Bytes zu ICQ - OSCAR - Protokoll weiter
http://iserverd.khstu.ru/docum_ext/icqv5.html
Gruß Falko
http://iserverd.khstu.ru/docum_ext/icqv5.html
Gruß Falko
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
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
Ich nutze PureBasic 4.02 unter Linux und Windows.
Momentane Projekte:
Das geheimste aller geheimen Projekte... FPBC
Momentane Projekte:
Das geheimste aller geheimen Projekte... FPBC
-
DarkDragon
- Beiträge: 6291
- Registriert: 29.08.2004 08:37
- Computerausstattung: Hoffentlich bald keine mehr
- Kontaktdaten:
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:
[EDIT]
Alle die das Passwort gerade gesehen haben: Bitte vergessen!
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)
EndIfAlle die das Passwort gerade gesehen haben: Bitte vergessen!
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.

