Сейчас на форуме: zombi-vadim, zds (+4 невидимых)

 eXeL@B —› Программирование —› Программа работает только внутри отладчика
<< . 1 . 2 . 3 . 4 .
Посл.ответ Сообщение

Ранг: 25.9 (посетитель), 1thx
Активность: 0.020
Статус: Участник

Создано: 23 сентября 2013 20:27 · Поправил: Envy12
· Личное сообщение · #1

Есть код:
Code:
  1. proc check
  2. ;invoke RegisterHotKey,0,1,0x0004,0x41
  3. ;invoke RegisterHotKey,0,2,0x0004,0x4c
  4. start3:
  5.         invoke AdjustTokenPrivileges,[phToken],0,PrivilegeCount ,0,0,0
  6.         mov    [prcs.dwSize],sizeof.PROCESSENTRY32
  7.         invoke CreateToolhelp32Snapshot, TH32CS_SNAPPROCESS, 0
  8.         mov    [hSnapshot], eax
  9.         invoke Process32First,eax,prcs
  10.         mov edi,[memhandle2]
  11.  
  12. loop1:
  13.         invoke GetMessage,msg,0,0,0
  14.         cmp ecx,1
  15.         je stop
  16.         mov eax,[edi]
  17.         cmp dword [prcs.szExeFile],eax
  18.         jnz kill2
  19.         add edi,4
  20. next:
  21.         invoke Process32Next,[hSnapshot],prcs
  22.         cmp    eax,0
  23.         jne    loop1
  24.         jmp start3
  25. kill2:
  26. stdcall kill1
  27. jmp next
  28. stop:
  29. invoke GetMessage,msg,0,0,0
  30. cmp ecx,2
  31. jnz next
  32. invoke Sleep,1200000
  33. jmp next
  34. ret
  35. endp

Первые 2 стркои закоментил тк с ними функция отказывается работать вне отладчика, без них все ок, как в отладчике так и без. В чем тут дело?




Ранг: 324.3 (мудрец), 222thx
Активность: 0.480.37
Статус: Участник

Создано: 22 октября 2013 10:20 · Поправил: DenCoder
· Личное сообщение · #2

Dr0p пишет:
ты бро обычо советуешь фигню, не шаря в вопросах. Я это очень давно заметил.

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

Dr0p пишет:
Это базовый примитив синхронизации и апи для его юзания. Они никогда не менялись и никогда не изменются. А андоки и прочая ... это сугубо твоя паранойя.

Точно, пора тебя лечить! CreateEvent, SetEvent, ResetEvent, WaitForSingleObject, WaitForMultipleObjects давно все юзают, никакого андока.

Dr0p пишет:
Никто вменяемый треды суспендить не посоветует.

Никто вменяемый столько флудить не станет. Вполне в своей программе усыплю нужный поток либо из другого процесса, либо из ранее созданного другого потока этого же процесса и никакого дедлока не будет! Вообще, как вариант, чтоб не париться с кодом автору - Process Explorer и останавливай, когда захочешь свою программу. Для меня - не вариант.

Dr0p пишет:
И вручную реализовать обьекты ядра тоже.

Вменяем будешь - покажи, где я предлагал реализовать объекты ядра вручную

P.S. Осмысли незатравленными остатками своего кривого мозга 90 постов этого топика и тогда может до тебя что-то дойдёт

-----
IZ.RU





Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 22 октября 2013 11:13
· Личное сообщение · #3

DenCoder

> никакого дедлока не будет!

Будет. Если останавливаемый тред захватил обьект с монопольным доступом, как частный случай это LdrpLoaderLock(обычно треды там крутятся).

> покажи, где я предлагал реализовать объекты ядра вручную

Вот:

> CreateEvent, SetEvent, ResetEvent, WaitForSingleObject, WaitForMultipleObjects давно все юзают, никакого андока.

В этом случае нужно есчо хэндл копировать в другой процесс. Но это всё уже реализовано в виде обьекта ядра -- event pait. Это 2 евента специально для таких целей.




Ранг: 324.3 (мудрец), 222thx
Активность: 0.480.37
Статус: Участник

Создано: 22 октября 2013 11:18 · Поправил: DenCoder
· Личное сообщение · #4

Реально, вот что нужно-то
Code:
  1. ATOM atomClass, atomHKPause, atomHKStop;
  2. HANDLE hEvtPauseResume, hEvtStop;
  3.  
  4. DWORD __stdcall WorkThread(LPVOID)
  5. {
  6.          HANDLE Handles[2] = {hEvtPauseResume, hEvtStop};
  7.  
  8.          do
  9.          {
  10.                  //Код работы
  11.                  //...
  12.  
  13.                  DWORD dwObj = WaitForMultipleObjects(2, Handles, FALSE, 0);
  14.                  if(dwObj != WAIT_TIMEOUT)
  15.                         if(dwObj == WAIT_OBJECT_0) WaitForSingleObject(hEvtPauseResume, INFINITE);
  16.                         else break;
  17.          }while(true);
  18.  
  19.          SetEvent(hEvtStop);
  20.  
  21.          return 0;
  22. }
  23.  
  24. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  25. {
  26.          int wmId, wmEvent;
  27.          PAINTSTRUCT ps;
  28.          HDC hdc;
  29.  
  30.          switch (message)
  31.          {
  32.          case WM_HOTKEY:
  33.                  if(wParam == atomHKPause) SetEvent(hEvtPauseResume);
  34.                  else if(wParam == atomHKStop)
  35.                  {
  36.                         SetEvent(hEvtStop);
  37.                         PostQuitMessage(0);
  38.                  }
  39.                  break;
  40.          default:
  41.                  return DefWindowProc(hWnd, message, wParam, lParam);
  42.          }
  43.          return 0;
  44. }
  45.  
  46. int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
  47. {
  48.          MSG msg;
  49.  
  50.          WNDCLASSEX wc;
  51.          ZeroMemory(&wc, sizeof(wc));
  52.          wc.cbSize = sizeof(wc);
  53.          wc.style = CS_GLOBALCLASS;
  54.          wc.lpfnWndProc = WndProc;
  55.          wc.hInstance = hInstance;
  56.          wc.lpszClassName = L"ForHotKeys";
  57.  
  58.          atomClass = RegisterClassEx(&wc);
  59.          HWND hWnd = CreateWindow((wchar_t*)atomClass, L"", 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, hInstance, NULL);
  60.          atomHKPause = GlobalAddAtom(L"hkPauseResume");
  61.          RegisterHotKey(hWnd, atomHKPause, MOD_CONTROL | MOD_ALT, VK_HOME);
  62.          atomHKStop = GlobalAddAtom(L"hkStop");
  63.          RegisterHotKey(hWnd, atomHKStop, MOD_CONTROL | MOD_ALT, VK_END);
  64.  
  65.          hEvtPauseResume = CreateEvent(NULL, FALSE, FALSE, NULL);
  66.          hEvtStop = CreateEvent(NULL, FALSE, FALSE, NULL);
  67.          CloseHandle(CreateThread(NULL, 0, WorkThread, NULL, 0, NULL));
  68.  
  69.          while (GetMessage(&msg, NULL, 0, 0))
  70.          {
  71.                  TranslateMessage(&msg);
  72.                  DispatchMessage(&msg);
  73.          }
  74.  
  75.          WaitForSingleObject(hEvtStop, INFINITE);
  76.  
  77.          CloseHandle(hEvtPauseResume);
  78.          CloseHandle(hEvtStop);
  79.  
  80.          UnregisterHotKey(hWnd, atomHKPause);
  81.          UnregisterHotKey(hWnd, atomHKStop);
  82.          DestroyWindow(hWnd);
  83.  
  84.          GlobalDeleteAtom(atomClass);
  85.          GlobalDeleteAtom(atomHKPause);
  86.          GlobalDeleteAtom(atomHKStop);
  87.  
  88.          return (int) msg.wParam;
  89. }


Рабочий код за 10 минут. По Ctrl-Alt-Home ставим код на паузу и также снимаем с паузы, по Ctrl-Alt-End завершаем работу. Нужно - переводите сами на asm.

Dr0p пишет:
В этом случае нужно есчо хэндл копировать в другой процесс.

Никакого другого процесса не нужно. Просто каша в топике уже получилась, как и у тебя в голове

-----
IZ.RU





Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 22 октября 2013 11:21 · Поправил: Dr0p
· Личное сообщение · #5

DenCoder

У меня не каша. Я имею ввиду что два евента используются обычно для синхронизации между процессами. Например при инжектах

Тогда есчо и секции юзаются для передачи данных. Это также реализовано в LPC




Ранг: 324.3 (мудрец), 222thx
Активность: 0.480.37
Статус: Участник

Создано: 22 октября 2013 11:22
· Личное сообщение · #6

Да не нужно никакого инжекта, ты запутался, как и сам автор в том, что ему нужно

-----
IZ.RU





Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 22 октября 2013 11:23
· Личное сообщение · #7

DenCoder

А я и не говорил что инжекты нужны.)




Ранг: 324.3 (мудрец), 222thx
Активность: 0.480.37
Статус: Участник

Создано: 22 октября 2013 11:26 · Поправил: DenCoder
· Личное сообщение · #8

Этого долго многие не могли понять. Но однако ж ты продолжаешь об инжектах, несмотря на --> Link <--

Dr0p пишет:
У меня не каша. Я имею ввиду что два евента используются обычно для синхронизации между процессами. Например при инжектах

Да? Можно синхронизировать и одним именованным евентом! Смотря что.

А, вообще, Clerkus, утомил! Я расчитывал, что envy сам дойдёт и поймёт, что ему нужно...

-----
IZ.RU



<< . 1 . 2 . 3 . 4 .
 eXeL@B —› Программирование —› Программа работает только внутри отладчика
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати