Wie Sie PowerShell verwenden, um Daten zu extrahieren aus .dll-oder .exe-Dateien

Ich möchte eine Liste mit allen Diensten, deren Starttyp auf automatisch festgelegt ist

Bin ich mit PowerShell 5

$path = 'hklm:\SYSTEM\ControlSet001\Services'
$services = get-childitem $path | get-itemproperty -name 'Start'
foreach ($s in $services){
    if($s.'Start' -like '2'){
        $dn = get-itemproperty $s.'pspath' -name 'DisplayName'
        echo $dn
    }
}

Aber das problem ist, die meisten Einträge sind mit so etwas wie dieses:

@%systemroot%\system32\SearchIndexer.exe,-103
@%SystemRoot%\System32\wscsvc.dll,-200

So, wie zu extrahieren string aus es?

Zur Klärung ein wenig weiter, für @%systemroot%\system32\SearchIndexer.exe,-103 der Display-Name ist "Windows Search". Die Frage ist, ist die PowerShell in der Lage extrahieren string "Windows Search" aus SearchIndexer.exe? Und wie macht man das?

UPDATE:

Im Grunde Stahlen Sie den code aus Wie zu extrahieren string resource DLL

$source = @"
using System;
using System.Runtime.InteropServices;
using System.Text;

public class ExtractData
{
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Ansi)]
private static extern IntPtr LoadLibrary([MarshalAs(UnmanagedType.LPStr)]string lpFileName);

[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern int LoadString(IntPtr hInstance, int ID, StringBuilder lpBuffer, int nBufferMax);

[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool FreeLibrary(IntPtr hModule);

public string ExtractStringFromDLL(string file, int number) {
    IntPtr lib = LoadLibrary(file);
    StringBuilder result = new StringBuilder(2048);
    LoadString(lib, number, result, result.Capacity);
    FreeLibrary(lib);
    return result.ToString();
}
}
"@

Add-Type -TypeDefinition $source

$ed = New-Object ExtractData

$path = 'hklm:\SYSTEM\ControlSet001\Services'
$services = get-childitem $path | get-itemproperty -name 'Start' -ErrorAction SilentlyContinue
foreach ($s in $services){
    if($s.'Start' -like '2'){
        $dn = get-itemproperty $s.'pspath' -name 'DisplayName'
        try{
        $dn = $dn.DisplayName.Split(',')
        $dn = $ed.ExtractStringFromDLL([Environment]::ExpandEnvironmentVariables($dn[0]).substring(1), $dn[1].substring(1))
        }
        catch{}
        finally{
        echo $dn
        }
    }
}

Hässlich, aber es hat geklappt, endlich……

InformationsquelleAutor oNion | 2017-08-30



2 Replies
  1. 4

    Was ist falsch mit

    get-service | where-object StartType -eq Automatic

    ?

    • Thx!!! Das ist ein viel besserer Weg, es zu tun. Aber bekomme ich noch die Antwort, wie zu extrahieren string aus .dll -, .exe-Dateien? Einfach nur neugierig
    • Ich dachte über, dass. Ich glaube nicht, dass Sie sich verlassen können, entweder immer eine resource-ID angehängt, oder der Pfadname nicht mit einem Komma! So kann ein paar Heuristiken für eine robuste Lösung. Aber der einfache Fall ist (string in $s) [Environment]::ExpandEnvironmentVariables($s.Substring(1, $s.LastIndexOf(',')-1)).
    • Es scheint nicht zu funktionieren, es machte @%SystemRoot%\System32\wscsvc.dll,-200 geworden @%SystemRoot%\System32\wscsvc.dll nicht genau extrahieren von Daten in der Datei. Aber trotzdem danke 🙂
    • In der F haben Sie „extrahieren, den string“ die ich zu Lesen, als mit dem Namen. Wenn Sie brauchen, Daten von innerhalb der Datei, wird kompliziert, schnell (Sie benötigen zum aufrufen von Win32-Ressourcen-APIs). Und in vielen Fällen ist es nur ein string ist (es ist keine Voraussetzung für den Anzeigenamen, um ein Ressource-Referenz).
    • Finden Sie unter diesem question die C# – code werden könnten, eingewickelt in eine Klasse geladen und dann dynamisch über Add-Type -TypeDefinition $codeString.
    • Danke für den link, endlich hat es geklappt

  2. 2

    Versuchen. Es funktioniert in der PowerShell 3, so sollte auch in höheren Versionen.

    Get-WmiObject -Class Win32_Service | 
        Where-Object StartMode -eq Auto | 
        Select-Object -Property DisplayName
    • Danke! Kennen Sie eine Möglichkeit zum extrahieren von Daten aus .exe-und .dll-Dateien? Einfach nur neugierig
    • Was habt Ihr versucht?
    • Ich würde Wetten, das gute Geld, dass die Antwort hier SO, und nicht allzu schwer zu finden.
    • Vielleicht schauen mit get-content -encoding byte.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.