Сплайсинг сокетов

Тема в разделе "WASM.NETWORKS", создана пользователем saxon, 24 июн 2009.

  1. JhanGhuangxi

    JhanGhuangxi New Member

    Публикаций:
    0
    Регистрация:
    15 апр 2010
    Сообщения:
    31
    Это теперь так подмена выдачи называется? xD)))
     
  2. sl0n

    sl0n Мамонт дзена **

    Публикаций:
    0
    Регистрация:
    26 сен 2003
    Сообщения:
    703
    "Это теперь так подмена выдачи называется? xD)))"

    выходит так =)
     
  3. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    sl0n
    Да без разницы. По теме есть чтолибо, кроме булочек ?
     
  4. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    вообще в юм. если сплейсить то NtDeviceioControlFile вместо сендов и рецивов.
     
  5. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    add с проверкой по NtQueryObject -> \Device\Afd
     
  6. sl0n

    sl0n Мамонт дзена **

    Публикаций:
    0
    Регистрация:
    26 сен 2003
    Сообщения:
    703
    Ну если по теме, то ты клерк все правильно написал таблицу патчить нормальный вариант. Но только что-то откровения в этом нету никакова в малваре 2-3 летней давности это видел ...
     
  7. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    sl0n
    Нет конечно ничего нового, но для некоторых, автора в том числе это новое.
    RET
    Этого нужно избегать, код нельзя изменять, посему про Detours нужно забыть.
    При использовании сепшенов, вариантов сграбить целевой функционал множество, например IDP, в простейшем случае разбить ссылку в sm_context_table и трейсить до сервиса.
     
  8. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Вот с помощью IDP динамический захват(выше по линку архив обновил):
    Код (Text):
    1.     .686
    2.     .model flat, stdcall
    3.     option casemap :none
    4.    
    5.     include \masm32\include\ntdll.inc
    6.    
    7. .code
    8. ; IDP
    9.     include Idp.inc
    10. ; LDASM
    11.     include VirXasm32b.asm
    12.    
    13. GET_CURRENT_GRAPH_ENTRY macro
    14.     Call _$_GetCallbackReference
    15. endm
    16.  
    17. SEH_Prolog proc C
    18.     pop ecx
    19.     push ebp
    20.     push eax
    21.     Call SEH_GetRef
    22.     push eax
    23.     assume fs:nothing
    24.     push dword ptr fs:[TEB.Tib.ExceptionList]
    25.     mov dword ptr fs:[TEB.Tib.ExceptionList],esp
    26.     jmp ecx
    27. SEH_Prolog endp
    28.  
    29. ; o Не восстанавливаются Ebx, Esi и Edi.
    30. ;
    31. SEH_Epilog proc C
    32.     pop ecx
    33.     pop dword ptr fs:[TEB.Tib.ExceptionList]
    34.     lea esp,[esp + 3*4]
    35.     jmp ecx
    36. SEH_Epilog endp
    37.  
    38. SEH_GetRef proc C
    39.     GET_CURRENT_GRAPH_ENTRY
    40.     mov eax,dword ptr [esp + 4]
    41.     mov esp,dword ptr [esp + 2*4]   ; (esp) -> ExceptionList
    42.     mov eax,EXCEPTION_RECORD.ExceptionCode[eax]
    43.     mov ebp,dword ptr [esp + 3*4]
    44.     jmp dword ptr [esp + 2*4]
    45. SEH_GetRef endp
    46.  
    47. _$_GetCallbackReference::
    48.     pop eax
    49.     ret
    50.  
    51. ; +
    52. ; Поиск ws2_32!sm_context_table
    53. ;
    54. WspQueryContextTable proc uses ebx esi edi pWahContextTable:PVOID, pWahCreateHandleContextTable:PVOID
    55. Local $Buffer[16]:CHAR, DllName:UNICODE_STRING
    56. Local WsHandle:PVOID, HlHandle:HANDLE
    57. Local Entries[5]:PVOID, WahEntries[3]:PVOID
    58. Local pSend:PVOID
    59.     Call SEH_Epilog_Reference
    60.     Call SEH_Prolog
    61.     lea ebx,$Buffer
    62.     lea ecx,Entries
    63.     xor edx,edx
    64.     mov Entries[0],0F45CAC9DH   ; CRC32("RtlCreateUnicodeStringFromAsciiz")
    65.     mov Entries[4],043681CE6H   ; CRC32("RtlFreeUnicodeString")
    66.     mov Entries[2*4],0183679F2H ; CRC32("LdrLoadDll")
    67.     mov Entries[3*4],0FED4B3C2H ; CRC32("LdrUnloadDll")
    68.     mov Entries[4*4],0E21C1C46H ; CRC32("LdrGetDllHandle")
    69.     mov Entries[5*4],edx
    70.     push ecx
    71.     push ecx
    72.     push edx
    73.     push edx
    74.     mov eax,IDP_QUERY_ENTRIES
    75.     Call IDP
    76.     test eax,eax
    77.     lea esi,DllName
    78.     jnz Exit
    79.     mov dword ptr [$Buffer],"_2SW"
    80.     push ebx
    81.     mov dword ptr [$Buffer + 4],"d.23"
    82.     push esi
    83.     mov dword ptr [$Buffer + 2*4],"ll"
    84.     Call Entries[0] ; RtlCreateUnicodeStringFromAsciiz()
    85.     test eax,eax
    86.     lea ecx,WsHandle
    87.     .if Zero?
    88.     mov eax,STATUS_INTERNAL_ERROR
    89.     jmp Exit
    90.     .endif
    91.     push ecx
    92.     push esi
    93.     push NULL
    94.     push NULL
    95.     Call Entries[2*4]   ; LdrLoadDll()
    96.     push eax
    97.     push esi
    98.     Call Entries[4] ; RtlFreeUnicodeString()
    99.     pop eax
    100.     mov dword ptr [$Buffer],"dnes"
    101.     test eax,eax
    102.     mov dword ptr [$Buffer + 4],eax
    103.     lea ecx,pSend
    104.     jnz Exit
    105.     push ecx
    106.     push eax
    107.     push eax
    108.     push ebx
    109.     push WsHandle
    110.     mov eax,IDP_QUERY_ENTRY
    111.     Call IDP
    112.     test eax,eax
    113.     mov dword ptr [$Buffer],"H2SW"
    114.     jnz Unload
    115.     push ebx
    116.     mov dword ptr [$Buffer + 4],".PLE"
    117.     push esi
    118.     mov dword ptr [$Buffer + 2*4],"lld"
    119.     Call Entries[0] ; RtlCreateUnicodeStringFromAsciiz()
    120.     test eax,eax
    121.     lea ecx,HlHandle
    122.     .if Zero?
    123.     mov eax,STATUS_INTERNAL_ERROR
    124.     jmp Unload
    125.     .endif
    126.     push ecx
    127.     push esi
    128.     push NULL
    129.     push NULL
    130.     Call Entries[4*4]   ; LdrGetDllHandle()
    131.     push eax
    132.     push esi
    133.     Call Entries[4] ; RtlFreeUnicodeString()
    134.     pop eax
    135.     test eax,eax
    136.     lea ecx,WahEntries
    137.     jnz Unload
    138.     mov WahEntries[0],03E2D73A7H    ; CRC32("WahReferenceContextByHandle")
    139.     mov WahEntries[4],0F646DDDDH    ; CRC32("WahCreateHandleContextTable")
    140.     mov WahEntries[2*4],eax
    141.     push ecx
    142.     push ecx
    143.     push eax
    144.     push HlHandle
    145.     mov eax,IDP_QUERY_ENTRIES
    146.     Call IDP
    147.     test eax,eax
    148.     mov esi,pSend   ; @send()
    149.     jnz Unload
    150.     lea edi,[esi + 100H]
    151.     xor ebx,ebx
    152. Ip:
    153.     Call VirXasm32
    154.     cmp al,3
    155.     jne @f
    156.     cmp byte ptr [esi],0C2H
    157.     jne Step
    158.     mov eax,STATUS_NOT_FOUND
    159.     jmp Unload
    160. @@:
    161.     cmp al,5
    162.     jne Step
    163.     cmp byte ptr [esi],0E8H ; Call GetCountedDSocketFromSocket
    164.     jne Step
    165.     bts ebx,1
    166.     jnc Step
    167. ; 2nd
    168.     add esi,dword ptr [esi + 1]
    169.     add esi,5   ; @GetCountedDSocketFromSocket()
    170.     lea edi,[esi + 80H]
    171. Ip2:
    172.     Call VirXasm32
    173.     cmp al,3
    174.     jne @f
    175.     cmp byte ptr [esi],0C2H
    176.     jne Step2
    177.     mov eax,STATUS_NOT_FOUND
    178.     jmp Unload
    179. @@:
    180.     cmp al,6
    181.     jne Step2
    182.     cmp word ptr [esi],15FFH
    183.     jne Step2
    184.     cmp word ptr [esi - 6],35FFH    ; push dword ptr [sm_context_table]
    185.     jne Step2
    186.     cmp word ptr [esi - 9],75FFH    ; push dword ptr [ebp + 2*4]
    187.     mov ecx,dword ptr [esi + 2]
    188.     jne Step2
    189.     cmp byte ptr [esi - 7],8
    190.     mov ecx,dword ptr [ecx]
    191.     jne Step2
    192.     cmp WahEntries[0],ecx
    193.     mov edx,dword ptr [esi - 4] ; @sm_context_table
    194.     jne Step2
    195.     mov ecx,pWahContextTable
    196.     mov esi,WahEntries[4]
    197.     mov edi,pWahCreateHandleContextTable
    198.     xor eax,eax
    199.     mov dword ptr [ecx],edx
    200.     mov dword ptr [edi],esi
    201.     jmp Exit
    202. Step2:
    203.     add esi,eax
    204.     cmp esi,edi
    205.     jb Ip2
    206.     jmp Unload
    207. Step:
    208.     add esi,eax
    209.     cmp esi,edi
    210.     jb Ip
    211. Unload:
    212.     push eax
    213.     push WsHandle
    214.     Call Entries[3*4]
    215.     pop eax
    216.     jmp Exit
    217. SEH_Epilog_Reference:
    218.     GET_CURRENT_GRAPH_ENTRY
    219. Exit:
    220.     Call SEH_Epilog
    221.     ret
    222. WspQueryContextTable endp
    223.  
    224. VEH proc uses esi edi ExceptionPointers:PEXCEPTION_POINTERS
    225.     assume fs:nothing
    226.     mov eax,ExceptionPointers
    227.     mov ecx,EXCEPTION_POINTERS.ExceptionRecord[eax]
    228.     assume ecx:PEXCEPTION_RECORD
    229.     mov edi,EXCEPTION_POINTERS.ContextRecord[eax]
    230.     assume edi:PCONTEXT
    231.     cmp [ecx].ExceptionFlags,NULL
    232.     jnz Chain
    233.     cmp [ecx].ExceptionCode,IDP_BREAKPOINT
    234.     je Load
    235.     cmp [ecx].ExceptionCode,IDP_SINGLE_STEP
    236.     jne Chain
    237. ;   [...]
    238. Load:
    239.     mov eax,EXCEPTION_CONTINUE_EXECUTION
    240.     ret
    241. Chain:
    242.     xor eax,eax
    243.     ret
    244. VEH endp
    245.  
    246. NTERR macro
    247.     .if Eax
    248.     Int 3
    249.     .endif
    250. endm
    251.  
    252. APIERR macro
    253.     .if !Eax
    254.     Int 3
    255.     .endif
    256. endm
    257.  
    258. Entry proc
    259. Local pWahContextTable:PVOID
    260. Local pWahCreateHandleContextTable:PVOID
    261.     invoke WspQueryContextTable, addr pWahContextTable, addr pWahCreateHandleContextTable
    262.     NTERR
    263.     mov ebx,pWahContextTable
    264.     mov eax,IDP_INITIALIZE_ENGINE
    265.     Call IDP
    266.     NTERR
    267.     .if dword ptr [Ebx] == Eax
    268.     push ebx
    269.     Call pWahCreateHandleContextTable   ; .. WSAStartup()
    270.     NTERR
    271.     .endif
    272.     push offset VEH
    273.     push 0
    274.     mov eax,IDP_ADD_VEH
    275.     Call IDP
    276.     APIERR
    277.     mov eax,IDP_ADD_REFERENCE
    278.     push 3000H
    279.     push pWahContextTable
    280.     Call IDP
    281.     NTERR
    282. ;   [...]
    283.     ret
    284. Entry endp
    285. end Entry
    Нотификация хэндлера будет выполняться из WahReferenceContextByHandle(). В первом стековом фрейме GetCountedDSocketFromSocket(), в следующем фрейме целевая функа(send() etc.).
     
  9. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Собрал тестовый семпл. Вначале был деадлок, оказался баг в вдижке с флажками, всё пофиксил:
    http://indy-vx.narod.ru/Bin/Wsi.zip
     
  10. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Тут сказали что этот семпл палится как Win32:lol: NSChanger-VJ. Так вот эта сигнатура лежит в дизасме длин(VirXasm32b). Для устранения проблемы добавить Nop по метке xa_no16.