Bir zamanlar aşağıdaki soruna kafa yormuş ve çözümünü bulamamıştım.
Hala da nasıl yapılacağını bilmiyorum.
Programı çalıştırdığımız anda program kendi kendinin 1.byte"ından sonuncu byte"ına kadar tüm verilerinin crc değerini hesaplayacak.
Ardından program içinde zaten belli crc değeri ile karşılaştıracak.
Eğer farklı ise bu orjinal program değil deyip çıkacak.
Batch dosya yada ikinci bir exe ile yapılabiliyor. Fakat ben bunu tek exe ile yapmak istiyorum.
Sorun işletim sisteminin çalışan exeye okuma/yazma yasağı getirmesinden kaynaklanıyor. Ama çözümü vardır elbet.
Delphi ile Programınıza CRC Koruması
crc korumasını programımızın kimlik numarasını alma ve kontrol etme şeklinde kullanacağız. burada her programın veya dosyanın belli crc numarası vardır .. 6A97568C gibi.... ama dosyamızın ufacık bir yerini bile değiştirdiğimiz zaman yani cracklandığı zaman bu numaralar değişir. biz delphi ile bu numarasnın değiştiğini algılayıp ona göre programımıza engelleme kodları yazacaz.
burada yapacağız işlem 2 tane dosyamız olacak birincisi programımızın crc numarasının kayıtlı olduğu dll dosyası ikincisi progje dosyamız.
burada programımızın tüm kodlamasının bittiğini varsayıyorum ve koruma işlemine geçiyoruz..
1 -
procedure TForm1.FormCreate(Sender: TObject);
Var
Check:Boolean;
begin
Check:= CrcKontrol(Application.ExeName);
if Check then
begin
label1.Caption := ' Programınız Düzgün Çalşıyor';
label1.Font.Color := ClGreen;
End
else
Begin
label1.Caption := ' Programınız Cracklandı ';
label1.Font.Color := ClRed;
end;
end;
end.
2 -
Ben yazmadım. alıntıdır >şuradan (http://www.mesutdemirci.com/delphi-ile-programiniza-crc-korumasi-koyma/) <
Tamam süpersin. Sistemde crc hesaplayan fonksiyon varsa oldu bu iş.
Yalnız iki dosya olayını sevmedim.
Bunun tek dosya hali olanını yazarım artık.
Yalnız tek dosya olanı acaip kıl.
Kıllığın ne olduğunu görebiliyormusunuz?
TurboPower Onguard komponentleri var bedava. onun içerisinde aradığınız fonksiyon var. gerçi komponent sevmezsiniz :)
neyse o şöyle çalışıyor. exeyi yaptık. bunun içinde bir kod parçası gömülü. dışarıdan başka bir exe onun kodunu siliyor perçinliyor. tek program var yine. artık değiştirirseniz program sizin daha önceden ayarladığınız işleri yapıyor. Ben şöyle yapmıştım. kırılan program, sözde beklendiği gibi çalışmaya devam ediyor. fakat zaman içerisinde cezalandırıyor. kafasına kafasına vuruyor. korsan kullanıcı mahvoluyor :)
Aslında işin gücün olmayacak virüs yazan adamlara kıllık yapan programlar geliştireceksin.
Hocam CRC kontrol işi pek de garanti değil. Kontrol için CRC kodunu programı derlerken yazacaksanız primary sectionların dışında bir yerde olmalı. Çünkü CRC kodunu hesaplayıp eklediğinizde yeni bir veri ve dolayısıyla yeni bir CRC kodu oluşacak. Bunu önlemek için CRC kodunu hesaplanan alanın dışında bir yerde tutmanız gerekiyor. Bunu da ancak derleme zamanında yapabilirsiniz.
Diyelimki bunu hallettiniz, CRC kodunun adresi bir disassembler ile kabak gibi açığa çıkar. İsteyen istediği değişikliği yapar, kodun sonunu CRC adresi olarak belirler, CRC hesaplar ve program yeni CRC kodu üzerinden hiçbirşey anlamadan çalışmaya devam eder. Programı kıracak olan adamın işini en fazla birkaç saat uzatırsınız.
Bıktırma babında işe yarar, ama hedefe kitlenilmişse pek de işe yaramayacaktır diye düşünüyorum.
Alıntı yapılan: z - 03 Haziran 2015, 15:56:51
Aslında işin gücün olmayacak virüs yazan adamlara kıllık yapan programlar geliştireceksin.
Bir forumda uzman kişi şöyle demiş:
Programınız çalışıyorsa kırılır. Kırılmayan program istiyorsanız, çalışmayanını yapmalısınız.
Kırılır da ot yoldurur.
Mesela debug edildiğini anlayan programın karşı atağa geçmesi sıradan debugcıları devre dışı bırakmaya yeter.
Fakat işletim sisteminin de desteğini almak lazım.
işletim sisteminin kendine faydası olsa, desteği hiç esirgemez.
Alıntı yapılan: fatih6761 - 03 Haziran 2015, 16:01:44
Hocam CRC kontrol işi pek de garanti değil. Kontrol için CRC kodunu programı derlerken yazacaksanız primary sectionların dışında bir yerde olmalı. Çünkü CRC kodunu hesaplayıp eklediğinizde yeni bir veri ve dolayısıyla yeni bir CRC kodu oluşacak. Bunu önlemek için CRC kodunu hesaplanan alanın dışında bir yerde tutmanız gerekiyor. Bunu da ancak derleme zamanında yapabilirsiniz.
Diyelimki bunu hallettiniz, CRC kodunun adresi bir disassembler ile kabak gibi açığa çıkar. İsteyen istediği değişikliği yapar, kodun sonunu CRC adresi olarak belirler, CRC hesaplar ve program yeni CRC kodu üzerinden hiçbirşey anlamadan çalışmaya devam eder. Programı kıracak olan adamın işini en fazla birkaç saat uzatırsınız.
Bıktırma babında işe yarar, ama hedefe kitlenilmişse pek de işe yaramayacaktır diye düşünüyorum.
Bu çözümü virüs bulaşmasına karşı düşünüyorum. Yoksa debuger ile uğraşan tabiki bunu devre dışı bırakır.
En azından bu yönteme özel virüs geliştirilmediği sürece virüslere karşı kesin çözüm gibi görünüyor.
Yukarıda yazdığın cevapta bahsettiğim kıllığı yakalamışsın.
Şimdi soru: Dediğin gibi değil komple tüm programın crcsini hesaplayıp gene kendi içindeki crc ile karşılaştıran programı yazmak.
Yazılır....
mesaj birleştirme:: 03 Haziran 2015, 14:13:21
Hatta basit bir exe yazmak lazım.
Bu exeyi çalıştırdığında eğer virüs exeyi değiştirmişse dikkat makinenizde virüs var uyarısı vermesi süper bir şey.
Hatta virüslü kısmı yakalayıp bir dosya içine yazması daha da süper olur. Alın buda virüs kodunuz.
Hocam CRC değerini içindeyken hesaplamak kısmına kafam basmadı.
Hesaplayıp yazdığımız CRC kodun CRC sini değiştirmeyecek mi?
CRC yi hesaplanan alanın içinde tutmayı nasıl başarırız?
Tamam işte sorunu tam olarak anladın.
Soruyu basitleştireyim.
3 adet veri alanı var.
1. veri belli. 2 ve 3. veri alanına 1., 2. ve 3. veri alanlarındaki verilerin toplamı ve toplamı bozmayacak ilave veri yazılacak.
Örnek: [1]=x
[2]=0
[3]=0
toplamı hesaplansın.
x+0+0=x+x-x
o halde 2 veri alanına x, 3 veri alanına da -x yazarsak sonuç değişmez.
Bu örneği toplamla koruduk. Aynı örneği CRC ile korunur hale getireceğiz. Soru bu.
Hocam yanlış hatırlamıyorsam CRC kodu AND OR gibi geri dönüşsüz operatörleri kullanıyorlar.
Bir de toplama işleminin değişme özelliği var. a+b=b+a sağlanıyor ama
sıralı veriler olunca
CRC(a,b,c) = CRC(b,a,c) sağlanıyor mu bunu bilmemiz lazım.
=================================
a,b sabit veriler olsun. Her a,b için
CRC(a,b,c) = c yi sağlayan bir c verisi tam tanımlı yollardan bulunabiliyorsa iş kolay demektir.
2 ilave değişkenle aynı crcyi elde edemiyorsak ilave değişken sayısını artırabiliriz.
Yani Crc(a,b,c,..........son,0,0,0.....0)=Crc(a,b,c,..........son,x,y,z....crcn)
Buradaki x,y,z... verilerinin amacı crcyi eşitlemeye yarayacak ilave veriler.
Sorun zaten crc yi tersden hesaplama zorluğu fakat bilgisayarla hızlıca deneme yaptırılabilir.
@z: CRC'i sabit ve sıfır olarak kabul edersen şöyle yapılabilir.
A = Dosyadaki binary data ise
CRC(A + CRC(A)) = 0 olur
CRC kontrolü ile uğraşmanız gereksiz uğraş hocam
program kırılacağı zaman kontrol noktası aşılmaya çalışılır, crc hesaplandıktan eşit midir diye bakan kısım yani
ayrıca sorunuza çözüm olarak bir const blok oluşturup CRC sonucu istediğiniz gibi olana kadar değiştirmek tek çözüm gibi geliyor.
@Icarus un da dediği gibi CRC sonucunu CRC işlemine eklerseniz sonucunuz 0 çıkar. buradan denemenizi hızlandırabilirsiniz
Programı korumak için rus bebekleri benzer bir yapı kullanmak daha mantıklı geliyor bana
yani progamınızı encrypted bir şekilde sıkıştırıp başka bir progamın içine gömdüğünüzü düşünün
bu program içindeki sıkıştırılmış veriyi alıp ram'e açarak ramden çalışmasını sağlayacak.
asıl program kodlarına ram'i tarayarak anca ulaşabilirsiniz.
ram üzerinde de çalışılan bloğa erişim engeli yapabilirseniz hw atak yapmadan kimse kodunuza bakamaz
ssl tarzı public - private key mantığıyla şifrelerseniz şifrenizde korunmuş olur.
Şifreleme, RAM'de çalıştırma olaylarına girerseniz muhtemelen bazı antivirüsler potansiyel tehlikeli gözüyle bakacaktır.
Alıntı yapılan: Icarus - 03 Haziran 2015, 19:39:41
@z: CRC'i sabit ve sıfır olarak kabul edersen şöyle yapılabilir.
A = Dosyadaki binary data ise
CRC(A + CRC(A)) = 0 olur
CRC(A + CRC(A)) = 0
Bunu nasıl yazdın anlamadım.
@ErsinErce
Öncelikle nerelerdeydin onca zamandır. Çoktandır yoktun piyasada.
Hocam amacım kodu birilerinden korumak değil. Eğer kodumun koduna virüs bulaşırsa çalışmayı kessin ve hata mesajı ile kullanıcıyı uyarsın.
@z: Abi crc çoğu zaman kontrol böyle yapılıyor crc("mesaj + crc") == 0 şeklinde. Aynı zamanda mesela CRC ile sıfır değeri ile oluşan burst error'lerin kontrolü ise CRC("mesaj + crc'nin aynı tabanda tersi") == "Crc polinomundan gelen Hep Sabit bir değer" şekinde oluyor.
Alıntı yapılan: ErsinErce - 03 Haziran 2015, 20:21:44
ram üzerinde de çalışılan bloğa erişim engeli yapabilirseniz hw atak yapmadan kimse kodunuza bakamaz
Hayır çok rahatlıkla hem çözer hem çözümlüş halini tekrar exe yapar hemde rahatlıkla değiştirir.
Hala anlamadım. Bu dediğin Check Sum hesabında okey ama CRC de olmaz diye düşünüyorum.
Burada deneyebilirsin abi
https://ghsi.de/CRC/index.php?Polynom=100110001&Message=E100CAFE
Alıntı yapılan: z - 03 Haziran 2015, 22:49:07
CRC(A + CRC(A)) = 0
Bunu nasıl yazdın anlamadım.
@ErsinErce
Öncelikle nerelerdeydin onca zamandır. Çoktandır yoktun piyasada.
Hocam amacım kodu birilerinden korumak değil. Eğer kodumun koduna virüs bulaşırsa çalışmayı kessin ve hata mesajı ile kullanıcıyı uyarsın.
Merhaba hocam şehir şehir dolaşmaktan pek fırsat bulamıyorum, sık sık ankaradayım aslında bir dahaki gelişime haber vermeye çalışırım müsaitseniz bir çay içeriz =)
konuya dönersek;
check sum adından da anlaşılacağı gibi toplam kontrölü bu direk toplama işlemide olabilir (örneğin bit parity) ve ya bir fonksiyonda olabilir (CRC)
bu kavram karmaşasından kurtulduktan sonra @Icarus'un verdiği adresten şu örneği yapalım;
CRC-16 P(x) = x16+ x15+ x1+ x0 toplama fonksiyonumuz olsun
12345678 verisini girdiğimizde toplam olarak bize 0xe420 değerini veriyor
https://ghsi.de/CRC/index.php?Polynom=11000000000000011&Message=12345678
bu veriye elde ettiğimiz sayıyı sonuna eklersek yani
12345678e420 haline getirirsek aynı fonksiyonun çıkışı 0 çıkıyor
https://ghsi.de/CRC/index.php?Polynom=11000000000000011&Message=12345678e420
Aslına bu yaptığınız crc'nin mantığına aykırı. Yani mesela ortada f(x+k)=k diye bir fonksiyon var. Siz f(x)'i biliyorsunuz ve buradan k'yı bulmaya çalışıyorsunuz. Zaten bu bulunabilecek olsaydı crc'nin bir mantığı kalmazdı çünkü bu işlemin makul sürede yapılamaması lazım. Eğer bu işlem makul bir sürede yapılabilseydi programı değiştiren kişi de yapabilirdi.
CRC nin amacı bu değilki.
Bahsettiğin şey H fonksiyonları.
Bilemiyorum ama diyelim ki bunu programın değişip değişmediğini anlamak için kullandınız. Bir program kodu var ve siz onun içine crc sonucunu eklediğinizde toplam programın crc'si değişecek. Yani o kodu eklediğinizde crc'nin ne olacağını bulmanız ya da eklediğiniz şeyi nötralize edecek bir şey varsa onu eklemeniz lazım. Bunu siz yapabiliyorsanız programı değiştiren de yapabilir demek istedim.
Amaca uygun en basit yöntem dosya adını AD.CRC32hash.EXE olarak adlandırma. Dezavantajı kullanıcının dosya adını değiştirme ihtimali. Sanıyorum çalışmanızda böyle bir sorunda olmayacağı için rahatlıkla kullanabilirsiniz. Çalışan uygulama kendi crc322sini hesaplayabilir. Windowsta bu dosya kullanılıyor diye hata vermez. Eğer bu yöntem işinizi görmezse veya sorunla karşılaşırsanız yardımcı olurum.