![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Создание пароля [D7, WinXP]
AndreyK_ © (2004-12-27 21:14:00)Уважаемые Мастера,помогите пожалуйста.
Вообще я хочу чтобы при первом запуске моей проги спрашивала пользователя ввести свой пароль. При следующем запуске, чтобы спрашивало введенный в первый раз пароль.
Запись его в отдельный файл не подходит.
Я создал RES файл, подключил к проекту. Загрузил в поток, проверил если там пароль. Если его нет то его надо туда добавить-этого я и не знаю.
Искал как это сделать, но не получилось найти.
Помогите, а то уже неделю мучаюсь.
AndreyK_4 (2004-12-28 21:12:00) [1]Большое спасибо Svit и Digitman ©
Svit (2004-12-28 15:40:00) [2]Опечатался, Svut - это я=)
Svut (2004-12-28 15:38:00) [3]Вот листинг для записи данных в незапущенный exe.
unit AppendEXE;
interface
uses sysutils;
type
TPayloadFooter = packed record
WaterMark: TGUID;
ExeSize: LongInt;
DataSize: LongInt;
end;
type
TPayload = class(TObject)
private
fFileName: string;
fOldFileMode: Integer;
fFile: File;
procedure Open(Mode: Integer);
procedure Close;
public
constructor Create(const FileName: string);
function HasPayload: Boolean;
function PayloadSize: Integer;
procedure SetPayload(const Data; const DataSize: Integer);
procedure GetPayload(var Data);
procedure RemovePayload;
end;
const
cReadOnlyMode = 0;
cReadWriteMode = 2;
cWaterMarkGUID: TGUID = // arbitrary watermark constant
'{9FABA105-EDA8-45C3-89F4-369315A947EB}';
implementation
procedure InitFooter(out Footer: TPayloadFooter);
begin
FillChar(Footer, SizeOf(Footer), 0);
Footer.WaterMark := cWaterMarkGUID;
end;
function ReadFooter(var F: File;
out Footer: TPayloadFooter): Boolean;
var
FileLen: Integer;
begin
FileLen := FileSize(F);
if FileLen > SizeOf(Footer) then
begin
Seek(F, FileLen - SizeOf(Footer));
BlockRead(F, Footer, SizeOf(Footer));
end
else
FillChar(Footer, SizeOf(Footer), 0);
Result := IsEqualGUID(Footer.WaterMark, cWaterMarkGUID);
end;
procedure TPayload.Close;
begin
CloseFile(fFile);
FileMode := fOldFileMode;
end;
constructor TPayload.Create(const FileName: string);
begin
inherited Create;
fFileName := FileName;
end;
procedure TPayload.GetPayload(var Data);
var
Footer: TPayloadFooter;
begin
Open(cReadOnlyMode);
try
if ReadFooter(fFile, Footer)
and (Footer.DataSize > 0) then
begin
Seek(fFile, Footer.ExeSize);
BlockRead(fFile, Data, Footer.DataSize);
end;
finally
Close;
end;
end;
function TPayload.HasPayload: Boolean;
begin
Result := PayloadSize > 0;
end;
procedure TPayload.Open(Mode: Integer);
begin
fOldFileMode := FileMode;
AssignFile(fFile, fFileName);
FileMode := Mode;
Reset(fFile, 1);
end;
function TPayload.PayloadSize: Integer;
var
Footer: TPayloadFooter;
begin
Result := 0;
Open(cReadOnlyMode);
try
if ReadFooter(fFile, Footer) then
Result := Footer.DataSize;
finally
Close;
end;
end;
procedure TPayload.RemovePayload;
var
PLSize: Integer;
FileLen: Integer;
begin
PLSize := PayloadSize;
if PLSize > 0 then
begin
Open(cReadWriteMode);
FileLen := FileSize(fFile);
try
Seek(fFile, FileLen - PLSize - SizeOf(TPayloadFooter));
Truncate(fFile);
finally
Close;
end;
end;
end;
procedure TPayload.SetPayload(const Data;
const DataSize: Integer);
var
Footer: TPayloadFooter;
begin
RemovePayload;
if DataSize > 0 then
begin
Open(cReadWriteMode);
try
InitFooter(Footer);
Footer.ExeSize := FileSize(fFile);
Footer.DataSize := DataSize;
Seek(fFile, Footer.ExeSize);
BlockWrite(fFile, Data, DataSize);
BlockWrite(fFile, Footer, SizeOf(Footer));
finally
Close;
end;
end;
end;
end.
Digitman (2004-12-28 14:36:00) [4]
> во время выполнения программы можно например *.res записать
> в exe?
только недокументированными ("хакерскими") способами.
и лучше ими не пользоваться.
можно поступить, например, так :
1. реализовать dll, которая собственно и будет выполнять обновление ехе любым удобным способом
2. непосредственно перед завершением приложение вызывает на выполнение rundll32.ехе, передавая параметрами имя этой длл, имя ф-ции, производящей обновление ехе-файла, данные для обновления
3. стартовавшая длл ждет пока приложение завершится, а затем обычным образом открывает ехе-файл и производит в нем необходимые обновления
AndreyK_3 (2004-12-28 14:23:00) [5]А во время выполнения программы можно например *.res записать в exe? Если можно то как (или никто не знает)?
Digitman (2004-12-28 13:19:00) [6]
> AndreyK_2
можно.
файл с расширением ехе - такой же файл как и все прочие файлы
AndreyK_2 (2004-12-28 12:30:00) [7]Так а вообще можно что-нибудь в exe записать?
Neznaika (2004-12-28 11:27:00) [8]
> Прога у меня один файл. Отдельный файл пользователь может
> нечайно удалить. Реестр- при переустановке Windows очищается.
Вообще с трудом представляю себе пользователя который лазиет в Program File и удаляет все что под руку попалось....
Плохиш (2004-12-28 11:21:00) [9]
>AndreyK_1 (27.12.04 22:33) [7]
>Прога у меня один файл. Отдельный файл пользователь может нечайно
>удалить. Реестр- при переустановке Windows очищается.
Ну и что, ну введёт пользователь пароль ещё раз, а ты его сохранишь. Он(пользователь) этого даже не заметит.
Neznaika (2004-12-28 11:20:00) [10]>>Прога у меня один файл. Отдельный файл пользователь может >>нечайно удалить. Реестр- при переустановке Windows очищается.
Ну дак засунь этот файл подальше например Document and setting\ApplicationData\и т.д. и т.п.
Erik1 (2004-12-28 11:10:00) [11]Неправильным путем идете товарищ! Недадо exe фаил мучать, это бесполезно, туда ничего незапишется.
ASoft (2004-12-28 02:57:00) [12]>>AndreyK_
Ты хочешь, что б пароль каждый раз прикомпилировался к EXE`шнику?
TButton (2004-12-27 23:39:00) [13]
> Реестр- при переустановке Windows очищается.
реестр очищается и рег едитом, причем выборочно и гораздо быстрее.
AndreyK_1 (2004-12-27 22:33:00) [14]Прога у меня один файл. Отдельный файл пользователь может нечайно удалить. Реестр- при переустановке Windows очищается.
А вообще я делаю так
var
Stream :TMemoryStream;
HResInfo: THandle;
MemHandle: THandle;
ResPtr: PByte;
ResSize: Longint;
password:string;
begin
HResInfo:=FindResource(HInstance, 'MYPASSWORD','STRING');
MemHandle:=LoadResource(HInstance, HResInfo);
ResPtr:= LockResource(MemHandle);
Stream := TMemoryStream.Create;
ResSize := SizeofResource(HInstance, HResInfo);
Stream.SetSize(ResSize+SizeOf(password));
Stream.Write(ResPtr^, ResSize);
Stream.Write(password, SizeOf(password));
Stream.Seek(0, 0);
А что дальше делать я не знаю.
Bork (2004-12-27 22:09:00) [15]
> А реестр записан на каменных скрижалях, да?
Если бы он был чем-то материальным его бы уже давно пропили!!!
Bork (2004-12-27 22:08:00) [16]
> А реестр записан на каменных скрижалях, да?
Если бы он был чем-то материальным его бы уже давно пропили!!!
Fay (2004-12-27 21:24:00) [17]А реестр записан на каменных скрижалях, да?
Bork (2004-12-27 21:23:00) [18]т.е. надо записать пароль в реестр?
Fay (2004-12-27 21:22:00) [19]Уверен на 99.99%, что в конечном итоге пароль окажется в файле 8)
Fay (2004-12-27 21:19:00) [20]>> Запись его в отдельный файл не подходит
Это почему?