eXeLab
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 1 марта!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

Русский / Russian English / Английский

Сейчас на форуме: alexsey007, Lambda (+1 невидимый пользователь)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS · SVN ·

 eXeL@B —› Вопросы новичков —› Выполнение действия при появлении процесса
Посл.ответ Сообщение

Ранг: 4.6 (гость)
Статус: Участник

Создано: 1 сентября 2018 20:09 New!
Цитата · Личное сообщение · #1

Прошу помощи по коду:
Code:
  1. #include <iostream>
  2. #include <cstring>
  3. #include <windows.h>
  4. #include <tlhelp32.h>
  5.  
  6. int proccess_is_exist(char *name)
  7. {
  8.          PROCESSENTRY32 pe32;
  9.          HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  10.          if (hProcessSnap == INVALID_HANDLE_VALUE)
  11.                  return -1;
  12.          pe32.dwSize = sizeof(PROCESSENTRY32);
  13.          Process32First(hProcessSnap, &pe32);
  14.          do
  15.          {
  16.                  if (!strcmp(name, pe32.szExeFile))
  17.                  {
  18.                         CloseHandle(hProcessSnap);
  19.                         return 1;
  20.                  }
  21.          } while (Process32Next(hProcessSnap, &pe32));
  22.          CloseHandle(hProcessSnap);
  23.          return 0;
  24. }
  25.  
  26. int main(int argc, char *argv[])
  27. {
  28.          setlocale(LC_ALL, "Russian");
  29.          char proc_name[] = "notepad.exe";
  30.         while (true)
  31.          {
  32.                  if (proccess_is_exist(proc_name))
  33.                  WinExec("C:\1.exe", SW_SHOWMINNOACTIVE);
  34.                  Sleep(1000);
  35.          }
  36.          return 0;
  37. }
- Здесь при обнаружении процесса notepad.exe запускается 1.exe многократно. Как сделать, чтобы происходило обнаружение нового процесса с интервалом ~1 сек, и при обнаружении, запускался 1.exe однократно? Делал убийство этой программы из 1.exe, но это не спасает, т.к. при обнаружении нового параллельно запущенного notepad.exe также должен быть произведен однократный запуск 1.exe. Т.Е. как сделать чтобы отслеживалось появление нового процесса *.exe происходило однократное срабатывание действия?


Ранг: 152.5 (ветеран)
Статус: Участник

Создано: 1 сентября 2018 20:14 · Поправил: f13nd New!
Цитата · Личное сообщение · #2

Заполняй массив pid(explorer.exe) - true/false, что он обработан, передавай его функции и пропускай уже обработанные. Ну и pid в аргументы 1.exe, чтоб он не растерялся что ему делать.

Ранг: 4.6 (гость)
Статус: Участник

Создано: 1 сентября 2018 20:16 New!
Цитата · Личное сообщение · #3

f13nd пишет:
Заполняй массив pid(explorer.exe) - true/false, что он обработан, передавай его функции и пропускай уже обработанные.
Вы не могли бы показать на примере?

Ранг: 255.4 (наставник)
Статус: Участник

Создано: 1 сентября 2018 20:27 · Поправил: difexacaw New!
Цитата · Личное сообщение · #4

inkermann

> как сделать чтобы отслеживалось появление нового процесса

Стандартные функции ждут сигнализацию обьекта, например завершение потока/процесса. Выполнить же обратное действие штатным путём не ясно как, осевой апи не предназначен для написания малвари, что бы отслеживать процессы. Есть косвенные способы - к примеру можно загружаться через гуй как фильтры. Можно запускаться как отладчик, но для заранее определённых процессов.

Это не корректно поставленная задача, зачем запускать есчо одно апп!?


Ранг: 152.5 (ветеран)
Статус: Участник

Создано: 1 сентября 2018 20:31 · Поправил: f13nd New!
Цитата · Личное сообщение · #5

Вы не могли бы показать на примере?
Code:
  1. stdcall proccess_is_exist,szProcessFilename,addr pbinHandledArray,[nHandledArrayMaxIndex]
  2. test ecx,ecx
  3. .if ~ZERO?
  4.          mov [nHandledArrayMaxIndex],ecx
  5.          ;запуск "1.exe %d",eax
  6. .endif
  7.  
  8. proc proccess_is_exist pszProcessFilename,pbinHandledArray,nHandledArrayMaxIndex
  9.          locals
  10.                  binProcessInfo  PROCESSENTRY32
  11.          endl
  12.          invoke CreateToolhelp32Snapshot,TH32CS_SNAPPROCESS,0
  13.          mov [hProcessSnapshot],eax
  14.          mov [binProcessInfo.dwSize],sizeof.PROCESSENTRY32
  15.          invoke Process32First,[hProcessSnapshot],addr binProcessInfo
  16.          .next:
  17.          .if eax = TRUE
  18.                  lea ecx,[binModuleInfo.szModule]
  19.                  invoke lstrcmpiA,addr binProcessInfo.szExeFile],[pszProcessFilename]
  20.                  test eax,eax
  21.                  .if ZERO?
  22.                         mov eax,[binProcessInfo.th32ProcessID]
  23.                         xor ecx,ecx
  24.                         mov edx,[pbinHandledArray]
  25.                         @@:
  26.                         .if ecx<[nHandledArrayMaxIndex]
  27.                               .if eax <> [edx + ecx*4]
  28.                                    inc ecx
  29.                                    jmp @B
  30.                               .endif
  31.                         .endif
  32.                         .if ecx=[nHandledArrayMaxIndex]
  33.                               mov DWORD[edx + ecx*4],eax
  34.                               inc ecx
  35.                               jmp @F
  36.                         .endif
  37.                  .endif
  38.                  invoke Process32Next,[hProcessSnapshot],addr binProcessInfo
  39.                  jmp .next
  40.          .else
  41.                  xor ecx,ecx
  42.          .endif
  43.          @@:
  44.          ret
  45. endp

Ранг: 255.4 (наставник)
Статус: Участник

Создано: 1 сентября 2018 20:38 New!
Цитата · Личное сообщение · #6

f13nd

invoke lstrcmpiA,addr binProcessInfo.szExeFile]


Ранг: 152.5 (ветеран)
Статус: Участник

Создано: 1 сентября 2018 20:40 New!
Цитата · Личное сообщение · #7

difexacaw
Я методом Кашпировского, без отладки и даже компиляции набросал. Просто идея, вряд ли он этот кусок использует.

Ранг: 4.6 (гость)
Статус: Участник

Создано: 1 сентября 2018 20:43 New!
Цитата · Личное сообщение · #8

f13nd, спасибо! Сейчас буду разбираться...
difexacaw, Ну там возможно не exe, а батник будет(чтобы в зависимости от задачи с разными настройками использовать.) Пока нужно на 20 сек. системное время дергать...

Добавлено спустя 2 минуты
Конечно, тяжеловато, Я только азы познаю...

Ранг: 255.4 (наставник)
Статус: Участник

Создано: 1 сентября 2018 20:49 · Поправил: difexacaw New!
Цитата · Личное сообщение · #9

inkermann

Не нужны вам пакетные файлы. Забудь про это. Спалит тебя авер, будешь гореть как ёлка.

| Сообщение посчитали полезным: Crawler


Ранг: 4.6 (гость)
Статус: Участник

Создано: 1 сентября 2018 21:06 New!
Цитата · Личное сообщение · #10

Да я пока для экспериментов, потом все в один запихну.

Ранг: 255.4 (наставник)
Статус: Участник

Создано: 1 сентября 2018 21:11 New!
Цитата · Личное сообщение · #11

inkermann

На батниках тесты нельзя выполнить на ав сканерах. В любом случае это всё не правильно. Так не делается.

Ранг: 115.5 (ветеран)
Статус: Участник

Создано: 1 сентября 2018 22:00 New!
Цитата · Личное сообщение · #12

Зачем удалять гланды через автогеном?
Есть же IFEO. Можно легко и просто запускать свою программу вместо любой заранее заданной. Нет заморочек с правами, не нужно постоянно дергать список процессов, а поскольку срабатывать будет при каждом старте нового процесса, не будет путанницы с многократным запуском целевого софта.
И где топикстартер писал про виксы я тоже чот не увидел, Инде как всегда на своей волне

| Сообщение посчитали полезным: zds



Ранг: 152.5 (ветеран)
Статус: Участник

Создано: 1 сентября 2018 22:05 · Поправил: f13nd New!
Цитата · Личное сообщение · #13

VOLKOFF пишет:
Есть же IFEO.

Одну малварную технику вместо другой ага Че ifeo, тупо explorer.exe заменить и готово.


Ранг: 210.0 (наставник)
Статус: Участник
X-Literator

Создано: 1 сентября 2018 22:07 New!
Цитата · Личное сообщение · #14

inkermann

Мьютексы. Можно создавать мьютекс, который видят другие процессы. Так проверяется, запущен ты один раз или несколько.

Можно в запускаемом EXE открывать пайп, если уже открыт - опять же, не запускать процесс в очередной раз.

Добавлено спустя 15 минут
f13nd учитывая, что сейчас новый зеродей появился, это не такое уж и безумие - заменить что-нибудь. Это я про эксплоит от SandboxEscaper. Все слышали о таком?

Короче, там пздц, можно через баг в планировщике повышать права от гостевых до системных перезаписью DACL хардлинка на любой файл, доступный на чтение. Соответственно, становится возможным его перезаписать.

В примере кода там перезаписывается printconfig.dll, потом запускается задание печати, и запускается через пэйлоад любая программа с системными правами.

| Сообщение посчитали полезным: inkermann


Ранг: 115.5 (ветеран)
Статус: Участник

Создано: 1 сентября 2018 22:32 · Поправил: VOLKOFF New!
Цитата · Личное сообщение · #15

f13nd пишет:
Одну малварную технику вместо другой ага

Это стандартный легальный системный механизм, который юзается достаточно часто, втч Process Explorer, Process Hacker, редакторами, альт консолями итп. Инде не буксуй, читай маны

Для автора (если он не умолчал о важных нюансах) это самый простой и надежный путь, идеально для любых тестов,- добавляешь одну запись в реестр и получаешь автоматический перехват запуска нужных процессов с вызовом своего кода. По сути это легальный хук CreateProcess. Не думаю, что найдется способ решить данную задачу эффективнее.

| Сообщение посчитали полезным: inkermann


Ранг: 255.4 (наставник)
Статус: Участник

Создано: 1 сентября 2018 22:40 New!
Цитата · Личное сообщение · #16

VOLKOFF

Так не в техниках дело, если вы не поняли задачу тс


Ранг: 152.5 (ветеран)
Статус: Участник

Создано: 2 сентября 2018 02:42 · Поправил: f13nd New!
Цитата · Личное сообщение · #17

Более правильный вариант использовать эвенты/колбеки, чтоб не было лага. Это можно сделать через эвенты WMI --> Link <-- или грязненьким способом через SetWindowsHookEx --> Link <--. Грязненький потому что отслеживать можно создание окна, а не процесса, но для explorer.exe это почти одно и то же. WMI сама по себе довольно тупая и глючная подсистема, я бы наверное выбрал второй вариант.

| Сообщение посчитали полезным: inkermann


Ранг: 4.6 (гость)
Статус: Участник

Создано: 2 сентября 2018 21:27 · Поправил: inkermann New!
Цитата · Личное сообщение · #18

Решил пойти по другому пути и заблудился в трех соснах:
Code:
  1. #include "windows.h"
  2. #include "iostream"
  3. using namespace std;
  4.  
  5. int main(int argc, char *argv[])
  6. {
  7.          for (int i = 0; i < argc; i++) {
  8.                   //Выводим список аргументов в цикле
  9.                  cout << "Argument " << i << " : " << argv[i] << endl;
  10.          
  11.  
  12.  
  13. -----------------------------------------------------------------------------------
  14.  
  15.  
  16.  
  17.     fi = ??????????
  18.          
  19.          STARTUPINFO cif;
  20.          ZeroMemory(&cif, sizeof(STARTUPINFO));
  21.          PROCESS_INFORMATION pi;
  22.          LPTSTR fi;
  23.          if (CreateProcess("C:\game.exe", fi,
  24.                  NULL, NULL, FALSE, NULL, NULL, NULL, &cif, &pi) == TRUE)
  25.                  WinExec("C:\1.cmd", SW_SHOWMINNOACTIVE);
  26.          {
  27.                  cout << "process" << endl;
  28.                  cout << "handle " << pi.hProcess << endl;
  29.                  Sleep(1000);
  30.          }
  31. }

Не получается нормально связать верхнюю часть с нижней ... Нужно, чтобы командная строка данного л..
из неизвестно какого кол-ва аргументов нормально передавалась game.exe. Т.Е. fi присвоить правильное значение, если сработает.. Что не пробовал - ошибки лезут.

Ранг: 115.5 (ветеран)
Статус: Участник

Создано: 2 сентября 2018 22:22 New!
Цитата · Личное сообщение · #19

inkermann пишет:
Что не пробовал - ошибки лезут

А маны CreateProcess читать не пробовал?
Для простоты жизни на таком уровне кодинга однострочник с GetCommandLine покатит.

| Сообщение посчитали полезным: ajax



Ранг: 1975.0 (!!!!)
Статус: Модератор
retired

Создано: 2 сентября 2018 22:40 New!
Цитата · Личное сообщение · #20

Размер в структуре STARTUPINFO укажи.

| Сообщение посчитали полезным: inkermann


Ранг: 4.6 (гость)
Статус: Участник

Создано: 3 сентября 2018 01:15 New!
Цитата · Личное сообщение · #21

Как только не извращался:
Code:
  1. #include <iostream>
  2. #include <windows.h>
  3. using namespace std;
  4.  
  5. int main(int argc, char *argv[])
  6.  
  7. {
  8.          for (int i = 1; i < argc; i++) {
  9.                  char cmdline;
  10.                  cmdline = (cout <<" "<< argv[i]);
  11.  
  12.  
  13.                  {
  14.                         char cmdline(argv);
  15.                         if (CreateProcess("1.exe", &cmdline, NULL, NULL, FALSE, NULL, NULL, NULL, NULL, NULL))
  16.                  
  17.          Sleep(1000); }
  18. }


Ранг: 325.0 (мудрец)
Статус: Участник
born to be evil

Создано: 3 сентября 2018 08:02 · Поправил: ajax New!
Цитата · Личное сообщение · #22

inkermann
--> Link <--
как уже VOLKOFF написал, GetCommandLine с минимумом движений покатит для параметров

| Сообщение посчитали полезным: inkermann



Ранг: 523.8 (!)
Статус: Участник
оптимист

Создано: 3 сентября 2018 09:10 New!
Цитата · Личное сообщение · #23

Получай PID процесса ,в пеши в массив и чекай его ......

| Сообщение посчитали полезным: Crawler, inkermann


Ранг: 4.6 (гость)
Статус: Участник

Создано: 3 сентября 2018 11:22 · Поправил: inkermann New!
Цитата · Личное сообщение · #24

ajax пишет:
GetCommandLine
Понятно. но интересно было бы именно с CreateProcess, т.к. остальные возможности, тоже понадобятся... То, что выше, я только для примера привел, чтобы носом ткнули , как &cmdline присвоить входное значение.

Ранг: 115.5 (ветеран)
Статус: Участник

Создано: 3 сентября 2018 15:01 New!
Цитата · Личное сообщение · #25

inkermann пишет:
GetCommandLine Понятно. но интересно было бы именно с CreateProcess

Они не взаимоисключающие, если че

inkermann пишет:
остальные возможности

страшно подумать, что там в "подводной части айсберга"

Ранг: 4.6 (гость)
Статус: Участник

Создано: 3 сентября 2018 19:36 · Поправил: inkermann New!
Цитата · Личное сообщение · #26

VOLKOFF пишет:
страшно подумать, что там в "подводной части айсберга"



Добавлено спустя 3 часа 40 минут
Вот так проходит 1 аргумент командной строки, а нужно, чтобы все. Подправьте пожалуйста мой код:
Code:
  1. #include <iostream>
  2.  
  3. using namespace std;
  4. int main(int argc,      // Number of strings in array argv
  5.          char *argv[],   // Array of command-line argument strings
  6.          char *envp[])  // Array of environment variable strings
  7. {
  8.          int count;
  9.  
  10.          // Display each command-line argument.
  11.          cout << "\nCommand-line arguments:\n";
  12.          for (count = 0; count < argc; count++)
  13.                  cout << " argv[" << count << "] "
  14.                  << argv[count] << "\n";
  15.  
  16.          if ((UINT)ShellExecute(
  17.                  NULL,
  18.                  "open",
  19.                  "C:\App.exe",
  20.                  argv[1],
  21.                  NULL,
  22.                  SW_SHOWNORMAL) <= 32) {
  23.                  // обработка ошибок
  24.          }
  25. }

Ранг: 4.6 (гость)
Статус: Участник

Создано: 4 сентября 2018 20:24 · Поправил: inkermann New!
Цитата · Личное сообщение · #27

Конечно устроил бы и предложенный вариант (LPTSTR WINAPI GetCommandLine(void);), но не могу его связать ни с shell execute ни с create proces. на все попытки ругается компилятор (vs17)... Если не затруднит, покажите пожалуйста на примере как. (Только чтобы длинные аргументы от 1 до 5 с путями, проходили, как есть дочернему процессу. Остальное сам приделаю. Уже не пойму толи библиотеки не те , толи глюки.)


Ранг: 152.5 (ветеран)
Статус: Участник

Создано: 5 сентября 2018 00:30 · Поправил: f13nd New!
Цитата · Личное сообщение · #28

Возможно дело в двойных кавычках. Вообще на голом апи можно аргументы передавать и забирать, чтоб студия вместо тебя не думала.

Code:
  1. invoke memset,addr binSui,0,sizeof.STARTUPINFO
  2. add esp,3*4
  3. mov [binSui.cb],sizeof.STARTUPINFO
  4. invoke CreateProcessW,0,addr szuUnzipCmd,0,0,0,0,0,0,addr binSui,addr binPri

Code:
  1. invoke GetCommandLineW
  2. invoke CommandLineToArgvW,eax,addr nArgs
  3. mov [pArgs],eax
  4. mov [nCurrentArg],1
  5. @@:
  6. mov eax,[nCurrentArg]
  7. .if eax < [nArgs]
  8.          lea eax,[eax*4]
  9.          add eax,[pArgs]
  10.          invoke lstrcpyW,addr szuArgument,DWORD[eax]
  11.          ...
  12.          inc [nCurrentArg]
  13.          jmp @B
  14. .endif

| Сообщение посчитали полезным: inkermann



Ранг: 577.9 (!)
Статус: Модератор
Research & Development

Создано: 5 сентября 2018 08:47 New!
Цитата · Личное сообщение · #29

Глянь сорсы плагина DbgChild - Debug Child Process Tool:
--> https://github.com/David-Reguera-Garcia-Dreg/DbgChild <--

Фичи:
Hook process creation for x86 or x64 child processes
Patching and unpatching of NTDLL process creation for x86 and x64 child processes
Process watcher for auto launching of new x64dbg instance when child process detected
Modify the suspend (pre) and resume (post) logic to adapt to your own requirements

| Сообщение посчитали полезным: inkermann


Ранг: 4.6 (гость)
Статус: Участник

Создано: 8 сентября 2018 12:49 · Поправил: inkermann New!
Цитата · Личное сообщение · #30

f13nd пишет:
Возможно дело в двойных кавычках.
Да! Именно! В составе аргумента они передаются, а powershell их сжирает. Экранировать же достаточно проблематично, особенно если кавычка в середине аргумента. Помимо того режется еще раньше, при разборе argv.
 eXeL@B —› Вопросы новичков —› Выполнение действия при появлении процесса

Оригинальный DVD-ROM: eXeL@B DVD !

Вы находитесь на форуме сайта EXELAB.RU
Проект ReactOS