ZTE USB Modem Engine Reverse
author : Sanjar Satsura {4k4 S4NJ}
web : http://www.d34dm4st3rs.narod.ru
e-mail I : sacura_08[at]inbox[dot]ru
e-mail II : d34dm4st3rs[at]yandex[dot]ru
e-mail III: sanjar[at]xakep[dot]ru
0x00 Intro
Сегодня я хотел бы поделиться со всем миром о моей недавней реверсерской работе.
Начну с того что вы все наверное уже наслышаны о такой новомодной вещице как USB
модем для интернета (от Beeline,MTS,etc)...
Да и маркетологи не спят во всю изрекламировали этот весьма страноватый продукт...
Почему странноватый споросите вы ?!
А дело все в том, что этот проект является довольно подозрительным и опасным !!!
Итак сегодня я попытаюсь вам объяснить почему он таковым является...
Для лучшего понимания статьи советую скачать исходники:
Начнем с того что этот проект разрабатывали китайцы (ZTE) и как каждый китайский продукт
этот продукт является самим по себе бажным и убогим... Не из-за того что его кодили
неправильные и безмозглые китайцы (а таковы не только китайцы), а потому что этот продукт
был изготовлен на скорую руку и стоит эта технология не совсем то дорого!
На моей родине (Узбекистан) этот модем давно набрал высокие обороты по продаже и на нем
специализируются почти все сотовые операторы(MTS UZ, Beeline UZ, Ucell)...
Первый раз я столкнулся с этим модемом месяца 3 назад и он сразу же меня заинтересовал
своей активностью... Когда я пытался установить этот модем своей подруге, касперыч 2010
сразул предупредил об некой странной активности этого модема... Я на всякий пожарный
снял копию этой проги и спокойно поехал в свою реверсерскую нору.
Приехав домой я сразу начал иследование этой проги и обнаружил не хилую активность
этой в ней=)) Утилиты FileMon & RegMon показали что программа проявляет активное участие в
жизни ОС и её реестра =0 А именно программа производит сканирование ОС (выявляет :
1 Инфо о состоянии свободного пространстве RAM
2 Получает данные о CP
3 Инфо о состоянии COM подсистемы
4 Инфо о параметрах Commnad Line (Командная Строка)
5 Инфо о уровне ID запущенной программы
6 Инфо о кол-во потоков данного процесса
7 Инфо о Формате Даты
8 Инфо о состоянии свободного пространства в жестком диске
9 Инфо о переменных средах ОС
10 Проверка размера программы
11 Инфо о времени ОС
12 Инфо о микропроцессоре
13 Инфо о состоянии автозагрузки
14 Инфо о языке ОС (по умолчанию)
15 Полная системная информация, аналогичная команде systeminfo в cmd.exe
16 Получает информацию о зональной относительности компьютера
17 Здесь получаем SID работающего пользователя
18 А здесь версию программы=))))
а также сканирует внутренее содержание системного диска %systemdrive% командой tree и
производит многие подозрительные действия
) но на этом все это не заканчивается...
А что вы думаете дальше делает эта тварь ?! Правильно ! Передает все собранные данные
на сервер=))))
Реверс этой проги это вполне доказал !!! (все данные присутсвуют в этом архиве).
Вот часть кода (с моими коментами) которая это наглядно демонстрирует :
Я диззасемблировал эту тварь (DLL_Netcard_R.dll) Идой (Idag), кому интересно можетCode:004D35C0 ; Инфо о состоянии COM подсистемы.... 004D35C6 [00000006 BYTES: COLLAPSED FUNCTION j_GetCommState. PRESS KEYPAD "+" TO EXPAND] ; Инфо о параметрах Commnad Line (Командная Строка)... 004D35CC [00000006 BYTES: COLLAPSED FUNCTION j_GetCommandLineA. PRESS KEYPAD "+" TO EXPAND] ; Инфо о уровне ID запущенной программы .... 004D35D2 [00000006 BYTES: COLLAPSED FUNCTION j_GetCurrentProcessId. PRESS KEYPAD "+" TO EXPAND] ; Инфо о кол-во потоков данного процесса ... 004D35D8 [00000006 BYTES: COLLAPSED FUNCTION j_GetCurrentThreadId. PRESS KEYPAD "+" TO EXPAND] ; Инфо о Формате Даты.... 004D35DE [00000006 BYTES: COLLAPSED FUNCTION j_GetDateFormatA. PRESS KEYPAD "+" TO EXPAND] ; Инфо о состоянии свободного пространства в жестком диске.... 004D35E4 [00000006 BYTES: COLLAPSED FUNCTION j_GetDiskFreeSpaceA. PRESS KEYPAD "+" TO EXPAND] ; Инфо о переменных средах ОС... 004D35EA [00000006 BYTES: COLLAPSED FUNCTION j_GetEnvironmentStrings. PRESS KEYPAD "+" TO EXPAND] 004D35F0 00000006 BYTES: COLLAPSED FUNCTION j_GetExitCodeThread. PRESS KEYPAD "+" TO EXPAND] ; Проверка размера программы.... 004D35F6 [00000006 BYTES: COLLAPSED FUNCTION j_GetFileSize. PRESS KEYPAD "+" TO EXPAND]
сам продизассемблировать эту хрень=))...
После анализа этой твари я обнаружил также серёзные баги в её проектирование,
а именно эти баги позволяли нам производить различные несанкционированные действия на
сервере=)))
0x01 БАГ I - Puk & Pin Spoofing:
Эта часть статьи посвященна подделке Puk & Pin кодов при запросе с серверной части программы.
Вот часть кода которая наглядно демонстрирует всё выше сказанное мной :
Вот еще пример который можно использовать для перехватов ключа и для дальнейшего использования поддельных ключей=)):Code:004EBE13 aSimPukRequir_2 db 'SIM PUK Required',0 ; DATA XREF: sub_4CEB04+163 - Функция проверки PUK -кода ; - Посдующее не требует коментариев=)) 004EBE24 aNoUim db 'NO UIM',0 004EBE2B aSimPin_0 db 'SIM PIN',0 004EBE33 aSimPuk_0 db 'SIM PUK',0 004EBE3B aSimPin2 db 'SIM PIN2',0 004EBE44 aSimPuk2 db 'SIM PUK2',0 004EBE4D aSimFailure_0 db 'SIM failure',0 004EBE59 aSimBusy_0 db 'SIM busy',0 004EBE62 aSc_2 db 'SC',0 ; DATA XREF: sub_4CEEF0+B1 004EBE65 aIncorrectPas_3 db 'Incorrect password',0 ; DATA XREF: sub_4CEEF0+134 ; Функция вызова "неправильного пароля" ; она же "правильного запроса" 004EBE78 aSimPukRequir_3 db 'SIM PUK Required',0 ; DATA XREF: sub_4CEEF0+161 - Вот тут функция коректности PUK-кода ; начинающим реверсерам : просто при поиске правильного Puk - кода , сравните правильный результат с Required PUK ; в main процедуре и все будет тип-топ=)) ;Exp: ;cmp aSimPuk_0,aSimPukRequir_3 ; jmp .... [далее на место назначения] 004EBE89 align 4 004EBE8C off_4EBE8C dd offset dword_4CDA95+3 ; DATA XREF: .data:004EBEAC
Далее еще много чего интересного можете найти в исходнике dll_card_reverse_from flash_media.asmCode:004DF26B aSystemCurren_4 db '\SYSTEM\CurrentControlSet\Services\qcusbser\Enum',0 ; Установка ключа для загрузки Сервиса 004DF26B ; DATA XREF: sub_423BB4+B1 USB Modem'a (qcubser) 004DF29C aCount_1 db 'Count',0 ; DATA XREF: sub_423BB4+183 004DF2A2 a1 db '1',0 ; DATA XREF: sub_423BB4+1BD 004DF2A4 a1_0 db '1',0 ; DATA XREF: sub_423BB4+214 004DF2A6 a0_0 db '0',0 ; DATA XREF: sub_423BB4+271 004DF2A8 aSystemCurren_5 db '\SYSTEM\CurrentControlSet\Enum\',0 ; DATA XREF: sub_423BB4+2CD ; Состояние подсистемы 004DF2C8 aDeviceParamete db '\Device Parameters',0 ; DATA XREF: sub_423BB4+335 ; Параметры для устройства 004DF2DB aPortname db 'PortName',0 ; DATA XREF: sub_423BB4+42C ; Названия порта =)))))
0x02 БАГ II - NETCARD PID Exploitation =)) :
Эта часть статьи удивительно уникальна. Дело в том ,что мы используем клиентскую реализацию программы.
Но есть также серверная часть... Здесь подробно приведен код отвечающий за подключение к серверной части
Итак, по всему ниже стоящему коду следует ,что на сервере действует та же система организации что и при организации
прав unix-like системы:
PID 3 - уровень доступа простого пользователя. Права ограничены, так что он может просмаривать только свою учетную запись
PID 2 - уровень доступа с правами Модератора. Права включают в себя просмотр не только своей учетной записи, но и других
пользователей=))) Далее также в права входят редактирование, удаление учетных записей=)))))!!! По мойму круто!!
Но все это ограничивается тем что, вы не можете добавлять учетные записи=(
PID 1 - уровень доступа с правами Администратора. Права не ограничены (ну или почти) ничем. Вы можете удалять,редактировать
вставлять, добавлять учетные записи, все в рамках этой системы=))))
PID 0 - уровень Супер Визора (Супер Администратора). Дает полный контроль над всеми системами связанных с этой системой.=)))
Попросту говоря это права root.
Существует также PID 4 - ну это простой гость не имеющий никаких прав на этом сервере. Так что его мы прсото не включили=))
Итак мы выяснили какие существуюит PID'ы и как они работают, но зачем нам эта инфа ?!
А затем, что когда мы подключаемся (мы входит с правами PID3), но сама программа использует права доступа у серверу с правами
PID2 !!! Да, да!!! вы не ослышались !!! Права модератора, и всё всё всё что они наследуют!!
Также существует возможность получения прав PID1 & PID 0 через баги в проектировании системы, но это уже другая тема=))
А сейчас мы рассмотрим те функции которые отвечают за подключение системы с правами PID 2.
Не терпится посмотреть зырим в исходник (dll_card_reverse_netcardconf.asm):
РАЗ:ДВА:Code:00402C88 ; Получение данных с сетевой карты usb модема 00402C88 public _MEC_GetNetcardInfo 00402C88 _MEC_GetNetcardInfo proc near 00402C88 00402C88 arg_0 = dword ptr 8 00402C88 00402C88 push ebp ; точка подключения заносится в стек=)) 00402C89 mov ebp, esp ; Передаем содержимое указателю стека=)))))) 00402C8B mov eax, dword_4D42F8 ; Передаем в eax удвоенное значение адресса 4D42F8 00402C90 test eax, eax ; Проверка (сравнение) 00402C92 jnz short loc_402C9A ; если не расно 0 , скачем 402C9A 00402C94 mov ax, 9 ; Выпоняем 00402C98 pop ebp ; все конец функции 00402C99 retn ; возврат в точку конца подпрограммы 00402C9A loc_402C9A: ; CODE XREF: _MEC_GetNetcardInfo+A 00402C9A cmp byte ptr [eax+0D0h], 1 ; Сверка ключей =)) 00402CA1 jz short loc_402CA9 ; если да (т.е равно 0) то едем дальше 00402CA3 mov ax, 7; выполняем 00402CA7 pop ebp ; конец функции 00402CA8 retn ; возврат в точку конца подпрограммыИ Наконец ТРИ:Code:00402CE0 ; Здесь проводятся установки SID&NID ; где SID - это ваш ID по подключению и NID - это и есть наш PID 00402CE0 public _MEC_SetNetcardSIDAndNID 00402CE0 _MEC_SetNetcardSIDAndNID proc near 00402CE0 ;;;;;;; Установки для глобальных переменных 00402CE0 arg_0 = dword ptr 8 ; Дес. 8 00402CE0 arg_4 = dword ptr 0Ch ; Дес. 12 00402CE0 arg_8 = dword ptr 10h ; Дес. 16 00402CE0 00402CE0 push ebp ; Заносим в стек=)) 00402CE1 mov ebp, esp ; Вот здесь можно и шелкод сбабахать =))) Запоминаем адресс =D)))) 00402CE3 mov eax, dword_4D42F8 ; Заносим двойное значение генерируемое функцией ... ; по адрессу 4D12F8 00402CE8 test eax, eax ; Проверка 00402CEA jnz short loc_402CF2 ; Прыгаем если да, нет идем дальше 00402CEC mov ax, 9 ; конец подфункции 00402CF0 pop ebp ; выходим 00402CF1 retn ; возврат в основную программу 00402CF2 ; --------------------------------------------------------------------------- 00402CF2 00402CF2 loc_402CF2: ; CODE XREF: _MEC_SetNetcardSIDAndNID+A 00402CF2 cmp byte ptr [eax+0D0h], 1 ; Сравнение везде одно и тоже, так что поломав одну функцию 00402CF9 jz short loc_402D01 ; с легкостью ломаем следующую (т.к они писались достаточно 00402CFB mov ax, 7 ; одинаково) 00402CFF pop ebp 00402D00 retn 00402D01 ; --------------------------------------------------------------------------- 00402D01 loc_402D01: ; CODE XREF: _MEC_SetNetcardSIDAndNID+19 00402D01 mov edx, [ebp+arg_8] ; MOV в роли LEA =)))) 00402D04 push edx ; Заносим EDX 00402D05 mov ecx, [ebp+arg_4] ; Берутся те самые ключи занесенные в регистр ebp 00402D08 mov edx, [ebp+arg_0] ; и заносятся путем попутного шифрования =))) ; mov ecx, [ebp+arg_4] == mov ecx,[ebx+ 12] (см. выше)=))) 00402D0B call sub_40B544 ; Вызов подфункции 00402D10 pop ebp ; Выходим из процедуры 00402D11 retn 00402D11 _MEC_SetNetcardSIDAndNID endpПомойму достаточно доказательств ужасного бага =)) нет ?! Тогда копайте исходник =D))!Code:00402E20 ; Exported entry 72. _MEC_SetNetcardPwd 00402E20 ; Установки для пароля 00402E20 ; --------------- S U B R O U T I N E --------------------------------------- 00402E20 00402E20 ; Attributes: bp-based frame 00402E20 00402E20 public _MEC_SetNetcardPwd 00402E20 _MEC_SetNetcardPwd proc near 00402E20 00402E20 arg_0 = dword ptr 8 00402E20 00402E20 push ebp ; Можно выловить пасс 00402E21 mov ebp, esp ; Здесь он попадает в стек так что можно снять pwd (pass) 00402E23 mov eax, dword_4D42F8 ; LordPE (простым дампом) 00402E28 test eax, eax ; Вносит пароль по умолчанию и тестирует 00402E2A jnz short loc_402E32 ; если поменять инструкцию jnz на jz можно без проблем 00402E2C mov ax, 9 ; проходить на сервер 00402E30 pop ebp 00402E31 retn 00402E32 ; --------------------------------------------------------------------------- 00402E32 00402E32 loc_402E32: ; CODE XREF: _MEC_SetNetcardPwd+A 00402E32 cmp byte ptr [eax+0D0h], 1 ; /// Та же самая проверка =)) 00402E39 jz short loc_402E41 00402E3B mov ax, 7 00402E3F pop ebp 00402E40 retn 00402E41 ; --------------------------------------------------------------------------- 00402E41 00402E41 loc_402E41: ; CODE XREF: _MEC_SetNetcardPwd+19 00402E41 mov edx, [ebp+arg_0] 00402E44 call sub_40B5A4 00402E49 pop ebp 00402E4A retn 00402E4A _MEC_SetNetcardPwd endp 0402F24 ; Exported entry 78. _MEC_ChangeNetcardLockPwd 00402F24 ; Установки для изменения PWD (пароля) ; Вот и все перехватываем esp и дело в шляпе =D 00402F24 ; --------------- S U B R O U T I N E --------------------------------------- 00402F24 00402F24 ; Attributes: bp-based frame 00402F24 00402F24 public _MEC_ChangeNetcardLockPwd 00402F24 _MEC_ChangeNetcardLockPwd proc near 00402F24 00402F24 arg_0 = dword ptr 8 00402F24 arg_4 = dword ptr 0Ch 00402F24 00402F24 push ebp ; Ни чем не скрывается 00402F25 mov ebp, esp 00402F27 mov eax, dword_4D42F8 00402F2C test eax, eax 00402F2E jnz short loc_402F36 00402F30 mov ax, 9 00402F34 pop ebp 00402F35 retn
0x03 БАГ IV - Remote SQL Injection
И напоследок очень серьёзный баг в проектировании системы который позволяет производить произвольные
SQL-иньекции в билинговой системе соединеной через серверную часть программы...
Этот пример демонстрирует также взаимосвязь серверной части ZTE USB-modem Engine с другими
компонентами системы=)) Это поможет вам ориентироваться в системе в целом =)))
Далее расмотренны возможные реализации атак:
РАЗ:ДВА:Code:004D4767 unk_4D4767 db 5Ch ; \ ; DATA XREF: sub_405248+113 ; Слеш который может помочь ; при организации null(x00) байтов 004D4768 db 0 ; ; %d 004D4769 aDb_dat_0 db 'db.dat',0 ; DATA XREF: sub_405248+13D ; Файл куда скидываются временные данные 004D4792 aDataSource db 'Data Source=',0 ; DATA XREF: sub_405248+1F1 ; Указатель на db.dat (temp database) 004D479F asc_4D479F db ';',0 ; DATA XREF: sub_405248+1FF ; 004D47A1 aPersistSecurit db 'Persist Security Info=False',0 ; DATA XREF: sub_405248+264 ; Состояние Информационной службы ; по умолчанию отключён... =))))ТРИ :Code:..... 04D47D5 aSmsindex db 'Smsindex',0 ; DATA XREF: sub_405768+46 ; ID индекса (номер по счету) 004D47DE aCodetype db 'CodeType',0 ; DATA XREF: sub_405768+82 ; Код региона(компании) Exp:+998-65 004D47E7 aLocation db 'Location',0 ; DATA XREF: sub_405768+C0 ; Направление (регион) 004D47F0 aStatus db 'Status',0 ; DATA XREF: sub_405768+FE ; Статус (отправлен или нет) 004D47F7 aIsconcat db 'IsConcat',0 ; DATA XREF: sub_405768+13C ; Каталог Контакта 004D4800 aConcatrefindex db 'ConcatRefIndex',0 ; DATA XREF: sub_405768+177 ; Активность клиента 004D480F aConcattotalmou db 'ConcatTotalMount',0 ; DATA XREF: sub_405768+1B3 ; Общее кол-во отпрваленных 004D4820 aConcatseq db 'ConcatSeq',0 ; DATA XREF: sub_405768+1EE ; Sequens =D 004D482A aContent db 'Content',0 ; DATA XREF: sub_405768+229 ; Содержание =)))))) 004D4832 aSender db 'Sender',0 ; DATA XREF: sub_405768+2AB ; Отправитель 004D4839 aReceiver db 'Receiver',0 ; DATA XREF: sub_405768+32A ; Получатель 004D4842 aSendtime db 'SendTime',0 ; DATA XREF: sub_405768+3AF ; Время отправки 004D484B aRecvtime db 'RecvTime',0 ; DATA XREF: sub_405768+428 ; Время получения СМС =))) 004D4854 aSmscentre db 'SMSCentre',0 ; DATA XREF: sub_405768+4A1 ; SMS Центр 004D485E aIndexid db 'indexID',0 ; DATA XREF: sub_405CAC+2D ; ID индекса 004D4866 aGroupid db 'GroupID',0 ; DATA XREF: sub_405CAC+77 ; ID Группы. Exp: User, Moderator, Administrator 004D486E aLocation_0 db 'Location',0 ; DATA XREF: sub_405CAC+B5 ; Направление СМС 004D4877 aAnumber db 'ANumber',0 ; DATA XREF: sub_405CAC+F6 ; Номер контакта exp: 6660666 =))) 004D487F aName db 'Name',0 ; DATA XREF: sub_405CAC+138 ; Имя контакта на кого зарегистрован номер;-)) 004D4884 aCompany db 'Company',0 ; DATA XREF: sub_405CAC+1C0 ; Компания. Exp: beeline ,mts , etc... .....В действительности запросы могут выглядеть следующим образом :Code:; Это запрос типа : select count(*)as Total from SMS where Location=%d ; %d = 0(по умочанию) см. адресс:004D4768, ; также %d может быть любой цифрой (организации в С) 004D4A9A aSelectCountAsT db 'select count(*) as Total from SMS where Location=%d;',0 ; Запрос помогает 004D4A9A ; DATA XREF: sub_407D9C+21 ; вытаскивать любое СМС из базы ; Запрос парсится путем прибавления данных (mov eax,0; mov ebx,1, add eax,ebx) ; Таким образом организованны некоторые запросы снизу ; А у нас получилось : select count(*) as Total from SMS where Status=%d and Location=%d; где %d = 0 004D4ACF aSelectCountA_0 db 'select count(*) as Total from SMS where Status=%d and Locati' ; Вытаскивает все СМС где статус равно 004D4ACF ; DATA XREF: sub_407D9C+40 ; %d - любая цифра... 004D4ACF db 'on=%d;',0 ; И выше стоящий Location = %d, %d - любая цифра 004D4B12 aTotal db 'Total',0 ; DATA XREF: sub_407D9C+87 004D4B18 aSelectFromSmsW db 'select * from SMS where Location = %d',0 ; Выборка СМС 004D4B18 ; DATA XREF: sub_407E6C+50 004D4B3E aSelectFromSm_0 db 'select * from SMS where Status = %d and Location = %d',0 004D4B3E ; DATA XREF: sub_407E6C+72 004D4B74 aDeleteFromSmsW db 'delete * from SMS where Smsindex = %d and Location = %d',0 ; Удаление СМС =)))))) 004D4B74 ; DATA XREF: sub_408010+19 004D4BAC aDeleteFromSm_0 db 'delete * from SMS where Location = %d',0 004D4BAC ; DATA XREF: sub_408078+1A 004D4BD2 aDeleteFromSm_1 db 'delete * from SMS where Status = %d and Location = %d',0 004D4BD2 ; DATA XREF: sub_408078+38 004D4C08 aUpdateSmsSetSt db 'update SMS set Status=%d where Smsindex = %d and Location =' ; Изменить СМС-ку ?! =D 004D4C08 ; DATA XREF: sub_408100+29 004D4C08 db ' %d',0
select count(*)as Total from SMS where Location=998657231001 - вытаскивает все СМС-ки абонента (UZB MTS) 7231001
ЧЕТЫРЕ :SQL запрос может выглядеть так :Code:; А теперь CDR ; Разговариваем сколько угодно и меняем значение времени на 0:01 =))) ; И платим гроши=)) Или звоним куда надо и потом меняем номера и все =)))) ; Делаем что хотим =D))) ; повторяю %d - число (целое,натуральное) ; %f - число с плавающей запятой; PS: ИЗ Си %f - float 004D4DF4 aSelectFromCdrW db 'select * from CDR where Location=%d;',0 004D4DF4 ; DATA XREF: sub_408430+17 004D4E19 aSelectFromCd_0 db 'select * from CDR where CDRType=%d and Location=%d;',0 004D4E19 ; DATA XREF: sub_408430+36 004D4E4D aDeleteFromCdrW db 'delete * from CDR where Location = %d;',0 004D4E4D ; DATA XREF: sub_4084FC+1A 004D4E74 aDeleteFromCd_0 db 'delete * from CDR where CDRType = %d and Location = %d;',0 004D4E74 ; DATA XREF: sub_4084FC+38 004D4EAC aInsertIntoCdrI db 'insert into CDR(indexID,PhoneNumber,RecordName,RecordTime,Du' 004D4EAC ; DATA XREF: sub_408584+56 004D4EAC db 'ration,DurationActive,TXBytes,RXBytes,Location,CDRType)value' 004D4EAC db 's(%d,:PhoneNumber,:RecordName,:RecordTime,%d,%d,%f,%f,%d,%d)' 004D4EAC db ';',0 004D4F62 aDeleteFromCd_1 db 'delete * from CDR where indexID = %d and Location = %d;',0 004D4F62 ; DATA XREF: sub_408654+18 004D4F9A aSelectCountA_3 db 'select count(*) As Total from PhoneBook where Location = %d',0 004D4F9A ; DATA XREF: sub_4086BC+1A 004D4FD6 aTotal_1 db 'Total',0 ; DATA XREF: sub_4086BC+64PS: + - это знак продолжения строкиCode:insert into CDR(666,7231001,Hacker,11:00,00:01,00:01,0,0,0,SIM)values+ +(666,:+998657230666,:Hax0r,:00:01,0,0,0.0,0.0,0.0,0.0)
И наконец ПЯТЬ !!! :
0x04 Заключение:Code:; переменные которые можно вводить с телефона (например запрос для shtrom атаки=)))) 004D7BEC a0123456789ppht db '0123456789pPHT+*#',0 ; DATA XREF: sub_40D490+29 004D7BFE aEI db '-T=е¦+Tы',0 ; DATA XREF: sub_40D490+98 004D7C07 unk_4D7C07 db 0CAh ; ¦ ; DATA XREF: sub_40D490+AA
Итак сегодня мы с вами рассмотрели USB модем от ZTE... Ну и какие впечатления ?!
Надеюсь статья вам понравилась и мои старанья не пропали зря...
Эта статья является поучительной, так что за любое несанкционнированое действие
направленное против закона я отвественности не несу!!!
Наверное каждый из нас сделал для себя выводы (и разработчки и пользователи), так что
без обид ok =))
С вами был тот же 4k4 S4NJ,S4(uR4_13l@(kH@(k3R_XxX, Sanjar Satsura, etc...
Gr33tz: m3=))) & FBI =)))) & 4ll p30pl3 wh0 kn0w m3=)))
Fuckzz: 4ll $tup1d b0t of our b1g W0RLD=))



Reply With Quote
Thanks
