Picproje Elektronik Sitesi

BİLGİSAYAR => Donanım ve Yazılım => Konuyu başlatan: z - 03 Haziran 2015, 15:29:19

Başlık: Çalıştırılan programın kendi crcsini hesaplaması
Gönderen: z - 03 Haziran 2015, 15:29:19
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.


Başlık: Ynt: Çalıştırılan programın kendi crcsini hesaplaması
Gönderen: t2 - 03 Haziran 2015, 15:38:32
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/) <
Başlık: Ynt: Çalıştırılan programın kendi crcsini hesaplaması
Gönderen: z - 03 Haziran 2015, 15:44:47
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?
Başlık: Ynt: Çalıştırılan programın kendi crcsini hesaplaması
Gönderen: t2 - 03 Haziran 2015, 15:48:45
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 :)
Başlık: Ynt: Çalıştırılan programın kendi crcsini hesaplaması
Gönderen: 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.
Başlık: Ynt: Çalıştırılan programın kendi crcsini hesaplaması
Gönderen: 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.
Başlık: Ynt: Çalıştırılan programın kendi crcsini hesaplaması
Gönderen: t2 - 03 Haziran 2015, 16:01:59
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.
Başlık: Ynt: Çalıştırılan programın kendi crcsini hesaplaması
Gönderen: z - 03 Haziran 2015, 16:05:08
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.
Başlık: Ynt: Çalıştırılan programın kendi crcsini hesaplaması
Gönderen: t2 - 03 Haziran 2015, 16:06:46
işletim sisteminin kendine faydası olsa, desteği hiç esirgemez.
Başlık: Ynt: Çalıştırılan programın kendi crcsini hesaplaması
Gönderen: z - 03 Haziran 2015, 16:09:47
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.
Başlık: Ynt: Çalıştırılan programın kendi crcsini hesaplaması
Gönderen: fatih6761 - 03 Haziran 2015, 16:20:49
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?
Başlık: Ynt: Çalıştırılan programın kendi crcsini hesaplaması
Gönderen: z - 03 Haziran 2015, 16:52:49
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.

Başlık: Ynt: Çalıştırılan programın kendi crcsini hesaplaması
Gönderen: fatih6761 - 03 Haziran 2015, 17:22:17
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.
Başlık: Ynt: Çalıştırılan programın kendi crcsini hesaplaması
Gönderen: z - 03 Haziran 2015, 17:31:05
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.
Başlık: Ynt: Çalıştırılan programın kendi crcsini hesaplaması
Gönderen: 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
Başlık: Ynt: Çalıştırılan programın kendi crcsini hesaplaması
Gönderen: ErsinErce - 03 Haziran 2015, 20:21:44
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.
Başlık: Ynt: Çalıştırılan programın kendi crcsini hesaplaması
Gönderen: engerex - 03 Haziran 2015, 20:40:44
 Şifreleme, RAM'de çalıştırma olaylarına girerseniz muhtemelen bazı antivirüsler potansiyel tehlikeli gözüyle bakacaktır.
Başlık: Ynt: Çalıştırılan programın kendi crcsini hesaplaması
Gönderen: z - 03 Haziran 2015, 22:49:07
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.




Başlık: Ynt: Çalıştırılan programın kendi crcsini hesaplaması
Gönderen: Icarus - 03 Haziran 2015, 23:06:27
@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.
Başlık: Ynt: Çalıştırılan programın kendi crcsini hesaplaması
Gönderen: z - 03 Haziran 2015, 23:10:01
Hala anlamadım. Bu dediğin Check Sum hesabında okey ama CRC de olmaz diye düşünüyorum.
Başlık: Ynt: Çalıştırılan programın kendi crcsini hesaplaması
Gönderen: Icarus - 03 Haziran 2015, 23:37:59
Burada deneyebilirsin abi
https://ghsi.de/CRC/index.php?Polynom=100110001&Message=E100CAFE
Başlık: Ynt: Çalıştırılan programın kendi crcsini hesaplaması
Gönderen: ErsinErce - 11 Haziran 2015, 14:14:15
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

Başlık: Ynt: Çalıştırılan programın kendi crcsini hesaplaması
Gönderen: trgtylcnky - 11 Haziran 2015, 17:08:33
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.
Başlık: Ynt: Çalıştırılan programın kendi crcsini hesaplaması
Gönderen: z - 11 Haziran 2015, 17:17:56
CRC nin amacı bu değilki.

Bahsettiğin şey H fonksiyonları.
Başlık: Ynt: Çalıştırılan programın kendi crcsini hesaplaması
Gönderen: trgtylcnky - 11 Haziran 2015, 19:44:36
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.
Başlık: Ynt: Çalıştırılan programın kendi crcsini hesaplaması
Gönderen: engerex - 11 Haziran 2015, 22:46:45
 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.