eXeL@B —› Программирование —› Delphi как раскидать глобальные переменные по памяти и не хранить поинтеры подряд? |
Посл.ответ | Сообщение |
|
Создано: 07 ноября 2009 17:30 · Личное сообщение · #1 Мне необходимо сохранить в программе написанной на Delphi (к примеру 3 переменных), которые я объявляю глобально. Использую в разных местах программы. Объявляю как обычный dword или pdword. Например использую так: Code:
Либо просто объявляю dword. В итоге получаю три подряд идущие ячейки с адресами где лежат переменные либо три подряд идущие переменные во втором случае. Моя задача состоит в том, что бы сохранить возможность обращения по имени переменной, но фактически адреса ячеек с переменными или значения не шли друг за другом. Как-то запутанно рассказал… В итоге при рассмотрении в дизассемблере обращение к переменным выгляди примерно так: Code:
или так: Code:
А мне бы получить как-то так: Code:
или так: Code:
Я понимаю, что этим ведает компилятор, но может есть варианты раскидать? |
|
Создано: 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: или все переменные в одном юните, а между ними декларации массивов с размером, какой хочешь чтобы был между ними.. |
|
Создано: 07 ноября 2009 18:39 · Личное сообщение · #3 |
|
Создано: 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; |
|
Создано: 07 ноября 2009 20:42 · Личное сообщение · #5 |
|
Создано: 07 ноября 2009 23:17 · Личное сообщение · #6 |
|
Создано: 07 ноября 2009 23:40 · Личное сообщение · #7 Archer пишет: накой это закидывание ноги за ухо нужно Там планируется хранить всякие адреса необходимые для успешной работы программы, константы расчётов, в общем важную информацию без которой софт работать не будет и которые раскиданы по всему коду. Разумеется содержимое ячеек правильно сформируется только тогда, когда инфа о железе и присланный файл ключа будут соответствовать. Простенькая защита получается. Можно чуть повиртуализировать код... Понимаю, что идея не выдерживает критики и мало кого это остановит, но хранить важные константы подряд небольшим блоком вообще грех... |
|
Создано: 08 ноября 2009 04:55 · Поправил: _ruzmaz_ · Личное сообщение · #8 Ну раз для защиты нужно), то тогда можно большую часть данных хранить рандомно в одном или нескольких массивах (либо в переменных между массивов произвольной длины), но при этом оставшуюся часть распределить, например, по стандартым дельфовым модулям, по своим модулям, по стандартным дельфовым классам, по элементам форм (свойство Tag можно использовать). В последнем случае может быть есть смысл что-нибудь типа Citadel заюзать. P.S. Если бы под fpc писалось, можно было через absolute адрес переменной задавать, что тоже пригодилось бы). |
|
Создано: 09 ноября 2009 12:39 · Поправил: Isaev · Личное сообщение · #9 ToBad пишет: Разумеется содержимое ячеек правильно сформируется только тогда, когда инфа о железе и присланный файл ключа будут соответствовать. пиши тогда компонент, который будет создавать и убивать массивы динамически (а данные перемещать конечно без потерь), а указатель на нужный давать при доступе через свойство, и вешай всё это дело в отдельный поток... быдет немного памяти жрать, но поставит в тупик многих (можно ещё и шифровать попутно) ----- z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh |
eXeL@B —› Программирование —› Delphi как раскидать глобальные переменные по памяти и не хранить поинтеры подряд? |