Esen;
Windows işletim sistemimizin kaç bit olduğunu “Windows+Pause” tuş kombinasyonunu kullanarak öğrenebilirsiniz. Ancak bugünkü konumuz, masm32 assembly de kodladığımız uygulamamız ile işletim sistemimizin bit durumunu döndürmek olacak. İnternet’te de değişik kaynaklarda farklı farklı yöntemler bulabilirsiniz. Hadi kodlara dönelim:
GetNativeSystemInfo APIsi Kullanarak
Windows, yazılım geliştirirken kullanabileceğimiz bir yapı sunuyor bize; adı: SYSTEM_INFO
Aşağıda MSDN ağından çektiğim yapının ayrıntılarını görüyorsunuz. Bu yapı birçok harika bilgi için alan yaratıyor. İşlemci seviyesi, “revision” numarası gibi.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
typedef struct _SYSTEM_INFO { union { DWORD dwOemId; struct { WORD wProcessorArchitecture; WORD wReserved; }; }; DWORD dwPageSize; LPVOID lpMinimumApplicationAddress; LPVOID lpMaximumApplicationAddress; DWORD_PTR dwActiveProcessorMask; DWORD dwNumberOfProcessors; DWORD dwProcessorType; DWORD dwAllocationGranularity; WORD wProcessorLevel; WORD wProcessorRevision; } SYSTEM_INFO; |
Bize gereken ise Windows işletim sisteminin bit durumudur. Bunu da wProcessorArchitecture değişkeninden çekiyoruz:
1 2 3 |
wProcessorArchitecture The processor architecture of the installed operating system |
MSDN’de açıklandığı gibi bu değişken yüklenen işletim sisteminin işlemci mimarisini taşır. O zaman GetNativeSystemInfo APIsini çağıralım:
1 2 3 |
void WINAPI GetNativeSystemInfo( _Out_ LPSYSTEM_INFO lpSystemInfo ); |
Bu API tek bir parametre alıyor o da yukarıda bahsettiğim SYSTEM_INFO yapısı. GetNativeSystemInfo koşunca SYSTEM_INFO yapısının içinde tanımlı boş değişkenlere ilgili bilgileri atıyor. Biz de gereksindiğimiz değişkenleri alıp isteğimiz doğrultusunda kullanacağız.
1 2 3 4 5 6 7 8 9 10 11 |
.data? sysinf SYSTEM_INFO <> .code mov ebx, offset sysinf invoke GetNativeSystemInfo,ebx cmp [ebx.SYSTEM_INFO.wProcessorArchitecture], PROCESSOR_ARCHITECTURE_AMD64 .if Zero? print chr$("[ + ] Sisteminiz 64-bit",13,10) .else print chr$("[ + ] Sisteminiz 32-bit",13,10) .endif |
Dikkat ederseniz ebx.SYSTEM_INFO.wProcessorArchitecture içinde bir değer var ve biz bu değeri PROCESSOR_ARCHITECTURE_AMD64 ile karşılaştırıyoruz. Peki bu değerler nereden geliyor? Yeniden SYSTEM_INFO yapımızın MSDN ağına dallanalım ve şunlara bakalım:
1 2 3 4 5 6 7 8 9 10 11 12 |
DEĞER ANLAMI PROCESSOR_ARCHITECTURE_AMD64 = 9 x64 (AMD or Intel) PROCESSOR_ARCHITECTURE_ARM = 5 ARM PROCESSOR_ARCHITECTURE_ARM64 = 12 ARM64 PROCESSOR_ARCHITECTURE_IA64 = 6 Intel Itanium-based PROCESSOR_ARCHITECTURE_INTEL = 0 x86 PROCESSOR_ARCHITECTURE_UNKNOWN = 0xffff Unknown architecture. |
PROCESSOR_ARCHITECTURE_AMD64 değeri 9. Karşılaştırma tarafında sistemden çekilen değeri 9 ile karşılaştırıyoruz. Eğer 9 ise sistem 64 bit değilse 32 bit yazdırıyoruz. Aslında daha çok if yapısı kullanılarak diğer seçenekler de ekrana bastırılabilir.
IsWow64Process Kullanarak
IsWow64Process APIsinin yapısı aşağıdaki gibidir. hProcess değeri olarak bir işlem/process veriyoruz. Belirtilen işlem WOW64 altında mı koşuyor? Sorusunu IsWow64Process soruyor ve yanıtını TRUE/FALSE olarak “PBOOL Wow64Process” değişkenine döndürüyor.
1 2 3 4 |
BOOL IsWow64Process( HANDLE hProcess, PBOOL Wow64Process ); |
WOW64 demek 64bit mimarideki işletim sisteminde varolan ve 32 bitlik uygulamaların da 64bitlik işletim sisteminde çalışmasını sağlayan framework. Eğer benim processim/işlemim bu çatı altında koşuyorsa ben 64bitlik bir işletim sistemi içerisindeyim demektir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
xchg ebx, rv(GetProcAddress, rv(GetModuleHandle, "kernel32") , "IsWow64Process") .if ebx print "[ + ] IsWow64Process bulundu: donusDegeri=" push eax invoke IsWow64Process, rv(GetCurrentProcess), esp pop ecx mov bayrakIsWow64,cl print str$(ecx),13,10 .if bayrakIsWow64==1 print chr$("[ + ] Sisteminiz 64-bit",13,10) .else print chr$("[ + ] Sisteminiz 32-bit",13,10) .endif .else print "[ + ] IsWow64Process bulunamadi", 13, 10, 10 .endif |
C:\Windows\SysWow64 dizinini denetleyerek
Windows 64 bit sistemlerde “C:\Windows\SysWow64” dizini bulunur. Bu dizin var mı yok mu diye denetlersek sistemin bit seviyesini bulabiliriz.
1 2 3 4 5 |
.if fexist("C:\Windows\SysWow64") print chr$("[ + ] Sisteminiz 64-bit",13,10) .else print chr$("[ + ] Sisteminiz 32-bit",13,10) .endif |
Not: fexist MASM32 kitaplığında bulunan bir makro. Dizin denetlemsi yapıyor.
hasherezade’nin yöntemini kullanarak
hasherezade’nin belirttiğine göre aşağıdaki kod kronos zararlısından geliyor. Yöntem çok temiz çalışıyor. CS – Code Segment ‘inin verdiği değer 32 bit ya da 64 bit olmasına göre değişir. 32bit sistemlerde 5bitlik bir değer dönerken 64 bit sistemlerde 6 bitlik bir değer dönüyor. Buna göre sistemimizin bit durumunu denetleyebiliyoruz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
is_system64_bit PROC ; _______________________________________________________________________________ ; Sistem 64bit mi kontrol eden yordam ; Yazar : hasherezade - https://gist.github.com/hasherezade/0994447e9d3dc184888fb2afd5a57301 ; Aldığı : yok ; Döndürdüğü: eax > 0 = 64-bit ; ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ LOCAL flag:DWORD xor eax, eax mov ax, cs shr eax, 5 mov flag, eax .IF flag > 0 mov eax, TRUE .ELSE mov eax, FALSE .ENDIF ret is_system64_bit ENDP invoke is_system64_bit .if Zero? print chr$("[ + ] Sisteminiz 32-bit",13,10) .else print chr$("[ + ] Sisteminiz 64-bit",13,10) .endif |
[dm]170[/dm]
[dm]171[/dm]
Comments of this post