Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.14.86] |
|
Сообщ.
#1
,
|
|
|
Добрый день.
Сделал инжект dll (в свое приложение, я его тестирую), перехватил WS2_32 Recv, далее отправляю полученные приложением пакеты в управляющую программу по TCP. Что бы их корректно отправить, нужно знать размер пакета, но ws2_32 вроде не показывает размер пакета, у него структура: ID cокета адрес буфера размер буфера(не пакета) флаг Подскажите как мне размер узнать? Прикреплённая картинка
|
Сообщ.
#2
,
|
|
|
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. |
Сообщ.
#3
,
|
|
|
Но Recv не я вызывал, она вернет тому кто вызывал.
|
Сообщ.
#4
,
|
|
|
Цитата Rzonex @ Но Recv не я вызывал, она вернет тому кто вызывал. Ну я так понимаю нужно на нее вешать хук. |
Сообщ.
#5
,
|
|
|
Ну, так я на нее и повесил хук то что на скрине - это то что хукается дебагером, ни в регистрах, ни в стеке нет ни намека на размер пакета...
Может у кого есть исходники какие? WPE PRO например - норм хукает Recv, смотрел олей как она перехватывает - вроде так же как у меня - джамп в начало и перенос затертого кода, хз где она размер берет... Лююууудиии поможите чем можите |
Сообщ.
#6
,
|
|
|
Цитата Rzonex @ Но Recv не я вызывал, она вернет тому кто вызывал. Что тогда означают слова "перехватил WS2_32 Recv" ? --- Перехватил - это значит, что подопытная прграмма теперь вызывает твою процедуру. Которая заменила recv, а сама эта процедура вызывает настоящий recv. Тогда воспользовавшись всеми её параметрами оригинального вызова и возвращаемым значением, можно узнать сколько быйт получено и где они находятся. |
Сообщ.
#7
,
|
|
|
Цитата Rzonex @ Ну, так я на нее и повесил хук Неправильно, видать, повесил. Вон ЫукпШ рассказал как это делается, и как тебе получить нужное |
Сообщ.
#8
,
|
|
|
Цитата ЫукпШ @ Что тогда означают слова "перехватил WS2_32 Recv" ? Означают, что я перехватил управление из функции Recv. Я не экспорт патчил, я сплайсил, по факту все еще вызывается оригинальный Recv, но на деле разницы нету. Сниффер Wpe Pro делает абсолютно то же самое, и он еще и ip выдает... Цитата ЫукпШ @ Тогда воспользовавшись всеми её параметрами оригинального вызова и возвращаемым значением А где находится возвращаемое значение? В стеке? В регистрах? Может в регистрах лежит адрес по которому находится возвращаемое значение? Вот все что делает Wpe Pro (это начало Recv). Я хукаю так же. Прикреплённая картинка
|
Сообщ.
#9
,
|
|
|
Rzonex, приведи полный код.
|
Сообщ.
#10
,
|
|
|
Цитата JoeUser @ Rzonex, приведи полный код. Вот асм Recv, мне кажется он стандартный всегда, ибо одна библиотека грузится для всех приложений которые сокет юзают. 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 определяет размер. Как - загадка... |
Сообщ.
#11
,
|
|
|
Цитата Rzonex @ А где находится возвращаемое значение? В стеке? В регистрах? Может в регистрах лежит адрес по которому находится возвращаемое значение? Это зависит от прототипа функции - бывает, она много параметров возвращает. Однако, если посмотрим на "int recv(...", возвращаемое "int" значение в eax. Т.е. если тип возврщаемого значения в регистр помещается, то в аккумуляторе. al,ax,eax итд. Добавлено Цитата Rzonex @ Я не экспорт патчил, я сплайсил, А в чём принципиальная разница ? Это техника. А смысл перехвата - замена оригинальной функции своей. Из которой вызывается оригинальная функция. (Или вообще не вызывается.) Это даёт возможность контролировать и модифицировать параметры как до вызова оригинальной функции, так и после её вызова. |
Сообщ.
#12
,
|
|
|
Цитата Rzonex @ Вот асм Recv, мне кажется он стандартный всегда, ибо одна библиотека грузится для всех приложений которые сокет юзают. Асм - это информативно. На чем прогу пишешь? |
Сообщ.
#13
,
|
|
|
В общем плюнул я на recv и перехватил connect, очень просто перехватывается, отправил весь трафик в свою управляющую прогу на локал хост.
Спасибо вам за то, что уделили время. |