Как запустить из программы процесс?

Тема в разделе "WASM.ASSEMBLER", создана пользователем alex-rudenkiy, 3 июл 2017.

  1. alex-rudenkiy

    alex-rudenkiy New Member

    Публикаций:
    0
    Регистрация:
    26 май 2017
    Сообщения:
    16
    Как запустить в отдельном процессе, какой нибудь байт-код? Ну вот например как мне из основной программы, запустить в отдельном процессе (НЕ ПОТОКЕ) "mycode"?

    #include "stdio.h"
    unsigned char mycode[] = "\xeB\x02\xBA\xC7\x93"
    "\xBF\x77\xFF\xD2\xCC"
    "\xE8\xF3\xFF\xFF\xFF"
    "\x63\x61\x6C\x63";
    int main ()
    {
    return 0;
    }
     
  2. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    alex-rudenkiy,

    Очевидно нужно записать в ап процесса ваш код и передать на него управление. Это инжектом называется.
     
  3. alex-rudenkiy

    alex-rudenkiy New Member

    Публикаций:
    0
    Регистрация:
    26 май 2017
    Сообщения:
    16
    В чей ап? Мне же сначала каким-то образом память выделить под новый процесс?
     
  4. TermoSINteZ

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

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
  5. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    alex-rudenkiy,

    > В чей ап? Мне же сначала каким-то образом память выделить под новый процесс?

    В целевой процесс-жертву. Или новый запустить если нужно, в зависимости от задачи. Потом выделить в памяти процесса регион, куда вы запишите данные.
     
  6. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    Кстате для академ целей может этот шелл и годится, но реально нет - там ветвления в середину инструкций, что самое палево которое только можно придумать.
     
  7. alex-rudenkiy

    alex-rudenkiy New Member

    Публикаций:
    0
    Регистрация:
    26 май 2017
    Сообщения:
    16
    Так вот, мне не нужен inject в какой нибудь процесс (как вы наверное подумали), мне нужно в новом процессе именно этот шелл и запустить :)
     
  8. sl0n

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

    Публикаций:
    0
    Регистрация:
    26 сен 2003
    Сообщения:
    684
    Так в чем проблема создаешь саспендед процесс в ентрипоинт записываешь шеллкод и делаешь резюм ... или я чего то не понял ?
     
  9. TermoSINteZ

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

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    Ок, пишете еще 1 исполняемый модуль, который содержит этот шел, передаете на него управление в main(), и из другого процесса - вызываете этот процесс. Все
     
  10. alex-rudenkiy

    alex-rudenkiy New Member

    Публикаций:
    0
    Регистрация:
    26 май 2017
    Сообщения:
    16
    Так ?...
    Код (ASM):
    1. invoke CreateProcess, 0, 0, 0, 0, 0, CREATE_SUSPENDED, 0, 0, 0, 0
    ... не получается, access violation выскакивает
     
  11. alex-rudenkiy

    alex-rudenkiy New Member

    Публикаций:
    0
    Регистрация:
    26 май 2017
    Сообщения:
    16
    Мне нужно выделить память (хз, как пустой процесс создать) и в неё переписать шелл (как переписать знаю) из нашей основной программы :sad:
     
  12. TermoSINteZ

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

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    Код (C):
    1. main(int argc, char** argv)
    2. {
    3. while(1) sleep(100);
    4. return;
    5. }
    ну вот вам типа пустой процесс )

    вот его компилируете
    В другом процессе запускаете этот процесс - последние параметры функции дадут вам описатели процесса и потока.
    Вот получаете хендл процесса и в нем создаете память доступную для записи и исполнения.
    Потом пишете в нее - ну а дальше делаете CreateRemoteThread на указанную память , ну либо просто переписываете точку входа и изменяете контекст процесса ручками. Вообще вариантов много .

    Я не пойму , в сети столько инфы по этому методу, что я просто не знаю даже что еще добавить вам.
     
  13. alex-rudenkiy

    alex-rudenkiy New Member

    Публикаций:
    0
    Регистрация:
    26 май 2017
    Сообщения:
    16
    Так это будет как отдельная программа (pusto.exe - например), это придётся её постоянно таскать?
     
  14. TermoSINteZ

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

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    ну есть способы создать свой процесс. но вам надо тогда знать порт завершения в csrss - ) что очень несовместимо между версиями винды. А без этого процесс не запустится.
     
  15. alex-rudenkiy

    alex-rudenkiy New Member

    Публикаций:
    0
    Регистрация:
    26 май 2017
    Сообщения:
    16
    А нельзя ли создать грубо говоря пустой thread (не зависимый от процесса) и туда тупо скопировать shell, который находится внутри запускаемой программы. А под независимостью, я подразумеваю, то что если прогу закрыть, то дочерние thread'ы тоже закрываются. Так вот, как сделать такой thread (ну я просто не знаю как правильно назвать по другому)
     
  16. 0xC3

    0xC3 New Member

    Публикаций:
    0
    Регистрация:
    1 июл 2017
    Сообщения:
    20
    Вы же собираетесь процесс откуда-то запускать? Вот и запускайте свою саспенд копию, анмапьте все - будет pusto.exe :)) , аллоцируйте память RWX, меняйте точку входа и резюмьте процесс. Или генерируйте свой pusto.exe.
    TermoSINteZ,
    нашли о чем заговорить тут )
    тем более я что то не припомню "летающих" без файла (файловой секции) процессов.

    Тема конечно глуповатая.
     
  17. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    alex-rudenkiy,

    > не получается, access violation выскакивает

    А как вы думаете, читать описание API не нужно, параметры тоже можно от балды" передавать ?

    Конечно же будет A/V, так как вместо указателей нули передаются.

    > Так это будет как отдельная программа (pusto.exe - например), это придётся её постоянно таскать?

    Копию своего процесса может запустить ?

    > А нельзя ли создать грубо говоря пустой thread (не зависимый от процесса) и туда тупо скопировать shell

    А в какую память вы собираетесь писать, если она может быть в пространстве процесса или ядра. Можно, имея прямой доступ к ядру, тоесть сделать то, для чего изначально и необходим шелл. Ну и для начала может нужно почитать что есть поток и прочие базовые вещи ?
     
  18. D34DC0D3_R

    D34DC0D3_R New Member

    Публикаций:
    0
    Регистрация:
    14 июл 2017
    Сообщения:
    11
    Эм... Ну для начала Вам нужно(ну как я понял) создать процесс с помощью CreateProcess, CreationFlags - CREATE_SUSPENDED, последним параметром идет ссылка на структуру PROCESS_INFORMATION. Далее выделяем память с помощью VirtualAllocEx(), хэндл берешь из PROCESS_INFORMATION, далее с помощью WriteProcessMemory Пишешь свой шелл в выделенную память(VirtualAllocEx - возвращает адрес выделенной памяти), И создаешь удаленный поток с помощью CreateRemoteThread, в LPTHREAD_START_ROUTINE передаешь адрес выделенной памяти. Закрываешь хэндл :) Вроде бы я не чего не забыл, теперь для реализации можно пойти на MSDN почитать про все эти функции и входящие/выходящие, а так же возвращаемые параметры. И начинать кодить :)

    P.s. Я пробовал разные варианты, пробовал и в новом процессе и в существующем и просто в текущем. Приложение падает с ошибкой переполнения стека. Ну и калькулятор(ведь он должен запустится) не запускает
     
  19. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    D34DC0D3_R,

    Переполнение стека возможно только при рекурсии, но так как ваш код не начал исполняться, то возможна лишь ода причина исчерпания стека - повторное исключение при попытке обработать текущее исключение. Так происходит рекурсивный вызов диспетчера, формирование фреймов на стеке до момента, пока стек не исчерпается, затем процесс прибивается. Это редкая ситуация и возникает она из за очень кривой реализации.
     
  20. D34DC0D3_R

    D34DC0D3_R New Member

    Публикаций:
    0
    Регистрация:
    14 июл 2017
    Сообщения:
    11
    Indy_,
    Ну покажите не кривую реализацию. С удовольствием бы посмотрел.
    Уже не первый раз замечаю, у Вас, какая-то странная техника чтения, вы пропускаете слова(как минимум, а то и строки). Я писал, что
    Это уже значит, что мой код запустится. А учитывая это
    То тут уже нужно запустить некую часть кода, для вызова функции CreateProcess() как минимум...

    А так же, методом не хитрых бряков на функциях, а так же дизассемблера, могу с уверенностью сказать, что мой код отлично работает. А приложение начинает падать по исполнению данного шелкода: Процесс создается, с остановленным основным потоком, далее в нем выделяется память, в память пишутся эти 19 байт, устанавливается контекст потока, а конкретнее EIP регистр на выделенную память. анпаужу поток.
    P.s. да я проверял адрес в памяти, шелкод пишется в память, ошибок нету. Без установки EIP на адрес шелкода, поток отлично анпаузится и приложение после этого работает.
    P.s.1. А по поводу ошибки переполнения стэка - об этом мне сообщила MSVC и то, только когда я пробовал запустить этот шел код в том же процессе, без создания новых и т.д.
    В свой то памяти работать легче.
    В общем вот мой код, надеюсь Вы тоже покажете свою реализацию, желательно что бы она работала :lol: :
    Код (C):
    1.  
    2. #define _CRT_SECURE_NO_WARNINGS
    3. #include <Windows.h>
    4. #include <iostream>
    5. unsigned char shellcode[] = "\xEB\x02\xBA\xC7\x93"
    6. "\xBF\x77\xFF\xD2\xCC"
    7. "\xE8\xF3\xFF\xFF\xFF"
    8. "\x63\x61\x6C\x63";
    9. int main()
    10. {
    11. // НЕ ЗАБЫТЬ! Убрать C:\\ перед именем файла
    12. char buff[MAX_PATH] = { 0 };
    13. char * procName = "C:\\CreateSuspended.exe";
    14. // Получим текущую дерикторию
    15. if (GetCurrentDirectory(MAX_PATH,buff) != 0)
    16. {
    17. // Пригодится чуть позже.
    18. strcat(buff, procName);
    19. //printf("Выводим содержимое буфера на экран: \n %s \n", buff);
    20. }
    21. // Обьявим и инициализируем структуры STARTUPINFO и PROCESS_INFORMATION
    22. STARTUPINFO stStartInfo;
    23. PROCESS_INFORMATION stProcInfo;
    24. ZeroMemory(&stStartInfo, sizeof(stStartInfo));
    25. ZeroMemory(&stProcInfo, sizeof(stProcInfo));
    26. // НЕ ЗАБЫТЬ! заменить procName на buff
    27. BOOL result = CreateProcess(procName,NULL,NULL,NULL, FALSE, CREATE_SUSPENDED,NULL,NULL, &stStartInfo, &stProcInfo);
    28. if (result)
    29. {
    30. printf("Process Created...\n");
    31. HANDLE hThread;
    32. hThread = stProcInfo.hThread;
    33. LPVOID addr;
    34. // Обьявим и инициализируем структуру CONTEXT
    35. CONTEXT cntx;
    36. ZeroMemory(&cntx, sizeof(cntx));
    37. cntx.ContextFlags = CONTEXT_CONTROL;
    38. GetThreadContext(hThread, &cntx);
    39. printf("Current EIP: 0x%x \n", cntx.Eip);
    40. // В общем:
    41. // Глаза бояться, а руки де...  из жопы! :D
    42. addr = VirtualAllocEx(stProcInfo.hProcess, NULL, 19, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    43. printf("Memory Allocated at: 0x%x \n", addr);
    44. WriteProcessMemory(stProcInfo.hProcess, addr, shellcode, 19, NULL);
    45. // Ну и собственно последний штрих, поставим EIP на адрес нашей выделеной памяти.
    46. cntx.Eip = (DWORD)addr;
    47. cntx.ContextFlags = CONTEXT_CONTROL;
    48. SetThreadContext(hThread, &cntx);
    49. // Возобновим процесс
    50. printf("Press anykey to resume thread \n");
    51. system("PAUSE");
    52. ResumeThread(hThread);
    53. CloseHandle(hThread);
    54. CloseHandle(stProcInfo.hProcess);
    55. // return 0;
    56. }
    57. else
    58. {
    59. // 2 - Файл не найден.
    60. printf("Error: %d \n", GetLastError());
    61. }
    62. system("PAUSE");
    63. return 0;
    64. }
    65.