Запасной аэродром для танкистов

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



Спам портал ЛГЦ

Сообщений 1 страница 14 из 14

1

Скачал сегодня обновление последнее. Первый запуск был нормальным - через tanki.exe Но уже при следующем началось вот такое:
https://upforme.ru/uploads/001c/ae/f6/2/t518650.png
Навязчивость поражает.
ЛГЦ уже давно превращён не в лаунчер, а спам-портал для дичи. Который большинство адекватных пользователей запускает только ради обновления и всё.

  • Лишние телодвижения для запуска клиента.

  • Навязчивые уведомления.

  • Предварительный расход трафика юзера на ещё не запущенные обновления или тыканье в окошко ЛГЦ , поиск чекбокса для отключения.

  • Дискомфортно, неудобно. А теперь уже почти и токсично с такой навязчивостью!

0

2

https://upforme.ru/uploads/001c/ae/f6/2/t202925.png
https://upforme.ru/uploads/001c/ae/f6/2/t127268.png
Ну что ж. Настало время потрогать клиент за вымя. Пошёл исследовать этот вопрос. :)

0

3

Предварительное ковыряние выявило новую дичь. Теперь если даже закрыты и клиент и ЛГЦ в процессах висит LestaErrorMonitor.exe из системной папки клиента. При чём не просто висит, а если этот процесс убить, то через несколько секунд он запускается вновь. И так до бесконечности, пока не переименуешь сам этот файл в папке.
Курю тему дальше.

0

4

В процессе исследования внезапно обнаружил, что при запущенном ЛГЦ винда начинает тормозить при открытии папок. Программы не тормозят, а вот переход по директориям, при чём любым, вылетает анимированное колесо прокрутки-ожидания. Несколько секунд ждать приходится.
Как только ЛГЦ закрыть - всё летает, как и прежде.
Вообще ужас!

0

5

В процессе ковыряния клиента и ЛГЦ выяснилось, что обмен данными между приложениями происходит тривиальным способом на базе Named Pipes - именованных каналов так называемых.
При запуске ЛГЦ создаются два канала: LGCIPC и LGC_IPC. Клиент при запуске видит эти каналы и получает инфо об аккаунте через них от ЛГЦ. Если ЛГЦ не запущен - каналов нет.
Можно этот вопрос было бы порешать написанием "запускатора", который бы создавал точно такие же каналы и пихал бы клиенту инфо об аккаунте. Но так как первый раз у меня авторизация работала через сам клиент, думаю, что тут дело в каком то флаге в реестр прописанном. Найти этот флаг, изменить значение и всё будет как по старому - авторизовываться можно будет через клиент без всякого ЛГЦ.
Пока курю этот вопрос дальше.

0

6

http://cdn-frm-ru.lesta.ru/4.6l/style_images/wg/search_icon.png
Отрублен. Старый форум окончательно снесён. Перезалил иконки все сюда.  :yep:

0

7

В общем как то так оно работает.
Фейковое окно ЛГЦ создаёт именованный канал такой же как и у настоящего ЛГЦ. Ждёт запуска клиента и читает созданный канал.
Клик по ярлыку клиента сам клиент не запускает, но в канале появляется сообщение:
https://upforme.ru/uploads/001c/ae/f6/2/t998967.png
Клиент ждёт ответ(я его пока не знаю, надо другое окно, окно фейкового клиента, собирать и выяснять это у ЛГЦ), или пока не будет закрыто окно ЛГЦ.
После закрытия окна клиент начинает грузиться:
https://upforme.ru/uploads/001c/ae/f6/2/t591573.png

0

8

Если именованный канал существует, в него можно послать сообщение прямо из CMD:

Код:
echo This is message CMD > \\.\pipe\LGC_IPC

Правда в консоли кодировка 866-я. Не заморачивался с кодировками в программе, всё иероглифами отображает, даже латиницу:
https://upforme.ru/uploads/001c/ae/f6/2/t88160.png

0

9

Код фейкового окна ЛГЦ на ассемблере:

Код:
format PE GUI 4.0
entry start

include 'win32w.inc'

section '.text' code readable executable

        start:
                invoke  GetModuleHandle,0
                mov     [wc.hInstance],eax
                invoke  LoadIcon,0,IDI_APPLICATION
                mov     [wc.hIcon],eax
                invoke  LoadCursor,0,IDC_ARROW
                mov     [wc.hCursor],eax
                invoke  RegisterClass,wc
                test    eax,eax
                jz      error

                invoke  CreateWindowEx,0,_class,_title,WS_VISIBLE+WS_DLGFRAME+WS_SYSMENU,128,128,256,192,NULL,NULL,[wc.hInstance],NULL
                test    eax,eax
                jz      error
                
                ;Создаем именованный канал
                invoke CreateNamedPipe, pipeName, PIPE_ACCESS_DUPLEX, PIPE_TYPE_MESSAGE or PIPE_READMODE_MESSAGE or PIPE_WAIT, 1, 1024, 1024, 0, 0
        
        mov [hPipe], eax
                cmp eax, INVALID_HANDLE_VALUE
        je  exit

                ;Ждем подключения клиента
                invoke ConnectNamedPipe, [hPipe], NULL

                ;Читаем данные из канала
                invoke ReadFile, [hPipe], buffer, 1024, bytesRead, 0
                invoke MessageBox, 0, buffer, Caption, MB_OK

        msg_loop:
                invoke  GetMessage,msg,NULL,0,0
                cmp     eax,1
                jb      end_loop
                jne     msg_loop
                invoke  TranslateMessage,msg
                invoke  DispatchMessage,msg
                jmp     msg_loop

        error:
                invoke  MessageBox,NULL,_error,NULL,MB_ICONERROR+MB_OK

        end_loop:
                invoke  ExitProcess,[msg.wParam]
        
        exit:
                invoke ExitProcess, 0

proc WindowProc uses ebx esi edi, hwnd,wmsg,wparam,lparam
                cmp     [wmsg],WM_DESTROY
                je      .wmdestroy
                .defwndproc:
                invoke  DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]
                jmp     .finish
        .wmdestroy:
                invoke  PostQuitMessage,0
                xor     eax,eax
        .finish:
                ret
endp

section '.data' data readable writeable

        _class TCHAR 'Chrome_WidgetWin_0',0
        _title TCHAR 'Lesta Game Center',0
        _error TCHAR 'Startup failed.',0
        wc WNDCLASS 0,WindowProc,0,0,NULL,NULL,NULL,COLOR_BTNFACE+1,NULL,_class
        msg MSG
        Caption TCHAR 'LGC_IPC',0
    pipeName TCHAR '\\.\pipe\LGC_IPC',0 ;LGCIPC, LGC_IPC
    buffer      rb 1024
    bytesRead   dd ?
    hPipe       dd ?

section '.idata' import data readable writeable

        library kernel32,'KERNEL32.DLL', user32,'USER32.DLL'

        include 'api\kernel32.inc'
        include 'api\user32.inc'

0

10

Переписал окошко :)
Теперь окно спрятано в трей, с иконкой глобуса из винды - халявной:
https://upforme.ru/uploads/001c/ae/f6/2/t905664.png
Данные из канала пишутся в файл, кодировки все понимаются:
https://upforme.ru/uploads/001c/ae/f6/2/t587770.png
Два пакета от клиента:
https://upforme.ru/uploads/001c/ae/f6/2/t938831.png

0

11

Код на ассемблере:

Код:
format PE GUI 4.0
entry start

include 'win32a.inc'

section '.data' data readable writeable

    ERROR_NO_DATA = 232
	FILE_APPEND_DATA = 0x0004

    szClass     db 'Widget_Tray_Class',0
    szTitle     db 'Lesta Game Center',0
    szExit      db 'Закрыть программу',0
    
    wc          WNDCLASS
    msg         MSG
    nid         NOTIFYICONDATA
    hMenu       dd ?
    pt  POINT
	szShell32 db 'shell32.dll',0
	
	pipe_name    db '\\.\pipe\LGC_IPC',0
    hPipe        dd ?
    buffer       rb 2048    ; Резервируем 2048 байт
    bytesRead    dd ?
	log_file    db 'log_pipe.txt',0
    hLog        dd ?
    written     dd ?
	crlf        db 0Dh, 0Ah

section '.text' code readable executable
start:
    invoke GetModuleHandle, 0
    mov [wc.hInstance], eax
    mov [wc.lpfnWndProc], WindowProc
    mov [wc.lpszClassName], szClass
    invoke RegisterClass, wc

    invoke CreateWindowEx, 0, szClass, szTitle, 0, \
           0, 0, 0, 0, 0, 0, [wc.hInstance], 0
    mov [nid.hWnd], eax
	
	invoke SetTimer, [nid.hWnd], 1, 500, 0
	
    invoke CreatePopupMenu
    mov [hMenu], eax
    invoke AppendMenu, [hMenu], MF_STRING, 1001, szExit

    mov [nid.cbSize], sizeof.NOTIFYICONDATA
    mov [nid.uID], 1
    mov [nid.uFlags], NIF_MESSAGE or NIF_ICON or NIF_TIP
    mov [nid.uCallbackMessage], WM_USER + 1
    invoke ExtractIcon, [wc.hInstance], szShell32, 13 
    mov [nid.hIcon], eax
    
    invoke Shell_NotifyIcon, NIM_ADD, nid
    
	invoke CreateNamedPipe, pipe_name, PIPE_ACCESS_DUPLEX, \
           PIPE_TYPE_MESSAGE or PIPE_READMODE_MESSAGE or PIPE_NOWAIT, \
           1, 2048, 2048, 0, 0
    mov [hPipe], eax
	
  msg_loop:
    invoke GetMessage, msg, 0, 0, 0
    test eax, eax
    jz end_loop
    invoke DispatchMessage, msg
    jmp msg_loop

  end_loop:
    invoke ExitProcess, 0

proc WindowProc hwnd, wmsg, wparam, lparam
    cmp [wmsg], WM_TIMER
    je .on_timer
    cmp [wmsg], WM_USER + 1
    je .on_tray
    cmp [wmsg], WM_COMMAND
    je .on_command
    cmp [wmsg], WM_DESTROY
    je .on_destroy
    
    invoke DefWindowProc, [hwnd], [wmsg], [wparam], [lparam]
    ret
  .on_timer:
    ; Пытаемся прочитать данные из пайпа
    invoke ReadFile, [hPipe], buffer, 2048, bytesRead, 0
    test eax, eax
    jnz .data_received  ; <--- ЕСЛИ ДАННЫЕ ЕСТЬ, ПРЫГАЕМ СЮДА

    ; Если ReadFile вернул 0, проверяем ошибку
    invoke GetLastError
    cmp eax, ERROR_NO_DATA
    je .finish
    
    ; Если клиент отключился, сбрасываем канал
    invoke DisconnectNamedPipe, [hPipe]
    invoke ConnectNamedPipe, [hPipe], 0
    jmp .finish

  .data_received:        
    mov eax, [bytesRead]
    test eax, eax
    jz .finish

    ; Логика записи в файл
    invoke CreateFile, log_file, FILE_APPEND_DATA, \
           FILE_SHARE_READ, 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0
    mov [hLog], eax
    
    cmp eax, INVALID_HANDLE_VALUE
    je .skip_write

    invoke WriteFile, [hLog], buffer, [bytesRead], written, 0
	;Добавляем перенос строки
	invoke WriteFile, [hLog], crlf, 2, written, 0
	
    invoke CloseHandle, [hLog]

  .skip_write:
    ; Сброс канала для следующего сообщения
    invoke DisconnectNamedPipe, [hPipe]
    invoke ConnectNamedPipe, [hPipe], 0
    jmp .finish
	
  .on_tray:
    cmp [lparam], WM_RBUTTONUP
    jne .finish
    
    invoke SetForegroundWindow, [hwnd]
    
    invoke GetCursorPos, pt
    
    invoke TrackPopupMenu, [hMenu], TPM_RIGHTALIGN, [pt.x], [pt.y], 0, [hwnd], 0
    jmp .finish

  .on_command:
    cmp [wparam], 1001
    jne .finish
    invoke DestroyWindow, [hwnd]
    jmp .finish

  .on_destroy:
    invoke Shell_NotifyIcon, NIM_DELETE, nid
    invoke PostQuitMessage, 0

  .finish:
    xor eax, eax
    ret
endp

section '.idata' import data readable
    library kernel32, 'KERNEL32.DLL', \
            user32,   'USER32.DLL', \
            shell32,  'SHELL32.DLL'

    include 'api\kernel32.inc'
    include 'api\user32.inc'
    include 'api\shell32.inc'

0

12

Ещё один существенный момент. Если ЛГЦ запретить коннектиться к серверам API и авторизации Лесты, то клиент запускается и вход в игру осуществляется.
https://upforme.ru/uploads/001c/ae/f6/2/t308223.png
Логи ЛГЦ - везде ошибки. Никакой авторизации или аутентификации нет. Если что-то и есть, то локальные данные аккаунта на компе пользователя.
При этом клиент спокойно запускается:
https://upforme.ru/uploads/001c/ae/f6/2/t569962.png
https://upforme.ru/uploads/001c/ae/f6/2/t933460.png
https://upforme.ru/uploads/001c/ae/f6/2/t241222.png

0

13

Классическую авторизацию отрубили на сервере.
Залокалхостил один из доменов МТ:

Код:
127.0.0.1	login.p2.tanki.su

Клиент тут же перестал плевать что авторизация возможна только через ЛГЦ
https://upforme.ru/uploads/001c/ae/f6/2/t772153.png
Надо выяснить структуру пакета , которую клиент отправляет серверу авторизации с ЛГЦ. Или сетевой адрес.
Одно из двух, либо в пакет какой-то флаг или параметр добавлен, либо авторизация по другому адресу, который клиенту ЛГЦ передаёт.

0

14

Опачки. А при смене интерфейса в клиенте ЛГЦ свободно авторизуется на на хосте который я выше на локалхост перевёл. О чём свидетельствует отсутствие пинга. :)
https://upforme.ru/uploads/001c/ae/f6/2/t402219.png
https://upforme.ru/uploads/001c/ae/f6/2/t744565.png
https://upforme.ru/uploads/001c/ae/f6/2/t625411.png

Стало быть ЛГЦ пихает клиенту какой то другой адрес для коннекта.

0