Сейчас на форуме: Magister Yoda (+4 невидимых)

 eXeL@B —› Основной форум —› Дизассемблирование WSARecvFrom из ws2_32.dll
Посл.ответ Сообщение

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

Создано: 14 февраля 2010 22:14 · Поправил: Yuri4850
· Личное сообщение · #1

Создал тему, ответов нет.
Сужаю вопрос.

Сейчас ситуация такая:
<Исследуемая программа> --- recvfrom ---> wsock32.dll --- WSARecvFrom ---> ws2_32.dll --- ?
Кто-нибудь может объяснить, откуда WSARecvFrom берет данные?




Ранг: 355.4 (мудрец), 55thx
Активность: 0.320
Статус: Uploader
5KRT

Создано: 14 февраля 2010 23:22
· Личное сообщение · #2

Дизассемблированная функция WSARecvFrom()
Code:
  1.  
  2. .text:71A9F652 ; int __stdcall WSARecvFrom(SOCKET s,LPWSABUF lpBuffers,DWORD dwBufferCount,LPDWORD lpNumberOfBytesRecvd,LPDWORD lpFlags,struct sockaddr *lpFrom,LPINT lpFromlen,LPWSAOVERLAPPED lpOverlapped,LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
  3. .text:71A9F652                 public WSARecvFrom
  4. .text:71A9F652 WSARecvFrom     proc near               ; DATA XREF: .data:71AA41C0o
  5. .text:71A9F652
  6. .text:71A9F652 var_8           = dword ptr -8
  7. .text:71A9F652 dwErrCode       = dword ptr -4
  8. .text:71A9F652 dwFlags         = dword ptr  8
  9. .text:71A9F652 lpBuffers       = dword ptr  0Ch
  10. .text:71A9F652 dwBufferCount   = dword ptr  10h
  11. .text:71A9F652 lpNumberOfBytesRecvd= dword ptr  14h
  12. .text:71A9F652 lpFlags         = dword ptr  18h
  13. .text:71A9F652 lpFrom          = dword ptr  1Ch
  14. .text:71A9F652 lpFromlen       = dword ptr  20h
  15. .text:71A9F652 lpOverlapped    = dword ptr  24h
  16. .text:71A9F652 lpCompletionRoutine= dword ptr  28h
  17. .text:71A9F652
  18. .text:71A9F652                 mov     edi, edi
  19. .text:71A9F654                 push    ebp
  20. .text:71A9F655                 mov     ebp, esp
  21. .text:71A9F657                 push    ecx
  22. .text:71A9F658                 push    ecx
  23. .text:71A9F659                 cmp     off_71AA4028, offset sub_71A99448
  24. .text:71A9F663                 push    esi
  25. .text:71A9F664                 jnz     short loc_71A9F688
  26. .text:71A9F666                 cmp     dword_71AA402C, 0
  27. .text:71A9F66D                 jz      short loc_71A9F688
  28. .text:71A9F66F                 push    dwTlsIndex      ; dwTlsIndex
  29. .text:71A9F675                 call    ds:TlsGetValue
  30. .text:71A9F67B                 test    eax, eax
  31. .text:71A9F67D                 mov     [ebp+var_8], eax
  32. .text:71A9F680                 jz      short loc_71A9F688
  33. .text:71A9F682                 and     [ebp+dwErrCode], 0
  34. .text:71A9F686                 jmp     short loc_71A9F698
  35. .text:71A9F688 ; ---------------------------------------------------------------------- -----
  36. .text:71A9F688
  37. .text:71A9F688 loc_71A9F688:                           ; CODE XREF: WSARecvFrom+12j
  38. .text:71A9F688                                         ; WSARecvFrom+1Bj ...
  39. .text:71A9F688                 lea     eax, [ebp+var_8]
  40. .text:71A9F68B                 push    eax
  41. .text:71A9F68C                 call    sub_71A994C1
  42. .text:71A9F691                 test    eax, eax
  43. .text:71A9F693                 mov     [ebp+dwErrCode], eax
  44. .text:71A9F696                 jnz     short loc_71A9F6F7
  45. .text:71A9F698
  46. .text:71A9F698 loc_71A9F698:                           ; CODE XREF: WSARecvFrom+34j
  47. .text:71A9F698                 push    [ebp+dwFlags]   ; dwFlags
  48. .text:71A9F69B                 call    sub_71A92B41
  49. .text:71A9F6A0                 mov     esi, eax
  50. .text:71A9F6A2                 test    esi, esi
  51. .text:71A9F6A4                 jz      short loc_71A9F6F0
  52. .text:71A9F6A6                 push    edi
  53. .text:71A9F6A7                 lea     ecx, [ebp+dwErrCode]
  54. .text:71A9F6AA                 push    ecx
  55. .text:71A9F6AB                 push    [ebp+var_8]
  56. .text:71A9F6AE                 mov     eax, [esi+0Ch]
  57. .text:71A9F6B1                 push    [ebp+lpCompletionRoutine]
  58. .text:71A9F6B4                 push    [ebp+lpOverlapped]
  59. .text:71A9F6B7                 push    [ebp+lpFromlen]
  60. .text:71A9F6BA                 push    [ebp+lpFrom]
  61. .text:71A9F6BD                 push    [ebp+lpFlags]
  62. .text:71A9F6C0                 push    [ebp+lpNumberOfBytesRecvd]
  63. .text:71A9F6C3                 push    [ebp+dwBufferCount]
  64. .text:71A9F6C6                 push    [ebp+lpBuffers]
  65. .text:71A9F6C9                 push    [ebp+dwFlags]
  66. .text:71A9F6CC                 call    dword ptr [eax+5Ch]
  67. .text:71A9F6CF                 mov     ecx, esi        ; lpAddend
  68. .text:71A9F6D1                 mov     edi, eax
  69. .text:71A9F6D3                 call    sub_71A92B26
  70. .text:71A9F6D8                 test    edi, edi
  71. .text:71A9F6DA                 pop     edi
  72. .text:71A9F6DB                 jnz     short loc_71A9F6E1
  73. .text:71A9F6DD                 xor     eax, eax
  74. .text:71A9F6DF                 jmp     short loc_71A9F703
  75. .text:71A9F6E1 ; ---------------------------------------------------------------------- -----
  76. .text:71A9F6E1
  77. .text:71A9F6E1 loc_71A9F6E1:                           ; CODE XREF: WSARecvFrom+89j
  78. .text:71A9F6E1                 cmp     [ebp+dwErrCode], 0
  79. .text:71A9F6E5                 jnz     short loc_71A9F6F7
  80. .text:71A9F6E7                 mov     [ebp+dwErrCode], 277Bh
  81. .text:71A9F6EE                 jmp     short loc_71A9F6F7
  82. .text:71A9F6F0 ; ---------------------------------------------------------------------- -----
  83. .text:71A9F6F0
  84. .text:71A9F6F0 loc_71A9F6F0:                           ; CODE XREF: WSARecvFrom+52j
  85. .text:71A9F6F0                 mov     [ebp+dwErrCode], 2736h
  86. .text:71A9F6F7
  87. .text:71A9F6F7 loc_71A9F6F7:                           ; CODE XREF: WSARecvFrom+44j
  88. .text:71A9F6F7                                         ; WSARecvFrom+93j ...
  89. .text:71A9F6F7                 push    [ebp+dwErrCode] ; dwErrCode
  90. .text:71A9F6FA                 call    ds:SetLastError
  91. .text:71A9F700                 or      eax, 0FFFFFFFFh
  92. .text:71A9F703
  93. .text:71A9F703 loc_71A9F703:                           ; CODE XREF: WSARecvFrom+8Dj
  94. .text:71A9F703                 pop     esi
  95. .text:71A9F704                 leave
  96. .text:71A9F705                 retn    24h
  97. .text:71A9F705 WSARecvFrom     endp
  98.  


Имеет следующий формат

Code:
  1. C++ 
  2. int WSARecvFrom(
  3.   __in     SOCKET s,
  4.   __inout  LPWSABUF lpBuffers,
  5.   __in     DWORD dwBufferCount,
  6.   __out    LPDWORD lpNumberOfBytesRecvd,
  7.   __inout  LPDWORD lpFlags,
  8.   __out    struct sockaddr *lpFrom,
  9.   __inout  LPINT lpFromlen,
  10.   __in     LPWSAOVERLAPPED lpOverlapped,
  11.   __in     LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
  12. );
  13.  


откуда WSARecvFrom берет данные?
Какие данные?

-----
Gutta cavat lapidem. Feci, quod potui. Faciant meliora potentes




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

Создано: 14 февраля 2010 23:59
· Личное сообщение · #3

Это твой топик на wasme http://www.wasm.ru/forum/viewtopic.php?pid=367080#p367080 ?
Если есть доступ с обоих сторон нужно смотреть что приходит на сервер и уходит оттдуда. Если нет доступа нужно искать описание самой утилиты pbucon.exe, или попровать два компа связать как сервер и клиент и посмотреть, я сомневаюсь что быстрее получится разобрать пакеты и полностью отреверсить эту утилиту. Я так понимаю не известно даже на каких протоколах она работает.

-----
Надежда - есть худшее из зол, ибо она продлевает наши страдания.© Ф. Ницше




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

Создано: 15 февраля 2010 00:36 · Поправил: Yuri4850
· Личное сообщение · #4

Спасибо, конечно, за ответы. Но.

Формат функции я смотрел в MSDN. IDA у меня тоже есть, приведенный листинг я видел. Мне непонятен смысл строки (кажется, здесь следующее звено цепочки):

Code:
  1. .text:71A9F6CC                 call    dword ptr [eax+5Ch]


Что вызывается здесь?


Доступа с той стороны нет. pbucon сам по себе уже неинтересен - работает по UDP, данные не искажает, даже никак не шифрует (смотрел буфер, который ему заполняет recvfrom).



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

Создано: 15 февраля 2010 01:16
· Личное сообщение · #5

Вообще *recv уйдёт в ZwDeviceIoControl если тебе от этого легче.

-----
Shalom ebanats!




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

Создано: 15 февраля 2010 02:19 · Поправил: Yuri4850
· Личное сообщение · #6

Легче конечно, имел дело с Zw* и Nt* функциями .
Только сомневаюсь, что вот так сразу WSARecvFrom ---> ZwDeviceIoControl.
Можно чуть подробнее?



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

Создано: 15 февраля 2010 02:36
· Личное сообщение · #7

nt4\private\net\sockets\winsock2\wsp\msafd\recv.c

Code:
  1.     //
  2.     // Receive the data on the socket.
  3.     //
  4.  
  5.     status = NtDeviceIoControlFile(
  6.                  (HANDLE)Handle,
  7.                  event,
  8.                  apcRoutine,
  9.                  apcContext,
  10.                  ioStatusBlock,
  11.                  IOCTL_AFD_RECEIVE,
  12.                  &recvInfo,
  13.                  sizeof(recvInfo),
  14.                  NULL,
  15.                  0
  16.                  );
  17.  


-----
Shalom ebanats!




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

Создано: 15 февраля 2010 02:58 · Поправил: Yuri4850
· Личное сообщение · #8

NtDeviceIoControlFile(
IN HANDLE FileHandle,
IN HANDLE Event OPTIONAL,
IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
IN PVOID ApcContext OPTIONAL,
OUT PIO_STATUS_BLOCK IoStatusBlock,
IN ULONG IoControlCode,
IN PVOID InputBuffer OPTIONAL,
IN ULONG InputBufferLength,
OUT PVOID OutputBuffer OPTIONAL,
IN ULONG OutputBufferLength);

Точно 7-й и 8-й параметры нужны? Не 9-й и 10-й? Хотя это экспериментально выяснить смогу...
Единственное, данные в буфере будут сжатыми или так сказать открытым текстом?




Ранг: 631.1 (!), 62thx
Активность: 0.370.01
Статус: Участник
Автор VB Decompiler

Создано: 15 февраля 2010 03:11 · Поправил: GPcH
· Личное сообщение · #9

Yuri4850 пишет:
call    dword ptr [eax+5Ch]
Что вызывается здесь?


Стандартный ООП вызов метода объекта. eax в данном случае это указатель на VTable, а 5C это смещение по ней. Обычно так вызываются свойства и методы объектов.

-----
Никогда не делай то, что возможно. Стремись сделать то что невозможно впринципе!




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

Создано: 15 февраля 2010 17:07
· Личное сообщение · #10

Всем спасибо, проблема решена.
Тему можно закрывать/удалять.




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 15 февраля 2010 18:07
· Личное сообщение · #11

Линк на второй топик https://cracklab.ru/f/action=locktopic&forum=2&topic=15801&chstat=1
В следующий раз в баню поедешь надолго.


 eXeL@B —› Основной форум —› Дизассемблирование WSARecvFrom из ws2_32.dll
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати