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 --->--->--->--->--><--><<-->-->-->--EBX>--EAX>--AX>--EAX>-->-->-->-->-->-->-->-->-->-->-->-->-->-->=>--->--->--->---> |