Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Почему вылетает ошибка Thread creation error? 
:(
    Опции темы
nod3264
Дата 3.2.2010, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 2.8.2009

Репутация: нет
Всего: 1



Есть необходимость написать программу, которая не даст работникам сидеть в аське, или играть в игры.
У людей и так полно работы, а вместо работы они занимаются фигнёй. 

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

Вот решил убрать совсем процесс с глаз работников, нашел в сети код:

Код

program project1;

uses
  Windows,
  rxtypes;

Var
  nb, i: Cardinal;

{$R res.RES} //Ресурс содержащий запускаемый exe(mem.exe)

function ZwUnmapViewOfSection(SectionHandle: THandle;p: Pointer): DWord; stdcall; external 'ntdll.dll';

function protect(characteristics: ULONG): ULONG;
const  mapping: array [0..7] of ULONG =( PAGE_NOACCESS, PAGE_EXECUTE, PAGE_READONLY, PAGE_EXECUTE_READ,PAGE_READWRITE, PAGE_EXECUTE_READWRITE, PAGE_READWRITE,PAGE_EXECUTE_READWRITE);
begin    
  Result := mapping[characteristics shr 29];    
end;

var
  pi: TProcessInformation;
  si: TStartupInfo;
  x, p, q: Pointer;
  nt: PIMAGE_NT_HEADERS;
  context: TContext;
  sect: PIMAGE_SECTION_HEADER;
begin
  si.cb := SizeOf(si);
  CreateProcess(nil, 'cmd.exe', nil, nil, FALSE, CREATE_SUSPENDED, nil, nil, si, pi);
  context.ContextFlags := CONTEXT_INTEGER;
  GetThreadContext(pi.hThread,  context);
  ReadProcessMemory(pi.hProcess,PCHAR(context.ebx) + 8,@x, sizeof (x),nb);
  ZwUnmapViewOfSection(pi.hProcess, x);
  p := LockResource(LoadResource(Hinstance, FindResource(Hinstance, 'EXE', RT_RCDATA)));
  if p = nil then exit;
  nt := PIMAGE_NT_HEADERS(PCHAR(p) + PIMAGE_DOS_HEADER(p).e_lfanew);
  q := VirtualAllocEx( pi.hProcess,Pointer(nt.OptionalHeader.ImageBase),nt.OptionalHeader.SizeOfImage,MEM_RESERVE or MEM_COMMIT, PAGE_EXECUTE_READWRITE);
  WriteProcessMemory(pi.hProcess, q, p, nt.OptionalHeader.SizeOfHeaders, nb);
  sect := PIMAGE_SECTION_HEADER(nt);
  Inc(PIMAGE_NT_HEADERS(sect));    
  for I := 0 to nt.FileHeader.NumberOfSections - 1 do
    begin
        WriteProcessMemory(pi.hProcess,PCHAR(q) + sect.VirtualAddress,PCHAR(p) + sect.PointerToRawData,sect.SizeOfRawData, nb);
        VirtualProtectEx( pi.hProcess,PCHAR(q) + sect.VirtualAddress,sect.SizeOfRawData,protect(sect.Characteristics),@x);
        Inc(sect);    
    end;    
  WriteProcessMemory(pi.hProcess, PCHAR(context.Ebx) + 8, @q, sizeof(q), nb);    
  context.Eax := ULONG(q) + nt.OptionalHeader.AddressOfEntryPoint;    
  SetThreadContext(pi.hThread, context);    
  ResumeThread(pi.hThread);    
end.



Проблема вот в чём, когда я таким образом запускаю exe с таким кодом:


Код

begin
  MessageBox(0,'Запускаем поток','Работает!',0);
  MyThread:=TMyThread.Create(false);
{ //И так пытался
  MyThread:=TMyThread.Create(true);
  MyThread.Execute;
}
  MessageBox(0,'Готово','Работает!',0);
end.


То в начале показывается сообщение "Запускаем поток", и после этого вылетает ошибка!

Цитата

Сигнатура проблемы:
  Имя события проблемы:     APPCRASH
  Имя приложения:     cmd.exe
  Версия приложения:     6.1.7600.16385
  Отметка времени приложения:     2a425e19
  Имя модуля с ошибкой:     KERNELBASE.dll


и сразу после этого

Цитата

Exception Ethread in module rabota.exe at 00012D10.
Thread creation error: Неверная попытка доступа к адресу памяти



Пытался делать поток через BeginThread, но ошибка осталась прежней.

На всех машинах у нас стоит Windows 7.


Подскажите в чём проблема, почему вылетает эта ошибка?


Это сообщение отредактировал(а) nod3264 - 3.2.2010, 20:50
PM MAIL   Вверх
Alca
Дата 3.2.2010, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: нет
Всего: 50



Ты главное пытайся....  smile 


--------------------
PM WWW ICQ Skype Jabber   Вверх
nod3264
Дата 3.2.2010, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 2.8.2009

Репутация: нет
Всего: 1



А если по теме, подсказать можешь причину этой ошибки?
PM MAIL   Вверх
Alca
Дата 3.2.2010, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: нет
Всего: 50





--------------------
PM WWW ICQ Skype Jabber   Вверх
nod3264
Дата 4.2.2010, 08:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 2.8.2009

Репутация: нет
Всего: 1



Читал.

Ошибка есть только когда в другом процессе свой exe запускаю, а так всё нормально.

Это сообщение отредактировал(а) nod3264 - 4.2.2010, 08:37
PM MAIL   Вверх
Alca
Дата 4.2.2010, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: нет
Всего: 50



  MyThread:=TMyThread.Create(true); //создать в приостановленном состоянии
  MyThread.FreeOnTerminate := false;    //не самоубивающийся поток
  MyThread.Execute;
  MyThread.Resume;    //запустить поток
  MyThread.WaitFor;   //ждемс когда поток отработает

Это сообщение отредактировал(а) Alca - 4.2.2010, 10:22


--------------------
PM WWW ICQ Skype Jabber   Вверх
artsb
Дата 4.2.2010, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 1
Всего: 64



Цитата(nod3264 @  3.2.2010,  10:02 Найти цитируемый пост)
В начале я написал такое приложение, но некоторые продвинутые работники просто убивали процесс. 
Потом я сделал процесс системным, через сервис, но и это их не остановило.
Пытался делать 2 процесса, которые контролируют и запускают друг друга. Но это тоже не эффективно.

Какие настырные работники  smile  А вы их увольнять не пробовали?  smile 

Цитата(nod3264 @  4.2.2010,  08:35 Найти цитируемый пост)
Ошибка есть только когда в другом процессе свой exe запускаю, а так всё нормально.

Так вы вроде поток запускаете, а не свою программу из другого процесса... После чего появилась эта ошибка? Что вы добавили?


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
nod3264
Дата 4.2.2010, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 2.8.2009

Репутация: нет
Всего: 1



Вот код exe который запускаю в другом процессе:

Код

program exe;

uses
  Classes;

type
  TMyThread = class(TThread)
  protected
    procedure Execute; override;
  end;

var
  MyThread: TMyThread;

function MessageBox(hWnd: LongWord; lpText, lpCaption: PChar; uType: LongWord): Integer; stdcall; external 'user32.dll' name 'MessageBoxA';

procedure TMyThread.Execute;
begin
  MessageBox(0,'Сообщение из потока','Работает!',0);
end;


begin
  MessageBox(0,'Запускаю поток...','Работает!',0);
  MyThread:=TMyThread.Create(false); //Вот тут ошибка вылетает (Thread creation error: Неверная попытка доступа к адресу памяти)
  MyThread.Resume;
  MyThread.WaitFor;
  MessageBox(0,'end','Работает!',0);
end.



Чтобы запустить в другом процессе делаю так:
1. Из этого exe делаю файл ресурса.
2. Использую код который я нашел ранее в сети (выложил в первом сообщении).

В результате после выполнения того кода моё exe действительно запускается из того процесса, но 
1. Показывает сообшение MessageBox(0,'Запускаю поток...','Работает!',0);
2. Сразу после этого ошибка 


Цитата

Сигнатура проблемы:
  Имя события проблемы:     APPCRASH
  Имя приложения:     cmd.exe
  Версия приложения:     6.1.7600.16385
  Отметка времени приложения:     2a425e19
  Имя модуля с ошибкой:     KERNELBASE.dll


Жму завершить, и вылазит сообщение 
Цитата


Exception Ethread in module rabota.exe at 00012D10.
Thread creation error: Неверная попытка доступа к адресу памяти


Если я просто запускаю exe, то проблем никаких. Проблема только при запуске в памяти

Это сообщение отредактировал(а) nod3264 - 4.2.2010, 11:00
PM MAIL   Вверх
artsb
Дата 4.2.2010, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 1
Всего: 64



nod3264, а что, если вообще запретить запуск Диспетчера Задач? Отключается он в реестре. А если для работников создать учётные записи с ограниченными правами, то они до реестра не доберутся (у нас так в колледже было smile) Правда я не знаю, поможет ли им сторонняя прога для редактирования реестра или сторонний Диспетчер Задач...

Ещё посмотрите эту тему. В частности пост SHEI'TI.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
nod3264
Дата 4.2.2010, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 2.8.2009

Репутация: нет
Всего: 1



artsb, там наверно про XP пишут, а у нас семёра везде. 
Сейчас попробую, может и получится, хотя очень сомневаюсь.


Я думаю что эта ошибка-причуды семёрки

Цитата

nod3264, а что, если вообще запретить запуск Диспетчера Задач? Отключается он в реестре. А если для работников создать учётные записи с ограниченными правами


Не, работникам нормальные учётки нужны, и диспетчер им тоже нужен

Это сообщение отредактировал(а) nod3264 - 4.2.2010, 11:22
PM MAIL   Вверх
artsb
Дата 4.2.2010, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 1
Всего: 64



Цитата(nod3264 @  4.2.2010,  11:08 Найти цитируемый пост)
а у нас семёра везде. 

способ работает под NT

Цитата(nod3264 @  4.2.2010,  11:08 Найти цитируемый пост)
Я думаю что эта ошибка-причуды семёрки

А я сомневаюсь...


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
nod3264
Дата 4.2.2010, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 2.8.2009

Репутация: нет
Всего: 1



Цитата

А я сомневаюсь... 


Я только что проверил на XP, там всё работает идеально!
PM MAIL   Вверх
artsb
Дата 4.2.2010, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 1
Всего: 64



Цитата(nod3264 @  4.2.2010,  11:30 Найти цитируемый пост)
Я только что проверил на XP, там всё работает идеально! 

Ну тгда скорее всего не косяк (хотя их там много smile), а изменения в работе ИМХО. А способ с ДЛЛ вы проверили?


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
nod3264
Дата 4.2.2010, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 2.8.2009

Репутация: нет
Всего: 1



нет
PM MAIL   Вверх
bems
Дата 4.2.2010, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 21
Всего: 88



Цитата(nod3264 @  3.2.2010,  10:02 Найти цитируемый пост)
VirtualAllocEx( pi.hProcess,Pointer(nt.OptionalHeader.ImageBase),nt.OptionalHeader.SizeOfImage,MEM_RESERVE or MEM_COMMIT, PAGE_EXECUTE_READWRITE);

ImageBase не обязан быть свободным, он может оказаться занят.

Цитата(nod3264 @  3.2.2010,  10:02 Найти цитируемый пост)
PCHAR(context.Ebx) + 8

Эта волшебная восьмерка вероятно изменилась после ХР

Цитата(nod3264 @  3.2.2010,  10:02 Найти цитируемый пост)
WriteProcessMemory(pi.hProcess,PCHAR(q) + sect.VirtualAddress,PCHAR(p) + sect.PointerToRawData,sect.SizeOfRawData, nb);
Скопирована только одна секция, вылет будет в рандомном месте, где компилятор сгенерил код для обращения к чему угодно за пределами секции кода

ВыводЖ выкинь этот код и внедряй длл

Это сообщение отредактировал(а) bems - 4.2.2010, 19:11


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0961 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.