На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются.
4. Используйте теги [ code=cpp ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Старайтесь формулировать свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной и более давности без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта (C++) user posted image FAQ Форума user posted image Наши Исходники user posted image Поиск по Разделу user posted image MSDN Library Online (Windows Driver Kit) user posted image Google

Ваше мнение о модераторах: user posted image B.V.
Модераторы: B.V.
  
> WS2_32 Recv - размер пакета
    Добрый день.

    Сделал инжект dll (в свое приложение, я его тестирую), перехватил WS2_32 Recv, далее отправляю полученные приложением пакеты в управляющую программу по TCP. Что бы их корректно отправить, нужно знать размер пакета, но ws2_32 вроде не показывает размер пакета, у него структура:

    ID cокета
    адрес буфера
    размер буфера(не пакета)
    флаг

    Подскажите как мне размер узнать?
    Прикреплённая картинка
    Прикреплённая картинка
      recv после принятия данных возвращает число, большее нуля, означающее количество принятых байт.

      Скрытый текст
      Из доки:
      Цитата
      Return Value

      If no error occurs, recv returns the number of bytes received and the buffer pointed to by the buf parameter will contain this data received. If the connection has been gracefully closed, the return value is zero.

      Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling WSAGetLastError.
        Но Recv не я вызывал, она вернет тому кто вызывал.
          Цитата Rzonex @
          Но Recv не я вызывал, она вернет тому кто вызывал.

          Ну я так понимаю нужно на нее вешать хук.
            Ну, так я на нее и повесил хук :D то что на скрине - это то что хукается дебагером, ни в регистрах, ни в стеке нет ни намека на размер пакета...
            Может у кого есть исходники какие?
            WPE PRO например - норм хукает Recv, смотрел олей как она перехватывает - вроде так же как у меня - джамп в начало и перенос затертого кода, хз где она размер берет...
            Лююууудиии поможите чем можите :)
            Сообщение отредактировано: Rzonex -
              Цитата Rzonex @
              Но Recv не я вызывал, она вернет тому кто вызывал.

              Что тогда означают слова "перехватил WS2_32 Recv" ?
              ---
              Перехватил - это значит, что подопытная прграмма
              теперь вызывает твою процедуру.
              Которая заменила recv, а сама эта процедура
              вызывает настоящий recv. Тогда воспользовавшись
              всеми её параметрами оригинального вызова
              и возвращаемым значением, можно узнать сколько быйт
              получено и где они находятся.
                Цитата Rzonex @
                Ну, так я на нее и повесил хук :D

                Неправильно, видать, повесил. Вон ЫукпШ рассказал как это делается, и как тебе получить нужное :)
                  Цитата ЫукпШ @
                  Что тогда означают слова "перехватил WS2_32 Recv" ?

                  Означают, что я перехватил управление из функции Recv.
                  Я не экспорт патчил, я сплайсил, по факту все еще вызывается оригинальный Recv, но на деле разницы нету.
                  Сниффер Wpe Pro делает абсолютно то же самое, и он еще и ip выдает...

                  Цитата ЫукпШ @
                  Тогда воспользовавшись
                  всеми её параметрами оригинального вызова
                  и возвращаемым значением


                  А где находится возвращаемое значение? В стеке? В регистрах? Может в регистрах лежит адрес по которому находится возвращаемое значение?

                  Вот все что делает Wpe Pro (это начало Recv). Я хукаю так же.
                  Прикреплённая картинка
                  Прикреплённая картинка
                  Сообщение отредактировано: Rzonex -
                    Rzonex, приведи полный код.
                      Цитата JoeUser @
                      Rzonex, приведи полный код.

                      Вот асм Recv, мне кажется он стандартный всегда, ибо одна библиотека грузится для всех приложений которые сокет юзают.
                      ExpandedWrap disabled
                        77226826 > 8BFF             MOV EDI,EDI
                        77226828   55               PUSH EBP
                        77226829   8BEC             MOV EBP,ESP
                        7722682B   83EC 10          SUB ESP,10
                        7722682E   53               PUSH EBX
                        7722682F   33DB             XOR EBX,EBX
                        77226831   813D 48702477 29>CMP DWORD PTR DS:[77247048],WS2_32.77222>
                        7722683B   56               PUSH ESI
                        7722683C   0F85 81000000    JNZ WS2_32.772268C3
                        77226842   391D 70702477    CMP DWORD PTR DS:[77247070],EBX
                        77226848   74 79            JE SHORT WS2_32.772268C3
                        7722684A   FF35 44702477    PUSH DWORD PTR DS:[77247044]
                        77226850   FF15 48122277    CALL DWORD PTR DS:[<&API-MS-Win-Core-Pro>; kernel32.TlsGetValue
                        77226856   8945 F8          MOV DWORD PTR SS:[EBP-8],EAX
                        77226859   3BC3             CMP EAX,EBX
                        7722685B   74 66            JE SHORT WS2_32.772268C3
                        7722685D   895D FC          MOV DWORD PTR SS:[EBP-4],EBX
                        77226860   FF75 08          PUSH DWORD PTR SS:[EBP+8]
                        77226863   E8 58C7FFFF      CALL WS2_32.77222FC0
                        77226868   8BF0             MOV ESI,EAX
                        7722686A   3BF3             CMP ESI,EBX
                        7722686C   74 76            JE SHORT WS2_32.772268E4
                        7722686E   8B4D F8          MOV ECX,DWORD PTR SS:[EBP-8]
                        77226871   8B45 10          MOV EAX,DWORD PTR SS:[EBP+10]
                        77226874   57               PUSH EDI
                        77226875   83C1 08          ADD ECX,8
                        77226878   8D55 FC          LEA EDX,DWORD PTR SS:[EBP-4]
                        7722687B   52               PUSH EDX
                        7722687C   51               PUSH ECX
                        7722687D   53               PUSH EBX
                        7722687E   53               PUSH EBX
                        7722687F   8D4D 14          LEA ECX,DWORD PTR SS:[EBP+14]
                        77226882   51               PUSH ECX
                        77226883   8D4D 08          LEA ECX,DWORD PTR SS:[EBP+8]
                        77226886   51               PUSH ECX
                        77226887   6A 01            PUSH 1
                        77226889   8945 F0          MOV DWORD PTR SS:[EBP-10],EAX
                        7722688C   8B45 0C          MOV EAX,DWORD PTR SS:[EBP+C]
                        7722688F   8D4D F0          LEA ECX,DWORD PTR SS:[EBP-10]
                        77226892   51               PUSH ECX
                        77226893   FF75 08          PUSH DWORD PTR SS:[EBP+8]
                        77226896   8945 F4          MOV DWORD PTR SS:[EBP-C],EAX
                        77226899   8B46 0C          MOV EAX,DWORD PTR DS:[ESI+C]
                        7722689C   FF50 54          CALL DWORD PTR DS:[EAX+54]
                        7722689F   8BCE             MOV ECX,ESI
                        772268A1   8BF8             MOV EDI,EAX
                        772268A3   E8 F8C6FFFF      CALL WS2_32.77222FA0
                        772268A8   3BFB             CMP EDI,EBX
                        772268AA   5F               POP EDI
                        772268AB   0F85 E8850000    JNZ WS2_32.7722EE99
                        772268B1   F745 14 00800000 TEST DWORD PTR SS:[EBP+14],8000
                        772268B8   75 1E            JNZ SHORT WS2_32.772268D8
                        772268BA   8B45 08          MOV EAX,DWORD PTR SS:[EBP+8]
                        772268BD   5E               POP ESI
                        772268BE   5B               POP EBX
                        772268BF   C9               LEAVE
                        772268C0   C2 1000          RETN 10
                        772268C3   8D45 F8          LEA EAX,DWORD PTR SS:[EBP-8]
                        772268C6   50               PUSH EAX
                        772268C7   E8 9AC5FFFF      CALL WS2_32.77222E66
                        772268CC   8945 FC          MOV DWORD PTR SS:[EBP-4],EAX
                        772268CF   3BC3             CMP EAX,EBX
                        772268D1  ^74 8D            JE SHORT WS2_32.77226860
                        772268D3   E9 CA850000      JMP WS2_32.7722EEA2
                        772268D8   C745 FC 38270000 MOV DWORD PTR SS:[EBP-4],2738
                        772268DF   E9 B5850000      JMP WS2_32.7722EE99
                        772268E4   C745 FC 36270000 MOV DWORD PTR SS:[EBP-4],2736
                        772268EB   E9 B2850000      JMP WS2_32.7722EEA2
                        772268F0   90               NOP
                        772268F1   90               NOP
                        772268F2   90               NOP
                        772268F3   90               NOP
                        772268F4   90               NOP


                      Вот бряк на Recv. В дампе по адресу буфера лежат реальные пакеты. Размер буфера всегда 109A0 (68000). Но таких пакетов огромных игра не отправляет никогда.
                      Сколько не брякай - один фиг 68000. Пакеты шлются бывает по одному, бывает пачками. Перед пакетом (речь об игровом пакете, игра ставит его размер в начале) есть его размер. Но это не поможет, если идет несколько игровых пакетов в одном системном - не могу узнать общий размер.

                      Пробовал ставить бряк на другие игры онлайн, там размер буфера в стеке явно указывает на размер отправляемого пакета, но вот в моем случае всегда 68000. Но WpePro определяет размер. Как - загадка...

                      user posted image
                      Сообщение отредактировано: Rzonex -
                        Цитата Rzonex @
                        А где находится возвращаемое значение? В стеке? В регистрах? Может в регистрах лежит адрес по которому находится возвращаемое значение?

                        Это зависит от прототипа функции - бывает, она много параметров
                        возвращает.
                        Однако, если посмотрим на "int recv(...", возвращаемое "int" значение в eax.
                        Т.е. если тип возврщаемого значения в регистр помещается, то в аккумуляторе. al,ax,eax итд.

                        Добавлено
                        Цитата Rzonex @
                        Я не экспорт патчил, я сплайсил,

                        А в чём принципиальная разница ?
                        Это техника.
                        А смысл перехвата - замена оригинальной функции своей.
                        Из которой вызывается оригинальная функция. (Или вообще не вызывается.)
                        Это даёт возможность контролировать и модифицировать
                        параметры как до вызова оригинальной функции, так и после её вызова.
                        Сообщение отредактировано: ЫукпШ -
                          Цитата Rzonex @
                          Вот асм Recv, мне кажется он стандартный всегда, ибо одна библиотека грузится для всех приложений которые сокет юзают.

                          Асм - это информативно. На чем прогу пишешь?
                            В общем плюнул я на recv и перехватил connect, очень просто перехватывается, отправил весь трафик в свою управляющую прогу на локал хост.
                            Спасибо вам за то, что уделили время.
                            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                            0 пользователей:


                            Рейтинг@Mail.ru
                            [ Script execution time: 0,1411 ]   [ 19 queries used ]   [ Generated: 13.12.24, 00:33 GMT ]