Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сохранение значений прямо в exe 
:(
    Опции темы
Teleport
Дата 25.11.2008, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 557
Регистрация: 5.7.2008
Где: Прибалтика

Репутация: 3
Всего: 6



имеется вот такая программка:
Код

var
  Form1: TForm1;
  i: integer;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
i:=i+1;
Label1.Caption:= IntToStr(i);
end;


с каждым нажатием кнопки - переменная i увеличивается на 1 единицу. Например нажал 5 раз на кнопку i стало равным 5-ти.
Возможно ли такое, что при следующем запуске программы переменная i уже имеет начальное значение - именно то, которое мы дали дали ей нажатием кнопки в прошлый раз. Без использования бд и файлов. Как сделать чтобы значение переменной i запоминалось в exe.


--------------------
user posted image
user posted image 
PM MAIL   Вверх
ecspertiza
Дата 25.11.2008, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 3.11.2008
Где: г.Смоленск

Репутация: нет
Всего: 5



Насколько я знаю в exe значение запомнить никак нельзя, это же бинарник фсётаки, запомни значение в реестре например чем невариант?


--------------------
С уважением,
мастер конфетного цеха!

онлайн компилер
залип
PM MAIL   Вверх
Teleport
Дата 25.11.2008, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 557
Регистрация: 5.7.2008
Где: Прибалтика

Репутация: 3
Всего: 6



ecspertiza, насколько я знаю - можно. А реестр и ini-файлы мне никак не подходят.
"4 байта вашей переменной храниться в памяти по адресу @i.. и с ними соответсвенно можно сделать все что хочеш." - вот что мне сказали недавно, но решения как именно это сделать у меня нет. Я даже не знаю как к этому потступиться!. 



--------------------
user posted image
user posted image 
PM MAIL   Вверх
Rrader
  Дата 25.11.2008, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 70
Всего: 191



Цитата(Teleport @  25.11.2008,  23:39 Найти цитируемый пост)
"4 байта вашей переменной храниться в памяти по адресу @i.. и с ними соответсвенно можно сделать все что хочеш." - вот что мне сказали недавно, но решения как именно это сделать у меня нет. Я даже не знаю как к этому потступиться!. 


Это несколько иная вещь. А чтобы значение переменной запоминалось в EXE, можно использовать опциональные потоки.


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
Teleport
Дата 25.11.2008, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 557
Регистрация: 5.7.2008
Где: Прибалтика

Репутация: 3
Всего: 6



Rrader - как это сделать в делфи? можно пример?


--------------------
user posted image
user posted image 
PM MAIL   Вверх
aktuba
Дата 25.11.2008, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: 16
Всего: 38



Цитата(Teleport @  25.11.2008,  18:39 Найти цитируемый пост)
4 байта вашей переменной храниться в памяти по адресу @i.. и с ними соответсвенно можно сделать все что хочеш.

Тебе же сказали - в памяти ;). Адрес в памяти и адрес в файле - не одно и тоже. Это раз. Два - да, действительно, можно. Но сложно.


--------------------
user posted image
PM MAIL WWW Skype   Вверх
NieL
Дата 25.11.2008, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 214
Регистрация: 10.2.2008

Репутация: 1
Всего: 1



PM MAIL   Вверх
Qu1nt
Дата 25.11.2008, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 13.1.2007

Репутация: 18
Всего: 50



А если используется другая файловая система?
PM MAIL   Вверх
Teleport
Дата 25.11.2008, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 557
Регистрация: 5.7.2008
Где: Прибалтика

Репутация: 3
Всего: 6



NieL - прочитал. там же задал вопрос. Это моя тема на том форуме. smile


--------------------
user posted image
user posted image 
PM MAIL   Вверх
Riply
Дата 25.11.2008, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: 3
Всего: 32



Цитата(Teleport @  25.11.2008,  17:11 Найти цитируемый пост)
Как сделать чтобы значение переменной i запоминалось в exe.


Реализовать можно. Но, imho, игра не стоит свеч, ибо трудозатраты несоизмеримы с эффектом.
И потом: ради чего именно в exe ? Чтобы лучше спрятать ?
Тогда это иллюзия. 
Все твои действия, при прятаньи в exe, вычисляются с таким же успехом, как и запись в любой другой файл smile

PM MAIL   Вверх
Romikgy
Дата 26.11.2008, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7325
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



А че тупо в ресурсы своего экзешника нельзя добавлять ?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
CodeMonkey
Дата 26.11.2008, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 38
Всего: 89



Вы для защиты это пытаетесь сделать? Да я просто в ярлык кину bat-ник - скопировать файл из бэкапа и запустить. Вечный запуск! И мне это сделать 2 минуты, а вам на реализацию недели уйдут. Лучше направьте свои силы на что-то более полезное. 

Кроме того, те, кто не станут покупать вашу программу, всё равно найдут способ её взломать, что бы вы там ни крутили. А те, кто собирается её купить, не станут использовать кряк, даже если его на блюдечке им принести (это я про цивилизованные страны, а не про Россию).

И ещё, у меня есть подозрение, что какой-нибудь шибко умный антивирус будет ругаться на модифицированный файл - мол, файл изменился - значит вирус!

Добавлено через 8 минут и 49 секунд
P.S. если по теме, то у меня есть сильное подозрение, что можно объявить константу, скажем так:

Код
const
  I: Integer = 5;


В процессе работы программы узнать её адрес:

Код
var
  P: Pointer;
...
  P := @I;


А далее воспользоваться тем фактом, что при проецировании exe файла на адресное пространство эта константа в адресном пространстве будет по адресу = [сдвиг exe от начала адресного пространства] + [сдвиг константы относительно начала exe файла].

Вам известна левая часть - это P. Первое слагаемое обычно константа - это $400000, если вы это число не меняли в настройках (и если вы не используете какую-нибудь рандомизацию адресного пространства). Для надёжности можно взять HInstance в exe - это ровно оно и будет. Ну а второе слагаемое - это то, что мы хотим узнать. 

X = Y + Z.

Z хотим, X, Y - известны. Решаем.

Потом открываем exe файл, отсчитываем от начала Z байт и пишем туда Integer. Как это сделать при запущенном exe - это отдельный вопрос.

Конечно, это просто набросок - что в голову пришло. Работоспособность этой схемы ещё нужно проверять.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Teleport
Дата 26.11.2008, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 557
Регистрация: 5.7.2008
Где: Прибалтика

Репутация: 3
Всего: 6



Riply - возможно, ты прав(а). 
Romikgy - покажи реализацию?
CodeMonkey - нну да, ты прав...
хм... smile


--------------------
user posted image
user posted image 
PM MAIL   Вверх
Rrader
  Дата 26.11.2008, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 70
Всего: 191



Teleport, держи пример, но только в учебных целях smile
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  I: Integer;

implementation

{$R *.dfm}

function IsOptStreamPresent(const AName: String): Boolean;
var
  FHandle: THandle;
begin
  Result := False;
  FHandle := CreateFile(PChar(ParamStr(0) + ':' + AName),
    GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE,
    NIL, OPEN_EXISTING, 0, 0);
  if FHandle <> INVALID_HANDLE_VALUE then
  begin
    Result := True;
    CloseHandle(FHandle);
  end;
end;

procedure GetOptionalStreamVariable(var Variable: Integer;
  const AName: String);
var
  MS: TMemoryStream;
begin
  if IsOptStreamPresent(AName) then
  begin
    MS := TMemoryStream.Create;
    try
      MS.LoadFromFile(ParamStr(0) + ':' + AName);
      Variable := PInteger(MS.Memory)^;
    finally
      FreeAndNil(MS);
    end;
  end
  else
    I := 0;
end;

procedure SetOptionalStreamVariable(Variable: Integer; const AName: String);
var
  MS: TMemoryStream;
begin
  if IsOptStreamPresent(AName) then
    DeleteFile(ParamStr(0) + ':' + AName);
  MS := TMemoryStream.Create;
  try
    MS.WriteBuffer(Variable, SizeOf(Variable));
    MS.SaveToFile(ParamStr(0) + ':' + AName);
  finally
    FreeAndNil(MS);
  end;  
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  I := I + 1;
  { Сохраняем }
  SetOptionalStreamVariable(I, 'I');
  Label1.Caption := IntToStr(I);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  { Загружаем }
  GetOptionalStreamVariable(I, 'I');
  Label1.Caption := IntToStr(I);
end;

end.



--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
CodeMonkey
Дата 26.11.2008, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 38
Всего: 89



Rrader, забыл озвучить ограничения этого метода.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1864 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.