Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 23.01.2010, 15:16
Аватар для Danik007
Danik007 Danik007 вне форума
Новичок
 
Регистрация: 05.01.2010
Сообщения: 58
Репутация: 10
Подмигивание Эмулятор адресации ОЗУ?

Всем доброе время суток!
Хочу спросить у знатоков и форумчан, если кто знает, как можно реализовать такой алгоритм и что для этого нужно:

1. Есть программа№1 (любая), она занимает какое-то адресное пространство после своего запуска, естественно что адресация начинается не с нуля с какого-то неизвестного значения (просто свободные ячейки памяти).

2. Хочу написать программу№2 (эмулятор), посредством которой я мог бы запустить программу№1 и она думала бы, что ее адресация начинается с N по M (где N и M указываю я. N - фиксированное, неизменное значение).

В общем получается некое подобие Виртуальной машины, только гораздо проще. Надеюсь что все объяснил грамотно, очень рассчитываю на вашу помощь!!!

P.S.
Хватит ли возможностей Delphi, чтобы реализовать такую задумку?
Ответить с цитированием
  #2  
Старый 24.01.2010, 12:06
Аватар для AND_REY
AND_REY AND_REY вне форума
Активный
 
Регистрация: 31.03.2009
Адрес: Украина, г.Днепропетровск
Сообщения: 324
Версия Delphi: Delphi7
Репутация: 3877
По умолчанию

На Delphi можно сделать но без выбора адреса (его прога сама выберет - скорее всего внутри своего адресного пространства).
На асме просто записать прогу по любому адресу,
например:
Код:
Цикл:
mov eax, Значение
mov [Адрес], eax
И то с под Windows не все адреса разрешены на запись.
Если написать драйвер то можна обращяться по любым адресам, но может вылетать синий экран если не туда обратишся.
Ответить с цитированием
  #3  
Старый 24.01.2010, 13:00
Аватар для Danik007
Danik007 Danik007 вне форума
Новичок
 
Регистрация: 05.01.2010
Сообщения: 58
Репутация: 10
По умолчанию

2 AND_REY
Видимо не очень толково я все изъяснил .
Я хочу чтобы все адреса оставались на месте и не в коем случае не собираюсь посягать на адреса в которых лежит ядро системы (синий экран мне не нужен).
Меня интересует принцип похожий на виртуальную машину, когда моя программа№2(эмулятор) заняла адресное пространство и уже из этой программы, в ее адресном пространстве (размер которого определяю я) запускаю прикладную программу. А цель, чтоб для прикладной программы адреса были не реальными, а виртуальными (то есть реальный адрес 8088, а прикладная программа думает что этот адрес 0000). Надеюсь теперь все будет понятно, спасибо что отозвались!!! Жду ваших советов.
Ответить с цитированием
  #4  
Старый 24.01.2010, 13:37
guranvir guranvir вне форума
Начинающий
 
Регистрация: 19.01.2010
Сообщения: 113
Репутация: 11
По умолчанию

Ну смотрите(быть может я не прав!), фактически вы хотите породить процесс, а Windows дает нам только такие решения: CreateProcess, но Win никогда не допустит общего адресного пространства у двух процессов, кроме общих точек при IPC ну и оно и понятно, ведь это приведет к проблемам при чтении/записи данных,если код запускать как поток при помощи CreateThread то тем более такие вольности с адресом не позволит.Похоже Вам нувжно писать собственный эмулятор и особенно гипервизор, чтобы перехватывать привилегированные инструкции, руководство по написанию виртуальных машин есть на wasm, а как пример возьмите qemu или Virtual Box
Ответить с цитированием
  #5  
Старый 24.01.2010, 13:41
guranvir guranvir вне форума
Начинающий
 
Регистрация: 19.01.2010
Сообщения: 113
Репутация: 11
По умолчанию

Так как без дров похоже не обойтись, то придется использовать C (driver) и Delphi (usermode application) управления процессом эмуляции, в принципе мне то же надо писать эмулятор, если Вам интересно то давайте объединяться, если что пишите в личку
Ответить с цитированием
  #6  
Старый 24.01.2010, 16:48
Аватар для AND_REY
AND_REY AND_REY вне форума
Активный
 
Регистрация: 31.03.2009
Адрес: Украина, г.Днепропетровск
Сообщения: 324
Версия Delphi: Delphi7
Репутация: 3877
По умолчанию

Может можна обойтись без драйверов и ограничений системы.
Использовать дельта-смещения в своём эмуляторе.

Вырезка с одного сайта:

Цитата:
Чтобы наш вирус работал, он должен быть написан в базонезависимом коде. В связи с этим появляется еще одно понятие - дельта-смещение.
Что это такое? Все очень просто. Когда вирус находится в чистом виде (так называемое первое поколение), т.е. не записан еще ни в какой файл, когда он работает, он обращается к переменным как есть относительно прописанного в его заголовке адреса, куда файл проецирован системой. Теперь представим, что наш вирус заразил программу. И там начинает работать. Но теперь он работает не там, куда его загрузил загрузчик, а из того места, где находится загруженная зараженная программа. Получается, что переменные теперь указывают на абсолютно другое место. Поэтому обратившись к своим данным по заданным адресам, вирус прочитает совсем не те данные, которые ему необходимы. Для того, чтобы решить эту проблему, вычисляется дельта-смещение. Это смещение относительно начала вируса, а не той программы, которая была им заражена.
сall VirDelta
VirDelta:
sub dword ptr [esp], OFFSET VirDelta
push dword ptr [esp] ; Сохраняем значение дельта-смещения в стеке
Как видим, при входе в вирусный код мы вызываем call. Но call после вызова помещает в стек адрес возврата. Вычитаем из него адрес метки VirDelta и получаем нужное нам смещение относительно начала файла. Далее сохраняем дельта-смещение для дальнейшего использования (прибавляя его к адресам переменных, последние принимают корректные значения).

Извеняюсь за материал противоречящий правилам сайта.

Последний раз редактировалось AND_REY, 24.01.2010 в 16:51.
Ответить с цитированием
  #7  
Старый 24.01.2010, 17:25
guranvir guranvir вне форума
Начинающий
 
Регистрация: 19.01.2010
Сообщения: 113
Репутация: 11
По умолчанию

Можно и поэкспериментировать, однако мне все же кажется учитывая задачи автора и то что то приложение которое он собирается запускать может разным, то лучше его изолировать, при этом из практики вирусописательства известно что приложение откуда запускается вирус часто вылетает. При том само первое приложение может влиять на работу второго негативным образом, а что вероятней так это то что ошибки второго приведут к жесткому зависанию первого из-за общего адресного пространства процессов, а представьте в такой ситуации плохой указатель и т.д., вобщем если это и возможно то весьма небезопасное решение. Нужны дополнительные средства мониторинга операций с памятью, особенно на запись. По крайней мере мне так кажется...
Ответить с цитированием
  #8  
Старый 24.01.2010, 20:02
Аватар для Danik007
Danik007 Danik007 вне форума
Новичок
 
Регистрация: 05.01.2010
Сообщения: 58
Репутация: 10
По умолчанию Сохранение процесса. Гибернация.

Ладно раскрою все карты
Я НЕ собирался писать вирус как кто-то мог подумать
Я хотел написать программу для сохранения процессов, эдакий аналог гибернации Vista/Seven, но зная что существует проблема с адресацией (запуская сохраненный процесс, может оказаться что адрес к котором он "стучится" уже заняты) решил реализовать описанный выше метод, но видимо не судьба...
1. Подскажите если кто знает, как работает гибернация и почему она может сохранять процессы, а МЫ нет?
2. Имеет ли какой-то смысл то что я написал выше? Возможно ли реализовать?
Ответить с цитированием
  #9  
Старый 24.01.2010, 20:39
guranvir guranvir вне форума
Начинающий
 
Регистрация: 19.01.2010
Сообщения: 113
Репутация: 11
По умолчанию

Цитата:
Гибернация – это режим энергоснабжения ПК, при котором текущий сеанс работы пользователя (все открытые файлы и приложения) сохраняется на жесткий диск (для этого в корне диска C: создается файл hiberfil.sys; имеет атрибуты Скрытый, Системный; 0,99ГБ)

Копай эмуляторы Дело в том что там такая задача давно решена, ведь снимки виртуальной машины и есть та самая гибернация. Исходные тексты Virtual Box открыты и там можно найти много ценных решений, но он на С++
Цитата:
При установленном гибридном режиме Vista сначала сохраняет содержимое памяти на диске, как при гибернации, но не выключает питание компьютера, а устанавливает режим пониженного энергопотребления. В результате компьютер можно быстро вернуть к работе, и, при этом, при возникновении проблем с электропитанием, после включения питания компьютер загрузится c помощью сохраненного на диске образа, как после гибернации.
Ответить с цитированием
  #10  
Старый 24.01.2010, 20:53
guranvir guranvir вне форума
Начинающий
 
Регистрация: 19.01.2010
Сообщения: 113
Репутация: 11
По умолчанию

Открываю и свои карты: мне нужно создать песочницу, как часть разрабатываемой системы безопасности(статус opensource ), пока работа идет над проактивной защитой, но вполне веорятно имеет смысл ее разрабатывать параллельно с sanbox, рабочий язык Delphi для всей системы безопасности. Так как задачи у нас схожие то вполне логично объединить усилия
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 13:03.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter