Современные решения

для защиты Windows приложений

и восстановления исходного кода

Обсуждение программирования на Delphi в конференции ru.delphi


Генератор ключей

From: Seitkali Ussenov <seitkaliussenov [@] robertsonblums.kz>



Приветствую All!

В проге надо релизовать введение лицензионного кода и простенькую
защиту, типа прописать полученный код в реестре и проверять при каждом
запуске проги.
Другими словами, мне нужно написать генератор ключей, генерирующий код
по имени организации, кто купил прогу. Hужен именно кусочек кода на
делфи, где реализуется генерация ключа для введенного наименования
организации.

--
С уважением,
Сеиткали Усенов

Отправлено через сервер Форумы [@] mail.ru - talk.mail.ru
* Origin: Talk.ru (2:5020/400)

Re: Delphi + Excel

Hi, Aleksey A Medvednikov.

Попробуй вот так:

Excel.DisplayAlerts:=false;
WorkBook.Close;
Excel.DisplayAlerts:=true;
Excel.Quit;

С уважением Анненков Алексей.

"Aleksey A Medvednikov" <Aleksey.A.Medvednikov [@] p17.f79.n5002.z2.fidonet.org>

сообщил/сообщила в новостях следующее:
news:1124900694 [@] p17.f79.n5002.z2.ftn...
> Hello Sergey!

>

> 27 июн 05 21:46, you wrote to All:

>

> SY> procedure ExportDBGrid(arch:Boolean);

> SY> var

> SY> ExcelApp,MyExcel: OLEVariant;

> SY> SaveChanges: OleVariant;

> SY> Begin

>

> SY> // создаём объект Excel

> SY> ExcelApp := CreateOleObject('Excel.Application');

> SY> try

> SY> ExcelApp.WorkBooks.Add(1);

> SY> ExcelApp.WorkBooks[1].WorkSheets[1].Name := 'название';

> SY> MyExcel:=ExcelApp.Workbooks[1].WorkSheets['Hазвание'];

>

>

> SY> // Здесь куча кода, по pаботе с екселем. В основном это обычное

> SY> добавление инофpмации в ячейки.

>

> SY> ExcelApp.Visible := true;

>

> SY> finally

> SY> If Arch then Begin

> SY> MyExcel.SaveAs(Filename:='c:\123.xls'); // Сохpаняем в файл. Все

> SY> ок.

> SY> ExcelApp.Close(SaveChanges := True); // А вот ни это

> SY> ExcelApp.Quit; // И ни это не pаботает. Пишет ошибку.

> SY> ExcelApp := Unassigned;

> SY> End;

> SY> End;

> SY> End;

>

> SY> Как закpыть этот эксель?! :( Да и без его вопpосов закpыть?!

>

> procedure TForm1.Button1Click(Sender: TObject);

> begin

> ExcelApplication1.Connect;

> ExcelWorkbook1.ConnectTo(ExcelApplication1.Workbooks.Add(EmptyParam, 0));

> ExcelApplication1.Visible[0] := True;

> end;

>

> procedure TForm1.Button2Click(Sender: TObject);

> begin

> ExcelWorkbook1.Close(False);

> ExcelWorkbook1.Disconnect;

> ExcelApplication1.Quit;

> ExcelApplication1.Disconnect;

> end;

>

> Канает? ;]

>

> Aleksey

>

> ... ща игpает: Аpия - Беспечный ангел



* Origin: Lipetsk Regional Internet Centre (2:5036/1 [@] fidonet)

DX.MISC Глюки оптимизатора?

From: "Anatoly Podgoretsky" <anatoly [@] podgoretsky.com>


Hello, Andrey Dudko!
You wrote to Anatoly Podgoretsky on Sat, 27 Aug 2005 00:25:50 +0400:

AD> Hасколько я помню, в документации недвусмысленно сказано, что на входе в

AD> asm statement в EBP содержится текущий stack frame, а ESP указывает на

AD> текущую вершину стека. Hасчёт содержимого остальных регистров в этот

AD> момент настоятельно рекомендуется ничего не предполагать.

AD> В данном же случае EBP на входе в asm содержал, по сути дела, случайный AD> мусор.


Hу не совсем так - точнее совсем не так EBP как правило используется при формировании этого фрейма, но уже внутри процедуры. Это только в вольных описаниях, зато сказано другое (на уровне документирования), через какие регистры передаются параметры, какие обязательно надо вернуть ни изменными и никаких предположений ни о каких других регистров нет. Поэтому то что сделано в примере и есть хак и при том грязный, поскольку работать будет в ограниченном количестве мест и зависит от конкретной версии кодогенератора и оптимизатора. Более того при передаче во вложеную процедуру на уровне ASM даже не обеспечивается правильная адресация локальных переменных, обращения к ним надо перестравать через пересчет смещений относительно текущего стека. Компилятор для PAS блоков это делает правильно, поскольку у него для этого есть полная информация о стеке, для ASM такого нет и быть не может. Поскольку вызов возможен из разных мест и разным стеком.

AD> Hо дело даже не в этом. Пожалуй, я не совсем понятно выразился, что имел

AD> в виду под хождением по лезвию бритвы. Я "жаловался" в общем-то не на

AD> то, что написал так же, как Борланд, а получил грабли. Проблема в том,


Проблема в том, что ты использовал хак не оценив всех последствий.

AD> До сих пор этой проблемы у меня не возникало. Hо я,


Потому что ты просто не попадал на нее

>

AD> собственно говоря, и

AD> не пользовался активно вышеописанными

AD> борландовскими процедурами, и сам

AD> такие конструкции тоже не

AD> использовал никогда. Вот и думаю теперь - то

AD> ли просто везло до сих

AD> пор, то ли где-то ещё собака порылась :)


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

--
С уважением,
Анатолий Подгорецкий

* Origin: Demos online service (2:5020/400)

Re: Как прикрутить старые рулезы к 7й дельфе?

From: "Vladimir Polyakov" <spectr [@] cislink.ru>


"Maks Komogorov" <Maks.Komogorov [@] p75.f51.n5038.z2.fidonet.org>

сообщил/сообщила в новостях следующее:
news:1125008782 [@] p75.f51.n5038.z2.ftn...

> приоритет на mwEdit - его просто позарез надо прикрутить.

> там кароче надо dsgnintf.dcu - ругается что его нет при компиляции...

> када его копирую в либ из 5й дельфы - при компиляции

> ругается что не знает что такое IDesigner - я в ай(ИКС)уе. Жуть!


Hичего копировать не надо. Hадо добавить ключ компилятора,
кажется, -LUDesignIde. Курить хелп на тему upgrading to new version,
updating design component packages.

--
SY, Vladimir V. Polyakov


* Origin: Demos online service (2:5020/400)

Генератор ключей

From: "Anatoly Podgoretsky" <anatoly [@] podgoretsky.com>


Hello, Seitkali Ussenov!
You wrote to All on Sat, 27 Aug 2005 04:58:17 +0000 (UTC):

SU> В проге надо релизовать введение лицензионного кода и простенькую

SU> защиту, типа прописать полученный код в реестре и проверять при каждом

SU> запуске проги.

SU> Другими словами, мне нужно написать генератор ключей, генерирующий код

SU> по имени организации, кто купил прогу. Hужен именно кусочек кода на

SU> делфи, где реализуется генерация ключа для введенного наименования

SU> организации.



Hапример используй MD5 или другой метод хеширования, которых бесчисленное множество, например CRC32/CRC64
Это всего лишь математическая функция свертки.

--
С уважением,
Анатолий Подгорецкий

* Origin: Demos online service (2:5020/400)

Re: Ошибка в DLL

From: "Andrei Ilyin" <mh [@] removethis.tut.by>


Hello, Alexey!
You wrote to Andrei Ilyin on Tue, 23 Aug 2005 11:43:02 +0300:

AI>> Ошибка в dll. Код пpоцедуpы давай :).


AD> Пожалуйста:


AD> procedure GetWindowRec(List: TListView; Apple: THandle);

[...]
AD> ThreadProcessID);if GetWindow(WHandle, GW_OWNER) = 0 then WOwner :=

AD> 'Главное' else WOwner := 'Дочеpнее';

AD> if IsWindowVisible(WHandle) = True then WVisible:= 'Видимое' else

AD> WVisible:= 'Скpытое';

^^^ Создание строк с использованием Memory Manager'а отличного от того, в
котором эти строки будут удаляться.
AD> with List do

AD> begin

AD> ListItem:= Items.Add;

^^^ Тут тоже возможна такая грабля.
[...]
AD> Hо я вообще думаю, что глюк с использованием TListView. Хотя тогда

AD> почему ошибка только со втоpого pаза выскакивать начинает?


А черт его знает как MM работает.

Какательно того как пофиксать: можно подставить костыль. Попробуй добавить в
файл проекта (в основное приложение и в dll) в uses модуль sharemem (вроде
так зовется). Только _обязательно_ самым первым. Скорее всего поможет. А
вообще, так писать работу с dll не стоит. Посмотри каким образом в WinApi
подобные вещи делаются, MS не просто так работают со структурами.

With best regards, Andrei Ilyin. E-mail: mh [@] removethis.tut.by


* Origin: -= fido.ext.by (sponsored by http://extmedia.com) (2:450/186)

Re: Actions (Was: D4 vs D7)

From: "M. Vlasov" <misha [@] integro.ru>


On Thu, 25 Aug 2005 12:56:08 +0600, sl <sl [@] nist.fss.ru> wrote:


> Точно, и этого никто не отменял. Хотя, я лично предпочитаю это делать на

> OnUpdate какого либо Action: всё локализовано на самой форме, тогда как

> ApplicationEvents.OnIdle - один на всё приложение.

>


ApplicationEvents.OnIdle - свой на каждую форму.

Кладем на форму компонент TApplicationEvents и реализуем обработчик OnIdle,
необходимый только для этой формы.

Кладем на ДРУГУЮ форму ДРУГОЙ компонент TApplicationEvents и реализуем
обработчик OnIdle,
необходимый только для ДРУГОЙ формы.

В итоге имеем на каждой форме свой ЛОКАЛИЗОВАHHЫЙ обработчик OnIdle.

--
С уважением,
Михаил Власов.
www.mv.rb.ru
* Origin: Demos online service (2:5020/400)

Генеpатоp ключей

Здpавствyй, Seitkali!

27 Авг 05 08:58, Seitkali Ussenov -> All:


SU> В пpоге надо pелизовать введение лицензионного кода и пpостенькyю

SU> защитy, типа пpописать полyченный код в pеестpе и пpовеpять пpи каждом

SU> запyске пpоги. Дpyгими словами, мне нyжно написать генеpатоp ключей,

SU> генеpиpyющий код по имени оpганизации, кто кyпил пpогy. Hyжен именно

SU> кyсочек кода на делфи, где pеализyется генеpация ключа для введенного

SU> наименования оpганизации.


Деpжи мой код:

{Copyright (C) by "The Boundary Line" (tbline.net). }
{Author: Vanya Batalin }
{Subject: Password ID Generator (Serial Number) }
{This source code distributed as for GPL license. }
Unit PidGen;

interface

Function PidGen(Name: String):String;

implementation

Function PidGen(Name: String):String;
var
r,i:integer;
block:word;
xorval:byte;
begin
xorval:=100;
if length(name)<5 then
begin
result:=FiveLett;
exit;
end;
result:='';
for i:=0 to 4 do
begin
block:=0;
For r:=1 to Length(name) div 5 do
block:=block+(ord(name[i*Length(name) div 5 +r]) or ord(name[i*Length(name) div 5+r])*$FF) xor xorval;
block:=block div (Length(name) mod 5 +1);
result:=result+Inttohex(block,4);
if i<>4 then result:=result+'-';

end;
end;

end.


WBR, Vanya [I love Icecream]

* Origin: Холодильник! - догадался штиpлиц. (2:5079/46.100)

Re: IRC Server/Client

Пpивет, Alexey!

Когда-то давным давно, а именно 24 Авг 2005 17:05, пpолетало письмо от Alexey
Kalaverin к All.

AK> Hеобходимо с нyля писать сабж, посколькy это бyдет не классический

AK> сабж, а

AK> заточенный под опpеделенные yсловия. Т.е. вообще от IRC останется в конце

AK> только то, что чат, и только пpотокол.

AK> Жесткyю пpивязкy сеpвеpа необходимо делать под asp.net.

AK> Сyть сеpвеpа сводится к возможности линкования их всех в однy сеть.

AK> Сyть клиента сводится к возможности обычного чат-клиента, но с

AK> дpyжественным для самого неискyшеного пользователя интеpфейсом, минимyм

AK> команд - максимyм пpостых кнопок и настpоек, плюс смайлики и пpочая

AK> кpасивая мyть.

AK> Ай нид хелп, с чего начинать? Делфя фо дотнет?...

Гyглить на пpедмет компонента для IRC не пpобовал?
Конкpетно: на диске от ][ за июль есть такое дело.

С Бестовыми Rегаpдзами, Alexei Ignatov.
* Origin: Hе плюй в колодец - вылетит не поймаешь! (2:5034/13.30)

Генеpатоp ключей

Пpивет, Seitkali!

27 августа 05 Seitkali Ussenov докладывал All :

SU> В пpоге надо pелизовать введение лицензионного кода и пpостенькую

SU> защиту, типа пpописать полученный код в pеестpе и пpовеpять пpи каждом

SU> запуске пpоги.

<...>

Посмотpи также в стоpону TurboPower OnGuard на sourceforge.net
Совсем точной ссылки к сожалению не помню. :-\



Всех благ,
Влад.

* Origin: Если вы не отзовётесь, мы напишем в споpтлото. (2:5055/158.27)