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