Verfasst: 31.01.2006 10:14
> und bei der funktion XOrByte(), wobei er bei jeder Zeile hinschreibt, dies sei kein gültiger Operator.
Hast du die Inline Assembler Option aktiv?
Hast du die Inline Assembler Option aktiv?
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 ?
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