2013-04-02 12 views
7

Quindi ho scritto uno script PowerShell per ottenere la piattaforma di qualsiasi dato exe \ dll. Non ho familiarità con le intestazioni di assieme per determinare se un file ha un codice nativo o meno. Sto cercando di non chiamare corflags, peverify, ildasm o qualsiasi altro eseguibile esterno.Determinare se l'assembly .NET è in modalità mista senza chiamare l'EXE esterno in Powershell v3

C'è un modo semplice per realizzare questo? Ecco il codice PowerShell che ho finora per determinare se un assembly è nativo o .NET e su quale piattaforma è costruito. Voglio aggiungere l'abilità se è .NET per determinare anche se è in modalità mista.

# Gets the Platform of a any Assembly native or managed. 
# Examples: 
# Get-Platform "C:\vs\projects\bestprojectever\bin\debug\mysweetproj.dll" 
# Get-Platform (dir *.dll | select -first 1) 

param([Parameter(Mandatory=$true, ValueFromPipeline=$true)] $assemblyPath) 

$platform = "Unknown" 
$resolvedPath = Resolve-Path -literalPath $assemblyPath 

try { 
    $architecture = [System.Reflection.AssemblyName]::GetAssemblyName($resolvedPath) | Select-Object -ExpandProperty ProcessorArchitecture 
    switch ($architecture) { 
     MSIL { $platform = "AnyCPU Managed" } 
     X86 { $platform = "x86 Managed" } 
     Amd64 { $platform = "x64 Managed" } 
     IA64 { $platform = "Itanium Managed" } 
     default { $platform = "Unknown Managed" } 
    } 
} 
catch [System.BadImageFormatException] { 
    try { 
     $assemblyStream = [System.IO.File]::OpenRead($resolvedPath) 
     try { 
      $binaryReader = New-Object System.IO.BinaryReader($assemblyStream) 
      if ($binaryReader.ReadUInt16() -eq 0x5A4D) 
      { 
       $ignore = $assemblyStream.Seek(0x3c, [System.IO.SeekOrigin]::Begin) 
       $pos = $binaryReader.ReadInt32() 
       $ignore = $assemblyStream.Seek($pos, [System.IO.SeekOrigin]::Begin) 
       $format = $binaryReader.ReadUInt32() 
       if ($format -eq 0x4550) 
       { 
        $machineType = $binaryReader.ReadUInt16() 
       } 
      } 
     } 
     finally { 
      if ($binaryReader -ne $null) { 
       $binaryReader.Close(); 
       if ($binaryReader.psbase -eq $null) { 
        $binaryReader.Dispose() 
       } else { 
        $binaryReader.psbase.Dispose() 
       } 
      } 
     } 
    } 
    finally 
    { 
     if ($assemblyStream -ne $null) { 
      $assemblyStream.Close(); 
      if ($assemblyStream.psbase -eq $null) { 
       $assemblyStream.Dispose() 
      } else { 
       $assemblyStream.psbase.Dispose() 
      } 
     } 
    } 
    switch ($format) 
    { 
     0x454C { $platform = "Virtual Device Driver Native" } 
     0x454E { $platform = "16bit Native" } 
     0x4550 
     { 
      switch ($machineType) 
      { 
       0x14c { $platform = "x86 Native" } 
       0x166 { $platform = "R4000 Native" } 
       0x169 { $platform = "MIPS WCE v2 Native" } 
       0x1a2 { $platform = "Hitachi SH3 Native" } 
       0x1a3 { $platform = "Hitachi SH3 DSP Native" } 
       0x1a6 { $platform = "Hitachi SH4 Native" } 
       0x1a8 { $platform = "Hitachi SH5 Native" } 
       0x1c0 { $platform = "ARM Native" } 
       0x1c2 { $platform = "Thumb Native" } 
       0x1d3 { $platform = "Matsushita AM33 Native" } 
       0x1f0 { $platform = "Power PC Native" } 
       0x1f1 { $platform = "Power PC with floating point support Native" } 
       0x200 { $platform = "IA64 Native" } 
       0x266 { $platform = "MIPS16 Native" } 
       0x366 { $platform = "MIPS with FPU Native" } 
       0x466 { $platform = "MIPS16 with FPU Native" } 
       0xebc { $platform = "EFI Byte Code Native" } 
       0x8664 { $platform = "x64 Native" } 
       0x9041 { $platform = "Mitsubishi M32R Native" } 
       0xc0ee { $platform = "Pure MSIL" } 
       default { $platform = "Unknown Native" } 
      } 
     } 
     default { $platform = "Unknown Format" } 
    } 
} 

return $platform 

Inoltre ho familiarità con il seguente question e tutte le risposte coinvolgere chiamando alcuni EXE esterno che sto cercando di evitare.

risposta

1

È possibile iniziare dal codice disponibile here e adattarlo per verificare se lo IMAGE_COR20_HEADER contiene COMIMAGE_FLAGS_ILONLY (in questo caso, questo è un assembly in modalità non mista).

Problemi correlati