пишу прогу и так случилось, что она должна стартовать как служба. вобщем эта служба стартует, все нормально единственное, что уже позже вызывается функция socket. которая со всего размаху падает в stack overflow. почему я понять не могу и из-за этого я полез в кишки этой функции. естественно в её кишках вызывается функция Код (Text): 71A93BDC . E8 EAFDFFFF CALL ws2_32.WSASocketW ; \WSASocketW из неё я попал в еще какую то под функцию ... Код (Text): 71A93A54 . 50 PUSH EAX 71A93A55 . FF75 1C PUSH DWORD PTR [EBP+1C] 71A93A58 . FF75 18 PUSH DWORD PTR [EBP+18] 71A93A5B . 57 PUSH EDI 71A93A5C . FF75 10 PUSH DWORD PTR [EBP+10] 71A93A5F . FF75 0C PUSH DWORD PTR [EBP+C] 71A93A62 . FF75 08 PUSH DWORD PTR [EBP+8] 71A93A65 . FF51 78 CALL DWORD PTR [ECX+78] 71A93A68 . 8BD8 MOV EBX,EAX 71A93A6A . 8B45 DC MOV EAX,DWORD PTR [EBP-24] 71A93A6D . 8970 50 MOV DWORD PTR [EAX+50],ESI 71A93A70 . 8B7F 24 MOV EDI,DWORD PTR [EDI+24] 71A93A73 . 8B4D E0 MOV ECX,DWORD PTR [EBP-20] 71A93A76 . E8 6C5A0000 CALL ws2_32.71A994E7 71A93A7B . 83FB FF CMP EBX,-1 71A93A7E . 0F84 1C7F0000 JE ws2_32.71A9B9A0 71A93A84 > 53 PUSH EBX ; /Arg1 71A93A85 . E8 3B020000 CALL ws2_32.71A93CC5 ; \ws2_32.71A93CC5 71A93A8A . 8BC3 MOV EAX,EBX 71A93A8C > E8 8FD7FFFF CALL ws2_32.71A91220 71A93A91 . C2 1800 RETN 18 как раз которая выззывается по адресу из ECX+78. уже находясь в nvappfil.dll о которой я никогда и слыхом не слыховал, вызываеся собственно странная функция, вернее значения её пареметров мне совсем не понятны ... Код (Text): 10008FC8 > 68 DC9A0110 PUSH nvappfil.10019ADC ; UNICODE "WSPSocket intercept" 10008FCD . 68 6D0D0000 PUSH 0D6D 10008FD2 . 68 8C800110 PUSH nvappfil.1001808C ; UNICODE "spi.cpp" 10008FD7 . 68 C8CB0110 PUSH nvappfil.1001CBC8 10008FDC . E8 3F99FFFF CALL nvappfil.10002920 собственно в ней и вызывается функция которая переполняет стек ... Код (Text): 1000A370 /$ 51 PUSH ECX 1000A371 |. 3D 00100000 CMP EAX,1000 1000A376 |. 8D4C24 08 LEA ECX,DWORD PTR [ESP+8] 1000A37A |. 72 14 JB SHORT nvappfil.1000A390 1000A37C |> 81E9 00100000 /SUB ECX,1000 1000A382 |. 2D 00100000 |SUB EAX,1000 1000A387 |. 8501 |TEST DWORD PTR [ECX],EAX 1000A389 |. 3D 00100000 |CMP EAX,1000 1000A38E |.^73 EC \JNB SHORT nvappfil.1000A37C 1000A390 |> 2BC8 SUB ECX,EAX 1000A392 |. 8BC4 MOV EAX,ESP 1000A394 |. 8501 TEST DWORD PTR [ECX],EAX 1000A396 |. 8BE1 MOV ESP,ECX 1000A398 |. 8B08 MOV ECX,DWORD PTR [EAX] 1000A39A |. 8B40 04 MOV EAX,DWORD PTR [EAX+4] 1000A39D |. 50 PUSH EAX 1000A39E \. C3 RETN Код (Text): 1000A37C |> 81E9 00100000 /SUB ECX,1000 1000A382 |. 2D 00100000 |SUB EAX,1000 1000A387 |. 8501 |TEST DWORD PTR [ECX],EAX 1000A389 |. 3D 00100000 |CMP EAX,1000 1000A38E |.^73 EC \JNB SHORT nvappfil.1000A37C собственно на этом цикле все и происходит ... самое интересное, что если не стартовать сервис все работает отлично ... почему не знаю, мб кто подскажит ... чего можно сделать ...
el- находясь в nvappfil.dll о которой я никогда и слыхом не слыховал Может быть это - NVIDIA App Filter, %SYSTEMROOT%\system32\nvappfilter.dll? Мама на nForce?
ну да ... но как это относится к winsock ... кстати вот еще такое наблюдение есть ... вызов сокета падает в стак оверфлов, если его вызов произодится из только что созданого треда или процесса ... т.е. я в своей проге новый процесс создаю и пару тредов в главном процессе ... если вызывать создание сокета в главном треде то все ок ... а вот если вызывать во вновь созданом процессе или треде, то все падает )))):