CreateRemoteThread trouble

Тема в разделе "WASM.WIN32", создана пользователем DeHunter, 25 фев 2005.

  1. DeHunter

    DeHunter New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2005
    Сообщения:
    80
    Адрес:
    Ukraine/Kiev
    Я не совсем знал куда написать. К вирусологии это впринципе имеет отдалённое отношение.

    Вобшем я написал код который по идеи должен создавать новый треад в експлоере и грузить длл откуда вызывать функцию.

    вот этот код.
    Код (Text):
    1.  
    2. ;.... Всевозможные инклуды и вариаблы покусаны ....;
    3. jmp code_injection
    4. ;<<<<<<<<<<<<<<<<<<<<<<<<<<<< AHTUNG. HEARE CODE THA WILL BE INJECTED TO EXPLOER >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>;
    5. start_inject_code :
    6. mov eax, offset end_importz
    7. sub eax, offset start_importz
    8. add eax, $+7
    9. call eax
    10. ;-------- imports and data --------;
    11. start_importz :
    12. iExitThread DD 0
    13. iGetProcAddress DD 0
    14. iLoadLibrary DD 0
    15. ProcName DB "MSGBLA", 0
    16. LibName  DB "mylib.dll", 0
    17. end_importz :
    18. ;-------- the code =)
    19. pop ebx
    20. mov eax, ebx
    21. add eax, offset LibName - offset start_importz
    22. push eax
    23. mov eax, ebx
    24. add eax, offset iLoadLibrary - offset start_importz
    25. call dword ptr [eax]
    26. test eax, eax
    27. jz error_call
    28. mov ecx, eax
    29. mov eax, ebx
    30. add eax, offset ProcName - offset start_importz
    31. push eax
    32. push ecx
    33. mov eax, ebx
    34. add eax, offset iGetProcAddress - offset start_importz
    35. call dword ptr [eax]
    36. test eax, eax
    37. jz error_call
    38. call eax
    39. error_call :
    40. call dword ptr [ebx]
    41. end_inject_code :
    42. ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>;
    43. ;------ inject our code to exploer
    44. code_injection :
    45. mov eax, ExitThread
    46. mov iExitThread, eax
    47. mov eax, LoadLibrary
    48. mov iLoadLibrary, eax
    49. mov eax, GetProcAddress
    50. mov iGetProcAddress, eax
    51. ;--- debug
    52. ; jmp start_inject_code
    53. ;--------
    54.  
    55. invoke FindWindowA,addr svchost_cls, 0
    56. invoke GetWindowThreadProcessId,  eax, addr pid
    57. invoke OpenProcess, PROCESS_ALL_ACCESS, 1, pid
    58. mov phdr, eax
    59. invoke VirtualAllocEx, phdr, 0, 1000H , MEM_COMMIT, PAGE_EXECUTE_READWRITE
    60. mov mbase, eax
    61. invoke WriteProcessMemory, phdr, mbase, offset start_inject_code, offset end_inject_code- offset start_inject_code, 0
    62. invoke CreateRemoteThread, phdr,0, 1000H, mbase, 0, 0, 0
    63. invoke CloseHandle, phdr
    64. invoke ExitProcess, 0
    65.  


    Это всё вылетает уже в експлоере. Я не могу его отладить даже. Когда эта радость вылетает олли пишет что там якобы была ошибка при вызове. Чтобы проверить правильно ли я посчитал адресса я там вставил джамп который вместо того чтобы тулить код в експлоер выполняет его. Посмотрите там под ;---- debug это джамп идёт. В длл примитивный месадж бокс. Так вот если разкоментировать дебаг то всё прекрасно работает. Ну всмысле что оффсеты посчитаны правильно. В чём проблема ?
     
  2. svl

    svl New Member

    Публикаций:
    0
    Регистрация:
    23 фев 2005
    Сообщения:
    46
    Адрес:
    Ukraine
    Рихтера поищи. Было уже в форуме. С примером кода.
     
  3. Songoku

    Songoku Эдгар

    Публикаций:
    0
    Регистрация:
    1 мар 2003
    Сообщения:
    68
    Адрес:
    Belarus
    Я ВОТ ТАК ВОТ ДЕЛАЛ!




    Код (Text):
    1. format PE GUI 4.0
    2. entry start
    3.  
    4. include '%include%\win32a.inc'
    5.  
    6. section '.code' code readable writeable executable
    7.  
    8.   _title db 'Win32 program template',0
    9.   _class db 'FASMWIN32',0
    10.   _bt db 'BUTTON',0
    11.   _ed db 'EDIT',0
    12.   _ch db 'Do somethink',0
    13.  
    14.   mainhwnd dd ?
    15.   hinstance dd ?
    16.   count dd 5
    17.   _ret dd 0
    18.  
    19.   msg MSG
    20.   wc WNDCLASS
    21.  
    22.  
    23.  
    24.   start:
    25.  
    26.     invoke  GetModuleHandle,0
    27.     mov [hinstance],eax
    28.     invoke  LoadIcon,0,IDI_APPLICATION
    29.     mov [wc.hIcon],eax
    30.     invoke  LoadCursor,0,IDC_ARROW
    31.     mov [wc.hCursor],eax
    32.     and [wc.style],0
    33.     mov [wc.lpfnWndProc],WindowProc
    34.     and [wc.cbClsExtra],0
    35.     and [wc.cbWndExtra],0
    36.     push    [hinstance]
    37.     pop [wc.hInstance]
    38.     mov [wc.hbrBackground],COLOR_BTNFACE+1
    39.     and [wc.lpszMenuName],0
    40.     mov [wc.lpszClassName],_class
    41.     invoke  RegisterClass,wc
    42.       ;  call g_err
    43.     invoke  CreateWindowEx,0,_class,_title,WS_VISIBLE+WS_DLGFRAME+WS_SYSME NU,128,128,192,192,NULL,NULL,[hinstance],NULL
    44.     mov [mainhwnd],eax
    45.     invoke  CreateWindowEx,WS_EX_STATICEDGE,_bt,_ch,WS_VISIBLE+WS_CHILD,1, 1,120,23,[mainhwnd],1,0,NULL
    46.     invoke  CreateWindowEx,WS_EX_STATICEDGE,_ed,_ch,WS_VISIBLE+WS_CHILD+ES _AUTOHSCROLL,1,25,170,18,[mainhwnd],2,0,NULL
    47.     ; ------- MessageBox ------
    48.     push    [MessageBox]
    49.     pop [_MessageBoxA]
    50.     ; ------- DeleteFile ------
    51.     push    [DeleteFile]
    52.     pop [_DeleteFileA]
    53.     ; ------- VirtualFree -----
    54.     push    [VirtualFree]
    55.     pop [_VirtualFree]
    56.  
    57.     mov  ebx,2
    58.     @@:
    59.     invoke   GetStockObject,DEFAULT_GUI_FONT
    60.     invoke   SendDlgItemMessage,[mainhwnd],ebx,WM_SETFONT,eax,0
    61.     dec  ebx
    62.     jz   @F
    63.     jmp  @B
    64.     @@:
    65.   msg_loop:
    66.     invoke  GetMessage,msg,NULL,0,0
    67.     or  eax,eax
    68.     jz  end_loop
    69.     invoke  TranslateMessage,msg
    70.     invoke  DispatchMessage,msg
    71.     jmp msg_loop
    72.  
    73.   end_loop:
    74.     invoke  ExitProcess,[msg.wParam]
    75.  
    76. proc WindowProc, hwnd,wmsg,wparam,lparam
    77.     enter
    78.     push    ebx esi edi
    79.     cmp [wmsg],WM_DESTROY
    80.     je  wmdestroy
    81.     cmp [wmsg],WM_COMMAND
    82.     je  wmcommand
    83.     cmp [wmsg],WM_CTLCOLOREDIT
    84.     je  wmctlcoloredit
    85.   defwndproc:
    86.     invoke  DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]
    87.     jmp finish
    88.   wmctlcoloredit:
    89.  
    90.  
    91.     jmp finish
    92.   wmdestroy:
    93.     invoke  PostQuitMessage,0
    94.     xor eax,eax
    95.     jmp finish
    96.   wmcommand:
    97.     cmp [wparam],1
    98.     jne finish
    99.     ; Код по нажатия кнопки!!!
    100.        ; int 3
    101.     invoke  FindWindow,aProgman,0
    102.     test    eax,eax  ; если окно не найдено что завершение процедуры.
    103.     jz  finish
    104.     mov ebx,esp
    105.     ; Так вот посмотрите для начало портатип GetWindowThreadProcessId
    106. ;        DWORD GetWindowThreadProcessId(
    107. ;        HWND hWnd,  // Дескриптор(описатель) окна
    108. ;        LPDWORD lpdwProcessId );  // адресс к переменной каторая описывает индификатор процесса
    109.     ; Так вы наверное спросите а почему я указал 3 параметра?
    110.     ; А патому что первый это рескриптор, 2 это указатель на стек, 3 - это просто мусор
    111.     ; просто я это командой выделяю в стеке 4 байта, что бы туда запистаь ProcessID
    112.     invoke  GetWindowThreadProcessId,eax,esp,eax
    113. ;        pop     ebx  ; А тут мы востонавливаем стек и переносим PID в ebx.
    114. ;        push    ebx  ; один и тот же заин .. эти две строки можно востоновить если потом понадобится ebx(PID)
    115.     invoke  OpenProcess,PROCESS_CREATE_THREAD+PROCESS_VM_OPERATION+PROCESS _VM_WRITE,0
    116.     test    eax,eax
    117.     jz  finish
    118.     xchg    eax,ebx
    119.     push    ebx ; ebx - Указатель HProcess
    120.     invoke  VirtualAllocEx,ebx,0,_Injected_end-Injected,MEM_COMMIT,PAGE_EX ECUTE_READWRITE
    121.     test    eax,eax
    122.     jz  @F
    123.     xchg    eax,edi ; edi - адресс где в explorer'e мы скопировали наш код.
    124.     invoke  WriteProcessMemory,ebx,edi,Injected,_Injected_end-Injected,esp ,eax
    125.     test    eax,eax
    126.     jz  @F
    127.     invoke  CreateRemoteThread,ebx,0,0,edi,edi,0,esp
    128.     add esp,4
    129.     test    eax,eax
    130.     jz  @F
    131.     invoke  CloseHandle,eax ; - закрытие описателя потока
    132.     @@:
    133.     invoke  CloseHandle ; - Закрытие описателя процесса explorer'a
    134. ;        stdcall _z,0
    135.  
    136.     xor eax,eax
    137.   finish:
    138.     pop edi esi ebx
    139.     return
    140.     endp
    141.  
    142.  
    143. macro bcall proc
    144. {
    145. local label1
    146. call $+5
    147. label1:
    148. pop  eax
    149. add  eax,proc-label1
    150. call dword[eax]
    151. }
    152.  
    153. macro bpush args
    154. {
    155. local label1
    156. call $+5
    157. label1:
    158. add  dword[esp],args-label1
    159. }
    160.  
    161.  
    162.  
    163.  
    164. proc Injected,lpParam
    165. enter
    166. @@:
    167. int 3
    168. push    MB_SYSTEMMODAL+MB_ICONWARNING
    169. bpush   aProgman
    170. bpush   _Train
    171. push    0
    172. bcall  _MessageBoxA
    173. bpush  _Train
    174. bcall  _DeleteFileA
    175. test    eax,eax
    176. ;jz      @B
    177. ; - Начало отчистки выделеной памяти.
    178. pop  edx  ; - Удаляем параметр lpParam из стека
    179. pop  edx  ; - В edx - находится адрес от куда эту функцию вызвали!
    180. push     MEM_RELEASE ; dwFreeType
    181. push     0       ; dwSize
    182. push     [lpParam]   ; lpAddress
    183. push     edx  ; - Этот параметр не имеет прямого отношения к VirtualFree.
    184. bpush    _VirtualFree
    185. pop  eax
    186. jmp  dword[eax]  ; Вызов VirtualFree
    187. ; - Конец функции. Дальше идут праметры каторые важны для дальнейшего использ.
    188. _MessageBoxA dd 0
    189. _DeleteFileA dd 0
    190. _VirtualFree dd 0
    191. aProgman     db 'Progman',0
    192. _Train       db 'C:\Fasm\EXAMPLES\Work\Test\Inject-explorer\test_to_delete.txt',0
    193. _Injected_end:
    194. endp
    195.  
    196.  
    197.  
    198. proc g_err
    199. tmp_str dd ?
    200. enter
    201.  pushad
    202.  invoke  GetLastError
    203.  test    eax,eax
    204.  jz  @F
    205.  lea     ebx,[tmp_str]
    206.  invoke  FormatMessage, FORMAT_MESSAGE_ALLOCATE_BUFFER + FORMAT_MESSAGE_FROM_SYSTEM,0,eax,0,ebx,0,0
    207.  invoke  MessageBox,0,[ebx],0, MB_OK + MB_ICONSTOP
    208.  invoke  LocalFree,[ebx]
    209.  @@:
    210.  popad
    211. return
    212. endp
    213.  
    214. section '.idata' import data readable writeable
    215.  
    216.   library kernel,'KERNEL32.DLL',\
    217.       user,'USER32.DLL',\
    218.       gdi,'GDI32.DLL'
    219.  
    220.   import kernel,\
    221.      GetModuleHandle,'GetModuleHandleA',\
    222.      ExitProcess,'ExitProcess',\
    223.      GetLastError,'GetLastError',\
    224.      FormatMessage,'FormatMessageA',\
    225.      LocalFree,'LocalFree',\
    226.      SetLastError,'SetLastError',\
    227.      OpenProcess,'OpenProcess',\
    228.      CloseHandle,'CloseHandle',\
    229.      VirtualAllocEx,'VirtualAllocEx',\
    230.      WriteProcessMemory,'WriteProcessMemory',\
    231.      CreateRemoteThread,'CreateRemoteThread',\
    232.      DeleteFile,'DeleteFileA',\
    233.      VirtualFree,'VirtualFree'
    234.  
    235.   import user,\
    236.      RegisterClass,'RegisterClassA',\
    237.      CreateWindowEx,'CreateWindowExA',\
    238.      DefWindowProc,'DefWindowProcA',\
    239.      GetMessage,'GetMessageA',\
    240.      TranslateMessage,'TranslateMessage',\
    241.      DispatchMessage,'DispatchMessageA',\
    242.      LoadCursor,'LoadCursorA',\
    243.      LoadIcon,'LoadIconA',\
    244.      PostQuitMessage,'PostQuitMessage',\
    245.      wsprintf,'wsprintfA',\
    246.      MessageBox,'MessageBoxA',\
    247.      SendDlgItemMessage,'SendDlgItemMessageA',\
    248.      GetDesktopWindow,'GetDesktopWindow',\
    249.      FindWindow,'FindWindowA',\
    250.      GetWindowThreadProcessId,'GetWindowThreadProcessId'
    251.  
    252.  import  gdi,\
    253.      GetStockObject,'GetStockObject',\
    254.      CreateSolidBrush,'CreateSolidBrush'
    255.  
     
  4. Sickle

    Sickle New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2003
    Сообщения:
    181
    вот рабочий пример самоудаления через RemoteThread (здесь код в Оперу прописывается и удаляет исходный экзэ)
    Код (Text):
    1.  
    2. .386
    3. .model flat, stdcall
    4. option casemap:none
    5. include \masm32\include\windows.inc
    6. include \masm32\include\kernel32.inc
    7. include \masm32\include\user32.inc
    8. includelib \masm32\lib\kernel32.lib
    9. includelib \masm32\lib\user32.lib
    10.  
    11. .data
    12. szTarget byte 'OpWindow', 0
    13. szUser32 byte 'USER32.DLL', 0
    14. szSharedData byte 261 dup (0)
    15.  
    16. .data?
    17. hModule dword ?
    18. hNewModule dword ?
    19. hProcess dword ?
    20. dwSize dword ?
    21. dwPid dword ?
    22. dwBytesWritten dword ?
    23. dwTid dword ?
    24. .code
    25.  
    26. HijackedThread proc
    27. invoke LoadLibrary, addr szUser32
    28. invoke DeleteFile, addr szSharedData
    29. invoke MessageBox, 0, addr szTarget, addr szTarget, 0
    30. invoke ExitThread, 0
    31. ret
    32. HijackedThread endp
    33.  
    34. _entrypoint:
    35. invoke GetModuleHandle, 0
    36. mov hModule, eax
    37. mov edi, eax
    38. assume edi:ptr IMAGE_DOS_HEADER
    39. add edi, [edi].e_lfanew
    40. add edi, sizeof dword
    41. add edi, sizeof IMAGE_FILE_HEADER
    42. assume edi:ptr IMAGE_OPTIONAL_HEADER32
    43. mov eax, [edi].SizeOfImage
    44. mov dwSize, eax
    45. assume edi:NOTHING
    46. invoke GetModuleFileName, 0, addr szSharedData, 261
    47. invoke FindWindowEx, 0, 0, addr szTarget, 0
    48. invoke GetWindowThreadProcessId, eax, addr dwPid
    49. invoke OpenProcess, PROCESS_ALL_ACCESS, FALSE, dwPid
    50. mov hProcess, eax
    51. invoke VirtualFreeEx, hProcess, hModule, 0, MEM_RELEASE
    52. invoke VirtualAllocEx, hProcess, hModule, dwSize, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE
    53. mov hNewModule, eax
    54. invoke WriteProcessMemory, hProcess, hNewModule, hModule, dwSize, addr dwBytesWritten
    55. invoke CreateRemoteThread, hProcess, 0, 0, addr HijackedThread, hModule, 0, addr dwTid
    56. invoke ExitProcess, 0
    57. end _entrypoint
    58.  




    у тебя скорее всего переход не туда происходит... смотри параметры CreateRemoteThread
     
  5. DeHunter

    DeHunter New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2005
    Сообщения:
    80
    Адрес:
    Ukraine/Kiev
    Большое спасибо. Я уже разобрался. Всё дело было в том что переход происходил не туда. Я то делал mov eax, [LoadLibraryA] к примуру на что оно мне помешало в eax ссылку на код типа jmp KERNEL32!LoadLibraryA.

    Вобшем я всё поправил. Просто я смотрел сурс где 500мхз делал такой прикол с помошью фасма. Но фасм компилит по нормальному в то время как масм творит какието чудеса. Ну я не сильно разбираюсь поэтому мог чегото и напутать с тем что оно там творит.

    Если кому стало интересно то вот код :
    Код (Text):
    1.  
    2.     jmp code_injection
    3. ;<<<<<<<<<<<<<<<<<<<<<<<<<<<< AHTUNG. HEARE CODE THA WILL BE INJECTED TO EXPLOER >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>;
    4. start_inject_code :
    5.     call end_importz
    6. ;-------- imports and data --------;
    7. start_importz :
    8.     iExitThread DD  0
    9.     iGetProcAddress DD  0
    10.     iLoadLibrary    DD  0
    11.     ProcName    DB  "LibMain", 0
    12.     LibName     DB  "srv.dll", 0
    13. end_importz :
    14. ;-------- the code =)
    15.     pop ebx
    16.     mov eax, ebx
    17.     add eax, offset LibName - offset start_importz
    18.     push eax
    19.     mov eax, ebx
    20.     add eax, offset iLoadLibrary - offset start_importz
    21.     call dword ptr [eax]
    22.     test eax, eax
    23.     jz error_call
    24.     mov ecx, eax
    25.     mov eax, ebx
    26.     add eax, offset ProcName - offset start_importz
    27.     push eax
    28.     push ecx
    29.     mov eax, ebx
    30.     add eax, offset iGetProcAddress - offset start_importz
    31.     call dword ptr [eax]
    32.     test eax, eax
    33.     jz error_call
    34.     call eax
    35. error_call :
    36.     push 0
    37.     call dword ptr [ebx]
    38. end_inject_code :
    39. ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>;
    40. ;------ inject our code to exploer
    41. code_injection :
    42.     mov eax, [LoadLibraryA]
    43.     mov eax, [eax+2]
    44.     mov eax, [eax]
    45.     mov iLoadLibrary, eax
    46.    
    47.     mov eax, [ExitThread]           ;BLA
    48.     mov eax, [eax+2]
    49.     mov eax, [eax]
    50.     mov iExitThread, eax
    51.    
    52.     mov eax, [GetProcAddress]
    53.     mov eax, [eax+2]
    54.     mov eax, [eax]
    55.     mov iGetProcAddress, eax
    56.         ;--- debug
    57.         ;   jmp start_inject_code
    58.         ;--------
    59.    
    60.     invoke FindWindowA,addr svchost_cls, 0
    61.     invoke GetWindowThreadProcessId,  eax, addr pid
    62.     invoke OpenProcess, PROCESS_ALL_ACCESS, 1, pid
    63.     mov phdr, eax
    64.     invoke VirtualAllocEx, phdr, 0, 1000H , MEM_COMMIT, PAGE_EXECUTE_READWRITE
    65.     mov mbase, eax
    66.     invoke WriteProcessMemory, phdr, mbase, offset start_inject_code, offset end_inject_code- offset start_inject_code, 0
    67.     invoke CreateRemoteThread, phdr,0, 1000H, mbase, 0, 0, 0
    68.     invoke CloseHandle, phdr
    69.     invoke ExitProcess, 0
    70. ;===================================================================== ======;
    71. End start
    72.  
    73.