MASM32 Assembly ile Windows Sürüm Bilgisini Döndürmek

Kategori Assembly
14.06.2017
2893 Okunma

Esen;
Windows işletim sisteminden sürüm bilgisi çekmenin birden çok yolu var. Bu yazıda bunları açıklamaya çalışacağım. Peki neden böyle birşey yapalım? Sürüm bilgisi bizim ne işimize yarayacak? Eğer geliştirici iseniz ve sadece belli bir windows sürümüne özel program yazıyorsanız ya da özellikle belli sürümün altındakilerde çalışmasını istemiyorsanız sürüm kontrolü yaparak istediğiniz sonucu alabilirsiniz. Veya zararlı yazılım çözümlemesi yaparken zararlının nasıl çalıştığını daha iyi anlamak adına işinize yarayabilir. APT saldırısı yapıldığını düşünün. Hedefte bir kurum olsun devlet ya da özel. Saldırganlar bu kurumda sadece belli sürüm (Mesela Windows 7 SP1 Enterprise) windows kullanıldığını öğrenmiş olsun. O zaman yazacakları zararlıyı Windows 7 SP1 ve üzerinde çalışacak şekilde programlayabilirler. Bizde bunu hata ayıklarken ortaya çıkartabiliriz.

Process Environment Block – PEB kullanarak sürüm bilgisi öğrenmek

Şunu söylemeliyim PEB başlı başına bir yazı konusu olabilir. Ama kısaca da olsa anlatmak gerek. PEB (Process Environment Block) windows tarafından yüklenen bir “yapıdır – struct”. Bu yapı user-mode içerisinde çalışır ve çok değerli bilgiler içerir: Sürüm bilgisi, yığıt adresleri ve yığıt sayısı (heap address – heap number), programın debug edilip edilmediğine dair bilgi, işlemci sayısı gibi bilgiler… WinDBG ile ilgili yazımı okuyup uygulama yaptıysanız, lokalde kernel debuggerı açıp dt ntdll!_PEB komutunu yazarak PEB yapısını WinDBG ekranına basabilirsiniz.

Umarım kafanız karışmaz şu linke bakarak PEB hakkında windows’ün sürümlerine göre gösteren değişiklikler de ele alınarak harika bir çalışma yapılmış: PEB Combined

İşte bu yapı içerisinde ben:

bu offsetlerdeki verileri döndürerek sürüm bilgisine ulaşabilirim:

RtlGetVersion APIsi kullanılarak sürüm bilgisi öğrenmek

RtlGetVersion apisi aşağıda da gördüğünüz gibi tek bir parametre almaktadır. Bu parametre ise RTL_OSVERSIONINFOW ya da RTL_OSVERSIONINFOEXW yapılarından birisidir.

RtlGetVersion apisi çalıştığında ilgili verileri bu yapıya yazar. Bizde oradan bilgileri çekebiliriz.

Bu apiyi kullanmadan önce döndüreceği verileri yazması için yapıyı tanımlamamız gerekiyor. Masm32 paketi içerisinde gelmediği için biz tanımlıyoruz: RTL_OSVERSIONINFOEXW

Windows 10 için aşağıdaki şekilde RtlGetVersion apisini RTL_OSVERSIONINFOEXW ile kullanarak gerekli bilgileri çeker sonra da yapının içindeki verileri ekrana basabiliriz:

GetVersionEx APIsi ile sürüm bilgisi döndürmek

GetVersionEx apisi tek bir parametre alır ve döndüreceği sürüm bilgisini bu parametre içerisindeki yapıya yazar. Bu API OSVERSIONINFOEX ya da OSVERSIONINFO yapılarını kullanarak sürüm bilgisi döndürür. Windows 10 ile bu APIyi kullanırsak bize yanlış bilgi döndürüyor. O yüzden bu APIyi artık Windows 10’da kullanmıyoruz. Windows 8.1’den öncesine kadar doğrudan bu apiyi çağırarak doğru sürüm bilgisi elde edilebiliyor. Windows 8.1 ‘den itibaren manifest bilgisi eklenmesi gerekiyor. Ancak benim bildiğim kadarıyla konsol programlarına manifest bilgisi eklenmiyor.

GetVersion APIsi ile sürüm bilgisi döndürmek

GetVersion APIsi parametre almaz. Çağrıldığı zaman sürüm bilgisini eax yazmacına yazar.
al= major sürüm bilgisi
ah= minor sürüm bilgisi
eax’in soldaki 4 baytı ise build-inşa bilgisini içerir.
Yukarıda açıklamaya çalıştığım GetVersinEx APIsi gibi bu da Windows 8.1’den itibaren hatalı sürüm bilgisi döndürüyor.

Kayıt Defterinden bilgi çekerek sürüm bilgisi öğrenmek

Tüm Windows sürümleri kayıt defterinde sürüm bilgisi başta olmak üzere birçok bilgiyi saklamaktadır. Bizi ilgilendiren ise şu yoldur: [HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion]
Bu yol içerisindeki anahtarlar windows sürüm, inşa servis paketi gibi bilgiler taşır. Buradan bilgi çekerek sürüm bilgisi döndürebiliriz:

Yukarıdaki kod parçası Windows 10 için geçerli. Oysa aşağıdaki kaynak kodda diğer sürümler için olan kodları da bulabilirsiniz. [HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion] yolu altında windows 10 ile beraber gelen iki yani anahtar var: “CurrentMajorVersionNumber” ve “CurrentMinorVersionNumber”. Bunlar doğru sonuç döndürür. Ancak geçmişten gelen bir anahtar var : “CurrentVersion” bunu windows 8’e kadar döndürebilirsiniz. Ama sonrasında sabit değer taşıyor.

Aşağıda kaynak kodları ekliyorum. Diğer örnekler gibi bu paket de RadASM2 ve Masm32 kullanılarak hazırlanıp derlendi. Kaynak kodlar içerisine de yorumlar ekledim. Onları da inceleyiniz. Daha iyi anlamak adına örnek kodu iyice kurcaların değişikliler yapın. Ve her gün kod yazmayı unutmayın.
[dm]159[/dm]

Comments of this post

Henüz yorum bulunmuyor!