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

 eXeL@B —› Программирование —› Delphi как раскидать глобальные переменные по памяти и не хранить поинтеры подряд?
Посл.ответ Сообщение


Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 07 ноября 2009 17:30
· Личное сообщение · #1

Мне необходимо сохранить в программе написанной на Delphi (к примеру 3 переменных), которые я объявляю глобально. Использую в разных местах программы.
Объявляю как обычный dword или pdword. Например использую так:
Code:
  1. Var a1,a2,a3:pdword;
  2. Begin
  3. New(a1);
  4. New(a2);
  5. New(a3);
  6. A1^:=5;
  7. A2^:=6;
  8. A3^:=7;
  9. End;

Либо просто объявляю dword. В итоге получаю три подряд идущие ячейки с адресами где лежат переменные либо три подряд идущие переменные во втором случае.
Моя задача состоит в том, что бы сохранить возможность обращения по имени переменной, но фактически адреса ячеек с переменными или значения не шли друг за другом. Как-то запутанно рассказал…
В итоге при рассмотрении в дизассемблере обращение к переменным выгляди примерно так:
Code:
  1. Mov eax,[.405000] ; eax=803563
  2. Mov eax,[eax]        ; eax=5
  3. Mov eax,[.405004] ; eax=821033
  4. Mov eax,[eax]        ; eax=6
  5. Mov eax,[.405008] ; eax=867831
  6. Mov eax,[eax]        ; eax=7

или так:
Code:
  1. Mov eax,[.405000] ; eax=5
  2. Mov eax,[.405004] ; eax=6
  3. Mov eax,[.405008] ; eax=7

А мне бы получить как-то так:
Code:
  1. Mov eax,[.405236] ; eax=803563
  2. Mov eax,[eax]        ; eax=5
  3. Mov eax,[.417809] ; eax=821033
  4. Mov eax,[eax]        ; eax=6
  5. Mov eax,[.402056] ; eax=867831
  6. Mov eax,[eax]        ; eax=7

или так:
Code:
  1. Mov eax,[.803563] ; eax=5
  2. Mov eax,[.821033] ; eax=6
  3. Mov eax,[.867831] ; eax=7

Я понимаю, что этим ведает компилятор, но может есть варианты раскидать?



Ранг: 88.3 (постоянный), 3thx
Активность: 0.040
Статус: Участник

Создано: 07 ноября 2009 18:29 · Поправил: Enigma
· Личное сообщение · #2

можно каждую переменную хранить в отдельном юните, только чтобы переменные были раскиданы, в каджом юните напиши одну или несколько функций, которые будут компилироваться, но фактически никакой работы делать не будут..

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

типа
Unit1:
var
my_param1 : int;
dummy1 : array [0..4554] of int;

Unit2:
var
my_param2 : int;
dummy2 : array [0..433] of int;

Unit1:
var
my_param3 : int;

PS: или все переменные в одном юните, а между ними декларации массивов с размером, какой хочешь чтобы был между ними..




Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 07 ноября 2009 18:39
· Личное сообщение · #3

Enigma - для трёх в каждом юните в принципе вариант, но по секрету скажу, что у меня 200 переменных...
Вариант с массивами между каждой переменной - интересно. Можно выделить мегабайт под это дело, рандомно насоздавать массивов разной длины...



Ранг: 88.3 (постоянный), 3thx
Активность: 0.040
Статус: Участник

Создано: 07 ноября 2009 18:44
· Личное сообщение · #4

да, только не забудь что компилятор уберет неиспользуемые массивы, надо будет создать функцию, которая их использует, и саму функцию за-использовать.. вот так прокатит
var
val:array [0..43] of int;
function dummy : int;
begin
val[0] := val[43];
result := val[0];
end;
initialization
asm
jmp @1
call dummy
@1:
end;




Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 07 ноября 2009 20:42
· Личное сообщение · #5

Enigma Спасибо за помощь! Ты подал хорошую идею, буду использовать этот метод.
Тему пока не закрываю на тот случай, если кто нибудь ещё варианты знает.




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 07 ноября 2009 23:17
· Личное сообщение · #6

Создай 1 массив большой длины. И выбери рандомом нужное число индексов, там и храни переменные. Хотя сами индексы будут лежать в памяти подряд. Поэтому хз, подойдёт или нет, ибо вывалил сразу странную задачу без объяснения, накой это закидывание ноги за ухо нужно.




Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 07 ноября 2009 23:40
· Личное сообщение · #7

Archer пишет:
накой это закидывание ноги за ухо нужно


Там планируется хранить всякие адреса необходимые для успешной работы программы, константы расчётов, в общем важную информацию без которой софт работать не будет и которые раскиданы по всему коду. Разумеется содержимое ячеек правильно сформируется только тогда, когда инфа о железе и присланный файл ключа будут соответствовать. Простенькая защита получается. Можно чуть повиртуализировать код... Понимаю, что идея не выдерживает критики и мало кого это остановит, но хранить важные константы подряд небольшим блоком вообще грех...



Ранг: 114.8 (ветеран), 41thx
Активность: 0.10
Статус: Участник

Создано: 08 ноября 2009 04:55 · Поправил: _ruzmaz_
· Личное сообщение · #8

Ну раз для защиты нужно), то тогда можно большую часть данных хранить рандомно в одном или нескольких массивах (либо в переменных между массивов произвольной длины), но при этом оставшуюся часть распределить, например, по стандартым дельфовым модулям, по своим модулям, по стандартным дельфовым классам, по элементам форм (свойство Tag можно использовать). В последнем случае может быть есть смысл что-нибудь типа Citadel заюзать.
P.S. Если бы под fpc писалось, можно было через absolute адрес переменной задавать, что тоже пригодилось бы).




Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 09 ноября 2009 12:39 · Поправил: Isaev
· Личное сообщение · #9

ToBad пишет:
Разумеется содержимое ячеек правильно сформируется только тогда, когда инфа о железе и присланный файл ключа будут соответствовать.

пиши тогда компонент, который будет создавать и убивать массивы динамически (а данные перемещать конечно без потерь), а указатель на нужный давать при доступе через свойство, и вешай всё это дело в отдельный поток... быдет немного памяти жрать, но поставит в тупик многих (можно ещё и шифровать попутно)

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh



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


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