|
Опкоды, Формулы, Клиент Разбор и изучение взаимодействия клиента с сервером |
|
Опции темы | Поиск в этой теме | Опции просмотра |
27.05.2011, 08:52 | #201 |
Умный
Регистрация: 17.06.2010
Сообщений: 397
Сказал(а) спасибо: 58
Поблагодарили 55 раз(а) в 38 сообщениях
|
Я правильно понимаю принцип декриптации:
первые 4(из них 2 без опкодных) пакет не зашифрованы. Начиная с пятого идут шифрованные пакеты. Для расшифровки нам нужны сиды из пакета аутентификации и сессион кей. С помощью этого расшифровываем пакета. Все верно или я что-то упустил? |
27.05.2011, 09:57 | #203 |
Умный
Регистрация: 17.06.2010
Сообщений: 397
Сказал(а) спасибо: 58
Поблагодарили 55 раз(а) в 38 сообщениях
|
А, т.е первые 4 все же зашифрованы, но default сидами
|
27.05.2011, 09:59 | #204 |
RuDB Dev
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
|
нет, они не зашифрованы, просто после них надо декриптовать с default сидами, а уже после установки новых коннектов - вытаскивать из пакетов.
|
27.05.2011, 14:14 | #205 |
Умный
Регистрация: 17.06.2010
Сообщений: 397
Сказал(а) спасибо: 58
Поблагодарили 55 раз(а) в 38 сообщениях
|
Так пакет с сидами идет почти с сразу. Он то ли третий, то ли четвертый. или мы его пропускаем и ждем такой же следующий? А до него все расшифровываем default сидами
|
27.05.2011, 16:38 | #206 | |
Супер-модератор
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
|
Цитата:
|
|
27.05.2011, 16:54 | #207 |
Умный
Регистрация: 02.07.2010
Сообщений: 434
Сказал(а) спасибо: 27
Поблагодарили 73 раз(а) в 45 сообщениях
|
|
28.05.2011, 16:59 | #208 |
Умный
Регистрация: 17.06.2010
Сообщений: 397
Сказал(а) спасибо: 58
Поблагодарили 55 раз(а) в 38 сообщениях
|
1.Хм, если я решу сменить реалм не входя в игру, то у меня откроется новое соединение. Получается для пакетов с этого соединения надо будет использовать сиды из пакета? Или только для игровых пакетов, которые идут при входе на персонажа????
2.Как отследить время, когда надо закрывать соединение? Единственное что приходит в голову, там это смотреть когда придет реконект пакет и закрывать соединение, с которого оно пришло Последний раз редактировалось Lordronn; 28.05.2011 в 17:41. |
29.05.2011, 12:23 | #209 | |
Умный
Регистрация: 02.07.2010
Сообщений: 434
Сказал(а) спасибо: 27
Поблагодарили 73 раз(а) в 45 сообщениях
|
Цитата:
ничего не нужно отслеживать, клиент сам все закрывает |
|
Пользователь сказал cпасибо: | Lordronn (29.05.2011) |
07.07.2011, 09:00 | #210 |
Умный
Регистрация: 02.07.2010
Сообщений: 434
Сказал(а) спасибо: 27
Поблагодарили 73 раз(а) в 45 сообщениях
|
Наконец-то на работе смог зайти в ВоВ после патча 4.2.
Близы что-то накосячили с поддержкой uPnP, получилось зайти в мир только после того как отключил в ADSL модеме поддержку uPnP. Хотя может это DLINK криво этот протокол реализовал в модеме... Поправил снифер до 14333 билда, собственно все как обычно: новые опкоды, новый адрес ключа, новый порядок сборки сидов |
07.07.2011, 12:16 | #211 |
Умный
Регистрация: 17.06.2010
Сообщений: 397
Сказал(а) спасибо: 58
Поблагодарили 55 раз(а) в 38 сообщениях
|
Везет, а я с 4.1.0 совокуплялся дня 3 без перерыва. Так и не собрал нормальный декриптор.
|
07.07.2011, 15:04 | #212 |
Умный
Регистрация: 02.07.2010
Сообщений: 434
Сказал(а) спасибо: 27
Поблагодарили 73 раз(а) в 45 сообщениях
|
пиши сюда в чем затык, буду подсказывать
|
07.07.2011, 16:35 | #213 |
Умный
Регистрация: 17.06.2010
Сообщений: 397
Сказал(а) спасибо: 58
Поблагодарили 55 раз(а) в 38 сообщениях
|
Решил переписать его почти с 0. Оставлю только саму прокси часть и мемори ридер. Начал с обнаружения сессион кея. Надеюсь я все верно нашел
Код:
public long SessionKey = 0x00D7DA5C; |
07.07.2011, 18:45 | #214 | |
Умный
Регистрация: 17.06.2010
Сообщений: 397
Сказал(а) спасибо: 58
Поблагодарили 55 раз(а) в 38 сообщениях
|
Пошаманил я с декриптором, но оценить работу не могу ввиду отсутствия многих данных. Я пока смог найти только 2 пакета:
Код:
SMSG_AUTH_CHALLENGE = 35856, CMSG_AUTH_SESSION = 10656, Дальше он ничего не уловил, что и не странно. В 4.2.0 SMSG_AUTH_CHALLENGE порядок чтения сидов тотже? Я пытался выяснить это сам с помощью ИДЫ, но ничего толком не понял в этом обработчике
|
|
07.07.2011, 20:44 | #215 | |
Умный
Регистрация: 02.07.2010
Сообщений: 434
Сказал(а) спасибо: 27
Поблагодарили 73 раз(а) в 45 сообщениях
|
Адрес ключа верный.
Сборка сидов совершенно ясно описана в функции
С опкодами еще проще, в первом соединении после дурацких безопкодных пакетов идут подряд SMSG_AUTH_CHALLENGE CMSG_AUTH_SESSION А во втором SMSG_AUTH_CHALLENGE CMSG_AUTH_NEW_SESSION (или как у тебя называется CMSG_AUTH_CONTINUED_SESSION ) Последний раз редактировалось Йоха; 07.07.2011 в 21:06. |
|
07.07.2011, 21:30 | #216 |
Умный
Регистрация: 17.06.2010
Сообщений: 397
Сказал(а) спасибо: 58
Поблагодарили 55 раз(а) в 38 сообщениях
|
Ясно, а я пытался разобраться в PH_SMSG_AUTH_CHALLENGE)
А как быть с ASLR? Читаю и получаю одни нули. Читаю после AUTH_NEW_SESSION Сделать как говорит Константин не получается, из-за отсутствия в реестре MoveImages на Win7 x64 Ultimate. Использовал глаза и поиск - нету. Дебаг привилегия присутствует Последний раз редактировалось Lordronn; 07.07.2011 в 21:35. |
07.07.2011, 21:38 | #217 |
Умный
Регистрация: 02.07.2010
Сообщений: 434
Сказал(а) спасибо: 27
Поблагодарили 73 раз(а) в 45 сообщениях
|
Ну правильно, его там нет по умолчанию, создай этот параметр
Или используй метод чтения памяти процесса с учетом ASLR, тут на форуме где-то была тема, там я и ТОМ_РУС выкладывали решение, вот тема Последний раз редактировалось Йоха; 07.07.2011 в 21:40. |
08.07.2011, 13:34 | #218 |
Умный
Регистрация: 17.06.2010
Сообщений: 397
Сказал(а) спасибо: 58
Поблагодарили 55 раз(а) в 38 сообщениях
|
А может быть такое, что пакет разбило не на 2 части, а на 21? Я тут сделал вывод информации дабы посмотреть. Увидел что 1 пакет разбили на 22 части.
|
08.07.2011, 13:45 | #219 |
Умный
Регистрация: 02.07.2010
Сообщений: 434
Сказал(а) спасибо: 27
Поблагодарили 73 раз(а) в 45 сообщениях
|
Конечно может.
Данные приходят в программу по протоколу TCP, а уж пакеты ВоВ собирай сам. Нет никакого правила какими кусками данные будут поступать в твою программу, это зависит от типа подключения, загруженности канала, сетевого оборудования, настроек сети, провайдера и еще фиг знает от чего. Например у меня проверяется в таком порядке: 0. Получаем данные с сокета, копируем в буфер. 1. Ожидаем недостающие данные или ждем начало нового пакета? 2. Хватает данных для обработки заголовка пакета ? (размер данных минимум 4 байта (сервер) или 6 (клиент), если нет то переходим к 0. 3. Проверка на "большой" пакет 4. Хватат ли данных для большого пакета ? (плюс 1 байт), если нет то переходим к 0. 5. В этом месте уже ясно что за опкод и размер пакета. Следовательно ждем данные равные размеру пакета 6. Пакет есть в буфере целиком - обрабатываем его, если нет то переходим к 0. 7. Повторяем с пункта 2 пока данные в буфере не закончились, иначе переходим к 0. Последний раз редактировалось Йоха; 08.07.2011 в 14:00. |
08.07.2011, 14:22 | #220 |
Умный
Регистрация: 17.06.2010
Сообщений: 397
Сказал(а) спасибо: 58
Поблагодарили 55 раз(а) в 38 сообщениях
|
У меня почти также. Осталось побороть ASLR. Не очень понял зачем нужен BaseAddress в C#. Для чтения я прибегнул к функции ReadProcessMemory из библиотеки kernel32.
В ХР я читал так Код:
public byte[] ReadSessionKey() { using (ProcessMemoryReader reader = new ProcessMemoryReader("wow")) { return reader.Read(reader.ReadInt(_wow.SessionKey) + _wow.Offset, 40L); } } Код:
public long SessionKey = 0x00D7DA5C; public long Offset = 0x508; |
08.07.2011, 15:39 | #221 |
Умный
Регистрация: 02.07.2010
Сообщений: 434
Сказал(а) спасибо: 27
Поблагодарили 73 раз(а) в 45 сообщениях
|
По умолчанию в виндах до версии 7 процесс загружается в память по виртуальному адресу 0x00400000, и этот адрес не меняется для всех программ (если не предпринимать специальных действий для этого).
В семерке поменяли механизм загрузки процессов в память и теперь (при включеном ASLR, а он по умолчанию включен) базовый адрес выбирает неким случайным образом винда. И адрес 0x00D7DA5C который мы берем из IDA (которая тоже предполагает что процесс грузится по адресу 0x00400000) будет неверным если винда выберет любой другой базовый адрес. Что бы исправить это недоразумение вычисляем смещение адреса ключа относительно базового адреса 0x00400000 (0x00D7DA5C - 0x00400000 = 0x0097DA5C). В снифере получаем BaseAdress процесса wow.exe, прибавляем к нему полученный 0x0097DA5C и получаем валидный адрес по которому находится ключ в памяти с учетом ASLR. Последний раз редактировалось Йоха; 08.07.2011 в 19:58. |
08.07.2011, 16:51 | #222 |
Умный
Регистрация: 17.06.2010
Сообщений: 397
Сказал(а) спасибо: 58
Поблагодарили 55 раз(а) в 38 сообщениях
|
Собственно с ключем вроде разобрался благодаря Косте! Хотяя вроде все ровно не тот ключ, ибо после разбора пакетов получаю большой размер.Йоха, можешь кинуть лог я посмотрю правильно ли декриптую или нет по номерам опкодов
Последний раз редактировалось Lordronn; 08.07.2011 в 18:55. |
08.07.2011, 18:58 | #223 |
Ученый
Регистрация: 02.04.2010
Сообщений: 237
Сказал(а) спасибо: 41
Поблагодарили 99 раз(а) в 44 сообщениях
|
__________________
SpellWork Qt4 |
08.07.2011, 19:47 | #224 | |
Умный
Регистрация: 02.07.2010
Сообщений: 434
Сказал(а) спасибо: 27
Поблагодарили 73 раз(а) в 45 сообщениях
|
Цитата:
ну вот, включил вывод отладочной информации в консоль (это логин до состояние окна выбора персонажа): Код:
ready connect 195.12.234.53:80 close 195.12.234.53:80 connect 213.248.127.130:1119 connect 195.12.246.220:3724 * StartSession S opcode=0x0000 len= 48 , ip = 195.12.246.220:3724 (009C) C opcode=0x0000 len= 48 , ip = 195.12.246.220:3724 (009C) S opcode=0x8C10 len= 39 , ip = 195.12.246.220:3724 (009C) C opcode=0x29A0 len= 360 , ip = 195.12.246.220:3724 (009C) got key S opcode=0xBEFB len= 14 , ip = 195.12.246.220:3724 (009C) S opcode=0x0B27 len= 882 , ip = 195.12.246.220:3724 (009C) S opcode=0x6AAE len= 262 , ip = 195.12.246.220:3724 (009C) S opcode=0xA237 len= 6 , ip = 195.12.246.220:3724 (009C) S opcode=0x7E72 len= 34 , ip = 195.12.246.220:3724 (009C) S opcode=0x0410 len= 271 , ip = 195.12.246.220:3724 (009C) connect 195.12.246.219:3724 S opcode=0x0000 len= 48 , ip = 195.12.246.219:3724 (0104) C opcode=0x0000 len= 48 , ip = 195.12.246.219:3724 (0104) S opcode=0x8C10 len= 39 , ip = 195.12.246.219:3724 (0104) C opcode=0x01A0 len= 40 , ip = 195.12.246.219:3724 (0104) C opcode=0xF226 len= 4 , ip = 195.12.246.220:3724 (009C) C opcode=0x1091 len= 4 , ip = 195.12.246.220:3724 (009C) C opcode=0xB6E2 len= 8 , ip = 195.12.246.220:3724 (009C) S opcode=0x8490 len= 6 , ip = 195.12.246.220:3724 (009C) C opcode=0x09A0 len= 8 , ip = 195.12.246.220:3724 (009C) S opcode=0x0C10 len= 2 , ip = 195.12.246.219:3724 (0104) C opcode=0x0920 len= 8 , ip = 195.12.246.220:3724 (009C) close 195.12.246.220:3724 S opcode=0x3C02 len= 331 , ip = 195.12.246.219:3724 (0104) C opcode=0x7E3B len= 8 , ip = 195.12.246.219:3724 (0104) C opcode=0x7E3B len= 8 , ip = 195.12.246.219:3724 (0104) C opcode=0x7E3B len= 8 , ip = 195.12.246.219:3724 (0104) S opcode=0xAA66 len= 505 , ip = 195.12.246.219:3724 (0104) S opcode=0xAA66 len= 146 , ip = 195.12.246.219:3724 (0104) S opcode=0xAA66 len= 611 , ip = 195.12.246.219:3724 (0104) S opcode=0x7A36 len= 39 , ip = 195.12.246.219:3724 (0104) C opcode=0xE2FB len= 5 , ip = 195.12.246.219:3724 (0104) S opcode=0x7A36 len= 505 , ip = 195.12.246.219:3724 (0104) S opcode=0x7A36 len= 505 , ip = 195.12.246.219:3724 (0104) S opcode=0x7A36 len= 505 , ip = 195.12.246.219:3724 (0104) S opcode=0x7A36 len= 505 , ip = 195.12.246.219:3724 (0104) S opcode=0x7A36 len= 505 , ip = 195.12.246.219:3724 (0104) S opcode=0x7A36 len= 505 , ip = 195.12.246.219:3724 (0104) S opcode=0x7A36 len= 505 , ip = 195.12.246.219:3724 (0104) S opcode=0x7A36 len= 505 , ip = 195.12.246.219:3724 (0104) Я c# не знаю вообще, пишу на с++. Ну а механизмы они от языка не зависят -) Почитай эту тему с начала, тут очень много полезной информации, я сам начал писать снифер с нуля читая эту тема и задавая вопросы про непонятные места. Если что неясно, спрашивай, всегда готов ответить на вопросы. Последний раз редактировалось Йоха; 08.07.2011 в 20:15. |
|
08.07.2011, 22:57 | #225 | |
Умный
Регистрация: 17.06.2010
Сообщений: 397
Сказал(а) спасибо: 58
Поблагодарили 55 раз(а) в 38 сообщениях
|
Те, которые не зашифрованны идут нормально, что и не странно, а вот дальше идет бред. Размер самого пакета 16 байт, а после декриптовки получаю 17кб, при том что это пакет целый, а не частичный.
Уже перебрал все возможные варианты происходящего, но ничего не помогло. Размер и опкоды коряво определяются.
|
|
08.07.2011, 22:59 | #226 |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
|
значит ключ неправильный.
|
08.07.2011, 23:03 | #227 |
Умный
Регистрация: 17.06.2010
Сообщений: 397
Сказал(а) спасибо: 58
Поблагодарили 55 раз(а) в 38 сообщениях
|
Я пропатчил реестр дабы вырубить ASLR, Йоха подтвердил что адрес верный. Чтение ключа идет верно
|
09.07.2011, 08:33 | #228 |
Умный
Регистрация: 02.07.2010
Сообщений: 434
Сказал(а) спасибо: 27
Поблагодарили 73 раз(а) в 45 сообщениях
|
|
09.07.2011, 13:30 | #229 | |
Умный
Регистрация: 17.06.2010
Сообщений: 397
Сказал(а) спасибо: 58
Поблагодарили 55 раз(а) в 38 сообщениях
|
|
|
09.07.2011, 14:23 | #230 |
Супер-модератор
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
|
Костя видимо вам скинул мой старый код от 4.0.6. Он не предназначен для работы с 4.1.0+.
|
09.07.2011, 16:59 | #231 |
Умный
Регистрация: 17.06.2010
Сообщений: 397
Сказал(а) спасибо: 58
Поблагодарили 55 раз(а) в 38 сообщениях
|
Простите, а вы рабочем не поделитесь?
|
09.07.2011, 23:12 | #232 |
Супер-модератор
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
|
Напишите самостоятельно.
|
12.07.2011, 09:59 | #233 |
Умный
Регистрация: 02.07.2010
Сообщений: 434
Сказал(а) спасибо: 27
Поблагодарили 73 раз(а) в 45 сообщениях
|
Посетила мысль сделать очередной вариант снифера -) На этот раз он самодостаточен.
Тип - перехват функций WIN32 API. Перехватываются соответственно winsock функции: bind, connect, recv, send. Возможно что-то еще надо будет перехватывать ... там разберемся. Преимущества такого подхода в том что не нужно городить огород из проксификаторов или подобных программ, ну и конечно то что можно влиять на происходящее - подменять данные, адреса и т.д. на лету. К тому же разбор данных не усложняется, а остается такой же как в прокси варианте снифера. Мы так же получаем готовые данные с сокета. И еще немаловажный момент - с точки зрения API все делается легально, никаких "грязных хаков" -). Память процесса wow.exe не меняется, warden спокойно курит. На данный момент опытный образец успешно отлавливает требуемые функции, и вызывает оригинальные из ws2_32.dll. Вов работает, логинится в мир и все выглядит как будто ничего не происходит. |
12.07.2011, 10:56 | #235 | |
Умный
Регистрация: 02.07.2010
Сообщений: 434
Сказал(а) спасибо: 27
Поблагодарили 73 раз(а) в 45 сообщениях
|
Цитата:
В моем варианте просто перехват функций API, с сетевой моделью никак не связано, перехват осуществляется так же как и для любой другой функции. Кстати посмотрел wow.exe импортирует функции из wininet.dll, видимо загружает файлы с веб сервера при помощи InternetreadFileExA, надо проверить что он там загружает и если что, то можно сделать сохранялку этих файлов себе куда-нибудь. |
|
12.07.2011, 15:37 | #236 |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
|
винапишный хук по моему близзами палится.
все таки на данный момент безопасным способом является либо прокси/проксификатор, либо pcap/pssdk. самым скрытым и неспалеваемым способом по прежнему остается "четвертое поколение" (LSP), т.к. работает на уровне ос, куда приложению не добраться. |
12.07.2011, 15:52 | #237 |
Умный
Регистрация: 02.07.2010
Сообщений: 434
Сказал(а) спасибо: 27
Поблагодарили 73 раз(а) в 45 сообщениях
|
У меня не хук, это раз
Перехват API можно делать разными способами это два Первый - правка таблицы импорта - палево, ибо изменяется память процесса Второй - splicing - не все антивирусы даже палят такое дело. меняется код самой API функции Ну и как показывает практика, вов нормально работает. Насчет бесплалевности LSP весьма сомнительно... Ничто не мешает близам запустить во время работы вов драйвер и спалить все потроха ОС и все что хочешь... Последний раз редактировалось Йоха; 12.07.2011 в 16:19. |
12.07.2011, 22:33 | #238 |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
|
сплайсинг сам по себе тоже по сути хук. причем при кажущейся перспективности - один хрен в чужой процесс лезть надо. то есть инжект. а дальше пошло поехало: ридПроцессМемори, РайтПроцессМемори, проблемы ASLR и тд и тп. насчет антивирусов - они это палят только в путь, особенно если реализация сделана баяном с прологом в 5 байт, антивирусы (все) проверяют прологи на джамп за пределы модуля.
беспалевность LSP без всякого сомнения вытекает из самой технологии. никакое приложение не видит и не может видеть этого уровня. что бы близы запустили на моей машине драйвер, они должны будут его проинсталить. а это права администратора и мое на то разрешение - как минимум. ты что, близзов сожрут нахрен с потрохами, если они начнут лезть в ядро системы. очень и очень много параноиков, трясущихся за свою ******у на винте и пароли от одноклассников. |
Пользователь сказал cпасибо: |
13.07.2011, 07:18 | #239 |
Гость
Сообщений: n/a
|
|
13.07.2011, 07:24 | #240 |
Умный
Регистрация: 02.07.2010
Сообщений: 434
Сказал(а) спасибо: 27
Поблагодарили 73 раз(а) в 45 сообщениях
|
ASLR - проблема это только проблема если атакуется комп через сеть, когда нет доступа к компьютеру.
Если атака делается уже с этого компьютера то базовый адрес приложения вычисляется тремя строчками кода. Так что никакой проблемы на самом деле нет. Все остальное верно, но не существенно. Так сказать на летные характеристики не влияет. Я уже реализовал подход с перехватом как ты говоришь "баянистым" -) путем джампа на месте стандартного пролога. и все чудесно, антивирь молчит, вов играет, я получаю данные. Кстати есть такая штука: detours - автор сама MS, сейчас это монстрило стоит 10к зелени, но первый ее простой вариант в виде одного .h и 1 .cpp файла прекрасно справляется с поставленой задачей |