Zabezpieczenie (modyfikacja EXE)

0

Witam.

Potrzebuje zrobić następującą rzecz:
Program przy pierwszym uruchomieniu będzie odczytywał nr seryjny dysku lub partycji i lokalizację.
Po odczytaniu ma on sam siebie zmodyfikować zapisując te dane.
Podczas każdego kolejnego uruchomienia ma odczytywać z siebie podane wyżej dane i porównywać z tymi pobranymi z systemu. Program powinno być można uruchamiać tylko z dysku stałego.

A teraz pytanko do was:
Jak się do tego zabrać?

Z góry dziękuję za pomoc.

//PS: Proszę nie zadawać pytań typu: "A do czego ci to?", "Google nie widziałeś?"

0
lukaszguzik napisał(a)

Witam.

Potrzebuje zrobić następującą rzecz:
Program przy pierwszym uruchomieniu będzie odczytywał nr seryjny dysku lub partycji i lokalizację.
Po odczytaniu ma on sam siebie zmodyfikować zapisując te dane.
Podczas każdego kolejnego uruchomienia ma odczytywać z siebie podane wyżej dane i porównywać z tymi pobranymi z systemu. Program powinno być można uruchamiać tylko z dysku stałego.

A teraz pytanko do was:
Jak się do tego zabrać?

Z góry dziękuję za pomoc.

//PS: Proszę nie zadawać pytań typu: "A do czego ci to?", "Google nie widziałeś?"

po kolei:
odczytywanie numeru seryjnego dysku masz na googlach (http://www.google.pl/search?hl=pl&q=delphi+%22numer+seryjny+dysku%22&btnG=Szukaj&lr=)
a odczyt/zapis plikow nasz na 4p:
Pliki
musisz sie tylko zastanowic, jak chcesz zmodyfikowac "samego siebie" ;]

p.s. ostrzegam, ze zabezpieczenie latwo obejsc, no chyba, ze komus sie nie chce w to bawic albo nie ma pojecia o programowaniu... na wszelki wypadek pomysl nad jakims szyfrowaniem...

0

cześć,
polecam : http://www.aspack.com
i masz problem rozwiązany profesjonalnie.

0

O chyba sobie kupię, co to tam wydać 99 dolców heh...

0
RedbaK napisał(a)

O chyba sobie kupię, co to tam wydać 99 dolców heh...

wyczuwam ironię ;-P ale wiesz, jak piszesz dla siebie to może faktycznie kupowanie takiego softu nie ma sensu, ale jak dla firmy gdzie np.pracujesz takie rozwiązania są wg mnie warte uwagi.
a ten wspomniany przeze mnie soft jest naprawdę dobry.

0
cimak napisał(a)

...

o plikach to wiem.
jak odczytać numer seryjny i lokalizację też wiem.
ale nie wiem jak zrobić żeby program zapisywał to w samym sobie :-)
myślałem nad dodaniem do execa kompilatora i źródeł żeby program się przekompilowywał, ale to chyba raczej troche głupie, bo można by to złamać choćby resexplorerem (jest w przykładach delphi).

Czekam na dalsze posty :-) ;-P

0

wcizmowski napisał:

wyczuwam ironię ;-P ale wiesz, jak piszesz dla siebie to może faktycznie kupowanie takiego softu nie ma sensu, ale jak dla firmy gdzie np.pracujesz takie rozwiązania są wg mnie warte uwagi.
a ten wspomniany przeze mnie soft jest naprawdę dobry.

Tak sobie mruczałem pod noskiem. :)
Oczywiście, jeśli na firmę komponent to jak najbardziej. Wrzucam to na fakturę i na odliczenie potem. Jeśli dla siebie to wiesz... ;]

lukaszguzik
Mam dziś dobry humor, więc wyjątkowo wrzucę Ci gotowca:

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label3: TLabel;
    Label2: TLabel;
    Button1: TButton;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  zamknac:boolean; // <--- od zamknięcia buttonem formy

  Seryjny: string;
  zabezpiecz: boolean;

implementation

{$R *.dfm}
//FUNKCJA DEKODOWANIA I KODOWANIA PLIKU
function dekoduj(text:string;var wynik:string):boolean;
var temp:string;i:integer;ch:smallint;suma:integer;
begin
if length(text)<1 then begin
  Result:=false;
  wynik:='';
  exit;
end;
temp:=Copy(text,1,Length(text)-1);
ch:=Ord(temp[1])-5;
while ch<0 do ch:=ch+255;
temp[1]:=Chr(ch);
for i:=2 to length(temp) do begin
   ch:=Ord(temp[i])-Ord(temp[i-1]);
   while ch<0 do ch:=ch+255;
   temp[i]:=Chr(ch);
end;
suma:=0;
for i:=1 to length(temp) do Inc(suma,Ord(temp[i]));
while suma>255 do Dec(suma,255);
if suma=Ord(text[Length(text)]) then begin
   Result:=true;
   wynik:=temp;
end else begin
   Result:=false;
   wynik:=text;
end;
end;

function koduj(text:string):string;
var temp:string;i:integer;ch:smallint;suma:integer;
begin
if length(text)<1 then begin
  Result:='';
  exit;
end;
suma:=0;
for i:=1 to length(text) do Inc(suma,Ord(text[i]));
while suma>255 do Dec(suma,255);
temp:=text;
for i:=length(temp) downto 2 do begin
   ch:=Ord(temp[i])+Ord(temp[i-1]);
   while ch>255 do ch:=ch-255;
   temp[i]:=Chr(ch);
end;
ch:=Ord(temp[1])+5;
while ch>255 do ch:=ch-255;
temp[1]:=Chr(ch);
Result:=temp+Chr(suma);
end;

//PROCEDURY ZAPISU I ODCZYTU DANYCH Z PLIKU
procedure ZapiszDane(dane:string;pocz:string='@@#@@';koniec:string='##@##';plikPomocniczy:string='c:\temp.bat');
var plik:TextFile;
begin
// po uruchomieniu tej procedury, masz 3 sekundy
// na zamknięcie programu, inaczej nic się nie zapisze
  AssignFile(plik,plikPomocniczy);
  Rewrite(plik);
  WriteLn(plik,'@Echo off');
  WriteLn(plik,'choice /N /T:1,3 /C:1111 >nul'); // czekaj trzy sekundy
  WriteLn(plik,'echo '+pocz+dane+koniec+'>>'+ExtractShortPathName(ParamStr(0)));
  WriteLn(plik,'cls');
  WriteLn(plik,'del %0 >nul'); // skasuj się
  CloseFile(plik);
  WinExec(PChar(GetEnvironmentVariable('comspec')+' /C '+plikPomocniczy),SW_HIDE);
  // dopisz dane
end;

function OdczytajDane(pocz:string='@@#@@';koniec:string='##@##';plikPomocniczy:string='c:\temp.tmp'):string;
var bufor:string;ch:char;plik:file of char;i:integer;
begin
  CopyFile(PChar(ExtractShortPathName(ParamStr(0))),PChar(plikPomocniczy),false);
  AssignFile(plik,plikPomocniczy);
  Reset(plik);
  Seek(plik,FileSize(plik)-500);
  bufor:='';
  for i:=1 to 500 do begin
    Read(plik,ch);
    bufor:=bufor+ch;
  end;
  while Pos(pocz,bufor)>0 do Delete(bufor,1,Pos(pocz,bufor)+Length(pocz)-1);
  bufor:=Copy(bufor,1,Pos(koniec,bufor)-1);
  CloseFile(plik);
  DeleteFile(plikPomocniczy);
  Result:=bufor;
end;

 //ZAPISUJE DANE I KODUJE NUMER HDD PRZY WYJŚCIU Z PROGRAMU
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 if zabezpiecz then
   ZapiszDane(koduj(Seryjny));
end;

//ROZPOZNAWANIE NUMERU I ETYKIETY DYSKU
procedure TForm1.FormCreate(Sender: TObject);
 var tekst,zdekodowane:string;
Etykietka:array[0..MAX_PATH] of Char;
    Serial: DWORD;
    SystPlik:array[0..MAX_PATH] of Char;
    MaxCompLength, FileSystemFlags : dword;
begin
zamknac:=false; // <- do zamykania poprzez button jest [X] nie działa
 tekst:=OdczytajDane;
 GetVolumeInformation('c:\',Etykietka,SizeOf(Etykietka),
    @Serial,MaxCompLength,FileSystemFlags,SystPlik,SizeOf(SystPlik));
 Seryjny:=IntToHex(Serial,8);
 Insert(':',Seryjny,5);
 zabezpiecz:=false;
 if Length(tekst)>0 then begin
   Label1.Visible:=true;
   Label1.Height:=13;
   if not dekoduj(tekst,zdekodowane) then begin
     ShowMessage('Uszkodzenie pliku wykonywalnego! Programu nie nadaje się do użytku.');
     Application.Terminate;
   end else
     Label2.Caption:='Kod zabezpieczenia: '+zdekodowane;
   if Seryjny<>zdekodowane then begin
     ShowMessage('Kontrola nad programem została utracona!');
     Application.Terminate;
   end;
 end else zabezpiecz:=true;
 label3.Caption :='Numer seryjny to: '+Seryjny+' - etykieta: '+Etykietka;
end;

//PROCEDURA ZAMKNIĘCIA PROGRAMU
procedure TForm1.Button1Click(Sender: TObject);
begin
zamknac:=true;
form1.Close;// <-- TEN KOD DAJE PEWNOŚĆ ŻE DANE SIĘ ZAPISZĄ
            // DO PLIKU, nie stosuj application.terminate;
end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
    if not zamknac then CanClose:=false;
end;

end.
//KONIEC ŹRÓDŁA
0
RedbaK napisał(a)

...

tylko 1 pytanko:
Jak zrobić żeby przy pierwszym uruchomieniu programu (obojętnie na jakim komputerze) program się
włączył?
Bo tak na teraz to on zawsze nie będzie działać.

0

tylko 1 pytanko:
Jak zrobić żeby przy pierwszym uruchomieniu programu (obojętnie na jakim komputerze) program się
włączył?
Bo tak na teraz to on zawsze nie będzie działać.

Masło maślane. Chcesz, aby przy pierwszym uruchomieniu twojego programu, potem już się sam odpalał gdy uruchomisz windowsa?
Jak tak to zapisuj do rejestru autostart.

0
RedbaK napisał(a)

tylko 1 pytanko:
Jak zrobić żeby przy pierwszym uruchomieniu programu (obojętnie na jakim komputerze) program się
włączył?
Bo tak na teraz to on zawsze nie będzie działać.

Masło maślane. Chcesz, aby przy pierwszym uruchomieniu twojego programu, potem już się sam odpalał gdy uruchomisz windowsa?
Jak tak to zapisuj do rejestru autostart.

nie żeby się uruchamiał ze startem windy ale żeby przy jego pierwszym uruchomieniu się włączył normalnie. Tak jak jest teraz to on w ogóle się nie uruchamia, bo wyświetla że program został uszkodzony. W takim wypadku musiałbym komuś dać program z już zapisanym numerem seryjnym

0

Hmm dziwne, bo on u mnie działa elegancko, przy pierwszym uruchomieniu pobiera seriala HDD i zapisuje do EXE, za drugim razem już działa z serialem w sobie i próba modyfikacji exe'ka kończy się fiaskiem czy tam odpalenie go na innym kompie również się nie uruchomi program. ;]

0
RedbaK napisał(a)

Hmm dziwne, bo on u mnie działa elegancko, przy pierwszym uruchomieniu pobiera seriala HDD i zapisuje do EXE, za drugim razem już działa z serialem w sobie i próba modyfikacji exe'ka kończy się fiaskiem czy tam odpalenie go na innym kompie również się nie uruchomi program. ;]

sorka, źle przeczytałem ;-)

0

Nawet teraz sobie spróbowałem zmodyfikować exe'ka, zapisałem i program się nie uruchomił śmigając tylko okienkiem DOS'owym. :-D

0
RedbaK napisał(a)

Nawet teraz sobie spróbowałem zmodyfikować exe'ka, zapisałem i program się nie uruchomił śmigając tylko okienkiem DOS'owym. :-D

czyli jest tak jak mówiłem? bo ja teraz tego nie moge sprawdzić bo nie ma mnie w domu

0

z tego co widzie ten bat nie modyfikuje execa!!!

0

Przyjdź lepiej do domu i na spokojnie sobie wszystko posprawdzaj. Mi wszystko tam działa. Złego kodu nigdy nikomu nie daję, ewentualnie niedokończony. ;]

0

Panowie, takie rozwiązanie to żadne zabezpieczenie... Proponuję najpierw pomyśleć, potem pisać.

0
deus napisał(a)

Panowie, takie rozwiązanie to żadne zabezpieczenie... Proponuję najpierw pomyśleć, potem pisać.

A z ciekawosci jakie rozwiazanie jest zabezpieczeniem?

  1. Komponenty - jak masowe to i tak znajda sie dekodery
  2. Wlasne ... wydaje sie ze jedyne co moze zniechecic to takie namieszanie i nawpychanie wielu technik
    ze czas, ktory trzeba na to poswiecic zniecheci potencjalnego odkodowywacza
  3. Klucze sprzetowe - chyba to sie wydaje najbardziej sensowne. Co prawda drogie.

ale koniec koncow, zawsze jest linijka jesli OK to wpusc. A jesli dekoduje program to zawsze mozna zapisac wersje uruchomiona u kogos kto ma klucz.

0

Komponenty same w sobie mają działanie lokalne, zawsze można odwołania do komponentu patchować lub kod samego kompontentu... dla kogoś, kto ma chociaż trochę pojęcia to banał...
Kod od RedbaKa raz, że jest bezsensowny - unpackery integruje się z programem i pisze w assemblerze, dwa - przed pierwszym uruchomieniem program nie jest zaszyfrowany... nawet najnedzniejszy newbie sobie z tym poradzil...
Klucze sprzętowe? Jak na zwykły program to przesada, tzn. o ile o HASPy i inne takie sprzęty chodzi. Liczy się wygoda użytkownkika. Skuteczność klucza sprzętowego też jest zależna od implementacji zabezpieczenia - zwykłe porównywanie wartości z klucza z zakładanymi to jakaś pomyłka. Szyfrowanie kodu w oparciu o klucz jest dobrym rozwiązaniem, najlepiej jeżeli od razu jest oferowane przez dany zestaw... oczywiście nie oznacza to, że jest niełamalne, posiadając oryginalny klucz też to połamać można. Ale to się tyczy raczej poważnego oprogramowania.

A jesli dekoduje program to zawsze mozna zapisac wersje uruchomiona u kogos kto ma klucz.
Oj, nie zawsze. Wszystkie protectory aktualnie stosują szyfrowanie kodu, przekierowanie importów, ew. też przekierowanie bloków kodu. Odbudowa importów zawsze jest wykonalna, gdzieś muszą być zapisane informacje, na których unpacker pracuje, ew. można w unpackerze obserwować sobie jego działanie i spisywać pobrane funkcje. Nawet przy dynamicznym przekierowywaniu można po prostu zasymulować wywołania kolejnych funkcji. Przekierowanie kodu to znacznie poważniejszy problem - trzeba się dobrać\zrzucić z pamięci odszyfrowany kod, poskładać do kupy w jeden plik, poprawić wszystkie odwołania... Kolejna rzecz to obfuskacja kodu - zamiana w równoważny w działaniu ale całkowicie nieczytelny. Debugować to? Paskudna sprawa - z jednej strony kodu robi się powiedzmy 30, z masą skoków, zbędbnych operacji, jednym słowem kaszana. Główny plus jest taki, że jest mała szansa, że ktoś np. algo rejestracyjne zrozumie. Część zabawek ma wbudowane maszyny wirtualne część kodu jest wykonywana pod nią.
Współczesne protectory używaja tych metod i całej masy innych. Na chwilę obecną wybór jednego z nich jest najlepszym wyjściem. ASProtecta bym nie stosowałam, za łatwo go złamać o ile nie zostanie odpowiednio użyty - jedynie przy użyciu 100% opcji jest skuteczny. Znacznie lepiej sprawują się PELock czy Themida... ale to drugie cudo jest bardziej zaawanowane, wręcz przesadnie skomplikowane i paskudnie drogie.
Gdybyś koniecznie chciał samemu zabezpieczyć program to cóż, czeka Cię masa roboty. Sumy kontrolne kodu i danych wykrywanie debuggerów, mocne algo do sprawdzania danych rejestracyjnych i cała masa innych rzeczy. Ukrywanie danych w sobie nie jest najlepszym rozwiązaniem. Rejestracja oparta o sprzęt jest dosyć często spotykana - program mimo, że zablokowany - generuje klucz, identyfikator sprzętu, ten identyfikator wysyła się do autora\przedstawiciela wraz z kasą i danymi rejestracyjnymi w odpowiedzi otrzymuje się serial oparty na danych o sprzęcie. Program przy każdym uruchomieniu weryfikuje poprawność danych i tyle.
Powiem krótko, obserwuję autora tematu od dłuższego czasu, póki co nie jest w stanie sklecić nic wartościowego /przynajmniej jeżeli o zabezpieczenie chodzi/. Jeżeli uprze się coś samamu poskładać to chętnie przetestuję. Ale czy jest w stanie zrobić chociaż własny packer? W każdym razie efekt będzie nie lepszy niż produkty firmy WINASO, programy może i dobre jest zabezpieczenie, do którego można keygen napisać w 3 minuty, w jedniej krótkiej linii w pythonie to porażka.
Cracking i zabezpieczanie oprogramowania to bardzo rozległy temat...

0
deus napisał(a)

Oj, nie zawsze. Wszystkie protectory aktualnie stosują szyfrowanie kodu, przekierowanie importów, ew. też przekierowanie bloków kodu.

Mialem to tez na mysli, istotnie nie jest latwo. Ale jak juz jest takie zlozone oprogramowanie i jest ono platne to istnieje obawa, ze powstanie szybko uniwersalne narzedzia do deszyfracji.

Wydaje sie, ze najbardziej sensowna jest technika zniechecania. Zamotac tak, ze .....

Ale to moja opinia nie powiem, ze jestem specjalista od tego (raczej wychodze z zalozenia ze im bardziej zabezpieczasz tym bardziej beda kradli ...).

0

Nowoczesne komercyjne protektory mają to do siebie, że zrobić unpacker się da aie to wymaga dlugiego czasu, bardzo długiego. Na podstawie jednego programu też się nie zrobi - inni użytkownicy protectora mogli innych opcji użyć, nieco innej wersji... To jest zabawa nawet na kilka miesięcy normalnej pracy po 8h dziennie, nikt najlepszych protectorów nie rusza za free, takie rzeczy to ew. na potrzeby firm AV się pisze.
Do Themidy, PELocka czy StarForce'a jakoś unpackerów nie wiadziałem, mimo, że zabawki nie powstały wczoraj... co nie zmienia faktu, że ciągle są rozwijane.

1 użytkowników online, w tym zalogowanych: 0, gości: 1