Subversion Repositories Kolibri OS

Rev

Rev 1833 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1832 yogev_ezra 1
; <--- description --->
2
; compiler:     FASM 1.67.21
3
; name:         ICQ for Kolibri
4
; version:      0.01
5
; written by:   LV
6
; e-mail:       lv4evil@ya.ru
7
 
8
 
9
; <--- include all MeOS stuff --->
10
include "lang.inc"
1833 hidnplayr 11
include "../../../macros.inc"
1832 yogev_ezra 12
purge mov
13
;include "ASCL9/ascl.inc"
14
;include "debug.inc"
1834 yogev_ezra 15
include "EDITBOX.INC"
1832 yogev_ezra 16
 
17
; <--- start of MenuetOS application --->
18
MEOS_APP_START
19
 
20
;include "debug.inc"
21
include "2000.inc"
22
include "comp.inc"
23
 
24
use_edit_box procinfo,22,5
25
 
26
; <--- start of code --->
27
CODE
28
 
29
 
30
    ;mov eax, 40
31
    ;mov ebx, 47h
32
    ;int 40h
33
 
34
    call    loaduin
35
    call    draw_window 	   ; at first create and draw the window
36
 
37
    ;call    buttonbox
38
 
39
  wait_event:			   ; main cycle
40
    mov     eax, 23
41
    mov     ebx, 20
42
    int     0x40
43
 
44
    cmp     eax, 1		   ;   if event == 1
45
    je	    redraw		   ;     jump to redraw handler
46
    cmp     eax, 2		   ;   else if event == 2
47
    je	    key 		   ;     jump to key handler
48
    cmp     eax, 3		   ;   else if event == 3
49
    je	    button		   ;     jump to button handler
50
 
51
    ;
52
    ; Ждем данных
53
    ;
54
    mov     eax, 53
55
    mov     ebx, 2
56
    push    ecx
57
    mov     ecx, [socket]
58
    int     0x40
59
    pop     ecx
60
    cmp     eax, 0
61
    jnz     read_socket
62
 
63
    mouse_edit_box inputbox
64
    ;
65
    ; Если есть соединение с сервером, посылаем пакеты - подтвеждения каждые 60 с
66
    ;
67
    call    sendkeep
68
 
69
    jmp     wait_event		   ;   else return to the start of main cycle
70
 
71
 
72
  redraw:			   ; redraw event handler
73
    call    draw_window
74
    jmp     wait_event
75
 
76
 
77
  key:				   ; key event handler
78
    mov     eax, 2		   ;   get key code
79
    int     0x40
80
 
1833 hidnplayr 81
    cmp ah, 0Dh 		   ; Пробел - отправить сообщение
1832 yogev_ezra 82
    jz send
83
 
84
 
85
    key_edit_box inputbox
86
 
87
    jmp     wait_event
88
 
89
 
90
  button:			   ; button event handler
91
    mov     eax, 17		   ;   get button identifier
92
    int     0x40
93
 
94
    cmp     ah, 2
1833 hidnplayr 95
    jz	    connect
1832 yogev_ezra 96
 
97
    cmp     ah, 3
1833 hidnplayr 98
    jz	    disconnect
1832 yogev_ezra 99
 
100
    cmp     ah, 4
1833 hidnplayr 101
    jz	    send
1832 yogev_ezra 102
 
103
    ;
104
    ; Проверяем, не нажата ли кнопка в КЛ
105
    ; 100 
106
    cmp ah, UINS+100
107
    jnc @f
108
    cmp ah, 100
109
    jc @f
110
    ;
111
    ; Нажата
112
    ;
113
    sub ah, 100
114
    mov [curruser], ah
115
    ;
116
    ; Выводим строчку, кому
117
    ;
118
    shr eax, 8
119
    and eax, 000000FFh
120
    push eax
121
    mov eax, CUSER
122
    call strlen
123
    mov ecx, eax
124
    mov eax, CUSER
125
    mov ebx, buff
126
    call strcpy
127
    pop eax
128
    mov ebx, NAME_LEN
129
    imul ebx, eax
130
    lea eax, [names+ebx]
131
    mov [buff+ecx], ' ' ; Пробел
132
    lea ebx, [buff+ecx+1]
133
    mov ecx, NAME_LEN
134
    call strcpy
135
    mov eax, buff
136
    xor ebx, ebx
137
    call writemsg
138
 
139
 
140
 
141
 
142
  @@:
143
    cmp     ah, 1
144
    jne     wait_event		   ;   return if button id != 1
145
 
146
    or	    eax, -1		   ;   exit application
147
    int     0x40
148
 
149
 
150
  draw_window:
151
    mov     eax, 12		   ; start drawing
152
    mov     ebx, 1
153
    int     0x40
154
 
155
    mov     eax, 0		   ; create and draw the window
156
    mov     ebx, 100*65536+700	   ;   (window_cx)*65536+(window_sx)
157
    mov     ecx, 100*65536+500	   ;   (window_cy)*65536+(window_sy)
158
    mov     edx, 0x03ffffff	   ;   work area color & window type 3
159
;   mov     esi, 0                 ;   grab color (not used)
160
;   mov     edi, 0                 ;   frame color (not used)
161
    int     0x40
162
 
163
    mov     eax, 4		   ; window header
164
    mov     ebx, 8*65536+8	   ;   coordinates
165
    mov     ecx, 0x10ffffff	   ;   color & font N1
166
    mov     edx, header 	   ;   address of text
167
    mov     esi, header.size	   ;   length of text
168
    int     0x40
169
 
170
    draw_edit_box inputbox
171
 
172
    rect 10, 30, 500, 450, 0
173
 
174
    draw_button 600, 460, 60, 15, 2, 'CONNECT'
175
    ;draw_button 600, 460, 60, 15, 3, 'Disconnect'
176
    draw_button 530, 460, 60, 15, 4, 'SEND'
177
 
178
    call printbuff
179
    call    buttonbox
180
 
181
 
182
    mov     eax, 12		   ; finish drawing
183
    mov     ebx, 2
184
    int     0x40
185
 
186
  ret
187
 
188
;
189
;  Соединение
190
;
191
  connect:
192
  mov eax, ICQ_IP
193
  mov ebx, ICQ_PORT
194
  call srv_connect
195
  ;call srv_login
196
 
197
 
198
  jmp wait_event
199
 
200
 
201
;
202
;
203
;
204
  disconnect:
205
  mov ecx, [socket]
206
  call closesocket
207
 
208
  jmp wait_event
209
 
210
 
211
;
212
;
213
;
214
  send:
215
  ;
216
  ; Определяем, не сменен ли текущий УИН
217
  ;
218
  ; Для смены используется / в начале строки и номер уина
219
  ; по порядку. Если длина > 2 символов, считается, что передан
220
  ; сам уин - для отправки сообщений юзерам, которых нет в КЛ
221
  ;
222
    mov al, [inputbuff]
223
    cmp al, '/'
224
    jnz sd_message
225
    ; Смена уина
226
    ;mov al, [inputbuff+2]
227
    ;cmp al, 20h
228
    ;jz sd_use_kl
229
    mov al, [inputbuff+3]
1833 hidnplayr 230
    cmp al, 20h 	   ; Пробел
1832 yogev_ezra 231
    jz sd_use_kl
232
    ;
233
    ; Ищем первый пробел, им должен закончиться уин
234
    ;
235
    xor ecx, ecx
236
  sd_loop:
237
    mov al, [inputbuff+ecx]
238
    cmp al, 20h
239
    jz sd_space
240
    cmp al, 0
1833 hidnplayr 241
    jz	wait_event
1832 yogev_ezra 242
    inc ecx
243
    jmp sd_loop
244
 
245
  sd_space:
246
    ;
247
    ; Заменяем пробел на 0, отсылаем сообщение
248
    mov [inputbuff+ecx], byte 0
249
    lea ebx, [inputbuff+1]
250
    lea eax, [inputbuff+ecx+1]
251
    call sendmsg
252
    mov ebx, 0000FFh
253
    call writemsg
254
    jmp wait_event
255
 
256
 
257
 
258
  sd_use_kl:
259
    lea eax, [inputbuff+1]
260
    mov [inputbuff+3], byte 0
261
    call ascitoint
1833 hidnplayr 262
    lea eax, [eax-1]	; Т.к. в КЛ отсчет с 0
1832 yogev_ezra 263
    mov [curruser], al
264
 
265
 
266
  sd_message:
267
  ;
268
  ; Сообщение
269
    movzx eax, [curruser]
270
    mov ebx, UIN_LEN
271
    imul ebx, eax
272
    lea ebx, [uins+ebx]
273
    mov al, [inputbuff]
274
    cmp al, '/'
275
    jz @f
276
    mov eax, inputbuff
277
    jmp sd_send
278
  @@:
279
    ;mov al, [inputbuff+2]
280
    ;cmp al, ' '
281
    ;jz @f
282
    lea eax, [inputbuff+4]
283
    ;jmp sd_send
284
  ;@@: lea eax, [inputbuff+3]
285
 
286
  sd_send:
287
    call sendmsg
288
    mov ebx, 0000FFh
289
    call writemsg
290
 
291
 
292
  jmp wait_event
293
 
294
 
295
;
296
; Есть принятые данные
297
;
298
  read_socket:
299
    pushf
300
    pushad
301
    ;write_debug 'Some data in socket'
302
    ;
303
    ; Проверяем, не был ли получен заголовок отдельно от данных
304
    ; в предыдущем цикле
305
    ;
306
    cmp [hrf], 1
307
    jz rs_head_recived
308
 
309
 
310
    mov eax, 53
311
    mov ebx, 2
312
    mov ecx, [socket]
313
    int 40h
314
    cmp eax, 6 ; Flap head size
315
    jc r_end
316
    ;
317
    ; Принимаем заголовок
318
    ;
319
    xor edx, edx
320
 
321
    ;mov ecx, [socket]
322
   rs_loop:
323
    mov eax,  53
324
    mov ebx, 3
325
 
326
    int 40h
327
 
328
    mov [mbuff+edx], bl
329
    inc edx
330
    cmp edx, 6
331
 
332
    jnz rs_loop
333
    ;
334
    ; Заполняем заголовок
335
    ;
336
    ;xor eax, eax
337
 
338
    ;
339
    ; Заголовок принят!
340
    ;
341
    mov [hrf], 1
342
 
343
    mov bl, [mbuff]
344
    mov [rflap.bId], bl
345
 
346
    mov bl, [mbuff+1]
347
    mov [rflap.bCh], bl
348
 
349
    mov bh, [mbuff+2]
350
    mov bl, [mbuff+3]
351
    mov [rflap.wSn], bx
352
 
353
    mov bh, [mbuff+4]
354
    mov bl, [mbuff+5]
355
    mov [rflap.wDs], bx
356
 
357
    ;
358
    ; Принимаем данные
359
    ;
360
    ;xor edx, edx
361
    cmp [rflap.bId], 2Ah
362
    jnz rs_flap_error
363
    ;
364
    ;  Проверяем, получены ли данные
365
    ;
366
  rs_head_recived:
367
 
368
    mov eax, 53
369
    mov ebx, 2
370
    ;mov ecx, [socket]
371
    int 40h
372
    cmp ax, [rflap.wDs]   ; Размер данных
373
    jc r_end
374
    ;
375
    ;
376
    mov ax, [rflap.wDs]
377
    ;
378
    ; Проверяем размер данных
379
    ;
380
    cmp ax, MBUFF_SIZE+1
381
    jnc rs_big_flap
382
 
383
    xor esi, esi
384
    mov esi, eax
385
    xor edx, edx
386
 
387
    ;mov ecx, [socket]
388
 
389
   rs_data_loop:
390
    cmp edx, esi
391
    jz rs_data_end
392
 
393
    mov eax, 53
394
    mov ebx, 3
395
    int 40h
396
    mov [mbuff+edx], bl
397
    inc edx
398
    jmp rs_data_loop
399
 
400
    ;
401
    ; Данные приняты
402
    ;
403
    rs_data_end:
404
    mov [hrf], 0
1833 hidnplayr 405
    write_debug 'Some data received'
1832 yogev_ezra 406
    ;
407
    ;
408
    ;
409
    cmp [login], 0
410
    jz rs_login
411
    call main_loop
412
    jmp r_end
413
 
414
 
415
    rs_login:
416
    call srv_login
417
    ;write_debug 'Exited srv_login'
418
    jmp r_end
419
 
420
    rs_flap_error:
421
    write_debug 'Invalid Flap'
422
    ;
423
    ; FLAP.id неверный. нужно закрыть сокет
424
    ;
425
 
426
    mov ecx, [socket]
427
    ;call closesocket
428
    jmp r_end
429
 
430
    ;
431
    ;  Слишком большой пакет!
432
    ;
433
    rs_big_flap:
434
 
1833 hidnplayr 435
    write_debug 'Too BIG FLAP Received'
1832 yogev_ezra 436
    mov [hrf], 0
437
 
438
    mov ecx, [socket]
439
    mov ax, [rflap.wDs]
440
    xor esi, esi
441
    mov esi, eax
442
    xor edx, edx
443
 
444
   rs_data_loop2:
445
    cmp edx, esi
446
    jz r_end
447
 
448
    mov eax, 53
449
    mov ebx, 3
450
    int 40h
451
    ;mov [mbuff+edx], bl
452
    inc edx
453
    jmp rs_data_loop2
454
 
455
 
456
 
457
 
458
 
459
    r_end:
460
 
461
    popad
462
    popf
463
  jmp wait_event
464
 
465
; Соединение с сервером, возвращает в eax - хэндл сокета
466
; передаем в еах IP адрес сервера
467
; в ebx - порт
1833 hidnplayr 468
  srv_connect:
1832 yogev_ezra 469
    push ecx
470
    push edx
471
    push esi
472
    push edi
473
    push ebx
474
 
1833 hidnplayr 475
    mov esi, eax	     ; IP - в esi
1832 yogev_ezra 476
    ; find free port
477
    mov    ecx, 1000	     ; Определяем локальный порт, начинаем с 1000
478
 
479
    getlp:
480
    inc    ecx
481
    push   ecx
482
    mov    eax, 53
483
    mov    ebx, 9
484
    int    0x40
485
    pop    ecx
486
    cmp    eax, 0	     ; этот локальный порт используется?
487
    jz	   getlp	     ; да - продолжаем перебирать
488
    ;OK ecx = port number
489
    ;Open Socket
490
    mov eax, 53
491
    mov ebx, 5
492
    xor edx, edx
493
    ;mov dx, ICQ_PORT
494
    pop edx
495
    ;mov esi,ICQ_IP
496
    mov edi, 1;SOCKET_ACTIVE
497
 
498
    int 040h
499
    ;
500
    mov [socket], eax
501
    ;
502
    ; Ждем установки соедиения
503
    mov ecx, eax
504
  srv_loop:
505
 
506
    mov eax, 53
507
    mov ebx, 6
508
    int 40h
509
    cmp eax, TCB_ESTABLISHED
510
    jz fin
511
    cmp eax, 11
512
    jae @f
513
    ;
514
    mov eax, 5
515
    mov ebx, 50
516
    int 40h
517
    jmp srv_loop
518
 
519
 
520
 
521
 
522
    ;cmp eax,-1
523
    ;jnz fin
524
    ;delay 100
1833 hidnplayr 525
    write_debug 'CONNECTION FAILED'		      ;Подключение не удалось
1832 yogev_ezra 526
    jmp @f
527
    ;connrcted:
528
					  ;CONNECTED
529
 
530
    fin:
531
    write_debug 'Connected!!!!'
532
  @@:
533
    pop edi
534
    pop esi
535
    pop edx
536
    pop ecx
537
    ;pop ebx
538
  ret
539
 
540
;
541
; --> ecx socket handle
542
;
543
  buff db 1024 dup 0
1833 hidnplayr 544
  lbuff db 8 dup 0	 ; Для 1 пакета от сервера
1832 yogev_ezra 545
  srv_login:
546
    pushf
547
    push eax
548
    push ebx
549
    ;push ecx
550
    push edx
551
 
552
    ;
553
    ; Определяем тип полученных данных
554
    ;
555
    movzx eax, [rflap.bCh]
556
    cmp eax, 01
557
    jz s_new_connection
558
    cmp eax, 04
559
    jz s_cookie        ; cookie
560
    jmp l_flap_err
561
 
562
  s_new_connection:
563
    ;
564
    ; Проверяем полученный пакет
565
    ;
566
    movzx eax, [rflap.wDs]
567
    cmp eax, 4
568
    jnz l_len_err
569
    mov eax, dword [mbuff]
1833 hidnplayr 570
    cmp eax, 01000000h	    ; 00 00 00 01
1832 yogev_ezra 571
    jnz l_data_err
572
    ;
573
    ;Формируем пакет для соединения
574
    ;
575
    ;mov [flap.bId], FLAP_ID
576
    mov [flap.bCh], NEW_CONNECTION
577
 
578
    mov eax, 26
579
    mov ebx, 9
580
    int 40h
581
    mov [seq], ax
582
 
1833 hidnplayr 583
    mov [flap.wSn], ax	    ; Sequence number
1832 yogev_ezra 584
    ;mov [buff],0
585
    ;mov [buff+1],0
586
    ;mov [buff+2],0
587
    mov dword [buff], 0x01000000 ;login Protokol version  00 00 00 01
588
    ;mov[buff+4],0
589
    mov word [buff+4], 0x0100; TLV.TYPE = UIN     00 01
590
 
591
    mov eax, UIN
592
    call strlen
593
    mov [buff+6], ah
594
    mov [buff+7], al ; Length of UIN
595
    mov edx, eax
1833 hidnplayr 596
    add edx, 7		       ; в edx длина заполненного буфера
1832 yogev_ezra 597
 
1833 hidnplayr 598
    mov ecx, eax	      ;Длина строки
1832 yogev_ezra 599
 
600
    mov eax, UIN
1833 hidnplayr 601
    lea ebx, [buff+8]	      ; + размер данных в буфере + 1
1832 yogev_ezra 602
 
603
    call strcpy
604
 
605
 
606
    mov eax, PASS
607
    call roast
608
 
609
    mov [buff+edx+2], 2 ; TLV.TYPE - rosted password
610
    call strlen
611
    mov word [buff+edx+4], ax  ; Length of pass
612
 
613
    add edx, 4
614
    mov ebx, buff
1833 hidnplayr 615
    add ebx, edx	       ; назначение
616
    add edx, eax	       ; Сохраняем в EDX длину заполненного буфнра
617
    mov ecx, eax	       ; Длина строки
618
    mov eax, PASS	       ; Источник
1832 yogev_ezra 619
    inc ebx
620
    call strcpy
621
 
622
    mov [buff+edx+2], 3 ; TLV.TYPE - client id string
623
    mov eax, ID_STRING
624
    call strlen
625
    mov word [buff+edx+4], ax
626
 
627
    add edx, 4
628
    mov ecx, eax
629
    mov ebx, buff
630
    add ebx, edx
631
    add edx, eax
632
    inc ebx
633
    mov eax, ID_STRING
634
    call strcpy
635
 
636
    mov [buff+edx+2], 016h  ; TLV.TYPE - Client id
637
    mov [buff+edx+4], 2
638
    mov word [buff+edx+6], ID_NUM
639
    add edx, 6
640
 
641
    mov [buff+edx+2], 017h ; Client major version
642
    mov [buff+edx+4], 2
643
    mov [buff+edx+6], MAJOR
644
    add edx, 6
645
 
646
    mov [buff+edx+2], 018h ; Client minor version
647
    mov [buff+edx+4], 2
648
    mov [buff+edx+6], MINOR
649
    add edx, 6
650
 
651
    mov [buff+edx+2], 019h ; Client lesser version
652
    mov [buff+edx+4], 2
653
    mov [buff+edx+6], LESSER
654
    add edx, 6
655
 
656
    mov [buff+edx+2], 01Ah ; Client build number
657
    mov [buff+edx+4], 2
658
    mov word [buff+edx+6], BUILD
659
    add edx, 6
660
 
661
    mov [buff+edx+2], 014h ; Client distribution number
662
    mov [buff+edx+4], 4
663
    mov [buff+edx+8], DISTR
664
    add edx, 8
665
 
666
    mov [buff+edx+2], 0Fh ; Client language
667
    mov eax, CL_LANG
668
    call strlen
669
    mov word [buff+edx+4], ax
670
    add edx, 4
671
    mov ecx, eax
672
    mov ebx, buff
673
    add ebx, edx
674
    inc ebx
675
    add edx, eax
676
    mov eax, CL_LANG
677
    call strcpy
678
 
679
    mov [buff+edx+2], 0Fh ; Client language
680
    mov eax, CL_COUNTRY
681
    call strlen
682
    mov word [buff+edx+4], ax
683
    add edx, 4
684
    mov ecx, eax
685
    mov ebx, buff
686
    add ebx, edx
687
    inc ebx
688
    add edx, eax
689
    mov eax, CL_COUNTRY
690
    call strcpy
691
 
692
   ;write_debug 'Connect attemption'
693
   ; mov eax, ICQ_IP
694
   ; call srv_connect
695
   ; cmp eax, -1   ; Подключение не удалось
696
   ; jz l_fin
697
 
698
   ; mov ecx, eax
699
   ; mov eax, rflap
700
   ; mov ebx, lbuff
701
   ; call recvflap
702
 
703
  ;  cmp eax, -1
704
   ; jz l_flap_err
705
   ; cmp [rflap.bCh], 01 ; AUTH channel
706
   ; jnz l_ch_err
707
   ; cmp eax, 4
708
   ; jnz l_len_err
709
   ; cmp dword [lbuff+3], dword 1
710
   ; jnz l_data_err
711
 
712
    mov ecx, [socket]
713
    inc dx
714
    mov [flap.wDs], dx ; Data size
715
    mov eax, flap
716
    mov ebx, buff
717
    call sendflap
718
    cmp eax, 0
1833 hidnplayr 719
    jnz l_fin		; Неуспех
1832 yogev_ezra 720
    jmp l_end
721
 
722
 
723
    s_cookie:
724
    ;mov eax, rflap
725
    ;mov ebx, buff
726
    ;call recvflap
727
    ;cmp eax, -1
728
    ;jz l_flap_err
729
    ;cmp [rflap.bCh], 4
730
    ;jnz l_ch_err
731
 
732
    ;write_debug 'UIN'
733
    xor ebx, ebx
734
 
735
   uin_loop:
736
    xor eax, eax
737
    mov ax, word [mbuff+ebx]
1833 hidnplayr 738
    cmp ax, 0100h	       ;  00 01 TLV.Type UIN
739
    jz l_uin_ok 		 ;  Теперь сервер передает еще данные при соединении, а потом опять
740
    add ebx, 5			       ; тот же TLV 1
1832 yogev_ezra 741
    cmp ebx, 5
742
    ja l_tlvt_err
743
    jmp uin_loop
744
 
745
 
746
 
747
 
748
 
749
  l_uin_ok:
750
    mov eax, ebx
751
    xor ebx, ebx
1833 hidnplayr 752
    mov bl, [mbuff+eax+3]	    ;
753
    mov bh, [mbuff+eax+2]	    ;  Длина данных
1832 yogev_ezra 754
    ;
755
    ;  UIN Пока не проверяется
756
    ;
757
 
758
 
759
    lea ebx, [ebx+eax+4]
760
    mov ax, word [mbuff+ebx]
1833 hidnplayr 761
    cmp ax, 0500h	      ; 00 05 Bos address
1832 yogev_ezra 762
    jz l_all_ok
1833 hidnplayr 763
    cmp ax, 0400h	      ; UIN incorrect
1832 yogev_ezra 764
    jz l_uin_err
765
    cmp ax, 0800h
766
    jz l_pass_err
767
    jmp l_tlvt_err
768
    ;
769
    ; если неверный UIN/ пароль, получаем TLV.TYPE 4/8
770
    ;
771
 
772
    l_all_ok:
773
    xor ecx, ecx
1833 hidnplayr 774
    mov cl, [mbuff+ebx+3]	;length
775
    mov ch, [mbuff+ebx+2]	;
1832 yogev_ezra 776
 
777
    lea eax, [mbuff+ebx+4]
778
    push ebx
779
    mov ebx, bos_address
780
    call strcpy
781
    pop ebx
782
    add ebx, ecx
1833 hidnplayr 783
    lea ebx, [ebx+4]		    ; Размер заголовка
1832 yogev_ezra 784
    ;
785
    ; cookie
786
    ;
787
    ;write_debug 'Login Cookie'
788
 
789
    xor eax, eax
790
    mov ax, word [mbuff+ebx]
1833 hidnplayr 791
    cmp ax, 0600h		   ; TLV.Type cookie
1832 yogev_ezra 792
    jnz l_tlvt_err
1833 hidnplayr 793
    mov cl, [mbuff+ebx+3]	    ;
794
    mov ch, [mbuff+ebx+2]	    ; Length
1832 yogev_ezra 795
    mov [cookie_len], cx
796
    lea eax, [mbuff+ebx+4]
797
    push ebx
798
    mov ebx, srv_cookie
799
    call strcpy
800
    pop ebx
1833 hidnplayr 801
 
1832 yogev_ezra 802
    ;
803
    ;  Соединяемся с BOS
804
    ;
805
    ;call srv_disconnect
806
    mov ecx, [socket]
807
    ;write_debug 'Closing socket'
808
    ;call closesocket
809
    ;
810
    ;
811
    ;mov eax, 53
812
    ;mov ebx, 8
813
    ;int 40h
814
 
815
 
816
 
1833 hidnplayr 817
 
1832 yogev_ezra 818
    mov eax, bos_address
819
    call ip_parser
820
 
821
    call htonl
822
    data_debug 'BOS Address: ', eax
823
    data_debug 'BOS Port: ', ebx
1833 hidnplayr 824
    mov [bos_ip], eax
1832 yogev_ezra 825
    mov [bos_port], ebx
826
    call srv_connect
1833 hidnplayr 827
    mov [login], 1		  ; Соединение с основным сервером установлено
1832 yogev_ezra 828
    ;mov [socket], eax
1833 hidnplayr 829
 
1832 yogev_ezra 830
 
831
 
832
    jmp l_end
833
    ;
834
    ;
835
    ;
836
    l_pass_err:
837
    write_debug 'PASSWORD INVALID'
838
    jmp l_fin
839
 
840
    l_uin_err:
841
    write_debug 'UIN INVALID'
842
    jmp l_fin
843
 
844
    l_data_err:
845
    write_debug 'LOGIN DATA MISMATCH'
846
    jmp l_fin
847
 
848
    l_len_err:
1833 hidnplayr 849
    write_debug 'RECEIVED DATA LENGTH MISMATCH'
1832 yogev_ezra 850
    jmp l_fin
851
 
852
    l_tlvt_err:
853
    write_debug 'TLV TYPE MISMATCH'
854
    jmp l_fin
855
 
856
    l_ch_err:
857
    write_debug 'FLAP CHANNEL MISMATCH'
858
    jmp l_fin
859
 
860
    l_flap_err:
1833 hidnplayr 861
    write_debug 'FLAP ID MISMATCH / RECEIVE ERROR'
1832 yogev_ezra 862
 
863
    l_fin:
864
 
865
    ;
866
    ; Необходимо закрыть сокет
867
    ;
868
    ;call srv_disconnect
869
    ;call closesocket
870
    l_end:
871
    pop edx
872
    ;pop ecx
873
    pop ebx
874
    pop eax
1833 hidnplayr 875
    popf
876
  ret
1832 yogev_ezra 877
 
878
;
879
; Length of string
880
; input eax = offset string
881
; output eax = strlen
882
;
883
  strlen:
884
    push ebx
885
    push ecx
886
    pushf
887
    xor ebx, ebx
888
    xor ecx, ecx
889
 
890
    loop_s:
891
    mov cl, [eax+ebx]
892
    cmp ecx,0
1833 hidnplayr 893
    jz	nl
1832 yogev_ezra 894
    inc ebx
895
    jmp loop_s
896
 
897
    nl:
898
    mov eax, ebx
899
    popf
900
    pop ecx
901
    pop ebx
902
  ret
903
 
904
;
905
; Roasting password
906
; EAX = offset password
907
;
908
 
909
  roast:
910
    pushf
911
    push ecx
912
    push ebx
913
 
914
    xor ecx, ecx
915
    xor ebx, ebx
916
 
917
    loop_r:
918
    mov bl, [eax+ecx] ;Символ из массива пароля
1833 hidnplayr 919
    cmp bl, 0	      ;Конец строки
1832 yogev_ezra 920
    jz r_fin
921
 
922
    xor bl, [ROASTING_ARRAY+ecx]
923
    mov [eax+ecx], bl
924
    inc ecx
925
    jmp loop_r
926
 
927
    r_fin:
928
    pop ebx
929
    pop ecx
930
    popf
931
  ret
932
 
933
 
934
;
935
;Copy string of bytes
936
;В EAX = адрес исходной строки
937
;В EBX = адрес назначения
938
;В ECX = длина строки
939
;
940
  strcpy:
941
    pushf
942
    push esi
943
    push edi
944
    push ecx
945
 
946
    cld      ;Обрабатываем строку от начала к концу
947
    mov esi, eax
948
    mov edi, ebx
949
 
950
    rep movsb
951
 
952
    pop ecx
953
    pop edi
954
    pop esi
955
    popf
956
  ret
957
 
958
 
959
;
960
; Заполняет буфер, по адресу в ebx
961
; данными, по адресу eax, в
962
; cx  - Тип TLV
963
; dx  - длина данных
964
;
965
;
966
 
967
  tlvstr:
968
    ;pushf
969
    push edx
970
    push ecx
971
    push ebx
972
 
973
    mov [ebx], ch     ; Type
974
    mov [ebx+1], cl
975
 
976
    mov [ebx+2], dh   ; Length
977
    mov [ebx+3], dl
978
 
979
    lea ebx, [ebx+4]
980
    ; EBX = offset of destination
981
    mov ecx, edx
982
 
983
    call strcpy
984
 
985
    pop ebx
986
    pop ecx
987
    pop edx
988
    ;popf
989
  ret
990
 
991
;
992
; eax - указатель на FLAP_head
993
; ebx - указатель на массив, заполненный данными
994
; ecx - хендл сокета
995
;
996
; В eax возвращает результат записи в сокет
997
;
998
  sendflap:
999
    pushf
1000
    push edx
1001
    ;push ecx
1002
    push esi
1003
    push ebx
1004
    push ecx
1005
 
1006
    xor edx, edx
1007
 
1833 hidnplayr 1008
    mov dl, [eax]	   ; ID byte
1832 yogev_ezra 1009
    mov [sbuff], dl
1010
 
1833 hidnplayr 1011
    mov dl, [eax+1]	   ; FLAP channel
1832 yogev_ezra 1012
    mov [sbuff+1], dl
1013
 
1833 hidnplayr 1014
    mov dl, [eax+2]	   ; FLAP datagramm seq number
1015
    mov [sbuff+3], dl	   ; меняем местами байты для передачи по сети
1832 yogev_ezra 1016
    mov dl, [eax+3]
1017
    mov [sbuff+2], dl
1018
 
1833 hidnplayr 1019
    mov dl, [eax+4]	   ; FLAP data size
1832 yogev_ezra 1020
    mov [sbuff+5], dl
1021
    mov dl, [eax+5]
1022
    mov [sbuff+4], dl
1023
    mov dx, word [eax+4]
1024
 
1833 hidnplayr 1025
    xchg ecx, edx	    ; ecx - size edx - handle
1026
    mov eax, ebx	    ; data
1027
    mov ebx, sbuff	    ; dest
1028
    add ebx, 6		    ; + header size
1832 yogev_ezra 1029
    call strcpy
1030
 
1833 hidnplayr 1031
    xchg ecx, edx	    ; ecx - handle, edx - data size
1832 yogev_ezra 1032
 
1033
    s_wait:
1833 hidnplayr 1034
    mov eax, 53 	    ; Проверяем состояние сокета. Если соедиение
1035
    mov ebx, 6		    ; установлено - посылаем буфер, если сокет закрыт, уходим
1832 yogev_ezra 1036
    int 40h
1037
    cmp eax, TCB_ESTABLISHED ; установлено
1038
    jz s_est
1039
    cmp eax, TCB_CLOSED
1040
    jz s_fin
1833 hidnplayr 1041
    cmp eax, 12 	   ;  У меня такое было, когда соединение устанавливалось с пустотой :-)
1042
    jnc s_fin		   ;
1832 yogev_ezra 1043
 
1044
 
1045
    mov eax, 5
1046
    mov ebx, 1
1833 hidnplayr 1047
    int 40h		   ; Ждем
1832 yogev_ezra 1048
    jmp s_wait
1049
 
1050
 
1051
    s_est:
1052
    mov eax, 53
1833 hidnplayr 1053
    mov ebx, 7		   ; писать в сокет
1832 yogev_ezra 1054
    ;xchg ecx, edx          ; ecx - handle, edx - data length
1833 hidnplayr 1055
    add edx, 6		   ; + size of header
1056
    mov esi, sbuff	   ; data
1832 yogev_ezra 1057
    int 40h
1058
 
1059
    s_fin:
1060
    pop ecx
1061
    pop ebx
1062
    pop esi
1063
    ;pop ecx
1064
    pop edx
1065
    popf
1066
  ret
1067
 
1068
;
1069
; Принимает пакет из сокета
1070
; eax - указатель на FLAP_head
1071
; ebx - указатель на массив
1072
; ecx - хендл сокета
1073
; Возвращает в eax количество принятых байт в массиве
1074
;
1075
;  recvflap:
1076
;    pushf
1077
;
1078
;    ;push eax
1079
;    push ebx
1080
;    push esi
1081
;    push edi
1082
;    push edx
1083
;    mov esi, eax
1084
;    mov edi, ebx
1085
;
1086
;    r_fail:
1087
;    mov eax, 53         ;  Опрашивааем сокет
1088
;    mov ebx, 2          ;  в eax количество полученных байт
1089
;    int 40h             ;
1090
;    cmp eax, 6          ;  буфер не пустой
1091
;    jnc r_ok
1092
;
1093
;    mov eax, 53         ;  Получаем состояние сокета
1094
;    mov ebx, 6          ;
1095
;    int 40h             ;
1096
;
1097
;    cmp eax, TCB_CLOSED ; закрыт - уходим
1098
;    jz r_err
1099
;
1100
;
1101
;   ;mov eax, 5         ; ждем
1102
;    ;mov ebx, 1
1103
;    ;int 40h
1104
;    ; уходим
1105
;
1106
;    ;jmp r_fail
1107
;    jmp rf_fin
1108
;
1109
;    r_ok:               ; В буфере данные
1110
;
1111
;    mov eax, 53
1112
;    mov ebx, 3
1113
;    int 40h
1114
;    mov [esi], bl       ; flap.bId
1115
;    cmp bl, FLAP_ID
1116
;    jnz r_err
1117
;
1118
;    mov eax, 53
1119
;    mov ebx, 3
1120
;    int 40h
1121
;    mov [esi+1], bl   ; flap.bCh
1122
;
1123
;    mov eax, 53
1124
;    mov ebx, 3
1125
;    int 40h
1126
;    mov [esi+3], bl   ; flap.wSn старший байт
1127
;
1128
;    mov eax, 53
1129
;    mov ebx, 3
1130
;    int 40h
1131
;    mov [esi+2], bl   ; flap.wSn младший байт
1132
;
1133
;    mov eax, 53
1134
;    mov ebx, 3
1135
;    int 40h
1136
;    mov [esi+5], bl   ; flap.wDs старший байт
1137
;
1138
;    mov eax, 53
1139
;    mov ebx, 3
1140
;    int 40h
1141
;    mov [esi+4], bl   ; flap.wDs младший байт
1142
;
1143
;    r_check:
1144
;    mov eax, 53       ; Проверяем число полученных байт
1145
;    mov eax, 2
1146
;    int 40h
1147
;
1148
;    xor ebx, ebx
1149
;    mov bx, word [esi+4] ; flap.wDs
1150
;    cmp eax, ebx
1151
;    jnc r_drr           ;>=
1152
;
1153
;    mov eax, 68           ; wait
1154
;    mov ebx, 1
1155
;    int 40h
1156
;    jmp r_check
1157
;
1158
;    r_drr:            ; ready for data  recive
1159
;
1160
;
1161
;    xor edx, edx
1162
;    mov dx, word [esi+4] ; flap.wDs
1163
;    xor esi, esi
1164
;
1165
;    rf_loop:
1166
;    mov eax, 53
1167
;    mov ebx, 3
1168
;    int 40h
1169
;    mov [edi+esi], bl
1170
;    inc esi
1171
;    cmp esi, edx
1172
;    jnz rf_loop
1173
;    mov eax, edx
1174
;    jmp rf_fin
1175
;
1176
;    r_err:
1177
;    ;pop ebx
1178
;    ;pop eax
1179
;    mov eax, -1
1180
;    jmp rf_fin
1181
;
1182
;
1183
;    rf_fin:
1184
;    pop edx
1185
;    pop edi
1186
;    pop esi
1187
;    pop ebx
1188
;    ;pop eax
1189
;    popf
1190
;  ret
1191
 
1192
;
1193
; eax - указатель на буфер
1194
; ebx - значение, которым необходимо затолнить. Используется только bl
1195
; ecx - размер
1196
;
1197
 
1198
  memset:
1199
    pushf
1200
    push edi
1201
    push eax
1202
    push ebx
1203
    push ecx
1204
 
1205
    cld
1206
    mov edi, eax
1207
    mov eax, ebx
1208
    rep stosb
1209
 
1210
    pop ecx
1211
    pop ebx
1212
    pop eax
1213
    pop edi
1214
    popf
1215
  ret
1216
 
1217
;
1218
; Парсим TLV
1219
; <-- в eax адрес TLV
1220
; <-- в ebx адрес буфера, который нужно заполнить
1221
; --> в ebx длина полученных данных
1222
; --> в eax тип TLV
1223
;
1224
 
1225
  tlvpar:
1226
    pushf
1227
    ;push esi
1228
    ;push edi
1229
    push ecx
1230
    xor ecx, ecx
1231
 
1232
    mov cl, [eax+3]  ;TLV.Length
1233
    mov ch, [eax+2]
1234
    call strcpy
1235
 
1236
    xor eax, eax
1237
    mov al, [ebx+1]  ;TLV.Type
1238
    mov ah, [ebx]
1239
    mov ebx, ecx
1240
 
1241
 
1242
    pop ecx
1243
    ;pop edi
1244
    ;pop esi
1245
    popf
1246
  ret
1247
 
1248
;
1249
;  <-- ECX - хендл сокета, который нужно закрыть
1250
;  --> ECX - Результат (Ненадежно)
1251
;
1252
  closesocket:
1253
    push eax
1254
    push ebx
1255
 
1256
    mov eax, 53
1257
    mov ebx, 8
1258
    int 40h
1259
 
1260
    mov ecx, eax
1261
 
1262
    pop ebx
1263
    pop eax
1264
  ret
1265
 
1266
;
1267
; ecx <-- хендл сокета
1268
;
1269
;
1270
 
1271
  srv_disconnect:
1272
    pushf
1273
    push eax
1274
    push ebx
1275
    mov [flap.bId], FLAP_ID
1833 hidnplayr 1276
    mov [flap.bCh], 4	   ;Disconnect
1832 yogev_ezra 1277
    xor eax, eax
1278
    mov ax, [seq]
1279
    mov [flap.wSn], ax
1280
    mov [flap.wDs], 0
1281
    mov eax, flap
1282
    mov ebx, buff
1283
    call sendflap
1284
 
1285
 
1286
    pop ebx
1287
    pop eax
1288
    popf
1289
  ret
1290
 
1291
;
1292
; <-- eax [bos_address]
1293
; --> eax = IP ADDRESS
1294
; --> ebx = port number
1295
;
1296
par_buff db 9 dup 0
1297
 
1298
  ip_parser:
1299
    pushf
1300
    push ecx
1301
    push edx
1302
    push esi
1303
    push edi
1304
 
1305
    xor ecx, ecx
1306
    ;xor eax, eax
1307
    xor ebx, ebx
1308
    xor edx, edx
1309
    xor esi, esi
1310
    xor edi, edi
1311
 
1312
    ip_loop:
1313
    xor eax, eax
1314
    ;xor edx, edx
1315
    mov al, [bos_address+ecx]
1316
    cmp al, '.'
1317
    jz ip_dot
1318
 
1319
    cmp al, 0
1320
    jz ip_end_str
1321
 
1322
    cmp al, ':'
1323
    jz ip_colon
1324
 
1325
    ;sub al, 30h
1326
    ;cmp al, 9
1327
    ;ja ip_err        ; Не цифра
1328
 
1329
    mov [par_buff+edx], al
1330
    inc ecx
1331
    inc edx
1332
    jmp ip_loop
1333
 
1334
    ip_dot:
1335
    ;xor eax, eax
1336
    mov [par_buff+edx], 0 ; Конец строки
1337
    mov eax, par_buff
1338
    call ascitoint
1339
 
1340
    ;data_debug 'Debug eax: ', eax
1341
 
1833 hidnplayr 1342
    cmp ecx, 0	     ; Не может начинаться с точки
1832 yogev_ezra 1343
    jz ip_err
1833 hidnplayr 1344
    shl esi, 8	     ; Сдвигаем предыдущий байт
1832 yogev_ezra 1345
    add esi, eax
1346
    inc ecx
1347
    xor edx, edx     ; Счетчик буфера = 0
1348
    jmp ip_loop
1349
 
1350
 
1833 hidnplayr 1351
    ip_colon:	      ; : В строке адреса
1352
    inc edi	      ; Было :
1832 yogev_ezra 1353
    jmp ip_dot
1354
 
1355
    ip_end_str:
1356
    cmp edi, 1
1357
    jz @f
1833 hidnplayr 1358
			  ; : Не было
1832 yogev_ezra 1359
    mov [par_buff+edx], 0 ; Конец строки
1360
    mov eax, par_buff
1361
    call ascitoint
1833 hidnplayr 1362
    shl esi, 8	     ; Сдвигаем предыдущий байт
1832 yogev_ezra 1363
    add esi, eax
1364
    ;mov eax, esi     ; IP в 16 ричной форме
1365
    ;xor ebx, ebx    ; Номера порта нет
1366
    jmp ip_end
1367
 
1833 hidnplayr 1368
    @@: 			   ; Было :
1369
    mov [par_buff+edx], 0
1832 yogev_ezra 1370
    mov eax, par_buff
1371
    call ascitoint
1372
    mov ebx, eax
1373
    jmp ip_end
1374
 
1375
    ip_err:
1376
    xor esi, esi
1377
 
1378
    ip_end:
1379
    mov eax, esi
1380
 
1381
    pop edi
1382
    pop esi
1383
    pop edx
1384
    pop ecx
1385
    popf
1386
  ret
1387
 
1388
;
1389
; <-- eax указатель на asci
1390
; --> eax int
1391
;
1392
  ascitoint:
1393
    pushf
1394
    push ebx
1395
    push ecx
1396
    push edx
1397
    push esi
1398
    push edi
1399
 
1400
    xor ebx, ebx
1401
    xor ecx, ecx
1402
    xor edx, edx
1403
    ;xor esi, esi
1404
    xor edi, edi
1405
 
1406
    ati_loop:
1407
    mov bl, [eax+ecx]
1833 hidnplayr 1408
    cmp bl, 0	      ; Конец строки
1832 yogev_ezra 1409
    jz ati_str_end
1410
    cmp bl, 39h
1833 hidnplayr 1411
    ja ati_err	      ; Не цифра
1832 yogev_ezra 1412
    cmp bl, 30h
1413
    jb ati_err
1414
 
1415
    inc ecx
1416
    jmp ati_loop
1417
 
1418
    ati_str_end:      ; В ecx длина строки
1419
    ;dec ecx           ; Установим на последний символ
1420
    add eax, ecx      ; Указатель на строку + Длина строки
1421
    dec eax
1422
 
1423
    ati_loop2:
1424
    cmp edx, ecx
1425
    jz ati_all
1426
    push eax
1833 hidnplayr 1427
    sub eax, edx	      ; Вычесть счетчик
1832 yogev_ezra 1428
    movzx ebx, byte [eax]     ; В bl символ
1429
    ;pop eax
1430
    sub bl, 30h       ; Вычисляем 10тичную цифру
1431
 
1432
    ;push eax
1433
    mov eax, ebx     ; В eax - цифра
1434
    mov ebx, 10      ; Множитель
1435
 
1436
    xor esi, esi
1437
 
1438
    ati_mul:
1439
 
1440
    cmp esi, edx     ; Умножаем на 10 n раз
1441
    jz ati_mul_end
1442
    ;push eax
1443
    ;mov eax, ebx
1444
    imul eax, ebx
1445
    ;mov ebx, eax
1446
    ;pop eax
1447
    inc esi
1448
    jmp ati_mul
1449
 
1450
 
1451
    ati_mul_end:
1452
    mov ebx, eax    ; В ebx вычисленное число
1453
    pop eax
1454
 
1455
    add edi, ebx
1456
    inc edx
1457
    jmp ati_loop2
1458
 
1459
    ati_all:
1460
    mov eax, edi
1461
    jmp ati_end
1462
 
1463
    ati_err:
1464
 
1465
    ;ati_str_end:
1466
    xor eax, eax
1467
 
1468
    ati_end:
1469
    pop edi
1470
    pop esi
1471
    pop edx
1472
    pop ecx
1473
    pop ebx
1474
    popf
1475
  ret
1476
 
1477
;
1478
;
1479
; <-- ecx хендл сокета
1480
; <-- eax указатель на структуру SNAC_head
1481
; <-- ebx указатель на данные
1482
; <-- edx размер данных
1483
; --> eax результат записи в сокет
1484
;
1485
 
1486
snac_buff db 1024 dup 0
1487
 
1488
  sendsnac:
1489
    pushf
1490
    push esi
1491
    push edi
1492
    push ebx
1493
    push edx
1494
    ;xor ebx, ebx
1833 hidnplayr 1495
    mov esi, ecx	    ; хендл сокета
1496
    mov edi, ebx	    ; Указатель на данные
1832 yogev_ezra 1497
 
1498
    xor ebx, ebx
1833 hidnplayr 1499
    mov bl, [eax]	    ;
1832 yogev_ezra 1500
    mov [snac_buff+1], bl   ; Family ID
1833 hidnplayr 1501
    mov bl, [eax+1]	    ; Конвертируется в BigEndian
1832 yogev_ezra 1502
    mov [snac_buff], bl     ;
1503
 
1833 hidnplayr 1504
    mov bl, [eax+2]	    ;
1832 yogev_ezra 1505
    mov [snac_buff+3], bl   ; Subtype ID
1833 hidnplayr 1506
    mov bl, [eax+3]	    ;
1832 yogev_ezra 1507
    mov [snac_buff+2], bl   ;
1508
 
1833 hidnplayr 1509
    mov bl, [eax+4]	    ;
1832 yogev_ezra 1510
    mov [snac_buff+5], bl   ;
1833 hidnplayr 1511
    mov bl, [eax+5]	    ; Flags
1832 yogev_ezra 1512
    mov [snac_buff+4], bl   ;
1513
 
1833 hidnplayr 1514
    mov bl, [eax+6]	    ;
1832 yogev_ezra 1515
    mov [snac_buff+9], bl   ;
1833 hidnplayr 1516
    mov bl, [eax+7]	    ;
1832 yogev_ezra 1517
    mov [snac_buff+8], bl   ;
1833 hidnplayr 1518
    mov bl, [eax+8]	    ; Reqest ID
1832 yogev_ezra 1519
    mov [snac_buff+7], bl   ;
1833 hidnplayr 1520
    mov bl, [eax+9]	    ;
1832 yogev_ezra 1521
    mov [snac_buff+6], bl   ;
1522
 
1833 hidnplayr 1523
    lea ebx, [snac_buff+10]
1832 yogev_ezra 1524
 
1833 hidnplayr 1525
    mov eax, edi	    ; Указатель на данные
1832 yogev_ezra 1526
    ;add ebx, 10             ; + размер заголовка SNAC
1833 hidnplayr 1527
    mov ecx, edx	    ; размер данных
1832 yogev_ezra 1528
    call strcpy
1529
 
1530
 
1833 hidnplayr 1531
    mov ecx, esi	    ; Хендл сокета
1832 yogev_ezra 1532
    mov [flap.bId], FLAP_ID
1833 hidnplayr 1533
    mov [flap.bCh], 2	    ; Канал для посылки SNAC
1832 yogev_ezra 1534
    xor ebx, ebx
1833 hidnplayr 1535
    inc [seq]		    ; seq Увеличивается на 1 при каждой посылке
1832 yogev_ezra 1536
    mov bx, [seq]
1537
    mov [flap.wSn], bx
1833 hidnplayr 1538
    add edx, 10 	    ; размер данных + размер заголовка SNAC
1832 yogev_ezra 1539
    mov [flap.wDs], dx
1540
    mov eax, flap
1541
    mov ebx, snac_buff
1542
    call sendflap
1543
 
1544
    pop edx
1545
    pop ebx
1546
    pop edi
1547
    pop esi
1548
    popf
1549
  ret
1550
 
1551
 
1552
 
1553
; Обработка всех пактов, приходящих от сервера
1554
; ECX <-- Хендл сокета
1555
;
1556
;
1557
;
1558
;
1559
;
1560
  main_loop:
1561
    pushf
1562
    ;push eax
1563
    ;push ebx
1564
    ;push edx
1565
    pushad
1566
 
1567
    mov ecx, [socket]
1568
    ;
1569
    ;  ждем пакет
1570
    ;
1571
  ;m_loop:
1572
    ;mov eax, 53
1573
    ;mov ebx, 2
1574
    ;int 40h
1575
    ;cmp eax, 6       ; размер заголоака FLAP
1576
    ;jnc recived      ; >=
1577
    ;
1578
    ; Уходим
1579
    ;
1580
    ;jmp m_fin
1581
    ;mov eax, 5
1582
    ;mov ebx, 5
1583
    ;int 40h
1584
    ;jmp m_loop
1585
    ;
1586
    ;  есть пакет
1587
    ;
1588
  ;recived:
1589
    ;mov eax, rflap
1590
    ;mov ebx, rbuff
1591
    ;call recvflap
1592
    ;
1593
    ; Определяем тип принятого FLAP
1594
    ;
1595
    xor ebx, ebx
1596
    mov bl, [rflap.bCh]
1833 hidnplayr 1597
    cmp bl, 1		     ; Установка соединения
1598
    jz	m_login
1832 yogev_ezra 1599
    cmp bl, 2
1833 hidnplayr 1600
    jz m_snac		     ; Получен SNAC
1832 yogev_ezra 1601
    cmp bl, 3
1833 hidnplayr 1602
    jz m_flap_err	     ; FLAP-level error
1832 yogev_ezra 1603
    cmp bl, 4
1833 hidnplayr 1604
    jz m_close_conn	     ; Закрытие соединения
1832 yogev_ezra 1605
    cmp bl, 5
1833 hidnplayr 1606
    jz m_keep_alive	     ;
1832 yogev_ezra 1607
    ;
1608
    ; Обработка рассоединения
1609
    ;
1610
  m_close_conn:
1834 yogev_ezra 1611
    write_debug 'Another Computer is Using YOUR UIN!'
1832 yogev_ezra 1612
    call srv_disconnect
1613
    call closesocket
1614
    jmp m_fin
1615
    ;
1616
    ; обработка соединения
1617
    ;
1618
  m_login:
1619
    ;
1620
    ; проверяем версию протокола
1621
    ;
1622
    xor eax, eax
1623
    mov al, [mbuff+3]
1624
    cmp eax, 1
1833 hidnplayr 1625
    jnz m_login_other	 ; Не подходит
1832 yogev_ezra 1626
 
1627
 
1628
    ;
1629
    ; генерируем случайный seq
1630
    ; Для этого берем время, прошедшее с момента запуска системы
1631
    ;
1632
    mov eax, 26
1633
    mov ebx, 9
1634
    int 40h
1635
    mov [seq], ax
1636
    ;
1637
    ; Отдаем серверу cookie
1638
    ;
1639
    mov [flap.bCh], 1
1640
    mov [flap.wSn], ax
1641
    xor eax, eax
1642
    mov ax, [cookie_len]
1833 hidnplayr 1643
    add eax, 8		  ; TLV len + protocol version len
1832 yogev_ezra 1644
    mov [flap.wDs], ax
1645
    mov dword [buff], 01000000h  ; 00 00 00 01 Номер протокола
1833 hidnplayr 1646
    mov word [buff+4], 0600h	 ; 00 06   TLV.Type
1832 yogev_ezra 1647
 
1648
    mov ax, [cookie_len]
1833 hidnplayr 1649
    mov [buff+6], ah		 ;
1650
    mov [buff+7], al		 ; TLV.Length
1832 yogev_ezra 1651
 
1833 hidnplayr 1652
    mov edx, ecx		 ; edx <-- socket handle
1832 yogev_ezra 1653
 
1833 hidnplayr 1654
    mov ecx, eax		 ; ecx <-- cookie len
1655
    mov eax, srv_cookie 	 ; Src
1832 yogev_ezra 1656
    lea ebx, [buff+8]
1657
    call strcpy
1658
 
1833 hidnplayr 1659
    mov ecx, edx		 ; ecx <-- socket handle
1832 yogev_ezra 1660
    mov eax, flap
1661
    mov ebx, buff
1662
    call sendflap
1663
    jmp m_fin
1664
 
1665
    m_login_other:
1666
    jmp m_fin
1667
 
1668
    ;
1669
    ; Как обработать ошибку, я не знаю
1670
    ;
1671
  m_flap_err:
1672
  jmp m_fin
1673
 
1674
    ;
1675
    ; Пока не обрабатывается
1676
    ;
1677
  m_keep_alive:
1678
  jmp m_fin
1679
 
1680
 
1681
    ;
1682
    ; Получен SNAC
1683
    ; Распознаем его тип
1684
    ;
1685
  m_snac:
1686
    mov eax, rsnac
1687
    mov ebx, mbuff
1688
    call snacpar
1689
    xor ebx, ebx
1690
    xor edx, edx
1691
    mov bx, [rsnac.wFid]
1692
    mov dx, [rsnac.wSid]
1693
 
1694
    cmp bx, 1
1833 hidnplayr 1695
    jz m_snac_1 	     ;Generic service controls
1832 yogev_ezra 1696
    cmp bx, 2
1833 hidnplayr 1697
    jz m_snac_2 	     ;Location services
1832 yogev_ezra 1698
    cmp bx, 3
1833 hidnplayr 1699
    jz m_snac_3 	     ;Buddy List management service
1832 yogev_ezra 1700
    cmp bx, 4
1833 hidnplayr 1701
    jz m_snac_4 	     ;ICBM (messages) service
1832 yogev_ezra 1702
    cmp bx, 9
1833 hidnplayr 1703
    jz m_snac_9 	     ;Privacy management service
1832 yogev_ezra 1704
    cmp bx, 015h
1833 hidnplayr 1705
    jz m_snac_15	     ;ICQ specific extensions service
1832 yogev_ezra 1706
    cmp bx, 013h
1833 hidnplayr 1707
    jz m_snac_13	     ;Server Side Information (SSI) service
1832 yogev_ezra 1708
 
1709
    jmp m_other_snac
1710
    ;
1711
    ;   FAMILY 1
1712
    ;
1713
  m_snac_1:
1714
    cmp dx, 7
1715
    jz m_snac_1_7
1716
    cmp dx, 3
1717
    jz m_snac_1_3
1718
    cmp dx, 018h
1719
    jz m_snac_1_18
1720
    cmp dx, 01Fh
1721
    jz m_snac_1_f
1722
    cmp dx, 13h
1723
    jz m_snac_13
1724
    cmp dx, 1
1725
    jz m_snac_1_1
1726
    jmp m_snac_1_other
1727
    ;
1728
    ; Rate limits information response
1729
    ;
1833 hidnplayr 1730
  m_snac_1_7:		   ; Отвечаем
1832 yogev_ezra 1731
    mov [ssnac.wFid], 1    ; Family
1732
    mov [ssnac.wSid], 8    ; Subtype
1733
    mov [ssnac.dRi], 8
1734
    mov word [buff], 0100h   ; 0001
1735
    mov word [buff+2], 0200h ; 0002
1736
    mov word [buff+4], 0300h ; 0003
1737
    mov word [buff+6], 0400h ; 0004
1738
    mov word [buff+8], 0500h ; 0005
1739
    mov eax, ssnac
1740
    mov ebx, buff
1833 hidnplayr 1741
    mov edx, 10 	     ; Размер данных
1832 yogev_ezra 1742
    call sendsnac
1743
    ;
1744
    ; Client ask server location service limitations
1745
    ;
1746
    mov [ssnac.wFid], 2    ; Family
1747
    mov [ssnac.wSid], 2    ; Subtype
1748
    mov [ssnac.dRi], 2
1749
    mov eax, ssnac
1750
    mov ebx, buff
1751
    xor edx, edx
1752
    call sendsnac
1753
 
1754
    jmp m_fin
1755
 
1756
    ;
1757
    ;  Server supported snac families list
1758
    ;
1759
  m_snac_1_3:
1760
    ;
1761
    ;  Server sends supported services list
1762
    ;
1763
 
1764
    ;
1833 hidnplayr 1765
    ;   SNAC(01,17)
1832 yogev_ezra 1766
    ;   Client ask for services version numbers
1767
    ;
1768
    mov [ssnac.wFid], 1    ; Family
1769
    mov [ssnac.wSid], 17h    ; Subtype
1770
    mov [ssnac.dRi], 17h
1771
    ;
1772
    ;   Список сервисов, которые нам нужны
1773
    ;
1833 hidnplayr 1774
    ;    xx xx          word            family number #1
1775
    ;    xx xx          word            family version
1776
    ;      ...           ...             ...
1832 yogev_ezra 1777
    ;
1778
 
1779
    ;
1780
    ; Поправил из дампа &RQ
1781
    ;
1782
    mov word [buff], 0100h   ; 0001
1783
    mov word [buff+2], 0300h ; 0003
1784
 
1785
    mov word [buff+4], 1300h ; 0013
1786
    mov word [buff+6], 0200h ; 0002
1787
 
1788
    mov word [buff+8], 0200h ; 0002
1789
    mov word [buff+10], 0100h ; 0001
1790
 
1791
    mov word [buff+12], 0300h ; 0002
1792
    mov word [buff+14], 0100h ; 0001
1793
 
1794
    mov word [buff+16], 1500h ; 0015
1795
    mov word [buff+18], 0100h ; 0001
1796
 
1797
    mov word [buff+20], 0400h ; 0004
1798
    mov word [buff+22], 0100h ; 0001
1799
 
1800
    mov word [buff+24], 0600h ; 0006
1801
    mov word [buff+26], 0100h ; 0001
1802
 
1803
    mov word [buff+28], 0900h ; 0009
1804
    mov word [buff+30], 0100h ; 0001
1805
 
1806
    mov word [buff+32], 1300h ; 0013
1807
    mov word [buff+34], 0400h ; 0004
1808
 
1809
    mov word [buff+36], 1500h ; 0015
1810
    mov word [buff+38], 0400h ; 0004
1811
 
1812
    mov word [buff+40], 1000h ; 0010
1813
    mov word [buff+42], 0100h ; 0001
1814
 
1815
 
1816
 
1817
    mov eax, ssnac
1818
    mov ebx, buff
1819
    mov edx, 44
1820
    call sendsnac
1821
 
1822
    jmp m_fin
1823
 
1824
 
1825
    ;
1826
    ; Server services versions
1827
    ;
1828
  m_snac_1_18:
1829
    ;
1830
    ; Обработки пока нет
1831
    ;
1832
 
1833
    ;
1834
    ; Client ask server for rate limits info
1835
    ; SNAC(01,06)
1836
    ;
1837
    mov [ssnac.wFid], 1    ; Family
1838
    mov [ssnac.wSid], 6    ; Subtype
1839
    mov [ssnac.dRi], 6
1840
    mov eax, ssnac
1841
    mov ebx, buff
1842
    xor edx, edx
1843
    call sendsnac
1844
 
1845
 
1846
 
1847
    jmp m_fin
1848
 
1849
    ;
1850
    ; Requested online info response
1851
    ;
1852
  m_snac_1_f:
1853
    ;
1854
    ;Тут должна быть наша информация, пока обработки нет
1855
    ;
1856
 
1857
 
1858
    jmp m_fin
1859
 
1860
    ;
1861
    ; Message of the day (MOTD)
1862
    ;
1863
  m_snac_1_13:
1864
    ;
1865
    ; Нечего обрабатывать :-))
1866
    ;
1867
    jmp m_fin
1868
 
1869
    ;
1870
    ; Сообщение об ошибке
1871
    ;
1872
 
1873
  m_snac_1_1:
1874
    xor eax, eax
1875
    mov ax, word [mbuff+10]
1876
    call ntohs
1877
    data_debug 'SERVER SEND ERROR #', eax
1878
 
1879
 
1880
    jmp m_fin
1881
 
1882
 
1883
  m_snac_1_other:
1833 hidnplayr 1884
     data_debug 'Unknown SNAC Family 1 received, type ', edx
1832 yogev_ezra 1885
     jmp m_fin
1886
 
1887
 
1888
 
1889
    ;
1890
    ; Family 2
1891
    ;
1892
  m_snac_2:
1893
    cmp dx, 3
1894
    jz m_snac_2_3
1895
    jmp m_snac_2_other
1896
    ;
1897
    ; Server replies via location service limitations
1898
    ;
1899
  m_snac_2_3:
1900
    ;
1901
    ;  Обработки пока нет
1902
    ;
1903
 
1904
    ;
1905
    ;  посылаем capabilities / profile
1906
    ;
1907
    mov [ssnac.wFid], 2    ; Family
1908
    mov [ssnac.wSid], 4    ; Subtype
1909
    mov [ssnac.dRi], 4
1910
 
1911
    ;mov eax, CAPABILITIES
1912
    ;mov ebx, buff
1913
    ;push ecx
1914
    ;mov ecx, 5             ; TLV.Type(0x05) - CLSID values
1915
    ;mov edx, C_LEN
1916
    ;call tlvstr
1917
    ;pop ecx
1918
    mov word [buff], 0500h  ; 00 05
1919
    mov eax, C_LEN
1920
    call htons
1921
    mov word [buff+2], ax
1922
 
1923
 
1924
 
1925
    push ecx
1926
 
1927
    mov eax, CAPABILITIES
1928
    lea ebx, [buff+4]
1929
    mov ecx, C_LEN
1930
    call strcpy
1931
 
1932
    pop ecx
1933
 
1934
 
1935
    mov eax, ssnac
1936
    mov ebx, buff
1833 hidnplayr 1937
    mov edx, C_LEN+4		; Длина данных+размер заголовка TLV
1832 yogev_ezra 1938
    call sendsnac
1939
 
1940
    ;
1941
    ; запрашиваем server BLM service limitations
1942
    ;
1943
    mov [ssnac.wFid], 3    ; Family
1944
    mov [ssnac.wSid], 2    ; Subtype
1945
    mov [ssnac.dRi], 2
1946
    mov eax, ssnac
1947
    mov ebx, buff
1948
    xor edx, edx
1949
    call sendsnac
1950
 
1951
 
1952
    jmp m_fin
1953
 
1954
  m_snac_2_other:
1955
    write_debug 'Unknown SNAC Family 2 Recived'
1956
    jmp m_fin
1957
 
1958
 
1959
 
1960
    ;
1961
    ;  FAMILY 3
1962
    ;
1963
  m_snac_3:
1964
    cmp dx, 3
1965
    jz m_snac_3_3
1966
    cmp dx, 0Bh
1967
    jz m_snac_3_b
1968
    cmp dx, 0Ch
1969
    jz m_snac_3_c
1970
    jmp m_snac_3_other
1971
 
1972
    ;
1973
    ; Server replies via BLM service limitations
1974
    ;
1975
  m_snac_3_3:
1976
    ;
1977
    ; Обработки пока нет
1978
    ;
1979
 
1980
    ;
1981
    ; Client ask server for ICBM service parameters
1982
    ;
1983
    mov [ssnac.wFid], 4    ; Family
1984
    mov [ssnac.wSid], 4    ; Subtype
1833 hidnplayr 1985
    mov [ssnac.dRi], 4	   ; request-id
1832 yogev_ezra 1986
    mov eax, ssnac
1987
    mov ebx, buff
1988
    xor edx, edx
1989
    call sendsnac
1990
 
1991
 
1992
 
1993
    jmp m_fin
1994
 
1995
    ;
1996
    ;  User online notification
1997
    ;
1998
  m_snac_3_b:
1999
    ;
2000
    ; Из всей информации пока нужен только статус
2001
    ;
1833 hidnplayr 2002
    xor edx, edx	   ; Счетчик
1832 yogev_ezra 2003
    xor ecx, ecx
2004
    xor eax, eax
1833 hidnplayr 2005
    cld 	    ; В направлении увеличения адресов
1832 yogev_ezra 2006
 
2007
    dec edx
2008
  m_snac_3_b_loop:
2009
    inc edx
2010
    cmp edx, UINS
1833 hidnplayr 2011
    jnc m_snac_3_b_end	   ;>=
1832 yogev_ezra 2012
 
1833 hidnplayr 2013
    mov cl, [mbuff+10]	   ; Длина УИН
1832 yogev_ezra 2014
    mov eax, ecx
2015
    mov edi, UIN_LEN
2016
    imul edi ,edx
2017
    lea edi, [uins+edi]
2018
    lea esi, [mbuff+11]
2019
    repe cmpsb
2020
 
2021
    jnz m_snac_3_b_loop
2022
    ;
2023
    ; UIN Определен
2024
    ;
2025
 
1833 hidnplayr 2026
    lea ecx, [eax+10+11]	   ; +sizeof SNAC_head + offset #2 TLV
2027
    mov ax, word [mbuff+ecx]		;#2 TLV.Type
2028
    cmp ax, 0C00h		   ;dc info (optional)
1832 yogev_ezra 2029
    jz m_snac_3_b_dc
1833 hidnplayr 2030
    cmp ax, 0A00h		   ;external ip address
1832 yogev_ezra 2031
    jz m_snac_3_b_extip
2032
    jmp m_snac_3_b_bad_tlv
2033
 
2034
 
2035
  m_snac_3_b_dc:
2036
    ;
2037
    ; Пропускаем этот TLV
2038
    ;
2039
    lea ecx, [ecx+41]
2040
  m_snac_3_b_extip:
2041
    ;
2042
    ; И этот :-)
2043
    lea ecx, [ecx+8]
2044
    mov ax, word [mbuff+ecx]
1833 hidnplayr 2045
    cmp ax, 0600h		  ;TLV.Type(0x0A) - external ip address
1832 yogev_ezra 2046
    jz m_snac_3_b_status
2047
    jmp m_snac_3_b_bad_tlv
2048
 
2049
  m_snac_3_b_status:
2050
    ;
2051
    ; наконец-то статус 8-)
2052
    ;
2053
    mov eax, dword [mbuff+ecx+4]
2054
    call ntohl
2055
    ;mov ebx, 4
2056
    ;imul ebx, edx
2057
    ;mov [stats+ebx], eax
2058
    mov ecx, eax
2059
    mov ebx, NAME_LEN
2060
    imul ebx, edx
2061
    lea ebx, [names+ebx]
2062
    mov eax, edx
2063
    call loadbb
2064
    jmp m_fin
2065
 
2066
 
2067
  m_snac_3_b_bad_tlv:
2068
    write_debug 'TLV Type Mismatch in SNAC(3,b)'
2069
    jmp m_fin
2070
 
2071
  m_snac_3_b_end:
2072
    write_debug 'UIN not in local Contact List'
2073
    jmp m_fin
2074
 
2075
 
2076
 
2077
  m_snac_3_c:
2078
    ;
2079
    ; User offline notification
2080
    ;
2081
  xor edx, edx
2082
  xor ecx, ecx
2083
 
2084
    dec edx
2085
    m_snac_3_c_loop:
2086
    inc edx
2087
    cmp edx, UINS
1833 hidnplayr 2088
    jnc m_snac_3_b_end	   ;>=
1832 yogev_ezra 2089
 
1833 hidnplayr 2090
    mov cl, [mbuff+10]	   ; Длина УИН
1832 yogev_ezra 2091
    mov edi, UIN_LEN
2092
    imul edi ,edx
2093
    lea edi, [uins+edi]
2094
    lea esi, [mbuff+11]
2095
    repe cmpsb
2096
    jnz m_snac_3_c_loop
2097
    ;
2098
    ; UIN Определен
2099
    ;
2100
    ;mov eax, -1
2101
    ;mov ebx, 4
2102
    ;imul ebx, edx
2103
    ;mov [stats+ebx], eax
2104
    mov ecx, -1
2105
    mov ebx, NAME_LEN
2106
    imul ebx, edx
2107
    lea ebx, [names+ebx]
2108
    mov eax, edx
2109
    call loadbb
2110
    jmp m_fin
2111
 
2112
 
2113
 
2114
 
2115
 
2116
 
2117
  m_snac_3_other:
1833 hidnplayr 2118
    write_debug 'Unknown SNAC Family 3 Received'
1832 yogev_ezra 2119
    jmp m_fin
2120
 
2121
 
2122
    ;
2123
    ;  FAMILY 4
2124
    ;
2125
  m_snac_4:
2126
    cmp dx, 5
2127
    jz m_snac_4_5
2128
    cmp dx, 7
2129
    jz m_snac_4_7
2130
    jmp m_snac_4_other
2131
 
2132
    ;
2133
    ;  Server sends ICBM service parameters to client
2134
    ;
2135
  m_snac_4_5:
2136
    ;
2137
    ;  Обработки пока нет
2138
    ;
2139
 
2140
    ;
2141
    ;  Client change default ICBM parameters command
2142
    ;
2143
    mov [ssnac.wFid], 4    ; Family
2144
    mov [ssnac.wSid], 2    ; Subtype
1833 hidnplayr 2145
    mov [ssnac.dRi], 2	   ; request-id
1832 yogev_ezra 2146
 
2147
    mov eax, ICBM_PARAMS
2148
    mov ebx, buff
2149
    push ecx
2150
    mov ecx, ICBMP_LEN
2151
    call strcpy
2152
    pop ecx
2153
 
2154
    mov eax, ssnac
2155
    mov ebx, buff
2156
    mov edx, ICBMP_LEN
2157
    call sendsnac
2158
 
2159
    ;
2160
    ;   Client ask server PRM service limitations
2161
    ;
2162
    mov [ssnac.wFid], 9    ; Family
2163
    mov [ssnac.wSid], 2    ; Subtype
1833 hidnplayr 2164
    mov [ssnac.dRi], 2	   ; request-id
1832 yogev_ezra 2165
    mov eax, ssnac
2166
    mov ebx, buff
2167
    xor edx, edx
2168
    call sendsnac
2169
 
2170
 
2171
    jmp m_fin
2172
 
2173
    ;
2174
    ;  Message for client from server
2175
    ;
2176
  m_snac_4_7:
2177
    ;
2178
    ;  Определяем тип сообщения по полю message channel
2179
    ;
2180
    xor eax, eax
1833 hidnplayr 2181
    mov ax, word [mbuff+10+8]		; +10 - размер SNAC
2182
					; +8 смещение до message channel
2183
    cmp ax, 0100h			; 00 01
1832 yogev_ezra 2184
    jz m_snac_ch1
2185
    cmp ax, 0200h
2186
    jz m_snac_ch2
2187
    cmp ax, 0400h
2188
    jz m_snac_ch4
2189
    jmp m_ch_other
2190
    ;
2191
    ;  channel 1 plain text
2192
    ;
2193
  m_snac_ch1:
2194
    ;
2195
    ; Т.к в очередной раз описание протокола не совпадает с реальностью
2196
    ; разбираем все TLV по порядку
2197
 
1833 hidnplayr 2198
    mov eax, dword [mbuff+10]	       ; cookie
1832 yogev_ezra 2199
    mov [msg_cookie1], eax
2200
    mov eax, dword [mbuff+10+4]
1833 hidnplayr 2201
    mov [msg_cookie2], eax	       ; Используются для потверждения приема сообщений
1832 yogev_ezra 2202
 
1833 hidnplayr 2203
    mov al, [mbuff+10+10]	       ; Sender UIN length
1832 yogev_ezra 2204
    mov [ui.bUinLength], al
2205
 
2206
    push ecx
2207
    movzx ecx, al
2208
 
1833 hidnplayr 2209
    lea eax, [mbuff+10+11]	       ; UIN string
2210
    lea ebx, [ui.bUin]		       ; Dest
1832 yogev_ezra 2211
    call strcpy
2212
 
1833 hidnplayr 2213
    lea ecx, [ecx+10+15]	       ; первый TLV
1832 yogev_ezra 2214
 
2215
 
2216
 m_snac_ch1_loop:
2217
 
2218
    movzx eax, word [mbuff+ecx]
1833 hidnplayr 2219
    cmp eax, 0100h		       ;TLV.Type(0x01) - user class
1832 yogev_ezra 2220
    jz m_snac_ch1_1
1833 hidnplayr 2221
    cmp eax, 0600h		       ;TLV.Type(0x06) - user status
1832 yogev_ezra 2222
    jz m_snac_ch1_6
1833 hidnplayr 2223
    cmp eax, 0800h		       ; Unknown type
1832 yogev_ezra 2224
    jz m_snac_ch1_8
1833 hidnplayr 2225
    cmp eax, 0500h		       ; Unknown type
1832 yogev_ezra 2226
    jz m_snac_ch1_5
1833 hidnplayr 2227
    cmp eax, 0F00h		       ; TLV.Type(0x0f) - user idle time
1832 yogev_ezra 2228
    jz m_snac_ch1_f
1833 hidnplayr 2229
    cmp eax, 0300h		       ; TLV.Type(0x03) - account creation time
1832 yogev_ezra 2230
    jz m_snac_ch1_3
1833 hidnplayr 2231
    cmp eax, 0400h		       ; TLV.Type(0x04) - automated response flag
1832 yogev_ezra 2232
    jz m_snac_ch1_4
1833 hidnplayr 2233
    cmp eax, 0200h		       ; TLV.Type(0x02) - message data
1832 yogev_ezra 2234
    jz m_snac_ch1_mess
2235
    jmp m_snac_msg_tlv_err
2236
 
2237
    ;
2238
    ; Возможно, дополнительная ииформация будет обрабатываться
2239
    ; но пока нет
2240
 
2241
  m_snac_ch1_1:
1833 hidnplayr 2242
    movzx eax, word [mbuff+ecx+2]	; TLV.Length
1832 yogev_ezra 2243
    call ntohs
2244
    lea ecx, [eax+ecx+4]
2245
    jmp m_snac_ch1_loop
2246
 
2247
  m_snac_ch1_6:
2248
 
1833 hidnplayr 2249
    mov eax, dword [mbuff+ecx+4]	    ; User status
1832 yogev_ezra 2250
    call ntohl
2251
    mov [ui.dUserStatus], eax
2252
 
2253
 
1833 hidnplayr 2254
    movzx eax, word [mbuff+ecx+2]	; TLV.Length
1832 yogev_ezra 2255
    call ntohs
2256
    lea ecx, [eax+ecx+4]
2257
    ;
2258
    ;
2259
 
2260
 
2261
    jmp m_snac_ch1_loop
2262
 
2263
  m_snac_ch1_8:
1833 hidnplayr 2264
    movzx eax, word [mbuff+ecx+2]	; TLV.Length
1832 yogev_ezra 2265
    call ntohs
2266
    lea ecx, [eax+ecx+4]
2267
    jmp m_snac_ch1_loop
2268
 
2269
  m_snac_ch1_5:
1833 hidnplayr 2270
    movzx eax, word [mbuff+ecx+2]	; TLV.Length
1832 yogev_ezra 2271
    call ntohs
2272
    lea ecx, [eax+ecx+4]
2273
    jmp m_snac_ch1_loop
2274
 
2275
  m_snac_ch1_f:
1833 hidnplayr 2276
    movzx eax, word [mbuff+ecx+2]	; TLV.Length
1832 yogev_ezra 2277
    call ntohs
2278
    lea ecx, [eax+ecx+4]
2279
    jmp m_snac_ch1_loop
2280
 
2281
  m_snac_ch1_3:
1833 hidnplayr 2282
    movzx eax, word [mbuff+ecx+2]	; TLV.Length
1832 yogev_ezra 2283
    call ntohs
2284
    lea ecx, [eax+ecx+4]
2285
    jmp m_snac_ch1_loop
2286
 
2287
 
2288
  m_snac_ch1_4:
2289
    ;movzx eax, word [buff+ecx+2]       ; TLV.Length
2290
    lea ecx, [ecx+4]
2291
    jmp m_snac_ch1_loop
2292
 
2293
 
2294
 
2295
  m_snac_ch1_mess:
2296
    ;
2297
    ;
2298
    movzx eax, word [mbuff+ecx+4]    ;
1833 hidnplayr 2299
    cmp eax, 0105h		     ; 05 fragment identifier (array of required capabilities)
2300
    jnz m_snac_ch1_fr_err	     ; 01 fragment version
1832 yogev_ezra 2301
 
2302
    movzx eax, word [mbuff+ecx+6]    ; Length
2303
    call ntohs
2304
 
1833 hidnplayr 2305
    lea ecx, [ecx+eax+8]	     ; Пропускаем  byte array of required capabilities (1 - text)
1832 yogev_ezra 2306
 
1833 hidnplayr 2307
    movzx eax, word [mbuff+ecx]      ;  fragment identifier (message text)
2308
    cmp eax, 0101h		     ;  fragment version
1832 yogev_ezra 2309
    jnz m_snac_ch1_fr_err
2310
 
2311
    movzx eax, word [mbuff+ecx+2]    ; TLV Length
2312
    call ntohs
2313
    xchg eax, ecx
2314
 
1833 hidnplayr 2315
    lea eax, [eax+8]		     ; Начало текстового сообщения
2316
    lea ecx, [ecx-4]		     ; - sizeof Message charset number, Message charset subset
1832 yogev_ezra 2317
 
2318
    push eax
2319
    push ecx
2320
 
2321
    ;
2322
    ;  Выводим Message From UIN
2323
    ;
2324
 
2325
    mov eax, MESS
2326
    call strlen
2327
    mov ecx, eax
2328
 
2329
    mov eax, MESS
2330
    mov ebx, buff
2331
    call strcpy
2332
 
2333
    lea ebx, [ebx+ecx]
2334
    lea eax, [ui.bUin]
2335
    movzx ecx, byte [ui.bUinLength]
2336
    call strcpy
2337
 
2338
    mov [ebx+ecx], byte 0
2339
 
2340
    mov eax, buff
2341
    xor ebx, ebx
2342
 
2343
    call writemsg
2344
    ;
2345
    ;  Само сообщение
2346
    ;
2347
 
2348
    pop ecx
2349
    pop eax
2350
    lea eax, [mbuff+eax]
2351
 
2352
    mov ebx, buff
2353
    call strcpy
2354
    mov [ebx+ecx], byte 0
2355
 
2356
    mov eax, buff
2357
    call win2dos
2358
    mov ebx, 00FF0000h
2359
    call writemsg
2360
 
2361
    ;
2362
    ;  Подтверждаем прием
2363
    ;
2364
 
2365
    pop ecx
2366
    ;
2367
    ; Пока не реализовано, т.к. не могу найти клиент, который это использует :-)
2368
    ;
2369
 
2370
    jmp m_fin
2371
 
2372
  m_snac_msg_tlv_err:
2373
    write_debug 'TLV TYPE MISMATCH'
2374
    pop ecx
2375
    jmp m_fin
2376
 
2377
  m_snac_ch1_fr_err:
2378
    write_debug 'UNKNOWN FRAGMENT IDENTIFIER OR FRAGMENT VERSION'
2379
 
2380
  ;m_snac_ch1_end:
2381
    pop ecx
2382
 
2383
    jmp m_fin
2384
 
2385
    ;
2386
    ;   Channel 2 message format (rtf messages, rendezvous)
2387
    ;
2388
  m_snac_ch2:
2389
    ;
2390
    ;  отправим сообщение, что канал не поддерживается
2391
    ;  нужны куки и уин
2392
    mov eax, dword [mbuff+10]
2393
    mov [msg_cookie1], eax
2394
    mov eax, dword [mbuff+10+4]
2395
    mov [msg_cookie2], eax
2396
 
1833 hidnplayr 2397
    mov al, [mbuff+10+10]	       ; Sender UIN length
1832 yogev_ezra 2398
    mov [ui.bUinLength], al
2399
 
2400
    push ecx
2401
    movzx ecx, al
2402
 
1833 hidnplayr 2403
    lea eax, [mbuff+10+11]	       ; UIN string
2404
    lea ebx, [ui.bUin]		       ; Dest
1832 yogev_ezra 2405
    call strcpy
2406
 
2407
 
2408
    mov [ssnac.wFid], 4      ; Family
2409
    mov [ssnac.wSid], 0Bh    ; Subtype
2410
    mov [ssnac.dRi], 0Bh
2411
 
2412
    mov eax, [msg_cookie1]
2413
    mov dword [buff], eax
2414
    mov eax, [msg_cookie2]
2415
    mov dword [buff+4], eax
1833 hidnplayr 2416
    mov word [buff+8], 0200h	  ; Channel 2
1832 yogev_ezra 2417
 
2418
    mov al, [ui.bUinLength]
2419
    mov [buff+10], al
2420
    lea eax, [ui.bUin]
2421
    lea ebx, [buff+11]
2422
    call strcpy
2423
    lea ecx, [ecx+11]
2424
 
1833 hidnplayr 2425
    mov word [buff+ecx], 0100h	  ; reason code (1 - unsupported channel, 2 - busted payload, 3 - channel specific)
1832 yogev_ezra 2426
    mov edx, ecx
2427
 
2428
    pop ecx
2429
    mov eax, ssnac
2430
    mov ebx, buff
2431
    call sendsnac
2432
 
2433
 
2434
    jmp m_fin
2435
 
2436
    ;
2437
    ;  Channel 4 message format (typed old-style messages)
2438
    ;
2439
  m_snac_ch4:
2440
 
2441
 
2442
 
2443
  m_ch_other:
2444
    write_debug 'Unknown message channel'
2445
 
2446
    jmp m_fin
2447
 
2448
 
2449
  m_snac_4_other:
1833 hidnplayr 2450
    write_debug 'Unknown SNAC Family 4 received'
1832 yogev_ezra 2451
    jmp m_fin
2452
 
2453
 
2454
 
2455
    ;
2456
    ; FAMILY 9
2457
    ;
2458
  m_snac_9:
2459
    cmp dx, 3
2460
    jz m_snac_9_3
2461
    jmp m_snac_9_other
2462
 
2463
    ;
2464
    ; Server sends PRM service limitations to client
2465
    ;
2466
  m_snac_9_3:
2467
    ;
2468
    ; Обработки пока нет
2469
    ;
2470
 
2471
 
2472
    ; Отключено, тк не поддерживается SIQ
2473
    ;
2474
 
2475
    ;
2476
    ;  Client ask server for SSI service limitations
2477
    ;
2478
    ;mov [ssnac.wFid], 13h  ; Family
2479
    ;mov [ssnac.wSid], 2    ; Subtype
2480
    ;mov [ssnac.dRi], 2     ; request-id
2481
    ;mov eax, ssnac
2482
    ;mov ebx, buff
2483
    ;xor edx, edx
2484
    ;call sendsnac
2485
 
2486
    ;
2487
    ; последняя стадия соединения
2488
    ;
2489
 
2490
    ;
2491
    ; Запрашиваем свою информацию
2492
    ;
2493
    mov [ssnac.wFid], 1  ; Family
2494
    mov [ssnac.wSid], 0Eh    ; Subtype
2495
    mov [ssnac.dRi], 0Eh     ; request-id
2496
 
2497
    mov eax, ssnac
2498
    mov ebx, buff
1833 hidnplayr 2499
    xor edx, edx	     ; TLV head len
1832 yogev_ezra 2500
    call sendsnac
2501
 
2502
 
2503
    ;
2504
    ; Client sends its DC info and status to server
2505
    ;
2506
    mov [ssnac.wFid], 1  ; Family
2507
    mov [ssnac.wSid], 1Eh    ; Subtype
2508
    mov [ssnac.dRi], 1Eh     ; request-id
2509
 
1833 hidnplayr 2510
    mov [buff], 0	    ;  TLV type 06
2511
    mov [buff+1], 6h	    ;
2512
    mov [buff+2], 0	    ;  TLV data length
2513
    mov [buff+3], 4	    ;
1832 yogev_ezra 2514
    ;
2515
    ;
2516
    mov ax, STATUS_DCDISABLED  ; DC disabled
2517
    call htons
2518
    mov word [buff+4], ax
2519
    mov ax, STATUS_ONLINE
2520
    mov [status], ax
2521
    mov word [buff+6], ax
2522
 
2523
    mov eax, ssnac
2524
    mov ebx, buff
1833 hidnplayr 2525
    mov edx, 8		 ; TLV head len+ data len
1832 yogev_ezra 2526
    call sendsnac
2527
 
2528
 
2529
    ;
2530
    ;  Выгружаем на сервер КЛ
2531
    ;
2532
    call uploadkl
2533
 
2534
    ;
2535
    ; Выгружаем инвизибл лист, пока пустой
2536
    ;
2537
    mov [ssnac.wFid], 9  ; Family
2538
    mov [ssnac.wSid], 7    ; Subtype
2539
    mov [ssnac.dRi], 7
2540
 
2541
    mov eax, ssnac
2542
    mov ebx, buff
2543
    xor edx, edx
2544
    call sendsnac
2545
 
2546
    ;
2547
    ; В &RQ Есть пакет установки разрешений. я использую его без изменения
2548
    ;  т.к. не знаю, что он содержит
2549
    ;
2550
 
2551
    mov [ssnac.wFid], 15  ; Family
2552
    mov [ssnac.wSid], 2    ; Subtype
2553
    mov [ssnac.dRi], 2
2554
 
2555
    mov word [buff], 0100h   ; 00 01 encapsulated META_DATA
2556
    mov word [buff+2], 1000h ; 00 10     Len
2557
    mov word [buff+4], 000Eh ;  LE Len
2558
    mov word [buff+10], 07D0h ; META_DATA_REQ
2559
 
2560
 
2561
    mov eax, UIN
2562
    call ascitoint
2563
    mov dword [buff+6], eax
2564
 
1833 hidnplayr 2565
    mov word [buff+12], 0102h	; request sequence number (incrementing)
2566
    mov word [buff+14], 0424h	; META_SET_PERMS_USERINFO
2567
    mov [buff+16], 1		; authorization (1-required, 0-not required)
2568
    mov [buff+17], byte 0	; webaware (0-no, 1-yes)
2569
    mov [buff+18], 1		 ; dc_perms (0-any, 1-contact, 2-authorization)
2570
    mov [buff+19], 0		;unknown
1832 yogev_ezra 2571
 
2572
    mov eax, ssnac
2573
    mov ebx, buff
2574
    mov edx, 20
2575
 
2576
 
2577
    ;
2578
    ; Client READY command
2579
    ;
2580
    mov [ssnac.wFid], 1  ; Family
2581
    mov [ssnac.wSid], 2    ; Subtype
1833 hidnplayr 2582
    mov [ssnac.dRi], 2	   ; request-id
1832 yogev_ezra 2583
 
2584
    mov eax, FAMILY_ARR
2585
    mov ebx, buff
2586
    push ecx
2587
    mov ecx, FA_LEN
2588
    call strcpy
2589
    pop ecx
2590
 
2591
    mov eax, ssnac
2592
    mov ebx, buff
2593
    mov edx, FA_LEN
2594
    call sendsnac
2595
 
2596
 
2597
    ;
2598
    ; Запрашиваем offline сообщения
2599
    ;
2600
    mov [ssnac.wFid], 15h  ; Family
2601
    mov [ssnac.wSid], 2    ; Subtype
1833 hidnplayr 2602
    mov [ssnac.dRi], 2	   ; request-id
1832 yogev_ezra 2603
 
1833 hidnplayr 2604
    mov word [buff], 0100h	;  TLV type 01
2605
    mov word [buff+2], 0A00h	;  00 0a Длина
2606
    mov word [buff+4], 0008h	;  08 00
1832 yogev_ezra 2607
    mov eax, UIN
2608
    call ascitoint
2609
    mov dword [buff+6], eax
2610
 
2611
    mov [buff+10],  003Ch ; 3C 00 - Запрос на оффлайновые сообщения
2612
    mov [buff+12],  0002  ; 02 00 - request sequence number
2613
 
2614
    mov edx, 14        ; Общий размер данных в буфере
2615
 
2616
    mov eax, ssnac
2617
    mov ebx, buff
2618
    call sendsnac
2619
 
2620
 
2621
 
2622
    ;
2623
    ; Запрашиваем информацию всех UIN
2624
    ;
2625
    call getinfo
2626
    ;
2627
    ; завершено соединение
2628
    ;
2629
    mov [login], 2
2630
 
2631
    jmp m_fin
2632
 
2633
  m_snac_9_other:
1833 hidnplayr 2634
    write_debug 'Unknown SNAC Family 9 Received'
1832 yogev_ezra 2635
    jmp m_fin
2636
 
2637
 
2638
    ;
2639
    ; FAMILY 13
2640
    ;
2641
  m_snac_13:
2642
    cmp dx, 3
2643
    jz m_snac_13_3
2644
    cmp dx, 0fh
2645
    jz m_snac_13_F
2646
 
2647
    jmp m_snac_13_other
2648
 
2649
    ;
2650
    ; Server sends SSI service limitations to client
2651
    ;
2652
  m_snac_13_3:
2653
    ;
2654
    ; Обработки пока нет
2655
    ;
2656
 
2657
    ;
1833 hidnplayr 2658
    ;  SNAC(13,05)        Client check if its local SSI copy is up-to-date
1832 yogev_ezra 2659
    ;
2660
    mov [ssnac.wFid], 13h  ; Family
2661
    mov [ssnac.wSid], 5    ; Subtype
1833 hidnplayr 2662
    mov [ssnac.dRi], 5	   ; request-id
1832 yogev_ezra 2663
    mov eax, ssnac
2664
    ;  3D E7 48 17
1833 hidnplayr 2665
    mov [buff], 03Dh	  ;
2666
    mov [buff+1], 0E7h	  ;     modification date/time of client local SSI copy
2667
    mov [buff+2], 48h	  ;
2668
    mov [buff+3], 17h	  ;
1832 yogev_ezra 2669
    ; 00 10
1833 hidnplayr 2670
    mov [buff+4], 00	  ;
2671
    mov [buff+5], 10h	  ;     number of items in client local SSI copy
1832 yogev_ezra 2672
 
2673
    mov ebx, buff
2674
    mov edx, 5
2675
    call sendsnac
2676
 
2677
    jmp m_fin
2678
 
2679
    ;
2680
    ;  Server tell client its local copy up-to-date
2681
    ;
2682
  m_snac_13_F:
2683
    ;
2684
    ;  Обработки нет
2685
    ;
2686
 
2687
    ;
2688
    ;  Client activates server SSI data
2689
    ;
2690
    mov [ssnac.wFid], 13h  ; Family
2691
    mov [ssnac.wSid], 7    ; Subtype
1833 hidnplayr 2692
    mov [ssnac.dRi], 7	   ; request-id
1832 yogev_ezra 2693
    mov eax, ssnac
2694
    mov ebx, buff
2695
    xor edx, edx
2696
    call sendsnac
2697
 
2698
    ;
2699
    ; последняя стадия соединения
2700
    ;
2701
 
2702
    ;
2703
    ; Client sends its DC info and status to server
2704
    ;
2705
    mov [ssnac.wFid], 1  ; Family
2706
    mov [ssnac.wSid], 1Eh    ; Subtype
2707
    mov [ssnac.dRi], 1Eh     ; request-id
2708
 
1833 hidnplayr 2709
    mov [buff], 0	    ;  TLV type 06
2710
    mov [buff+1], 6h	    ;
2711
    mov [buff+2], 0	    ;  TLV data length
2712
    mov [buff+3], 4	    ;
1832 yogev_ezra 2713
    ;
2714
    ;
2715
    mov ax, STATUS_DCDISABLED  ; DC disabled
2716
    call htons
2717
    mov word [buff+4], ax
2718
    mov ax, STATUS_ONLINE
2719
    mov [status], ax
2720
    mov word [buff+6], ax
2721
 
2722
    mov eax, ssnac
2723
    mov ebx, buff
1833 hidnplayr 2724
    mov edx, 8		 ; TLV head len+ data len
1832 yogev_ezra 2725
    call sendsnac
2726
 
2727
    ;
2728
    ; Client READY command
2729
    ;
2730
    mov [ssnac.wFid], 1  ; Family
2731
    mov [ssnac.wSid], 2    ; Subtype
1833 hidnplayr 2732
    mov [ssnac.dRi], 2	   ; request-id
1832 yogev_ezra 2733
 
2734
    mov eax, FAMILY_ARR
2735
    mov ebx, buff
2736
    push ecx
2737
    mov ecx, FA_LEN
2738
    call strcpy
2739
    pop ecx
2740
 
2741
    mov eax, ssnac
2742
    mov ebx, buff
2743
    mov edx, FA_LEN
2744
    call sendsnac
2745
 
2746
 
2747
    ;
2748
    ; Запрашиваем offline сообщения
2749
    ;
2750
    mov [ssnac.wFid], 15h  ; Family
2751
    mov [ssnac.wSid], 2    ; Subtype
1833 hidnplayr 2752
    mov [ssnac.dRi], 2	   ; request-id
1832 yogev_ezra 2753
 
1833 hidnplayr 2754
    mov word [buff], 0100h	;  TLV type 01
2755
    mov word [buff+2], 0A00h	;  00 0a Длина
2756
    mov word [buff+4], 0008h	;  08 00
1832 yogev_ezra 2757
    mov eax, UIN
2758
    call ascitoint
2759
    mov dword [buff+6], eax
2760
 
2761
    mov [buff+10],  003Ch ; 3C 00 - Запрос на оффлайновые сообщения
2762
    mov [buff+12],  0002  ; 02 00 - request sequence number
2763
 
2764
    mov edx, 14        ; Общий размер данных в буфере
2765
 
2766
    mov eax, ssnac
2767
    mov ebx, buff
2768
    call sendsnac
2769
 
2770
 
2771
 
2772
    jmp m_fin
2773
 
2774
  m_snac_13_other:
1833 hidnplayr 2775
    write_debug 'Unknown SNAC Family 13 Received'
1832 yogev_ezra 2776
    jmp m_fin
2777
 
2778
 
2779
 
2780
 
2781
    ;
2782
    ;  Family 15
2783
    ;
2784
 
2785
  m_snac_15:
2786
 
2787
    cmp dx, 3
2788
    jz m_snac_15_3
2789
 
2790
    jmp m_snac_15_other
2791
 
2792
 
2793
    ;
2794
    ; Server sends message #N
2795
    ;
2796
  m_snac_15_3:
2797
    ;
2798
    ; Определяем подтип принятого пакета
2799
    ;
2800
 
2801
    ;write_debug 'SNAC 15, 3'
2802
 
2803
    xor eax, eax
2804
    mov ax, word [mbuff+10]  ; + SNAC.head size
1833 hidnplayr 2805
    cmp ax, 0100h	     ; 00 01 TLV type
1832 yogev_ezra 2806
    jnz m_snac_tlv_err
2807
 
2808
    mov ax, word [mbuff+10+10]
1833 hidnplayr 2809
    cmp ax, 0041h	      ; Offline Message
1832 yogev_ezra 2810
    jz m_snac_offline_mes
1833 hidnplayr 2811
    cmp ax, 0042h	      ; End messages
1832 yogev_ezra 2812
    jz m_snac_offline_end
2813
    cmp ax, 07DAh
2814
    jz m_snac_meta_data
2815
 
2816
 
2817
    write_debug 'Unknown Subtype SNAC (15,3)'
2818
    jmp m_fin
2819
 
2820
  m_snac_offline_mes:
1833 hidnplayr 2821
    mov eax, MESS		       ;
2822
    call strlen 		       ;  Выводим строку с сообщением о отправителе и времени отправки
2823
    push ecx			       ;
2824
    mov ecx, eax		   ;
1832 yogev_ezra 2825
    mov eax, MESS
2826
    mov ebx, buff
2827
    call strcpy
2828
 
1833 hidnplayr 2829
    mov eax, dword [mbuff+14+10]	  ; Sender UIN
2830
    lea ebx, [buff+ecx] 	       ; После строчки о сообщении
1832 yogev_ezra 2831
    call int2strd
2832
 
2833
    lea ebx, [ebx+eax]
2834
    mov [ebx], byte ' '
2835
    inc ebx
2836
 
1833 hidnplayr 2837
				       ; + Длина UIN
2838
    movzx eax, byte [mbuff+21+10]	  ; Day
1832 yogev_ezra 2839
    call int2strd
2840
 
2841
    lea ebx, [ebx+eax]
2842
    mov [ebx], byte '.'
2843
    inc ebx
2844
 
2845
 
1833 hidnplayr 2846
    movzx eax, byte [mbuff+20+10]	  ;Mounth
1832 yogev_ezra 2847
    call int2strd
2848
 
2849
    lea ebx, [ebx+eax]
2850
    mov [ebx], byte ' '
2851
    inc ebx
2852
 
1833 hidnplayr 2853
    movzx eax, [mbuff+22+10]		  ; Hour
1832 yogev_ezra 2854
    call int2strd
2855
 
2856
    lea ebx, [ebx+eax]
2857
    mov [ebx], byte ':'
2858
    inc ebx
2859
 
1833 hidnplayr 2860
    movzx eax, [mbuff+23+10]		  ; Minute
1832 yogev_ezra 2861
    call int2strd
2862
 
2863
    lea ebx, [ebx+eax]
2864
    ;mov [ebx], byte ' '
2865
    ;inc ebx
2866
 
1833 hidnplayr 2867
    mov [ebx], byte 0			   ; Str end
1832 yogev_ezra 2868
    mov eax, buff
2869
    xor ebx, ebx
2870
 
2871
    call writemsg
2872
 
1833 hidnplayr 2873
    movzx ecx, word [mbuff+26+10]	      ; Длина соообщения
1832 yogev_ezra 2874
    lea eax, [mbuff+28+10]
2875
    mov ebx, buff
2876
    call strcpy
2877
 
2878
    mov [ebx+ecx], byte 0
2879
 
2880
    mov eax, buff
1833 hidnplayr 2881
    call win2dos			      ;перекодируем
1832 yogev_ezra 2882
 
1833 hidnplayr 2883
    mov ebx, 00FF0000h			      ;Цвет
1832 yogev_ezra 2884
 
2885
    call writemsg
2886
 
2887
 
2888
    pop ecx
2889
 
2890
    jmp m_fin
2891
 
2892
 
2893
  m_snac_offline_end:
2894
    ;
2895
    ; Удаляем сообщения на сервере
2896
    ;
2897
    mov [ssnac.wFid], 15h  ; Family
2898
    mov [ssnac.wSid], 2    ; Subtype
2899
    mov [ssnac.dRi], 0602h     ; request-id
2900
 
1833 hidnplayr 2901
    mov word [buff], 0100h     ;  00 01 TLV.Type(1) - encapsulated META_DATA1
2902
    mov word [buff+2], 0A00h   ;  00 0A TLV.Length
2903
    mov word [buff+4], 0008h   ;  08 00 data chunk size (TLV.Length-2)
1832 yogev_ezra 2904
    mov eax, UIN
2905
    call ascitoint
2906
    mov dword [buff+6], eax    ; xx xx xx xx (LE) client uin
1833 hidnplayr 2907
    mov word [buff+10], 003Eh  ; 3E 00  (LE) data type: delete offline msgs request cmd
2908
    mov word [buff+12], 0007h  ;  xx xx (LE) request sequence number
1832 yogev_ezra 2909
 
1833 hidnplayr 2910
    mov edx, 14 	       ; Размер данных
1832 yogev_ezra 2911
    mov eax, ssnac
2912
    mov ebx, buff
2913
    call sendsnac
2914
 
2915
 
2916
 
2917
    jmp m_fin
2918
 
2919
    ;
2920
    ; Ответ на запрос о пользователях
2921
    ;
2922
  m_snac_meta_data:
2923
    ;
2924
    ; Определяем очередной подтип :-)
2925
    ;
2926
    mov ax, word [mbuff+10+14]
1833 hidnplayr 2927
    cmp ax, 0104h		    ;data subtype: META_SHORT_USERINFO
1832 yogev_ezra 2928
    jz m_snac_short_userinfo
2929
    cmp ax, 00C8h
1833 hidnplayr 2930
    jz m_snac_basic_userinfo	    ;data subtype: META_BASIC_USERINFO
1832 yogev_ezra 2931
    write_debug 'Unknown META DATA subtype'
2932
    jmp m_fin
2933
 
2934
 
2935
 
2936
  m_snac_short_userinfo:
2937
    ;
2938
    ; Из всей информации пока нужен только ник
2939
    ;
2940
    mov al, [mbuff+10+16]
1833 hidnplayr 2941
     cmp al, 0Ah		    ;success byte
1832 yogev_ezra 2942
     jnz m_fin
2943
 
2944
     movzx eax, word [mbuff+10+12]  ;request sequence number
2945
     ;
2946
     ; В запросе я использовал порядковый номер юзера в КЛ
1833 hidnplayr 2947
     lea ebx, [mbuff+10+19]	    ;nickname string
1832 yogev_ezra 2948
     ; Длина строки не нужна, т.к. строка Null-Terminated
2949
     ;Определяем статус
2950
     mov ecx, 4
2951
     imul ecx, eax
2952
     mov ecx, [stats+ecx]
2953
 
2954
     call loadbb
2955
 
2956
 
2957
 
2958
    jmp m_fin
2959
 
2960
  ;
2961
  ; тк SIQ на запрос короткой инфы отвечает
2962
  ; пакетом базовой информации, реализую пока только его
2963
  ;
2964
  m_snac_basic_userinfo:
2965
     mov al, [mbuff+10+16]
1833 hidnplayr 2966
     cmp al, 0Ah		    ;success byte
1832 yogev_ezra 2967
     jnz m_fin
2968
 
2969
     movzx eax, word [mbuff+10+12]  ;request sequence number
2970
     ;
2971
     ; В запросе я использовал порядковый номер юзера в КЛ
1833 hidnplayr 2972
     lea ebx, [mbuff+10+19]	    ;nickname string
1832 yogev_ezra 2973
     ; Длина строки не нужна, т.к. строка Null-Terminated
2974
     ;Определяем статус
2975
     mov ecx, 4
2976
     imul ecx, eax
2977
     mov ecx, [stats+ecx]
2978
 
2979
     call loadbb
2980
 
2981
 
2982
 
2983
    jmp m_fin
2984
 
2985
  m_snac_tlv_err:
2986
    write_debug 'TLV TYPE MISMATCH'
2987
 
2988
    jmp m_fin
2989
 
2990
 
2991
  m_snac_15_other:
2992
 
1833 hidnplayr 2993
    write_debug 'Unknown SNAC Family 15 Received'
1832 yogev_ezra 2994
 
2995
    jmp m_fin
2996
 
2997
 
2998
  m_other_snac:
1833 hidnplayr 2999
    write_debug 'Unknown SNAC received'
1832 yogev_ezra 3000
    jmp m_fin
3001
 
3002
 
3003
 
3004
  m_fin:
3005
    ;pop edx
3006
    ;pop ebx
3007
    ;pop eax
3008
    popad
3009
    popf
3010
  ret
3011
 
3012
; Для перевода DWORD из Little Endian в Big Endian
3013
; и наоборот :-)
3014
; <--EAX DWORD
3015
; -->EAX
3016
;
3017
  ntohl:
3018
  htonl:
3019
    ;pushf
3020
    push ebx
3021
    ;push ecx
3022
 
3023
    xor ebx, ebx
3024
 
3025
    mov bl, ah
3026
    mov bh, al
3027
    shl ebx, 16
3028
 
3029
    shr eax, 16
3030
    mov bl, ah
3031
    mov bh, al
3032
 
3033
    mov eax, ebx
3034
 
3035
    ;pop ecx
3036
    pop ebx
3037
    ;popf
3038
  ret
3039
 
3040
 
3041
; Для перевода WORD из Little Endian в Big Endian
3042
; <--AX WORD
3043
; -->AX WORD
3044
;
3045
 
3046
  ntohs:
3047
  htons:
3048
    ;pushf
3049
    push ebx
3050
 
3051
    xor ebx, ebx
3052
    mov bl, ah
3053
    mov bh, al
3054
    mov eax, ebx
3055
 
3056
    pop ebx
3057
    ;popf
3058
  ret
3059
 
3060
;
3061
; парсит SNAC
3062
; <--EAX указатель на SNAC_head
3063
; <--EBX указатель на буффер
3064
; -->EAX указатель начало данных = buffer+sizeof SNAC_head
3065
;
3066
;
3067
  snacpar:
3068
    pushf
3069
    push ecx
3070
    ;push edx
3071
 
1833 hidnplayr 3072
    mov cl, [ebx+1]	; Family (service) id number младший байт
3073
    mov ch, [ebx]	; старший
1832 yogev_ezra 3074
    mov word [eax], cx
3075
 
1833 hidnplayr 3076
    mov cl, [ebx+3]	; Family subtype id number
3077
    mov ch, [ebx+2]	;
1832 yogev_ezra 3078
    mov word [eax+2], cx
3079
 
1833 hidnplayr 3080
    mov cl, [ebx+5]	 ; SNAC flags
3081
    mov ch, [ebx+4]	 ;
1832 yogev_ezra 3082
    mov word [eax+4], cx ;
1833 hidnplayr 3083
 
3084
    mov cl, [ebx+7]	    ;
3085
    mov ch, [ebx+6]	    ;
1832 yogev_ezra 3086
    mov word [eax+8], cx    ; SNAC request id
1833 hidnplayr 3087
    mov cl, [ebx+8]	    ;
3088
    mov ch, [ebx+7]	    ;
1832 yogev_ezra 3089
    mov word [eax+6], cx    ;
3090
 
1833 hidnplayr 3091
    add ebx, 10 	    ;Размер заголовка
1832 yogev_ezra 3092
    mov eax, ebx
3093
 
3094
 
3095
    ;pop edx
3096
    pop ecx
3097
    popf
3098
  ret
3099
 
3100
;
3101
; парсит userinfo block
3102
;  FIXIT
3103
;
3104
 
3105
;  userinfopar:
3106
;    pushf
3107
;
3108
;
3109
;
3110
;
3111
;
3112
;
3113
;    popf
3114
;  ret
3115
 
3116
;
3117
;  посылка сообщения
3118
;  [eax] <-- текстовый буфер  \
3119
;  [ebx] <-- UIN              /  Null-terminated
3120
 
3121
  sendmsg:
3122
    pushf
3123
    pushad
3124
    push eax
3125
    push ebx
3126
 
3127
    mov [ssnac.wFid], 4h  ; Family
3128
    mov [ssnac.wSid], 6    ; Subtype
3129
    mov [ssnac.dRi], 106h     ; request-id
3130
    ;
3131
    ;  Получаем время с запуска системы, для cookie
3132
    ;
3133
    mov eax, 26
3134
    mov ebx, 9
3135
    int 40h
3136
 
3137
    mov dword [buff], eax      ; Cookie 1
3138
    mov dword [buff+4], eax    ; Cookie 2
3139
 
3140
    mov word [buff+8], 0100h   ; Message channel 00 01
3141
 
3142
 
3143
    pop ebx
3144
    mov eax, ebx
3145
    call strlen
3146
 
3147
    mov [buff+10], al
3148
    mov ecx, eax
3149
    mov eax, ebx
3150
    lea ebx, [buff+11]
3151
    call strcpy
3152
    lea ecx, [ecx+11]
3153
 
1833 hidnplayr 3154
    mov word [buff+ecx], 0200h	  ;     TLV.Type(0x02) - message data
1832 yogev_ezra 3155
 
3156
    ;push ecx                      ;
1833 hidnplayr 3157
				   ; TLV.Length
1832 yogev_ezra 3158
 
1833 hidnplayr 3159
    mov word [buff+ecx+4], 0105h	 ; 05 01   01 - fragment version, 05 - fragment identifier
1832 yogev_ezra 3160
 
1833 hidnplayr 3161
    mov word [buff+ecx+6], 0100h	 ; data length
1832 yogev_ezra 3162
 
1833 hidnplayr 3163
    mov [buff+ecx+8], 01		 ; byte array of required capabilities (1 - text)
1832 yogev_ezra 3164
 
1833 hidnplayr 3165
    mov [buff+ecx+9], 01		 ; fragment identifier (text message)
3166
    mov [buff+ecx+10], 01		  ; fragment version
1832 yogev_ezra 3167
 
3168
    pop ebx
3169
    mov eax, ebx
3170
    call strlen
3171
    mov edx, eax
1833 hidnplayr 3172
    lea eax, [eax+4]			 ; Длина сообщения + Message charset number+ Message language number
1832 yogev_ezra 3173
 
3174
    call htons
3175
    mov word [buff+ecx+11], ax
3176
 
3177
    mov eax, edx
1833 hidnplayr 3178
    lea eax, [eax+13]			  ; + длина служебных данных
1832 yogev_ezra 3179
    call htons
3180
    mov word [buff+ecx+2], ax
3181
 
3182
 
1833 hidnplayr 3183
    mov word [buff+ecx+13], 0700h	 ; Message charset number
3184
    mov word [buff+ecx+15], 0300h	 ; Message language number
1832 yogev_ezra 3185
 
3186
    mov eax, ecx
1833 hidnplayr 3187
    mov ecx, edx			 ; Len
1832 yogev_ezra 3188
    lea edx, [eax+17]
3189
 
1833 hidnplayr 3190
    mov eax, ebx			 ;Source
1832 yogev_ezra 3191
 
1833 hidnplayr 3192
    lea ebx, [buff+edx] 		 ;Dest
1832 yogev_ezra 3193
 
3194
    call strcpy
1833 hidnplayr 3195
    lea ecx, [ecx+edx]			 ; +String length
1832 yogev_ezra 3196
 
3197
    mov [buff+ecx], byte 0
3198
    mov eax, ebx
3199
    call dos2win
3200
 
3201
 
1833 hidnplayr 3202
    mov word [buff+ecx], 0600h		     ; TLV.Type(0x06) - store message if recipient offline
3203
    mov word [buff+ecx+2], 0		     ; TLV.Length
1832 yogev_ezra 3204
 
1833 hidnplayr 3205
    lea edx, [ecx+4]			     ; +TLV_head length
1832 yogev_ezra 3206
    mov eax, ssnac
3207
    mov ebx, buff
3208
    mov ecx, [socket]
3209
    call sendsnac
3210
 
3211
 
3212
 
3213
    popad
3214
    popf
3215
  ret
3216
 
3217
;
3218
;   Запрос информации UINов
3219
;
3220
  getinfo:
3221
    pushad
3222
    pushf
3223
    ;
3224
    ; SNAC (15,2) - Meta information request
3225
    ;
3226
 
3227
    mov [ssnac.wFid], 15h  ; Family
3228
    mov [ssnac.wSid], 2    ; Subtype
3229
    mov [ssnac.dRi], 702h     ; request-id
3230
 
1833 hidnplayr 3231
    mov word [buff], 0100h	   ;TLV.Type(1) - encapsulated META_DATA
3232
    mov word [buff+2], 1000h	   ; 00 10  TLV.Length
3233
    mov word [buff+4], 000Eh	   ; (LE)               data chunk size (TLV.Length-2)
1832 yogev_ezra 3234
    mov eax, UIN
3235
    call ascitoint
1833 hidnplayr 3236
    mov dword [buff+6], eax	   ;(LE)                request owner uin
3237
    mov word [buff+10], 07D0h	   ;data type: META_DATA_REQ
1832 yogev_ezra 3238
    ;mov word [buff+12], 0008h      ; request sequence number <<<-- Может меняться FIXIT
1833 hidnplayr 3239
    mov word [buff+14], 04BAh	   ; data subtype: META_SHORTINFO_REQUEST
1832 yogev_ezra 3240
 
3241
    mov ecx, [socket]
3242
    mov edx, 20
3243
 
1833 hidnplayr 3244
    xor esi, esi	; Счетчик
1832 yogev_ezra 3245
    xor eax, eax
3246
 
3247
  gi_loop:
3248
    mov ebx, esi
1833 hidnplayr 3249
    mov word [buff+12], bx	; request sequence number
1832 yogev_ezra 3250
    mov ebx, UIN_LEN
3251
    imul ebx, esi
3252
    mov al,  [uins+ebx]
3253
    cmp al, 0
1833 hidnplayr 3254
    jz	gi_end
1832 yogev_ezra 3255
 
3256
    lea eax, [uins+ebx]
3257
    call ascitoint
3258
    mov dword [buff+16], eax
3259
 
3260
    mov eax, ssnac
3261
    mov ebx, buff
3262
 
3263
    call sendsnac
3264
    inc esi
3265
    cmp esi, UINS
3266
    jnc gi_end
3267
    jmp gi_loop
3268
 
3269
 
3270
 
3271
 
3272
 
3273
 
3274
  gi_end:
3275
    popf
3276
    popad
3277
  ret
3278
 
3279
;
3280
; Загружаем локальный КЛ на сервер для получения статуса юзеров
3281
;
3282
  uploadkl:
3283
    pushf
3284
    pushad
3285
    ;
3286
    ;  Add buddy(s) to contact list
3287
    ;
3288
    mov [ssnac.wFid], 3   ; Family
3289
    mov [ssnac.wSid], 4   ; Subtype
1833 hidnplayr 3290
    mov [ssnac.dRi], 4	  ; request-id
1832 yogev_ezra 3291
 
1833 hidnplayr 3292
    xor esi, esi	  ; Счетчик
3293
    xor edx, edx	  ; Заполнено байт
1832 yogev_ezra 3294
 
3295
  ukk_loop:
3296
    mov ebx, UIN_LEN
3297
    imul  ebx, esi
3298
    mov al, [uins+ebx]
3299
    cmp al, 0
3300
    jz ukk_end
3301
    lea eax, [uins+ebx]
3302
 
3303
    call strlen
3304
    mov [buff+edx], al
3305
    inc edx
3306
 
3307
    mov ecx, eax
3308
    lea eax, [uins+ebx]    ; Source
3309
    lea ebx, [buff+edx]
3310
    call strcpy
3311
    add edx, ecx
3312
    inc esi
3313
    cmp esi, UINS
3314
    jz ukk_end
3315
    jmp ukk_loop
3316
 
3317
 
3318
 
3319
 
3320
 
3321
  ukk_end:
3322
    mov eax, ssnac
3323
    mov ebx, buff
3324
    mov ecx, [socket]
3325
    call sendsnac
3326
 
3327
    popad
3328
    popf
3329
  ret
3330
 
3331
;
3332
;
3333
;
3334
  sendkeep:
3335
    pushf
3336
    pushad
3337
    cmp [login], 2
3338
    jnz @f
3339
    mov ax, [timer]
1833 hidnplayr 3340
    cmp ax, 300 	  ;60 c
1832 yogev_ezra 3341
    jb @f
3342
    mov [timer], 0
3343
    mov [flap.bId], FLAP_ID
1833 hidnplayr 3344
    mov [flap.bCh], 5	      ;Keep alive
1832 yogev_ezra 3345
    mov [flap.wDs], 0
3346
    inc [seq]
3347
    mov ax, [seq]
3348
    mov [flap.wSn], ax
3349
    mov eax, flap
3350
    mov ebx, buff
3351
    mov ecx, [socket]
3352
    call sendflap
3353
 
3354
 
3355
  @@:
3356
    popad
3357
    popf
3358
  ret
3359
 
3360
 
3361
 
3362
 
3363
; <--- initialised data --->
3364
DATA
3365
  lsz header,\
1833 hidnplayr 3366
    ru, "KI",\
1832 yogev_ezra 3367
    en, "KI",\
3368
    fr, "KI"
3369
 
3370
 
3371
;
3372
MESS db 'Message from ', 0
3373
CUSER db 'Current user: ', 0
3374
 
3375
;
3376
 
3377
;ICQ_IP =  0x0A00A8C0   ; 192.168.0.10
3378
 ICQ_IP =  0x99A10C40
3379
;
3380
flap FLAP_head
3381
rflap FLAP_head
3382
;
3383
ssnac SNAC_head        ; для передачи SNAC
3384
rsnac SNAC_head        ; для принятого SNAC
3385
;
1833 hidnplayr 3386
ui UI_head	       ; User info
1832 yogev_ezra 3387
;
3388
procinfo process_information
3389
;
3390
UIN db '123456789',0
3391
PASS db 'coolpass',0
3392
ID_STRING db 'ICQ Inc. - Product of ICQ (TM).2000b.4.65.1.3281.85',0
3393
;ID_STRING db 'ICQ Inc. - Product of ICQ (TM).2001b.5.17.1.3642.85',0
3394
CAPABILITIES db 053h, 054h, 0, 0, 097h, 0B1h, 027h, 051h, 024h, 03Ch, 043h, 034h, 0ADh, 022h, 0D6h, 0ABh,\
1833 hidnplayr 3395
		0F7h, 03Fh, 014h, 092h, 02Eh, 07Ah, 064h, 075h, 0FAh, 0DFh, 04Dh, 0C8h, 088h, 06Fh, 0EAh, 035h,\
3396
		095h, 0FDh, 0B6h, 0DFh, 09h, 046h, 013h, 044h,	04Ch, 07Fh, 011h, 0D1h, 082h, 022h, 044h, 045h,\
3397
		053h, 054h, 0, 0
1832 yogev_ezra 3398
;
3399
; From &RQ
3400
;
3401
 
3402
;CAPABILITIES db 0x09, 0x46, 0x13, 0x49, 0x4C, 0x7F, 0x11, 0xD1, 0x82, 0x22, 0x44, 0x45,\    ;...P.F.IL.TВ"DE
3403
;                0x53, 0x54, 0x00, 0x00, 0x09, 0x46, 0x13, 0x44, 0x4C, 0x7F, 0x11, 0xD1, 0x82, 0x22, 0x44, 0x45,\        ;ST...F.DL.TВ"DE
3404
;                0x53, 0x54, 0x00, 0x00, 0x09, 0x46, 0x13, 0x4E, 0x4C, 0x7F, 0x11, 0xD1, 0x82, 0x22, 0x44, 0x45,\        ;ST...F.NL.TВ"DE
3405
;                0x53, 0x54, 0x00, 0x00, 0x09, 0x46, 0x00, 0x00, 0x4C, 0x7F, 0x11, 0xD1, 0x82, 0x22, 0x44, 0x45,\        ;ST...F..L.TВ"DE
3406
;                0x53, 0x54, 0x00, 0x00, 0x26, 0x52, 0x51, 0x69, 0x6E, 0x73, 0x69, 0x64, 0x65, 0x02, 0x07, 0x09,\        ;ST..&RQinside...
3407
;                0x00, 0x00, 0x00, 0x00
3408
 
3409
 
3410
C_LEN = 40h
3411
;C_LEN = 80
3412
ICBM_PARAMS db 0, 0, 0, 0, 0, 0Bh, 01Fh, 040h, 3, 0E7h, 3, 0E7h, 0, 0, 0, 0
1833 hidnplayr 3413
ICBMP_LEN = 16		 ;    ^^^ from &RQ
1832 yogev_ezra 3414
 
3415
 
3416
;
3417
; from &rq
3418
;
1833 hidnplayr 3419
FAMILY_ARR db  0x00, 0x01, 0x00, 0x03, 0x01, 0x10, 0x04, 0x7B,	0x00, 0x13, 0x00, 0x02, 0x01, 0x10, 0x04, 0x7B,\
3420
	       0x00, 0x02, 0x00, 0x01, 0x01, 0x01, 0x04, 0x7B,	0x00, 0x03, 0x00, 0x01, 0x01, 0x10, 0x04, 0x7B,\
3421
	       0x00, 0x15, 0x00, 0x01, 0x01, 0x10, 0x04, 0x7B,	0x00, 0x04, 0x00, 0x01, 0x01, 0x10, 0x04, 0x7B,\
3422
	       0x00, 0x06, 0x00, 0x01, 0x01, 0x10, 0x04, 0x7B,	0x00, 0x09, 0x00, 0x01, 0x01, 0x10, 0x04, 0x7B,\
3423
	       0x00, 0x0A, 0x00, 0x01, 0x01, 0x10, 0x04, 0x7B,	0x00, 0x10, 0x00, 0x01, 0x00, 0x10, 0x06, 0x6A
1832 yogev_ezra 3424
 
3425
 
3426
 
3427
 
3428
 
3429
FA_LEN = 50h
3430
 
3431
;
3432
ID_NUM = 010Ah
3433
MAJOR = 05h
3434
;MAJOR = 04h
3435
;MINOR = 041h
3436
MINOR = 011h
3437
LESSER = 01h
3438
;BUILD = 0CD1h
3439
BUILD = 0E3Ah
3440
DISTR = 055h
3441
TCB_ESTABLISHED = 4
3442
TCB_CLOSED = 11
3443
;
3444
CL_LANG db 'en',0
3445
CL_COUNTRY db 'us',0
3446
 
3447
 
1833 hidnplayr 3448
sbuff db 1024 dup 0	; Буфер для передачи используется внутри sendflap
1832 yogev_ezra 3449
 
1833 hidnplayr 3450
rbuff db 1024 dup 0	; Приемный буфер
3451
tbuff db 512 dup 0	; Для TLV
1832 yogev_ezra 3452
srv_cookie db 512 dup 0 ; Куки для авторизации
3453
bos_address db 128 dup 0 ; Адрес BOS сервера
1833 hidnplayr 3454
cookie_len dw 0 	 ; Длина куки
3455
seq dw 0		 ; Sequence number
1832 yogev_ezra 3456
bos_ip dd 0
3457
bos_port dd 0
1833 hidnplayr 3458
status dw 0		; status
1832 yogev_ezra 3459
 
1833 hidnplayr 3460
mbuff db 2048 dup 0	; Для приема
3461
MBUFF_SIZE		= 2048
1832 yogev_ezra 3462
 
1833 hidnplayr 3463
hrf db 0		; Флаг приема заголовка
1832 yogev_ezra 3464
 
3465
mouse_flag dd 0
3466
socket dd 0
3467
login db 0
3468
 
1833 hidnplayr 3469
msg_cookie1 dd 0	;   Используются для потверждения приема сообщений
3470
msg_cookie2 dd 0	;
1832 yogev_ezra 3471
 
1833 hidnplayr 3472
curruser    db 0	;  текущий пользователь, которому будут отправляться сообщения
3473
			; - Номер в КЛ по порядку
1832 yogev_ezra 3474
 
3475
 
3476
timer dw 0
3477
 
3478
;ltest db "ADMIN",0
3479
 
3480
 
3481
 
3482
;
3483
; EDITBOXES
3484
;
3485
inputbuff:
3486
       rb 512
3487
 
3488
inputbox edit_box 490,10,460,0xffffff,0x6a9480,0,0xAABBCC,0,511,inputbuff,ed_focus,0,0
3489
 
3490
 
3491
; <--- uninitialised data --->
3492
UDATA
3493
 
3494
 
3495
MEOS_APP_END
3496
; <--- end of MenuetOS application --->