не получается запустить svchost

Discussion in 'WASM.BEGINNERS' started by berni, Jul 18, 2009.

  1. berni

    berni New Member

    Blog Posts:
    0
    Code (Text):
    1. CreateProcess(NULL, "svchost.exe", NULL, NULL, 0, CREATE_SUSPENDED, NULL, NULL, &si, &pi);
    2.     c.instr_push_loadlibrary_arg = 0x68; //машинный код инструкции push
    3.     c.loadlibrary_arg = (DWORD)((BYTE*)p_code + offsetof(CodeInject, libraryname));
    4.     c.instr_call_loadlibrary = 0x15ff; //машинный код инструкции call
    5.     c.adr_from_call_loadlibrary = (DWORD)(p_code + offsetof(CodeInject, addr_loadlibrary));
    6.     c.instr_push_exitthread_arg = 0x68;
    7.     c.exitthread_arg = 0;
    8.     c.instr_call_exitthread = 0x15ff;
    9.     c.adr_from_call_exitthread =    (DWORD)(p_code + offsetof(CodeInject, addr_exitthread));
    10.     c.addr_loadlibrary = (DWORD)GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");
    11.     c.addr_exitthread = (DWORD)GetProcAddress(GetModuleHandle("kernel32.dll"),"ExitThread");
    12.     strcpy((char*)c.libraryname, "c:\\windows\\system32\\liba.dll" );
    13.  
    14.         ctx.ContextFlags = CONTEXT_FULL;
    15.         GetThreadContext(pi.hThread, &ctx);
    16.  
    17.         code_address = VirtualAllocEx(pi.hProcess, NULL, sizeof(c), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    18.  
    19.         WriteProcessMemory(pi.hProcess, code_address, &cmds, sizeof(c), NULL);
    20.  
    21.         ctx.Eip = (unsigned long)code_address;
    22.         SetThreadContext(pi.hThread, &ctx);
    23.  
    24.         ResumeThread(pi.hThread);
    после этого процес тупо завершается.
     
  2. Clerk

    Clerk Забанен

    Blog Posts:
    0
    Выложите экзе.
     
  3. berni

    berni New Member

    Blog Posts:
    0
    екзе не оптимизированный, с CRT
     
  4. berni

    berni New Member

    Blog Posts:
    0
    не приаттачился :dntknw:
    http://rapidshare.com/files/257277133/test.exe.html
     
  5. l_inc

    l_inc New Member

    Blog Posts:
    0
    berni
    Слишком много ошибок. До работоспособного кода ещё очень далеко. Ошибки начиная с того, что для c.loadlibrary_arg высчитывается бред (но падение произойдёт уже буквально на следующем после этого push'а call'е, т.к. для c.adr_from_call_loadlibrary тоже бред высчитывается), как минимум потому, что адрес кода в целевом процессе на момент расчёта ещё не известен, и заканчивая тем, что процесс ещё даже не закончил инициализацию. Так что LoadLibrary всё равно не прокатила бы. Ну и в конце концов, насколько можно судить по коду, предполагалось (именно предполагалось, т.к. реально внедряется ерунда всякая), что будет вызвана ExitThread в единственном потоке процесса. Так чего вообще можно было ожидать?
     
  6. spa

    spa Active Member

    Blog Posts:
    0
    [iшаман мод] скорее всего dll создает поток :derisive:[/шаман мод]
     
  7. berni

    berni New Member

    Blog Posts:
    0
    структура инжекта рабочая.
    после того как вызвана библиотека, сработает длл_процесс_аттач, оттуда вызовутся другие треды, поэтому этот тред можно спокойно убить.
     
  8. spa

    spa Active Member

    Blog Posts:
    0
    berni
    с другими процессами работает? вообще вы точно копируете имя функции в чужое АП?
     
  9. berni

    berni New Member

    Blog Posts:
    0
    SPA
    с другими да, к примеру сплайся createprocess получаю pid после создания процесса и потом делаю инжект, все хорошо.
    но вот при creeateprocess с CREATE_SUSPENDED нифига не пашет :dntknw: точнее судя про processexplorer руссиновича, длл инжектится в процесс, но он все равно завершается.
     
  10. l_inc

    l_inc New Member

    Blog Posts:
    0
    SPA
    Сам об этом подумал, когда отправил пост, но новый пост, только чтобы исправить, создавать не хотелось.
    berni
    Ну и что? Одной из сотни ошибок меньше. Как я уже сказал, параметр для LoadLibrary рассчитан неверно. Аргумент для косвенного вызова (FF 15) рассчитан соответственно также неверно. А был бы верно рассчитан, LoadLibrary всё равно бы не сработала, т.к. svchost ещё не закончил инициализацию. Ему нужно дать отработать самому хотя бы до точки входа.
     
  11. spa

    spa Active Member

    Blog Posts:
    0
    berni
    хм, у меня есть мнение что твой тред не успевает создаться, поставь Sleep(10000); перед завершением потока, и проверь. Возможно конечно я ошибаюсь, но по виду именно в этом проблема.
     
  12. berni

    berni New Member

    Blog Posts:
    0
    l_inc
    почему не верно? после иннициализации это выглядит так
    Code (Text):
    1.     push adr_library_name
    2.     call dword ptr [loadlibrary_adr]
    3.     push exit_thread_arg
    4.     call dword ptr [exit_thread_adr]
    а что инициализация? если мы переключаем процесс на наш код, который загрузит длл, а та уже все остальные dllки?

    SPA
    пробовал, не помогло
     
  13. l_inc

    l_inc New Member

    Blog Posts:
    0
    berni
    После инициализации это не выглядит так. Потому что на этапе заполнения этих полей ни адрес loadlibrary_adr в целевом процессе не известен, ни адрес adr_library_name, ни exit_thread_adr. Рассчитать эти адреса появляется возможность только после вызова VirtualAllocEx.
    Да... кстати, правильно SPA говорит. Задержка всё равно понадобится.
     
  14. l_inc

    l_inc New Member

    Blog Posts:
    0
    Хотя нет... гоню... не понадобится. Перепутал с сишным return из основного потока. Там же по return ExitProcess вызывается, а не ExitThread.