Delphi - .Exe Bilgileri Hex Editorde Okunmasın Nasıl Şifrelerim ?

Başlatan __TECH__, 02 Temmuz 2011, 14:56:03

__TECH__

Arkadaşlar delphi kullanarak hazırladığım bir yazılım , şirketteki serverime sabit ip üzerinden baglanıyor , mssql server 2008 R2 kullanıyorum , delphi içerisinde bir connection string tanımladım  server ip adresi , veri tabanı adı , kullanıcı adı ve sifresi bu string içerisinde yazılız , programı derliyorum,compile ediyorum   fakat , exe kıran ve exenin bilgilerini veren yazılımlarda mesela WinHexEditorde compile ettigim exe yi actıgımda server ip adresim , veri tabanı adım , kullanı adı ve sifrem gorunuyor yani kötü amaclı birisi bu exeyi acıp veri tabanına herhangi bir ms sql desktop manager yazılımla direk baglanıp bilgilerimde deişiklik yapabilir , piyasa hali hazırda satılan yazılımlarda bu connection string okunmamasının onune nasıl geciliyor ? exe yi nasıl şifrelerim  , nasıl bir yol izlemem lazım okunmaması için ?

mufitsozen

programinizda kullandiginiz sabit (literal) bilgileri exede gorunmemesi icin programi yazarkan sifreleyip koyunuz, kullanirkende  desifre edip okuyarak kullaniniz.

Eger literal bilginin exe icindeki yeri bilinmiyorsa desifre etmek oldukca zordur (ama imkansiz değildir)

benim cok guvenlik istemeyen programlar icin kullandigim bir method var (binlerce programcida eminim kullaniyordur) literal bilgi dizinini indexi ile XOR layip  saklayiniz okurkende tekrar index'i ile XORlayip kullaniniz

Ornegin elinizde 6 bytelik bir dizi olsa :
"_TECH_" ==> 0x5f, 0x54, 0x45, 0x43, 0x48,0x5f === indexle (0x01,0x02,0x03,0x04,0x05,0x06) XOR ===> 0x5E, 0x56,0x46,0x47,0x4d,0x59

dikkat ederseniz '_' karakteri indexle XOR edildigi icin iki degisik deger oluyor simdi bu dizini tekrar index ile XOR ederseniz orijinal dizini bulursunuz
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

__TECH__

hocam ben delphide ms sql servere baglanmak için zeos bileşenleri kullanıyorum , ve veri tabanına baglanmadan once su kodu olusturuyorum
forum üzerine yerlestirdigim zeos connection nesnesinin adını mssql yapıyorum


mssql.HostName:='server ip adresi';
mssql.Database:='veritabanı adi';
mssql.User:='veri tabanı kullanıcı adi';
mssql.Password:='veri tabanı kullanıcı sifresi';
MsSQL.Connect;

mufitsozen

Alıntı yapılan: __TECH__ - 02 Temmuz 2011, 15:41:55
hocam ben delphide ms sql servere baglanmak için zeos bileşenleri kullanıyorum , ve veri tabanına baglanmadan once su kodu olusturuyorum
forum üzerine yerlestirdigim zeos connection nesnesinin adını mssql yapıyorum


mssql.HostName:='server ip adresi';
mssql.Database:='veritabanı adi';
mssql.User:='veri tabanı kullanıcı adi';
mssql.Password:='veri tabanı kullanıcı sifresi';
MsSQL.Connect;

iyiya once kucuk bir sifreleme programi yazip bu sabit degerlerin ne oldugunu hesapla or: 'www.google.com' gibi bunuda cevirince (mesela) 'xzup#$%fdjs' filan olsun (mesela dedik, tabii ayni boyda :-)  )

mssql.HostName:= DesifreProc('xzup#$%fdjs');   yazarsan olur (bu anafikir tabii ben delphi bilmem, [pascal bilirim ama]) yani off-line bir kucuk program ile sifrelemek istedigin bilgileri sifrele, bunlari ya bir .ini dosyasindan yada benim yaptigim gibi direk yerine desifreleyip koy.

kolay gelsin

Aslinda @gerbayin isi yoksa sana bu fonksiyonlari 10 dk yazardi ama (delphi ustasidir ve c vede c++ vede .....)
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

__TECH__

hocam internette arastırdım ama genelde hepsi bilinen sifreleme teknikleri , genelde herkes md5 olarak dusunmusler mesela
mesela 127.0.0.1 in md5 karsılıgı =  f528764d624db129b32c21fbca0cb8d6

su sekilde yapsam

mssql.hostname :=MD5('f528764d624db129b32c21fbca0cb8d6');

bu sekilde server adının kac karakterde saklandıgı ortada yani 32 karakter olan md5  41 olanı hash burdanda anlasılır ve geri donusum yapılmasa bile baglanıcak olan kişi , kendi yazdıgı ozel ayrı bir yazılımla zaten oda aynı sekilde kendi yazılımında

mssql.hostname :=MD5('f528764d624db129b32c21fbca0cb8d6');

yazdıgı zaman direk baglanır cunku md5 bir dogrulama algoritması yani yazılanla numara dogrulandıgında baglantı saglanır , piyasada olmayan bir algoritma bulmak lazım geri donusmemesi için

mufitsozen

Alıntı yapılan: __TECH__ - 02 Temmuz 2011, 16:01:21
hocam internette arastırdım ama genelde hepsi bilinen sifreleme teknikleri , genelde herkes md5 olarak dusunmusler mesela
mesela 127.0.0.1 in md5 karsılıgı =  f528764d624db129b32c21fbca0cb8d6

su sekilde yapsam

mssql.hostname :=MD5('f528764d624db129b32c21fbca0cb8d6');

bu sekilde server adının kac karakterde saklandıgı ortada yani 32 karakter olan md5  41 olanı hash burdanda anlasılır ve geri donusum yapılmasa bile baglanıcak olan kişi , kendi yazdıgı ozel ayrı bir yazılımla zaten oda aynı sekilde kendi yazılımında

mssql.hostname :=MD5('f528764d624db129b32c21fbca0cb8d6');

yazdıgı zaman direk baglanır cunku md5 bir dogrulama algoritması yani yazılanla numara dogrulandıgında baglantı saglanır , piyasada olmayan bir algoritma bulmak lazım geri donusmemesi için

verdikya algorithmayi!

birde exe dosyasinin icinde nerde md5 bilgisi basliyor ve kac byte kim bilecek varmi oyle bir babayigit?
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

t2

Programı kullanan kişiden aşağıdaki bilgileri neden gizliyoruz?

mssql.HostName:='server ip adresi';
mssql.Database:='veritabanı adi';
mssql.User:='veri tabanı kullanıcı adi';
mssql.Password:='veri tabanı kullanıcı sifresi';
MsSQL.Connect

Bu işte bir bit yeniği var. Ben kullanacağım programın bilmediğim yerlere bağlanmasını istemem. Şifre girilecekse de, kendim girmem veya görmem lazım.

__TECH__

hocam o algoritma yazma işini cozemedim :) delphide cok cok iyi deilim bende bildigim ve arastırıp buldugum kadarı ile toparlayıp birseyler yazdım bende ama algoritma işinde takıldım

__TECH__

hocam siz sifrenizi zaten gireceksiniz kullanılar icin olan kullanıcı adı ve sifresinden bahsetmiyorum , yazılımın genel veri tabanı ile arasındaki baglantıdan bahsediyorum , program bilmedigimiz bir yere baglanmıyoki kullanıcın ihityacı olan stok bilgilerini vermek icin ana serverde calısan baska bir ana yazılımın veri tabanına baglanıp o anki cuncel stok adetlerini gostericek , korkumuz kötü amaclı biri tüm stokları silmesin deiştirmesin veri tabanı  ip adresini ve bilgileri gorup

t2

Bu kullanıcı için bazı kısıtlamalar olması lazım. o şekilde olur. Ya da  zaten internet olacaksa program kullanılmaz, internet üzerinden işlem yapılır.

Ozaman bu bilgiler webteki config.php gibi bir ayar dosyasında durur.  kullanıcılar zaten onu göremez.

Kullanıcı bilgisayarında kullanıcı adı ve şifre olur.  bununla siteye giriş yapılır her kullanıcının şifresi ve kul. adı farklıdır. yetkileri ve grubu da olur.

mufitsozen

Alıntı yapılan: __TECH__ - 02 Temmuz 2011, 16:25:30
hocam siz sifrenizi zaten gireceksiniz kullanılar icin olan kullanıcı adı ve sifresinden bahsetmiyorum , yazılımın genel veri tabanı ile arasındaki baglantıdan bahsediyorum , program bilmedigimiz bir yere baglanmıyoki kullanıcın ihityacı olan stok bilgilerini vermek icin ana serverde calısan baska bir ana yazılımın veri tabanına baglanıp o anki cuncel stok adetlerini gostericek , korkumuz kötü amaclı biri tüm stokları silmesin deiştirmesin veri tabanı  ip adresini ve bilgileri gorup
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

t2

Alıntı yapılan: t2 - 02 Temmuz 2011, 16:27:18
Ozaman bu bilgiler webteki config.php gibi bir ayar dosyasında durur.  kullanıcılar zaten onu göremez.

Burak B

Bu konu benim uzmanlık alanıma giriyor. :)  Zeos kullanıyorsan ağzınla kuş tutsan o verileri alırlar. Geçtim Zeos u ne istersen yap o verileri alırlar. Bu işi server tarafında halletmelisin. Client tarafında bu tür bilgileri barıdırmak tehlikelidir. XOR v.s. boşuna uğraşma. Hatta RSA, AES bile yapsan çözerler. Server tarafında çözümle konuyu. Benden ipucu direkt mysql servera değilde kendi yazdığın bir authentication servera bağlan oda senin isteklerini server tarafındaki mysql servera iletsin. ;)

Örnek;
Bak mesela ben senin programını irdelemek isteyen kötü niyetli birisi olsam durup lamer vari hex editörde stringler aramazdım; ne yapardım giderdim işletim sisteminin network çıkışında senin kullandığın protokolü dinlerdim. Sen istediğin kadar şifreleme kullan eninde sonunda bağlantı kuracaksın ve o bilgi orada apacık halde olacak. Bilmem anlatabildim mi ? Ha istersen SSL veri akışını kullan farketmez bende gider SSL paketini oluşmadan modifiye edip o bilgiyi alırım. İşte bu yüzden bu işi client tarafında değil server tarafında hallet diyorum. Umarım açıklayıcı olabilmişimdir. Lamerlardan koruyayım yeter diyorsan git Sanal makineler ve morphism kullanan bir execryptor edin onunla programını paketle. Böylece pekçok lameri programından uzak tutmuş olursun ama herşey biryere kadar bu bahsettiğim dinleme tekniğini akıl edecek biri çıkarsa ki (bu bir lamer olmayacaktır) client tarafında pek şansın olmaz.

Kolay gelsin.
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

iyildirim

Bu prograın kullandığı loginlerin veya daha iyisi loginlerin bağlı olduğu role'lerin  haklarını  sınırlandırın.  MsSQL de her bir tablo yada bir tablonun tek tek elemanlarının read, update, delete gibi haklarını belirleyebilirsiniz. Eğer silinme ve update işlemlerini istemiyorsanız bu haklarını role permission içerisinde vermezsiniz olur biter.

Ayrıca çok gerekiyorsa tek tek tabloların kolonlarına  (eski deyimle field) da bu hakların tanımlamak mümkün..

Ancak bunun yerine update delete gibi işlemlerde bu tip bağlantıların kullandığı login veya role'lere bu hakları vermek yerine update delete işlemlerini store procedure' ler üzerinden yapmak daha iyi. Bir store procedure'e execute hakkı verildiğinde bu procedure içerisinde güncellenen tablolara bu hakları vermek zorunda değilsiniz.  Yani işlem sizin store procedure de tanımladığınız şekilde yapılır..  Three tier yazmak da buna benzer ve daha iyi bir çözüm..  Web servisleri de..

Daha da sağlam olsun isterseniz, tabloların altına yazacağınız triggerlerde güncellenen veya silinen kayıtları yedek bir veritabanına aktarmak da mümkün. Bu şekilde şifreyi kaptırıp çeşitli tablolar isteğiniz dışında güncellense bile her hangi bir timestamp anına geri dönmekte mümkün olur.

Sadece basitce bir hex editörle şifrelerim görünmesin diyorsanız, arkadaşlar neler yapılabileceğini yazmışlar. Bende bu şekildeki bilgileri açık yazmak yerine 3DES ile şifrelerim..

Eğer VPN veya SSL 'i de kendin kurayım derseniz hellman-hiff (doğru yazdım umarım, yıllardır bakmıyorum. ) gibi algoritmalara da bakabilirsiniz.


__TECH__

Alıntı YapBu kullanıcı için bazı kısıtlamalar olması lazım. o şekilde olur. Ya da  zaten internet olacaksa program kullanılmaz, internet üzerinden işlem yapılır.
Ozaman bu bilgiler webteki config.php gibi bir ayar dosyasında durur.  kullanıcılar zaten onu göremez.
Kullanıcı bilgisayarında kullanıcı adı ve şifre olur.  bununla siteye giriş yapılır her kullanıcının şifresi ve kul. adı farklıdır. yetkileri ve grubu da olur.

web sitesi girişleri üzerine değil hocam , delphi ile hazırlanmış serverdeki mssql veri tabanından bilgi ceken client bir yazılım için sordum yani server ip adresi kullanıcı bilgisayarındaki exe icerisinde , server taraflı yazılabilir hersey evet haklısınız ama client yazılım server ip adresini nerden okuyacakki servere baglanıpta server tarafındaki işlemleri gorsun ,  server bilgileri exe icinde olmak zorunda bilinmeyen bir algoritma yazarak bi care bulcaz artık