Форум по 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.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter