Murat ERDEM - Personal Research Blog




Qiling Framework

january 07, 2021

Bu yazımızda Qiling Framework nedir?,qiling ile neler yapabiliriz gibi konulara değineceğiz. uygulama olarakda basit bir api hooking yapacağız.

(Qiling Framework)

Qiling temelinde unicorn engine bulunan farklı sistemleri simüle edebilen bir frameworktür. Qilingin özellikleri dokümantasyonunda aşağıdaki gibi listelenmiştir.

Qilingin yukarıdaki gibi güzel özellikler var ancak burada benim en çok dikkatimi çeken noktalar isolated environment ve kernel oldu tersine mühendislik için oldukça kullanışlı özellikleri olduğunu söyleyebiliriz.

Qiling genel olarak kullanması oldukça kolay bir yapıya sahip diyebiliriz ancak dokümantasyonunun yetersiz olmasından dolayı bir çok fonksiyonunu ve bu fonksiyonların kullanımını geliştirilmiş farklı projelerin kaynak kodlarının incelenmesinden öğrenmek gerekmekte bu da biraz uzun bir süreç ile birlikte anlaşılmayan noktalar karşımıza çıkarmaktadır. Geliştirildikçe bu gibi eksikler giderilerek daha kaliteli bir yapıya dönüşecektir.

Qiling güzel bir sanallaştırma ve çok sayıda kullanışlı fonksiyon bulundurmasından dolayı üzerine çok faydalı ürünler geliştirilebilir. Şimdi ise bir kaç küçük kullanım örneği yapalım.

Sistem Simüle Etmek

ilk olarak kurulumları yapmamız gerekiyor, bunun için buradaki yazılanları uygulayabilirsiniz. kurulum sırasında önemli noktalardan birisi gerekli dll yada lib dosyalarını kurulu olan sistemden toplamanız gerekmekte bunun için hedef sistemde buradaki scriptleri çalıştırabiliriz. Bu bizim için otomatik olarak toplama işlemini yapacaktır.

       
    
        from qiling import *

        ql = Qiling(["hello.exe"], "examples/rootfs/x86_windows",)
        ql.run()
    

Kurulumdan sonra yukarıdaki gibi bir python kodunun çalıştırırsak bizim için sanal bir ortamda ilgili dosyayı çalıştıracaktır. Burada Qiling sınıfına gönderilen ilk parametre bir listedir ve çalıştırılacak olan uygulamayı ve argümanlarını alır. İkinci parametre ise simüle edilecek olan sistemi göstermektedir. run komutu ile de simülasyon başlamaktadır. Yukarıda ben bir dosyaya “hello world” yazan bir exe yazdım bunun çalıştırdığımızda aşağıdaki gibi bir çıktı almaktayız.

Bu loglarda görüldüğü gibi öncelikle gerekli dll’leri hafızaya yükleyip daha sonra çağrılan her api için bir log düşmekte. “examples/rootfs/x86_windows” dizinine gittiğimizde ise oluşturulan dosyayı görebiliriz.

API Hooking

Qiling’in sağladığı en güzel kolaylıklardan birisi de api hooking diyebiliriz. set_api() fonksiyonu ile bir api çağrıldığında programın nasıl bir yol izleyeceğine karar verebiliriz.

       
    
        from qiling import *
        from qiling.os.windows.fncc import *

        def myWriteFile(ql,addr,params):
            okunan = ql.mem.string(params["lpBuffer"])
            print("okunan:",okunan)
            ql.mem.string(params["lpBuffer"],"a"*len(okunan))
            return addr,params

        ql = Qiling(["hello.exe"], "examples/rootfs/x86_windows")
        ql.filter = []
        ql.set_api("WriteFile",myWriteFile,QL_INTERCEPT.ENTER)
        ql.run()
    

Yukarıdaki scripti çalıştırırsak eğer uygulamamızın çalışması sırasında bir yerlerde WriteFİle apisi çağrılırsa program çalışmadan önce myWriteFile fonksiyonu çalışacaktır. Bu fonksiyonun sonunda adres ve parametreleri return ettik bunun sebebi bu fonksiyondan sonra programın hatasız bir şekilde çalışmasını sağlamak. ayrıca ql.filter = [] ile de gereksiz logları kapattık. scriptın çıktısı aşağıdaki gibidir.

Dosyaya baktığımızda ise istediğimiz değerin yazılmış olduğunu görebiliriz.

Yukarıdaki kodlarda dikkat çekmek istediğim bir nokta ise set_api() fonksiyonundaki QL_INTERCEPT.ENTER parametresidir. Dokümanlarda yoktu ancak kendi çıkarımıma göre fonksiyon çağrılmadan önce myWriteFile fonksiyonunu çağırıyor. QL_INTERCEPT.ENTER yerine QL_INTERCEPT.EXIT parametresini verirsek qiling hatasız bir şekilde çalışacaktır ancak dosyanın içerisine istediğimiz değişikliği uygulayamamaktadır. Buradan ise Fonksiyon çağrıldıktan sonra myWriteFile fonksiyonunu çalıştırdığı sonucuna varılabilir.

Qilingin daha bir çok özelliği bulunmakta daha detaylı öğrenmek için aşağıdaki linklere göz atabilirsiniz.

  • https://docs.qiling.io/en/latest/
  • https://github.com/qilingframework/qiling
  • https://github.com/N1ght-W0lf/QilingForMalwareAnalysis
  • https://malware.news/t/automated-malware-unpacking-with-binary-emulation/40192