Сейчас на форуме: vsv1, NIKOLA, r0lka, johnniewalker (+5 невидимых)

 eXeL@B —› Крэки, обсуждения —› Поиск адреса для перехвата POST и GET запросов через HTTPS по протоколу HTTP/2.0
Посл.ответ Сообщение

Ранг: 0.2 (гость)
Активность: 0=0
Статус: Участник

Создано: 03 сентября 2018 15:26 · Поправил: linkmaze
· Личное сообщение · #1

Здравствуйте. Помогите разобраться или толкните в нужном направлении. Суть вопроса: разрабатываю библиотеку на С++ для перехвата POST и GET запросов из браузера. Для трафика передаваемого по протоколу HTTP/1.1 (не важно HTTP или HTTPS) я нашел нужные адреса и реализовал перехват. Но с протоколом HTTP2 никак не могу разобраться. Дело в том что он бинарный и в отличии от HTTP найти в памяти даже буфер с данными проблема, т.к. привычного запроса вроде "POST http://www.site.ru/post.php HTTP/1.0\r\n" в этом протоколе нет. Нашел только то что при формировании запроса HTTP2 используется некая сигнатура вида "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n" ее в памяти я нашел, при ее изменении сайты работающие по HTTP2 перестают открываться. Вроде как по формату протокола до применения шифрования HTTPS данные должны иметь вроде как такой формат:
0000 00 00 00 07 3a 6d 65 74 68 6f 64 00 00 00 03 47 ....:method....G
0010 45 54 00 00 00 05 3a 70 61 74 68 00 00 00 05 2f ET....:path..../
0020 64 65 6d 6f 00 00 00 0a 3a 61 75 74 68 6f 72 69 demo....:authori
0030 74 79 00 00 00 10 68 74 74 70 32 2e 61 6b 61 6d ty....http2.akam
0040 61 69 2e 63 6f 6d 00 00 00 07 3a 73 63 68 65 6d ai.com.. --------->И так далее
но я нигде в памяти не могу найти даже первые 11 байт со словом method и размером этого заголовка (7 байт) при остановке на breakpoint`ах после которых вызывается отправка данных через WSASend.
Прошу прощения если слишком сумбурно изложил. Помогите пожалуйста уже весь мозг себе сломал!




Ранг: 271.2 (наставник), 331thx
Активность: 0.321.49
Статус: Участник

Создано: 03 сентября 2018 16:59
· Личное сообщение · #2

Code:
  1. All frames begin with a fixed 9-octet header followed by a variable-length payload.
  2.  
  3.  +-----------------------------------------------+
  4.  |                 Length (24)                   |
  5.  +---------------+---------------+---------------+
  6.  |   Type (8)    |   Flags (8)   |
  7.  +-+-------------+---------------+-------------------------------+
  8.  |R|                 Stream Identifier (31)                      |
  9.  +=+=============================================================+
  10.  |                   Frame Payload (0...)                      ...
  11.  +---------------------------------------------------------------+

Ну и далее одна из frame payload структур в зависимости от значения Type. Данные, которые ты привел наверное структура headers (type=1), возможно ты не можешь их найти потому что --> Link <-- Хз вообще зачем искать что-то в памяти, бери стандарт и читай.

-----
2 оттенка серого


| Сообщение посчитали полезным: linkmaze

Ранг: 0.2 (гость)
Активность: 0=0
Статус: Участник

Создано: 03 сентября 2018 17:50
· Личное сообщение · #3

Искать в памяти нужно для того чтобы найти буфер в котором содержатся данные в сыром виде без шифрования https для того чтобы их перехватить и сохранить. Вообще в идеале нужно найти адрес функции на входе которой будет буфер с ещё не зашифрованными данными. Так у меня получилось для HTTP1.1. Если знаете какой нибудь способ как это сделать эффективно/(более эффективно чем я это делаю) пожалуйста поделитесь. Я не придумал ничего другого как искать в памяти ожидаемые данные и смотреть далее из каких функций идет к ним обращение. Может это и костыль, не знаю, не бейте сильно, лучше поучите, все таки здесь собраны все профи в этих вопросах.




Ранг: 271.2 (наставник), 331thx
Активность: 0.321.49
Статус: Участник

Создано: 03 сентября 2018 18:22
· Личное сообщение · #4

linkmaze пишет:
Искать в памяти нужно для того чтобы найти буфер в котором содержатся данные в сыром виде без шифрования https для того чтобы их перехватить и сохранить.

Такой подход помимо кажущейся простоты дает ряд проблем. Допустим удалось найти функцию сжатия в одной из библиотек IE, допустим по сигнатуре ее можно найти и перехватить, как быть с другими браузерами, где этот протокол может быть реализован авторски и упирается в функции wsock? Как быть с другим ПО, где этот протокол может быть реализован другой библиотекой? Универсальный способ - сворачивать протокол с уровня TCP/IP, такую библиоетку можно в сниффер вкрутить и в апи-шпион и как угодно и что угодно. Скорей всего даже существуют уже готовые и даже фришные библиотеки, где хттп2 реализован, надо только скоммуниздить.

-----
2 оттенка серого


| Сообщение посчитали полезным: sefkrd

Ранг: 173.8 (ветеран), 208thx
Активность: 0.120.36
Статус: Участник

Создано: 03 сентября 2018 19:24 · Поправил: VOLKOFF
· Личное сообщение · #5

Не увидел под какой браузер пилится.
В Firefox было в dll реализовано экспортируемыми PR_Read и PR_Write, в хроме придется вручную искать неэкспортируемые SSL_Read | SSL_Write (например через вызовы ssl либы). В целом вся затея "тупиковая веточка", жутко не универсальная, трудоемкая в реализации и очевидно будет требовать частого обновления под новые билды браузера. Но ваше право.

| Сообщение посчитали полезным: difexacaw

Ранг: 0.2 (гость)
Активность: 0=0
Статус: Участник

Создано: 03 сентября 2018 19:59
· Личное сообщение · #6

PR_Write хорошо справляется с HTTP но полностью игнорирует HTTP2.. На счет реализации, ну да, для будущих версий будет сплошной головняк, каждый раз придется искать сигнатуру по новому но мне нужно только под существующие последние версии firefox'a и хрома.
А что значит "сворачивать протокол с уровня TCP/IP"? И как тогда быть с HTTPS.
. . . На счет затеи это вы в самую точку, тот еще геморрой, но может подскажете способ как мне найти адреса таких неэкспортируемых функций.
Для http1.1 по https, получилось через поиск строки в памяти, нашел такую неэкспортируемую ф-ию для хрома, а для http2 какой то ступор, думаю что может у меня какой то неправильный подход, может что то лучшее и универсальное можно найти.
Или может быть сам подход поменять к проблеме?

Добавлено спустя 2 минуты
f13nd - спасибо за ссылку на описание протокола.




Ранг: 88.2 (постоянный), 111thx
Активность: 0.070.01
Статус: Участник

Создано: 07 сентября 2018 12:05
· Личное сообщение · #7

Очередной формграббер




Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 09 сентября 2018 23:54 · Поправил: difexacaw
· Личное сообщение · #8

VOLKOFF

Откопал кодес который это и доставал из хрома. Действительно не лучший метод, даже между обновками был использован тяжёлый мотор что бы получить нужные переменные --> Link <--

А есчо такие действия зарубит системная защита(при сборке с /CFG),либо авер.
Внутренности апп лучше не трогать, это сложно достаётся и всегда хардкод.

Добавлено спустя 18 минут
linkmaze

> может подскажете способ как мне найти адреса таких неэкспортируемых функций.

Пример выше. Чтобы доставать какие то переменные из тела апп нужно это делать на уровне кодового анализа - разлаживать его в граф, выше он есчо и билдится. Это довольно сложные способы. Сигнатурой очевидно доставать не вариант.

> Или может быть сам подход поменять к проблеме?

Да, это не правильный подход к задаче. Я не особо разбираюсь в сетевых апи, но там вроде как можно ставить фильтры штатным путём и всё такое.

-----
vx





Ранг: 77.2 (постоянный), 73thx
Активность: 0.190.15
Статус: Участник

Создано: 10 сентября 2018 01:17
· Личное сообщение · #9

difexacaw пишет:
Я не особо разбираюсь в сетевых апи

Дык, для чего твои "моторные" умозаключения.. Поста ради.. Ты бот..
Куда ты, нос свой тыкаешь..




Ранг: 271.2 (наставник), 331thx
Активность: 0.321.49
Статус: Участник

Создано: 10 сентября 2018 06:38 · Поправил: f13nd
· Личное сообщение · #10

difexacaw пишет:
Сигнатурой очевидно доставать не вариант.

Не согласен. Если считать сигнатурой не то, что ею обычно называется, выхлоп очень хороший. Для ишака и браузеров на ослиной тяге достаточно взять несколько длл разных версий и понаделать для них масок. Чем тупей компилер/настройки компилера, тем сигнатурный поиск работает надежней. Просто это не тот случай, где рационально лезть в код чужой программы, потому что на IE свет клином не сошелся и возможных вариантов слишком много.

-----
2 оттенка серого





Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 11 сентября 2018 21:29 · Поправил: difexacaw
· Личное сообщение · #11

sefkrd

У меня рабочий семпл, а у тебя его нет. Суть в том что для работы с кодом не нужно знать какой то сторонний протокол, который вызывается через искомый указатель. Так что не пиши чушь.

f13nd

И у вас есть реализация, ну что бы не быть пустословным ?

Если бы можно было так просто достать сигнатуры, то эта задача не поднималась бы на куче форумов. Тупо забили бы смещений(указатели ксорятся и код изменяется в билдах так что увы, при сигнатурном подходе при апдейте отвалится всё, а это не приемлемо). И не нужно было бы тянуть конструкторы и прочие сложности. Данная задача иначе не решается.

-----
vx





Ранг: 271.2 (наставник), 331thx
Активность: 0.321.49
Статус: Участник

Создано: 11 сентября 2018 22:03
· Личное сообщение · #12

difexacaw пишет:
И у вас есть реализация, ну что бы не быть пустословным ?

Под интел не делал, PowerPC например вот в одно нажатие кнопки в иде:
Code:
  1. 0050EEF0: mflr      r0;4;1;opc:31:26:31;rd:0:21:25;spr:256:11:20;opc:339:1:10;opc:0:0:0;;;
  2. 0050EEF4: mr        r11, r1;4;1;opc:31:26:31;rs:1:21:25;rd:11:16:20;rs:1:11:15;opc:444:1:10;opc:0:0:0;;
  3. 0050EEF8: stwu      r1, -0x10(r1);4;1;opc:37:26:31;rd:1:21:25;rs:1:16:20;d:65520:0:15;;;;
  4. 0050EEFC: bl        loc_414AC;4;1;opc:18:26:31;l:15518060:2:25;opc:0:1:1;opc:1:0:0;;;;
  5. 0050EF00: addi      r31, r13, -0x7C14;4;1;opc:14:26:31;rd:31:21:25;rs:13:16:20;d:33772:0:15;;;;
  6. 0050EF04: addi      r30, r13, -0x5CC0;4;1;opc:14:26:31;rd:30:21:25;rs:13:16:20;d:41792:0:15;;;;
  7. 0050EF08: lbz       r11, -0x70CA(r13);4;1;opc:34:26:31;rd:11:21:25;rs:13:16:20;d:36662:0:15;;;;
  8. 0050EF0C: cmplwi    r11, 0;4;1;opc:10:26:31;d:0:23:25;opc:0:22:22;l:0:21:21;rs:11:16:20;imm:0:0:15;;
  9. 0050EF10: bne       loc_50EF20;4;1;opc:16:26:31;opc:4:21:25;opc:2:16:20;l:4:2:15;opc:0:1:1;opc:0:0:0;;
  10. 0050EF14: lbz       r10, -0x7B6E(r13);4;1;opc:34:26:31;rd:10:21:25;rs:13:16:20;d:33938:0:15;;;;
  11. 0050EF18: cmplwi    r10, 0;4;1;opc:10:26:31;d:0:23:25;opc:0:22:22;l:0:21:21;rs:10:16:20;imm:0:0:15;;
  12. 0050EF1C: beq       loc_50EF28;4;1;opc:16:26:31;opc:12:21:25;opc:2:16:20;l:3:2:15;opc:0:1:1;opc:0:0:0;;
  13. 0050EF20: li        r0, 1;4;1;opc:14:26:31;rd:0:21:25;opc:0:16:20;imm:1:0:15;;;;
  14. 0050EF24: stb       r0, -0x7C12(r13);4;1;opc:38:26:31;rd:0:21:25;rs:13:16:20;d:33774:0:15;;;;

Выкинуть ненужные поля в текстовом редакторе и скриптом обратно свернуть:
Code:
  1. binValues db      0x7C\,0x00\,0x02\,0xA6\,0x7C\,0x00\,0x03\,0x78\,0x94\,0x00\,0x00\,0x00\,0x48\,0x00\,0x00\,0x00\,\
  2.                               0x38\,0x00\,0x00\,0x00\,0x38\,0x00\,0x00\,0x00\,0x88\,0x00\,0x00\,0x00\,0x28\,0x00\,0x00\,0x00\,\
  3.                               0x40\,0x82\,0x00\,0x10\,0x88\,0x00\,0x00\,0x00\,0x28\,0x00\,0x00\,0x00\,0x41\,0x82\,0x00\,0x00\,\
  4.                               0x38\,0x00\,0x00\,0x01\,0x98\,0x00\,0x00\,0x00\,0x00\,0x00\,0x00\,0x00\,0x00\,0x00\,0x00\,0x00
  5. binMask db              0xFC\,0x00\,0x07\,0xFE\,0xFC\,0x00\,0x07\,0xFE\,0xFC\,0x00\,0x00\,0x00\,0xFC\,0x00\,0x00\,0x02\,\
  6.                               0xFC\,0x00\,0x00\,0x00\,0xFC\,0x00\,0x00\,0x00\,0xFC\,0x00\,0x00\,0x00\,0xFC\,0x40\,0xFF\,0xFF\,\
  7.                               0xFF\,0xFF\,0xFF\,0xFE\,0xFC\,0x00\,0x00\,0x00\,0xFC\,0x40\,0xFF\,0xFF\,0xFF\,0xFF\,0x00\,0x02\,\
  8.                               0xFC\,0x1F\,0xFF\,0xFF\,0xFC\,0x00\,0x00\,0x00\,0x00\,0x00\,0x00\,0x00\,0x00\,0x00\,0x00\,0x00

У этого ассемблера особенность: обязательная часть опкода старшие 6 бит первого байта, за ними обычно сразу поле регистра-приемника. Flirt и ему подобные сразу идут мимо. Выхлоп - несколько тысяч билдов, сделанных с разбросом аж в 15 лет, десятком-другим сигнатур берутся все. С интелом возможно чуть посложней, но вряд ли драматичная разница. Если у разработчиков нету задачи бороться с сигнатурным анализом.

-----
2 оттенка серого





Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 11 сентября 2018 22:22
· Личное сообщение · #13

f13nd

А каким образом PPC имеет отношение к нт. Это совершенно иная архитектура.

-----
vx





Ранг: 271.2 (наставник), 331thx
Активность: 0.321.49
Статус: Участник

Создано: 11 сентября 2018 23:18 · Поправил: f13nd
· Личное сообщение · #14

difexacaw пишет:
Это совершенно иная архитектура.

Архитектура особого значения не имеет, не так много инструкций могут кодироваться двумя-тремя разными форматами. И например если sib не нужен, он и не будет от балды использоваться. Больше влияет сложность компилера. При желании можно накачать и дистрибутивов и хотфиксов и хоть на каждую версию длл по комплекту сигнатур сделать, их там не настолько много будет. И это всяко реальней, чем фантазировать на тему графов.

-----
2 оттенка серого





Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 12 сентября 2018 20:54
· Личное сообщение · #15

f13nd

Вам походу есчо расти долго. Сигнатура не имеет смысла после апдейта. Общий способ основанный на закономерностях в коде живучий", так как учитывает многие нюансы, а не привязан лишь к смещениям или строковым сигнатурам.

Есть огромное число примеров, которые реализованы грамотно под XP и до сих пор работоспособны под последние билды ос. А ваши сигнатуры лишь вам только и нужны, как то так. Это не используется в виксах, по выше описанной причине - при апдейте становится неработоспособно, так как фундаментально не предсказывает возможные изменения.

-----
vx




Ранг: 7.1 (гость)
Активность: 0.020
Статус: Участник

Создано: 13 сентября 2018 10:58
· Личное сообщение · #16

ТС просто отключи хттп2.
распарси ини профиля. оттуда получи папку. туда кинь user.js с настройками. это легитимное отключение. админ не нужен.

либо пиши парсилку хттп2.
суть в том, что протокол выбирается на этапе тлс хэндшейка, те тебе в пр_рид/райт итд уже будут валиться данные по протоколу который выбран на предыдущем этапе, который тебе не доступен в этих функа. ты можешь задетектить сигнатуру хттп2 и выбирать парсеры (если есть) - типа http_parser от ноды либо nghttp2.

Такие дела.




Ранг: 271.2 (наставник), 331thx
Активность: 0.321.49
Статус: Участник

Создано: 13 сентября 2018 11:07
· Личное сообщение · #17

difexacaw пишет:
Вам походу есчо расти долго

Я практикой обычно занят, а не теоретизирую на форумах на тему визоров, которых нету в природе и похоже никогда не будет. Для того, с чем сталкивался, это неплохо работает. В сторону интела расти не собираюсь, он меня интересует только как среда для исполнения.

-----
2 оттенка серого



 eXeL@B —› Крэки, обсуждения —› Поиск адреса для перехвата POST и GET запросов через HTTPS по протоколу HTTP/2.0
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати