Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Вопрос про потоки

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> Вопрос про потоки
Имя
Сообщение << Старые топики   Новые топики >>
Вопрос про потоки - 2010-03-01 20:53:17.580000   
Sunzer

Сообщений: 253
Оценки: 31190
Присоединился: 2007-06-15 19:23:32.436666
Вопрос такой, код выделяет память, пишет в нее код, этот код исполняется, создает поток, который освобождает выделеную страницу памяти и убивается, а первый поток переходит на другой участок памяти и выполняется. Всегда ли все это будет работать нормально?
А то я думаю нужно ли Sleep добавить во второй созданый поток. Вроде и так работает. Но стабильно ли?
Post #: 1
RE: Вопрос про потоки - 2010-03-01 21:48:28.043333   
Sunzer

Сообщений: 253
Оценки: 31190
Присоединился: 2007-06-15 19:23:32.436666
Вот пример: http://www.sendspace.com/file/5dmqzj (6 КБ)



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

Смотрите ехе в отладчике.

Ведь если в начале кода второго потока поставить Sleep то точно код выполнится позже.
Post #: 2
RE: Вопрос про потоки - 2010-03-01 22:08:33.813333   
Sunzer

Сообщений: 253
Оценки: 31190
Присоединился: 2007-06-15 19:23:32.436666
Вобщем нужно задержку в коде второго потока в начале ставить, и не париться тогда.
Post #: 3
RE: Вопрос про потоки - 2010-03-01 22:24:16.170000   
Sunzer

Сообщений: 253
Оценки: 31190
Присоединился: 2007-06-15 19:23:32.436666
По моему мы о разном говорим, мне не надо много кода юзать, мне всего лишь нужно создать второй поток который через 1 сек. освободит выделеную память, и уничтожится. А главная нить будет работать на совсем другой странице памяти. И на второй поток ей все равно
Post #: 4
RE: Вопрос про потоки - 2010-03-02 12:44:02.606666   
Sunzer

Сообщений: 253
Оценки: 31190
Присоединился: 2007-06-15 19:23:32.436666
Меня до сих пор похоже не поняли, я создаю второй поток для того что бы он освободил память свою и завершился.
А первый поток после создания второго исполняется в другом месте. И в то место нельзя писать код для освобождения.

Картина такая:

Есть один главный поток.
1) Выделяется память, туда пишется код, туда передается управление.
2) Заполняется память из которой выделялась память(Пишется новый код)
А далее нужно передать управление обратно, из выделеной память обратно, таким образом что бы выделеная память освободилась. Я и решил создать второй поток с задержкой, который освободит память VirtualFree, а потом уничтожится.
А тем временем главный поток будет спокойно исполнятся в своем месте
Post #: 5
RE: Вопрос про потоки - 2010-03-02 13:46:35.340000   
Sunzer

Сообщений: 253
Оценки: 31190
Присоединился: 2007-06-15 19:23:32.436666
quote:

P.S. Если не секрет, что ты такое хитрое пишешь? Какую-нибудь защиту?


Для PE загрузчика код дописываю, что бы память выделеная просто так не болталась.
Post #: 6
RE: Вопрос про потоки - 2010-03-02 21:07:33.876666   
Sunzer

Сообщений: 253
Оценки: 31190
Присоединился: 2007-06-15 19:23:32.436666

quote:

ORIGINAL: rgo

quote:

ORIGINAL: Sunzer

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

Картина такая:

Есть один главный поток.
1) Выделяется память, туда пишется код, туда передается управление.
2) Заполняется память из которой выделялась память(Пишется новый код)
А далее нужно передать управление обратно, из выделеной память обратно, таким образом что бы выделеная память освободилась. Я и решил создать второй поток с задержкой, который освободит память VirtualFree, а потом уничтожится.
А тем временем главный поток будет спокойно исполнятся в своем месте

Вот после 2. Делаем так, кладём в стек адрес, куда надо передавать управление обратно. Затем кладём туда аргументы для VirtualFree, затем говорим jmp VirtualFree. Всё. VirtualFree освободит память и вернёт управление туда куда надо.


Я в курсе. Но мне надо востановить регистры. А после VirtualFree они нарушутся. Так бы уже давно так сделал.
Post #: 7
RE: Вопрос про потоки - 2010-03-02 22:12:15.926666   
Sunzer

Сообщений: 253
Оценки: 31190
Присоединился: 2007-06-15 19:23:32.436666
PUSHAD\ POPAD только 8 регистров общего назначения.

Гм:) Какой код я не пойму востановит это все? Ведь в память перезаписаную писать нельзя, т.к. вовредится код. Вы не понимаете что мне нужно. Все что можно исполнять находится в выделеной памяти.

Первый поток создает второй поток, потом востанавливает регистры PUSH OEP\RET все регистры целы.
А второй поток освобождает память и убивается.

Если бы не было задачи в сохранении начальных значений регистров, то можно было бы сделать просто так в конце кода:

PUSH …
PUSH OEP
JMP VirtualFree
Post #: 8
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> Вопрос про потоки







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.