[SNIPPET] Get W$ Version {RtlGetVersion - Native API}

Iniciado por Karcrack, 16 Septiembre 2009, 22:11 PM

0 Miembros y 1 Visitante están viendo este tema.

Karcrack

Código (vb) [Seleccionar]
'NTDLL
Private Declare Function RtlGetVersion Lib "NTDLL" (ByRef lpVersionInformation As Long) As Long

Private Function NativeGetVersion() As String
   Dim tOSVw(&H54)     As Long
 
   tOSVw(0) = &H54 * &H4
   Call RtlGetVersion(tOSVw(0))
 
   NativeGetVersion = Join(Array(tOSVw(4), tOSVw(1), tOSVw(2)), ".")
End Function

Public Function VersionToName(ByVal sVersion As String) As String
   Select Case sVersion
       Case "1.0.0":     VersionToName = "Windows 95"
       Case "1.1.0":     VersionToName = "Windows 98"
       Case "1.9.0":     VersionToName = "Windows Millenium"
       Case "2.3.0":     VersionToName = "Windows NT 3.51"
       Case "2.4.0":     VersionToName = "Windows NT 4.0"
       Case "2.5.0":     VersionToName = "Windows 2000"
       Case "2.5.1":     VersionToName = "Windows XP"
       Case "2.5.3":     VersionToName = "Windows 2003 (SERVER)"
       Case "2.6.0":     VersionToName = "Windows Vista"
       Case "2.6.1":     VersionToName = "Windows 7"
       Case Else:        VersionToName = "Unknown"
   End Select
End Function


Ejemplo para llamarla:
MsgBox VersionToName(NativeGetVersion)

Esta en distintas funciones para que, por ejemplo, el servidor envie solo lo que devuelve NativeGetVersion y luego el cliente interprete los numeros con VersionToName... :rolleyes:

Lleva un tiempo en HackHound y en AdvanceVB... se me olvido ponerla aqui.... lo siento :-[ :xD

http://www.advancevb.com.ar/?p=255
http://hackhound.org/forum/index.php?topic=21559.msg133308#msg133308


Saludos ;)

Jaixon Jax

Gracias ... una buena manera de saber exactamente el SO ....



agus0


YST

Yo opino que si es NT es mejor sacarlo directo del registro :P


Yo le enseñe a Kayser a usar objetos en ASM

agus0

y como sabes que es nt o no?

y por que decis que es mejor?

YST

#5
Cita de: agus0 en 17 Septiembre 2009, 06:39 AM
y como sabes que es nt o no?

y por que decis que es mejor?
Con el mismo registro puedes saber si es NT o no(si falla no es NT ) :xD , digo que es mejor por que en el registro ya esta escrito directamente que version del SO es entre otras cosas ( si es ultimate o home basic aparece en el registro por ejemplo ) :P

Para ser mas expesifico en la clave :
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductName


Yo le enseñe a Kayser a usar objetos en ASM

BlackZeroX

Cita de: YST en 17 Septiembre 2009, 07:06 AM
Cita de: agus0 en 17 Septiembre 2009, 06:39 AM
y como sabes que es nt o no?

y por que decis que es mejor?
Con el mismo registro puedes saber si es NT o no(si falla no es NT ) :xD , digo que es mejor por que en el registro ya esta escrito directamente que version del SO es entre otras cosas ( si es ultimate o home basic aparece en el registro por ejemplo ) :P

Para ser mas expesifico en la clave :
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductName

no lo creo, es muy inesacto, si hay un soft malisioso en dicha pc y cambia ese campo, realmente te la crees?
The Dark Shadow is my passion.

Karcrack

#7
Como dice BlackZeroX esa clave es modificable... en cambio usando RtlGetVersion seria 'mas' complicado de engañar...




Otro metodo:
Código (vb) [Seleccionar]
'NTDLL
Private Declare Function NtCurrentTeb Lib "NTDLL" () As Long
'MSVBVM60
Private Declare Sub GetMem4 Lib "MSVBVM60" (ByVal Addr As Long, ByRef RetVal As Long)

Public Function PEBGetWinVersion() As String
    Dim lPEB        As Long 'Pointer to PEB
    Dim lOSMa       As Long 'OSMajorVersion     [PEB+0xA4]
    Dim lOSMi       As Long 'OSMinorVersion     [PEB+0xA8]
    Dim lOSPlat     As Long 'OSPlatformId       [PEB+0xB0]
   
    Call GetMem4(NtCurrentTeb + &H30&, lPEB)
    Call GetMem4(lPEB + &HA4, lOSMa)
    Call GetMem4(lPEB + &HA8, lOSMi)
    Call GetMem4(lPEB + &HB0, lOSPlat)
   
    PEBGetWinVersion = Join(Array(lOSPlat, lOSMa, lOSMi), ".")
End Function

Public Function VersionToName(ByVal sVersion As String) As String
    Select Case sVersion
        Case "1.0.0":     VersionToName = "Windows 95"
        Case "1.1.0":     VersionToName = "Windows 98"
        Case "1.9.0":     VersionToName = "Windows Millenium"
        Case "2.3.0":     VersionToName = "Windows NT 3.51"
        Case "2.4.0":     VersionToName = "Windows NT 4.0"
        Case "2.5.0":     VersionToName = "Windows 2000"
        Case "2.5.1":     VersionToName = "Windows XP"
        Case "2.5.3":     VersionToName = "Windows 2003 (SERVER)"
        Case "2.6.0":     VersionToName = "Windows Vista"
        Case "2.6.1":     VersionToName = "Windows 7"
        Case Else:        VersionToName = "Unknown"
    End Select
End Function

YST

Cita de: BlackZeroX en 17 Septiembre 2009, 07:27 AM
Cita de: YST en 17 Septiembre 2009, 07:06 AM
Cita de: agus0 en 17 Septiembre 2009, 06:39 AM
y como sabes que es nt o no?

y por que decis que es mejor?
Con el mismo registro puedes saber si es NT o no(si falla no es NT ) :xD , digo que es mejor por que en el registro ya esta escrito directamente que version del SO es entre otras cosas ( si es ultimate o home basic aparece en el registro por ejemplo ) :P

Para ser mas expesifico en la clave :
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductName

no lo creo, es muy inesacto, si hay un soft malisioso en dicha pc y cambia ese campo, realmente te la crees?
Claro y si hay un malware que te hace hoock a la api tambien ningun metodo funcionaria ,pero hay que ser realista ;)


Yo le enseñe a Kayser a usar objetos en ASM

Karcrack

Cita de: YST en 17 Septiembre 2009, 18:21 PM
Claro y si hay un malware que te hace hoock a la api tambien ningun metodo funcionaria ,pero hay que ser realista ;)
El ultimo metodo que he posteado si que funcionaria por mucho Hook que haya...