Merhaba, bu yazımda bir Visual Studio eklentisini yazılımın verileri nerede sakladığını ve nasıl çalıştığını öğrenmek için deneme periyodu süresini maniple etmeye çalışacağım.
Öncelikle bu eklentiyi analiz etmeliyiz. Bu eklenti de aslında bir yazılım ve işletim sistemine bazı istekler yapıyor okuyor yazıyor vs. İnceleme işlemi yaparken Procmon yazılımından yardım alacağım. Deneme süresini sıfırlamak istediğim eklenti 14 günün ardından kullanılmaz hale geliyor. Amaç burada kurulumdan sonra 14 günü sayması için bir yerde saklaması gereken zamanı yani kurulum tarihini maniple ederek yazılımın davranışını değitirmek.
Eklentimiz bir Visual Studio eklentisi olduğu için bu process in oluşturduğu okuduğu dosyaları ve Registry kayıtlarını inceliyoruz.Visual Studio programı ilk açıldığında registery de bir çok işlem yapıyor Procmon yazılımı ile 500k registery işlemi arasından bizim programımını zaman ile ilgili işlemi yapan kaydını bulmak için programın ismini aratıp (devenv.exe) altındaki ve üstündeki kayıtları inceledim. Kayıtların bir tanesi dikkatimi çekti.
Kayıt aşağıdaki gibi bir regedit dizinine erişiyordu fakat normalde regeditte \REGISTRY\A diye başlayan böyle bir dizin yoktur.
\REGISTRY\A{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}\Software\Microsoft\VisualStudio\16.0_86d95122\General\TrialExpireDate
Araştırmalarımdan \REGISTRY\A kayıtlarının Visual Studio tarafından kullanılan registry hive kayıtları olduğunu ve Appdata içerisinde Visual Studionun verilerinin bulunduğun klasörde %LOCALAPPDATA%\Microsoft\VisualStudio\16.0_86d95122
privateregistry.bin dosyası olduğunu ve bunun regedit hive dosyasının kendisi olduğunu öğrendim.
Hive dosyaları regeditte Dosya->Yığını Yükle (Load Hive) seçeneği ile yüklenebilmekte. privateregistry.bin dosyası izinleden kaynaklı olarak bulunduğu dizinden load edilemezken powershell ile
cp privateregistry.bin reg.bin
komutuyla bir kopyası masaüstüne alındığında regeditten okunabiliyor. Regeditten ilgili kayıda gittiğimde aşağıdaki içeriği gördüm. Regedit İçeriği
Burada regedit dosyasına muhtemelen bir class serialize edilerek basılmış gibi görünüyordu. (C# obje serialize ettiğinde hex değerin 0b ile bittiğini görebilirsiniz) System.DateTime bir C# tipi olduğundan Bundan sonraki kısmın tarihi ifade edebileceği düşüncesiyle değeri aldığımda aşağıdaki değere ulaştım.
02,00,00,00,08,0d,00,00,fa,e2,0b,90,d8,88,0b
Daha sonra bu değeri anlamlandırabilmek için online C# compileri dotnetfiddle ile şu anki tarihi gösteren kısa bir program yazdım.
using System;
public class Program
{
private static DateTime HexToDateTime(string hexDate) {
return DateTime.FromBinary(Convert.ToInt64(hexDate, 16));
}
private static string DateToHex(DateTime theDate) {
return theDate.ToBinary().ToString("x");
}
public static void Main()
{
DateTime localDate = DateTime.Now;
Console.WriteLine(DateToHex(localDate));
}
}
Kod çıktı olarak 88d88584a4cd05fa değerini üretiyordu. Bu değer 16 byte uzunluğundaydı.
Elimdeki değerle kıyasladığımda 88, d8 değerinden tarihi aldığımı anlamış oldum. Son 2 byte silinip 16 byte lık değer alındığında aşağıdaki değer elde ediliyordu.
00,00,fa,e2,0b,90,d8,88
Tabi bu değer little endian formatında olduğundan big endian formatına çevirdiğimde şu anki tarihi elde edebildim.
88 d8 90 0b e2 fa 00 00
Bunu aşağıdaki koddan doğruladım. Sağdan 9. bit bile 7 dakika gibi bir zamana denk geliyordu.
Console.WriteLine(HexToDateTime("88d8900be2fa0000"));
Fakat şık bir tarih olsun diye 1/27/2056 10:30:34 PM tarihine denk gelen 88da000000000000 hex değerini var olan değer ile yine endian çevirdiğim url yardımıyla oluşturup klasörü exportladım ve sadece gereken değeri bırakıp onu düzenleyerek regeditte değiştirdim ve -4. günde olduğumu gördüm.
Diğer bir seçenek ise IsExpireTimeSet değişkenini false yaparak ilk açılışta 15 günlük yeni zaman oluşturulması sağlanabilir.
Diğer bir seçenek ise visual studio regedit ayarların değişiminden doğacak riskleri göze alarak privateregistry.bin dosyası sıfırlanabilir.
Daha bir çok yöntemle bilgisayar üzerinde çalışan yazılımların davranışlarını değiştirilebilir.