Сейчас на форуме: vsv1, _MBK_ (+3 невидимых)

 eXeL@B —› Вопросы новичков —› Иследование длл на мультипотоковость. (Multithread)
Посл.ответ Сообщение

Ранг: 11.4 (новичок)
Активность: 0.010
Статус: Участник

Создано: 23 ноября 2007 22:51
· Личное сообщение · #1

Здрасьте Всем!!
Хочу сразу сказать, что я только пару дней назад нашел этот сайт (да и начал изучать эту область).
И хочу выразить огромную благодарность создателям и админам этого сайта! Сайт суперский, огромное количество полезной информации, качалка, все что нужно для счастья вообщем. Большое спасибо!!!

Перейду ближе к делу!
Есть программа в которую нужно встроить определенный код, и вообще всячески исследовать. Какие процедуры за что отвечают и тд. Самое простое было бы добавить библиотеку и в в процедуре main (или как там она называется) библиотеки создать новый поток, который бы работал постоянно, и использовал внешнии библиотеки приложения. Впринципе этого было бы наверно достаточно.
Внимание Вопрос:
После создания нового процесса, программа становится мультипотоковой (возможно в приложении и так больше одного потока, я не смотрел пока). Поэтому библиотеки должны быть так же мультипотоковыми, чтобы не было ошибки при вызове из двух потоков одной процедуры одновременно. Вопрос как узнать, multithread dll или singlethread? и есть ли какие нибудь инструменты чтобы сделать из singlethread - multithread?

Заранее спасибо за ответ!



Ранг: 495.3 (мудрец)
Активность: 0.30
Статус: Участник

Создано: 23 ноября 2007 23:24
· Личное сообщение · #2

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

Это называется реверсинг.
shob_vas пишет:
в процедуре main (или как там она называется)

Название - это только слово. А суть - EntryPoint.
shob_vas пишет:
После создания нового процесса

Ты хотел сказать нити (треда)?
shob_vas пишет:
Вопрос как узнать, multithread dll или singlethread

Можно посмотреть есть ли в списке вызываемых Win32API функции работы с тредами (типа CreateThread). Если жертва не пакована, то сразу смотри импорт (в Hiew'e F4,F8,F7).
shob_vas пишет:
и есть ли какие нибудь инструменты чтобы сделать из singlethread - multithread?

Вот этот вопрос вообще не понял.
Ты знаком с WinAPI-программированием?
Если нет - увы =(.

-----
Всем привет, я вернулся




Ранг: 11.4 (новичок)
Активность: 0.010
Статус: Участник

Создано: 23 ноября 2007 23:59
· Личное сообщение · #3

Bitfry
Спасибо за исчерпывающий ответ!

Bitfry пишет:
Можно посмотреть есть ли в списке вызываемых Win32API функции работы с тредами (типа CreateThread). Если жертва не пакована, то сразу смотри импорт (в Hiew'e F4,F8,F7).

Буду иметь ввиду, спасибо, обязательно посмотрю!

Хотя я щас подумал, возможно вы не много не так поняли вопрос...
Когда я создаю библиотеку (или екзешник) в VS в свойствах проекта, можно указать в графе "runtime library" на выбор multithread или singlethread. (Я конечно может что то неправильно понимаю, но я себе это представляю как генерация кода для мультитредового приложения либо сингтредового) Я вообще себе это правильно понимаю или нет?



Ранг: 495.3 (мудрец)
Активность: 0.30
Статус: Участник

Создано: 24 ноября 2007 02:03
· Личное сообщение · #4

Так бы сразу и сказал, что про VS спрашиваешь.
Различий между multithread и singlethread в бинарнике не будет до тех пор пока не появится код второй нити и, если не ошибаюсь, без опции multithread этот код не скомпилить. Так что смотри импорт.
А для более глубокого понимания вопроса спускайся на уровень Ассемблера и чистого WinAPI.

-----
Всем привет, я вернулся




Ранг: 11.4 (новичок)
Активность: 0.010
Статус: Участник

Создано: 24 ноября 2007 10:39
· Личное сообщение · #5

Так вот один из вопросов как раз и есть. Как узнать с какими опциями скомпилен екзешник. мультитред или синглтред? может это делает какой нибудь peid или чтонибудь типа того...



Ранг: 495.3 (мудрец)
Активность: 0.30
Статус: Участник

Создано: 24 ноября 2007 21:23
· Личное сообщение · #6

shob_vas пишет:
может это делает какой нибудь peid или чтонибудь типа того...

Ещё раз повторю. Чтоб было понятно.

PeId всего лишь сопоставляет файл со своей базой сигнатур. Если ты добавишь в базу свою сигнатуру Multithread (там элементарный текстовый формат), то будет и PeId определять эту самую опцию.

Проблема заключается в том, что exe собраные multithread и singlethread абсолютно одинаковые.
Можешь провести эксперимент:

1. Скомпилить шаблон окна в VS с разными опциями.
2. Сравнить по байтам FC /b
3. Проанализировать отличия.
Увидишь, что кроме билда и тайма файлы одинаковые.

Но если в коде будет второй тред (хотябы оконная процедура второй нити) - различия будут.
А самое яркое из них всё равно функция CreateThread в импорте. =)

-----
Всем привет, я вернулся





Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 25 ноября 2007 09:57
· Личное сообщение · #7

Bitfry, кста, в старых VC++ были две версии снандартных библиотек: single and multi threaded. Думаю что первая это просто оптимизация второй без синхронизации. Так енто, в принципе можно сделать сигнатуру malloc или new - реализации будут разные.



Ранг: 11.4 (новичок)
Активность: 0.010
Статус: Участник

Создано: 26 ноября 2007 11:57
· Личное сообщение · #8

Bitfry пишет:
Проблема заключается в том, что exe собраные multithread и singlethread абсолютно одинаковые.


Хм, а зачем тогда эта опция нужна, если она не влияет на код?




Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 26 ноября 2007 20:21
· Личное сообщение · #9

shob_vas, в старых компилерах были разные библиотеки. В VC8/VS2005 ни опции ни single threaded libs уже нету.



Ранг: 11.4 (новичок)
Активность: 0.010
Статус: Участник

Создано: 26 ноября 2007 20:47 · Поправил: shob_vas
· Личное сообщение · #10

понял, спасибо!
То есть по идее если екзешник скомпилен на vs2005, то можно подсоединять новые ПОТОКИ к нему и использовать функции его библиотек (dll) не боясь, ошибок из-за одновременного вызова функции разными ПОТОКАМИ, так?




Ранг: 109.2 (ветеран)
Активность: 0.090
Статус: Участник
Cardinal

Создано: 26 ноября 2007 21:03
· Личное сообщение · #11

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

-----
– Почему ты работаешь по ночам ? – Так удобнее... В одну смену с чертями...




Ранг: 11.4 (новичок)
Активность: 0.010
Статус: Участник

Создано: 26 ноября 2007 22:01
· Личное сообщение · #12

черт, я имел ввиду потоки а не процессы!



Ранг: 495.3 (мудрец)
Активность: 0.30
Статус: Участник

Создано: 26 ноября 2007 23:35
· Личное сообщение · #13

s0larian пишет:
Bitfry, кста, в старых VC++ были две версии снандартных библиотек: single and multi threaded. Думаю что первая это просто оптимизация второй без синхронизации. Так енто, в принципе можно сделать сигнатуру malloc или new - реализации будут разные.

Понял.
Нужно не шаблон компилить, а пример с malloc, тогда различия появятся.
Но вообще странно, что этих сигнатур до сих пор нет в PeId. =/

shob_vas пишет:
То есть по идее если екзешник скомпилен на vs2005, то можно подсоединять новые ПОТОКИ к нему и использовать функции его библиотек (dll) не боясь, ошибок из-за одновременного вызова функции разными ПОТОКАМИ, так?

100% гарантии нет. Но если dll писал не Бил лично, то должно работать.
Очень советую прочитать:
Джеффри РИХТЕР
Создание эффективных WIN32-приложений
с учетом специфики 64-разрядной версии Windows

shob_vas пишет:
черт, я имел ввиду потоки а не процессы!

Строго говоря, thread лучше переводить как "нить" или тупо "тред".
А то встречал я такие переводы, в которых одним словом и stream и pipe и thread... Пойди разберись.

-----
Всем привет, я вернулся





Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 27 ноября 2007 04:41 · Поправил: s0larian
· Личное сообщение · #14

Bitfry, кста ешё один момент - CRT(С Runtime Libs) может линковаться динамически. Вообще, было три варианта: single-threaded static <ML[d]>, multithreaded static <MT[d]>, or multithreaded DLL<MD[d]>

В VS2005 осталисть два воследних.

http://support.microsoft.com/kb/154753 http://support.microsoft.com/kb/154753


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


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