coolwolf / 16/03/2013

Obfuscators (code encryptors) for .net

obfuscate
Because of dotfuscator coming with visual studio gives very entry level !protection, i had to use another obfuscator.
A few months ago i had maked a little google search. then i found Eazfuscator. It was enough for a singe developer like me. But in time Eazfuscator become commercial and i had to stop encrypting my software publications. It was not a big problem because most of my software has local install source.
But last week i had to distribute a software on my web site. For some reasons i can not share its source code. So the solution is to obfuscate (encrypt) the code. So i started again to found a replacement for eazfuscator.
Here i will share my experiments.
1. Eazfuscator  ($399):
Ofcourse my first try was eazfuscator. Because it is very easy to use it. You just install it. Then drag solution into eazfuscator’s green area. That’s all. Whenever you build and publish your project it will be obfuscated. You do not have to do additional steps.
It is not very expensive. $399 is acceptible price. I decide to use it in trial period (30 days) and then buy it. But when i install and use the eazfuscator, it show me “builded applciation will not work after 7 days”. I can not buy it in 7 days. In this step i continue my research for alternative obfuscator.
2. Orange Heap (free):
I heard it before. Download and installation was easy. After that it show me a screen. You choose the source and destionaton folder. As i understand after that the applciation obfuscate the executables and puts in the output folder. In comparison to eazfuscator it is not easy for me. I am using clickonce to publish my applications. So i rght click on my solutions in visual studio and choose publish. This is the way i publish my applicastions. When using eazfuscator i do not have to do additional steps. With orange heap i have to create executables first. Then use another installer than clickonce and also another than visual studio installer project. You can use install project in visual studio. But you have to configure the installer project. Ofcours i make a search on the google. May be another one think this is not easy and made a tutorial how to use orange heap with visual studio. But no success. I read the help file in pdf format (it is included with installation). There are good samples. But there is no information about how to integrate with visual studio. At he end i decide to do not use orange heap. When i use another installer orange heap will be my choice.
3. NToolbox Yano (free):
No visual studio integration.
4. The Enigma Protector ($149):
No visual studio integration.
5. Phoenix Protector (free) :
No Visual Studio integration.
6. ILProtector (free) :
From these address add the following code to your post build event. Do not forgot: it will protect only RELEASE builds. Debug builds will not be protected.
On 32 bit windows :

if /I "$(ConfigurationName)" == "Release" "c:\Program Files\VgrSoft\ILProtector\ILProtector.exe" "$(TargetPath)" -nologo

On 64 Windows :

if /I "$(ConfigurationName)" == "Release" "c:\Program Files (x86)\VgrSoft\ILProtector\ILProtector.exe" "$(TargetPath)" -nologo

I have another obfuscators to try. I will share my expreiences here. If you have anything to add to this post, please be free. Just specify in the comment, i will ad your suggestion to this post.
Decompilers (reflectors) i used to try opening obfuscated source code :
ILsPy
JustDecompile
Red Gate reflector (trial)
.

coolwolf / 11/01/2013

Sql Server 2012 Database Mail Konfigürasyonu

Sql Server’ınızda mail ayarları yapıp sistemin size :
Yedekleme tamamlandığında ;
Yedekleme tamamlanamadığında ;
Hata oluştuğunda;
Log dosyaları dolduğunda;
Sistem belirlediğiniz bir yükün üzerinde çıktığında size mail atmasını istiyorsanız aşağıdaki adımları izleyebilirsiniz.
Öncelikle Management kısmında Database Mail üstüne sağ tıklayıp Configure Database Mail tıklıyoruz.
21
Sonraki ekrana next deyip geçiyoruz.
22
Bir sonraki ekranda en üstteki seçeneği işaretliyoruz. Daha sonra bu ayarları değiştirmek için Manage Database Mail Accounts and profiles seçeneğini kullanabilirsiniz.
23
Çıkan ekranda SMTP server bilgilerimizi yazıyoruz.25
Bu ekranda eposta hesaplarımızı ekliyoruz.
24
Default Profile kısmını Yes yapıp bu hesabı her işlemde kullanabilmemizi sağlıyoruz.
26
Bu ekranda bir değişiklik yapmadan devam ediyoruz.
27
Finish diyerek işlemi bitiriyoruz.
28
Bu ekranı gördüğümüzde işlem tamamlanmıştır.

Şimdi sisteme oluşturduğumuz profili kullanmasını söyleyelim.
Sql Server Agent’e sağ tıklayıp Properties diyoruz.

Burada Alert System’i seçiyoruz. Enable mail profile seçeneğini işaretliyoruz. Profil olarak da oluşturduğumuz profili seçiyoruz.

OK tuşuna basıp ekranı kapattıktan sonra, SQL Server Agent altındaki Operators seçeneğine sağ tıklayıp New Operator diyoruz.

Operatörümüzün bilgilerini girip OK butonuna tıklıyoruz.

Bu operatöre neleri bildireceğimizi bu ekrandan seçiyoruz.

Şimdi sıra geldi yedekleme planımıza mail atmasını söylemeye. Jobs altındaki yedekleme işimize sağ tıklayıp Properties diyoruz.

Çıkan ekranda Notifications seçeneğine gelip E-Mail’i işaretliyoruz. Karşısından operatörü ve ne zaman mail atmasını istediğimizi işaretliyoruz.

OK butonuna bastıktan sonra işlemimiz tamamlanmış olacaktır.
Hatasız yedeklemeler dilerim 🙂

coolwolf / 11/01/2013

Sql Server 2012 Otomatik Yedekleme

Sql Server 2012 ile veritabanınızın yedeklerini otomatik olarak almak istiyorsanız alttaki adımları izleyiniz.
Önce Sql Server Management Studio’yu açıp Sql Server Agent‘in çalıştığından emin olun. Yedekleme için Sql Server Agent gereklidir.

Eğer SQL Server Agent’in çalışıtüına emin isek bir sonraki adıma geçebiliriz.
Management altındaki Maintenace Plans’a sağ tıklayıp Maintenance Plan Wizard’ı seçiyoruz.


Çıkan ekrana next diyerek devam ediyoruz.

Bu adımda maintenance planımıza bir isim vermemiz gerekiyor.
Change butonuna bakarak yedekleme planımızın ne zamanlar çalışacağını belirtiyoruz.

Change butonuna bastıktan sonra alttaki ekranı kullanarak zamanlamamızı ayarlıyoruz.
İşimizi bitirdikten sonra ok butonuna basıyoruz.

Next düğmesine bastıktan sonra maintenance planımızın ne çeşit bir plan olduğunu belirtiyoruz. Bizim örneğimizde Backup Database.

Eğer birden fazla seçenek işaretlediysek bu işlemlerin hangi sırada yapılacağını seçiyoruz.

Bir sonraki ekranda Databases kısmına Specific databases seçip, Database karşısındaki … butonuna basarak hangi veritabanının yedekleneceğini seçiyoruz. Ardından add butonuna basarak yedeklerimizin nereye kopyalanacağını seçiyoruz.

Bu ekranda next deyip devam ediyoruz.

Alttaki ekran son ekranımız. bu aşamadan sonra işlemimizi tamamlamış oluyoruz.

Alttaki gibi bir ekran görüyorsanız işlemler tamamlanmış demektir.

Yedek aldıktan sonra sistemin size mail atmasını istiyorsanız ilgili yazımızdan destek alabilirsiniz.

coolwolf / 24/10/2012

TFS 2012 Project Creation Error

If you receive the following erro when trying to create a project on Team foundation Server 2012 :

Error
TF30170: The plugin Microsoft.ProjectCreationWizard.Build failed during task BuildTask from group Build.
Explanation
Plugin error text: “TF203013: The path C:\Windows\SERVIC~2\LOCALS~1\AppData\Local\Temp\tmpBF13.tmp is in the DOS (8.3) short path format and is not supported. Enter a full path to the item and try again.”
User Action
Contact your Team Foundation Server administrator.

 
First create a new user with administrator privileges. Then  open Team Foundation Administration Console and change the account. It will solve your problem.

coolwolf / 08/06/2012

sqlite türkçe harf sıralaması, sqlite turkish collation

Kullandığım projelerde ACCESS yerine SQLite kullanmayı uzun zamandır düşünüyordum. Fakat SQLite altında sorgu yaptığımda harfleri Türkçe sıralayamıyordu.
Bu sorunu çözmek için önce SQLite ve ICU bileşenlerini kendim derlemeyi denedim. Fakat C bilgim olmadığı için bu konuda başarılı olamadım.
Ardından yılmadım ve denemelerime devam ettim.
En sonunda bu adresteki kodu kullanarak sorunumu çözebildim.
Namespace’imizin içinde bir yere şu satırları ekliyoruz:

[SQLiteFunction(FuncType = FunctionType.Collation, Name = "UTF8CI")]
    public class SQLiteCaseInsensitiveCollation : SQLiteFunction
    {
        private static readonly System.Globalization.CultureInfo _cultureInfo = System.Globalization.CultureInfo.CreateSpecificCulture("tr-TR");
        public override int Compare(string x, string y)
        {
            return string.Compare(x, y, _cultureInfo, System.Globalization.CompareOptions.IgnoreCase);
        }
    }

Şimdi bu fonksiyonu kullanabilmemiz için Program.cs dosyamızdaki Main() fonksiyonunun içine şu satırı ekliyoruz:

System.Data.SQLite.SQLiteFunction.RegisterFunction(typeof(SQLiteCaseInsensitiveCollation));

Eğer tabloları herhangi bir SQLite Yönetim programıyla oluşturduysanız Türkçe sıralama yine çalışmayacaktır.
İsterseniz buradaki derme çatma programı kullanarak da SQLite veritabanınızı yönetebilirsiniz.
Tabloları kendimiz program içinde oluşturmalıyız. SQL konusunda iyi değilseniz SQLite yönetim programlarını herhangi biriyle oluşturduğunuz tabloyu EXPORT ederek SQL kodlarını elde edebilirsiniz.
Burada sıralama yapacağınız (ORDER BY) FIELD’ların oluşturma koduna COLLATE UTF8CI kelimelerini ekliyoruz:

CREATE TABLE `tablom` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
`adi` TEXT NULL COLLATE UTF8CI,
`soyadi` TEXT)

Bundan sonra yapacağınız insert ve select sorgularında sıralama Türkçe oalcaktır.
Eğer

No such collation: UTF8CI

şeklinde hata alırsanız select sorgusunun sonuna COLLATE BINARY kelimelerini ekleyin :

select * from tablom order by adi COLLATE BINARY

İyi kodlamalar.

coolwolf / 01/12/2010

PHP 3. String ve Matematiksel İşlemler

3. dersimizde PHP ile string işlemleri ve matematiksel işlemler yapmayı öğreneceğiz.
İlk olarak matematiksel işleme bir örnek verelim.
round (yuvarla) komutu :
round komutu ile virgülden sonraki rakkamları yuvarlıyoruz yada en yakın tamsayıya tamamlıyoruz.
Örnekler:

echo round(45.4);         // 45
echo round(45.5);         // 46
echo round(45.6);         // 46
echo round(45.6, 0);      // 46
echo round(32.268759, 2);  // 32.27
echo round(1425879, -3); // 1425000
echo round(32.0268, 3);    // 32.027
echo round(32.055, 2);    // 32.06

Diğer matematiksel işlem fonksyonları için http://www.php.net/manual/en/ref.math.php adresine bakabilirsiniz.
PHP içerisinde toplama,çıkarma,bölme ve çarpma operatörleri aşağıdaki gibidir:
Toplama:

<?php
$ilksayi=45;
$ikincisayi=22;
$toplam=$ilksayi+$ikincisayi;  //67
?>

Çıkarma:

<?php
$ilksayi=45;
$ikincisayi=22;
$toplam=$ilksayi-$ikincisayi;  //23
?>

Bölme:

<?php
$ilksayi=45;
$ikincisayi=22;
$toplam=$ilksayi/$ikincisayi;  //2.0454545454545
?>

Çarpma:

<?php
$ilksayi=45;
$ikincisayi=22;
$toplam=$ilksayi*$ikincisayi;  //990
?>

String işlemleri:
http://www.php.net/manual/en/ref.strings.php linkine tıklayarak tüm string işleme fonksiyonlarına ulaşabilirsiniz.
Biz çok kullanılan birkaç fonksiyondan örnek verelim.
md5() komutu verdiğimiz bir string’i md5 şifrelenmiş hale dönüştürür.
Örnek:

<?php
$metin="Merhaba Dunya";
echo md5($metin);
?>

str_replace() komutu bir string içerisinde aradığınız değeri bulur ve vereceğiniz değer ile değiştirir.
str_replace ($bunu_ara,$bununla_degistir,$bunun_icinde)
Örnek:

<?php
$bunun_icinde="Merhaba Dunya";
$bunu_ara="er";
$bununla_degistir="$";
echo str_replace($bunu_ara,$bununla_degistir,$bunun_icinde);
?>

strlen() komutu verilen string’in kaç karakter içerdiğini sayar.
Örnek:

<?php
$metin="Merhaba Dunya";
echo strlen($metin);  //13
?>

strpos() komutu verilen string’in içerisinde verilen karakter’in ilk oalrak kaçıncı sırada olduğunu verir.
Örnek:

<?php
$metin="Merhaba Dunya";
$bul="a";
echo strpos($metin,$bul);  //4
?>

substr() komutu verilen string’in içerisinden belli bir bölümü alır.
Örnek:

<?php
$metin="Merhaba Dunya";
echo substr($metin,2,6);  //rhaba
echo substr($metin,2);  //rhaba Dunya
?>

Yukarıda birkaç string işleme fonksiyonu örneği verdik. Bir sonraki dersimiz veritabanı bağlantıları ile ilgili oldukça uzun bir ders olacak.

coolwolf / 01/12/2010

PHP 2. İlk komutumuzu yazalım

Bir önceki makalede php çalıştırmak için gerekli olan araçları kurduk. Şimdi ilk php sayfamızı çalıştıralım ve sonucu görelim.
Öncelikle şunları hatırlatalım:
PHP sayflaraının uzantısı .php olmalıdır. (Tabi ki bu uzantıyı değiştirmek mümkün. Fakat biz genel geçer kurallar üzerinde konuşalım.)
.php uzantılı olmayan dosyalardaki php kodları aynen olduğu gibi web tarayıcısına gönderilecektir. Haliyle bunlar işlem görmeyecek hatta son kullanıcı tarafından görülebilecektir.
.php uzantılı dosyalar aslında HTML formatında dosyalardır. Yani <html> tag’ı ile başlar </html> tagı ile biterler. Bunların farkı araya php kodları yazıyor olmamızdır.
PHP kodları HTML kodu içerisinde <?php blablakod ?> şeklinde yazılırlar. <?php ?> tagları arasında yazılmayan kodlar yine işlem görmeyecektir.
Biz kendi yerel sunucumuzda çalışıyoruz. İstersek php.ini dosyasından tüm hataları görünür yapabiliriz. Fakat yine de alışkanlık haline getirelim ve hata kontrolü (debug) yapmak sitediğimiz sayfaların başına error_reporting(E_ALL); kodunu yazalım ki oluşabilecek hataları ekranda görelim. Peki bu hataları her zaman neden görüntülemiyoruz diye sorabilirsiniz. Mesele şu ki eğer tüm hata mesajlarınızı görüntülerseniz kodlarınız ve sisteminiz hakkında birçok bilgiyi kötü niyetli kişilere kolayca verebilirsiniz.
PHP yapı oalrak C dili ile benzerlik göstermektedir. Bu benzerliklerden biri de tüm satırlar ; (noktalı virgül) ile bitmelidir.
Şimdilik aklıma gelen önemli noktalar bu kadar. Hadi ilk kodumuzu yazalım.
<?php echo ‘merhaba dünya’; ?> Bu kodu index.php isimli bir dosyaya kaydedelim ve webroot dizinimize koyalım. Bir önceki makalede de anlattığımız gibi WampServer için bu root dizini “c:\wamp\www” dizinidir. Yani biz index.php dosyamızı buraya koyacağız. Sonra da tarayıcımızın adres satırına http://localhost yazacağız.
Eğer herşey yolunda gitmişse sayfanın sol üst köşesinde merhaba dünya yazısını görmemiz gerekiyor. Görmüyorsak bundan önce izlediğimiz adımları kontrol etmekte fayda var.
Eğer daha önce normal bir programlama dili kullandıysanız temel olarak giriş ve çıkış komutları olduğunu zaten biliyorsunuz. Yani writeln, readln, scanf, printf, readkey, print gibi komutlarla ekrana yazı yazdırdık ve klavyeden giriş aldık. (Tabi bu bahsettiklerim visual olmayan diller)
PHP’de echo yad aprint komutuyla ekrana bilgi yazdırıyoruz. Klavyeden birşeyler okumak için ise genellikle HTML FORM kullanıyoruz. Bir örnekle açıklayalım:

<?php
if(isset($_POST['adi']) && isset($_POST['soyadi']))
{
echo 'Sorgu çalıştı <br>';
echo $_POST['adi'].' '.$_POST['soyadi'];
}
?>
<html>
<head><title>PHP Öğreniyorum</title></head>
<body>
<form name="form1" action="_self" method="POST">
<input name="adi" type="text" size="25" maxlenght="25">
<input name="soyadi" type="text" size="25" maxlenght="25">
<input type="submit" name="button" value="Tamam">
</form>
</body>
</html>

Yukarıda kırmızı ile yazılan kısım sayfanın php derleyicisi tarafından işlenecek kısmı. Mavi ile yazılı olan kısım ise doğrudan tarayıcıya gönderilecek kısım.
İlk satırda bir sorgu çalıştırdık ve POST metodu ile sayfaya gönderilen “adi” ve “soyadi” değişkenlerinin bir değere set edilip edilmediklerini kontrol ettik. isset komutu herhangi bir değişkenin set edip edilmediğini yani bir değer içerip içermediğini kontrol eder. Fakat şunu hatırlatmakta yarar var. Eğer “adi” değişkeninin değeri “” (boş karakter), ” ” (boşluk), “0” (sıfır) gibi değerlere set edilmişse bile isset sorgusu 1 (True) olarak dönecektir. Burada kontrol edilen değişkenin içeriği değil kendisinin bellekte yer alıp almamış olmasıdır.
Biz IF sorgumuzda hem “adi” hem de “soyadi” değişkenlerinin set edilmiş olmasını istedik. Bu durumda sayfayı ilk açtığımızda karşımıza herhangi bir yazı çıkmayacak çünkü bu iki değişkeni set etmedik.
Sayfanın mavi ile yazılmış kısmıda ise basit bir HTML sayfası ve içinde de bir FORM yer almaktadır. Bu form’un adı “form1”, içeriğini göndereceği yer “_self” (yani kendisi. Buraya islemler.php yazsaydım tamam butonuna bstığımda değerleri islemler.php sayfasına gönderecekti), gönderme metodu “POST” olarak belirlenmiştir. Formun içinde her ikisinin de görülebilir ve kullanılabilir karakter giriş sayısı 25 olmak üzere bir “adi” diğeri “soyadi” isminde iki adet TEXT FIELD’ımız var. Son olarak da formu ACTION’da tanımlanan hedefe göndermesi için SUBMIT butonumuz var.
Tamam (Submit) butonuna bastığımızda artık “$_POST[‘adi’]” ve “$_POST[‘soyadi’]” değişkenleri bir değere sahipler. Biz bunları boş bırakıp gönder butonuna bassak bile bu iki değişken artık boş da olsa bir değere sahipler. Bu nedenle sorgu çalışacak ve “adi” “soyadi” değişkenlerini ekrana yazacaktır (boş olsalar bile.)
Sonra tekrar forma birşey yazıp “Tamam” butonuna bastığımızda bu sefer de yeni yazdıklarımız üstte gözükecektir.
Böylece klavyeden birşeyler girdik ve bunları sayfada yazdırdık. Bundan sonraki konuda birkaç matematik işlem ile stringler üzerinde birkaç deneme yapacağız. Ondan sonra da veritabanına birşeyler yazıp okumayı deneyeceğiz.
Herkese iyi çalışmalar
Bölüm 3 ->

coolwolf / 01/12/2010

PHP 1. Başlamak için gerekenler

Merhaba,
Elimden geldiğince PHP ile programlamaya yeni başlayanlar için bir kılavuz oluşturmaya çalışacağım.
PHP ile yaptığım yüzlerce uygulama var. Fakat yine de ben bu konuda çok iyiyim diyemem çünkü PHP dilini benden daha iyi kullanan birçok kişi var. Ortalama bir programcı sayılırım PHP konusunda.
Bunu özellikle belirtmemin sebebi şu:
Burada yazanları tek yol olarak kabul etmeyin. Herkesin kendine göre bir programcılık anlayışı vardır. Öğrendikçe yeni yöntemler kullanmanız kaçınılmaz. En iyi kod yazım şekli benim yazdığım şekilde olmayabilir. Farklı kod yazma mantıkları ile karşılaştığınızda şaşırmayın.
Şimdi gelelim konumuza:
Öncelikle bilgisayarımıza Php + Mysql + Apache + bunları yönetecek araçlar kurmalıyız. Bu işi en kolay şekilde yapmanın yollarından biri WampServer kullanmak. WampServer’ı bilgisayarınıza buradan indirip kurabilirsiniz.
Benim kurduğum WampServer şunları içeriyor: Apache 2.2.8, PHP 5.2.6 + PECL, SQLitemanager, MySQL 5.0.51b, Phpmyadmin.
Belki çoğunuz biliyorsunuz ama biz yine de bunların ne işe yaradığını açıklayalım.
Apache bir WEB sunucusudur. Sizin IP adresinize yapılan web isteklerine cevap verir. Sanal sunucular, cgi işlemleri, güvenli web gibi işlerden apache sorumludur. Basit olarak anlatmak gerekirse apache kendisine gelen istekleri tanımlı olan sanal sunucu dizininden okuyup kullanıcıya geri gönderir. Eğer kullanıcı farklı isimde bir dosya istememişse varsayılan olarak index.html dosyasını (kurulumda yapacağınız tanımlara göre bunlar değişir.Örn: PHP çalışması için index.php dosyalarını da varsayılan olarak açması gerekir.) gönderir.
Mysql bir veritabanı sunucusudur. Excel’de gördüğünüz sayfaları (Sheet) düşünün. Veritabanı her bir Sheet’i bir tablo olarak saklar. Sonra da bu tablolarda SQL diliyle işlem ve sorgulama yapmamızı sağlar.
PHP bir programlama dilidir. .PHP uzantılı web sayfaları apache tarafından ziayretçiye gönderilmeden önce PHP yorumlayıcısına (interpreter) gönderilir. PHP yorumlayıcısı bu kodları işler ve düz html çıktısı olarak sonucu apache’ye gönderir. Apache de bu süz html çıktısını ziyaretçinin web tarayıcısına gönderir. Böylece php sayfamız gereğini icra etmiş olur.
Dönelim WampServer’a.
WampServer varsayılan olarak “C:\wamp” dizinine kurulur.
Bu dizinin içindeki “www” dizini web sayfalarınızı tutacağınız dizindir.
“apps” dizininde sqlitemanager ve phpmyadmin bulunur.
“bin” dizini içerisinde de apache, php ve mysql programları bulunur. Oluşturacağınız veritabanları “C:\wamp\bin\mysql\mysql5.0.51b\data” dizini ieçrisinde saklanır. Yaptığınız projeleri yedeklemek isterseniz bu dizini yedeklemelisiniz.
Artık bilgisayarımızda kurulu bir Web Server + PHP + MySql Server’ımız var.
WampServer’ı çalıştırıp durdurmak için görev çubuğuna yerleşen WampServer simgesine çift tıklayarak gerekli işlemleri yapabilirsiniz.
Bundan sonraki derslerimizde PHP ile basit uygulamalar yapacağız.
Herkese İyi Çalışmalar.
Bölüm 2