Frage:
Kann ein Windows-Prozess überprüfen, ob er von einem anderen Prozess injiziert wurde?
Benny
2014-01-20 00:48:44 UTC
view on stackexchange narkive permalink

Es gibt viele Tutorials, die zeigen, wie injizierter Code in den Prozessspeicher erkannt wird. Dies erfordert jedoch im Allgemeinen die Verwendung eines Debuggers.

Kann ein Prozess irgendwie erkennen, ob er von einem anderen Prozess mit Winapi injiziert wurde? Wenn ja, wie?

Gibt es insbesondere "feste / wahrscheinliche" Merkmale von injiziertem Code? Aus dieser Frage geht beispielsweise hervor, dass injizierter Code dadurch gekennzeichnet werden kann, dass er immer auf Seiten angezeigt wird, für die die folgenden Schutzflags gesetzt sind: PAGE_READWRITE_EXECUTE, PAGE_EXECUTE_READ, PAGE_EXECUTE_WRITECOPY und möglicherweise (aber unwahrscheinlich) PAGE_EXECUTE. Können Sie auf andere Merkmale von injiziertem Code hinweisen?

Was ist, wenn der injizierte Code den Seitenschutz auf etwas weniger Verdächtiges zurücksetzt?
@0xC0000022L Könnten Sie mir bitte ein Beispiel für etwas geben, das weniger verdächtig ist?
Zwei antworten:
PhoeniX
2014-01-20 02:18:13 UTC
view on stackexchange narkive permalink

Injizierter Code kann dargestellt werden durch, aber nicht beschränkt auf:

Remote erstellter Thread kann durch verschiedene Techniken erkannt werden:

  1. Regelmäßige Überprüfung Wenn Prozess-Threads vom aktuellen Prozess mithilfe von NtQueryProcessInformation erstellt wurden.
  2. Überprüfen Sie für jeden Thread, ob er aus dem Adressraum der ursprünglichen ausführbaren Datei und nicht aus einem verwaisten Speicher ausgeführt wird Seite:

    1. NtQueryInformationThread
    2. Setzen Sie den zweiten Parameter auf ThreadQuerySetWin32StartAddress
    3. GetModuleInformation - Überprüfen Sie, ob die Thread-Startadresse im Bereich jedes der geladenen Module liegt und diese Module legitim sind (nach bekannter Liste / nach Pfad).
    4. Überprüfen Sie auch hier.
    5. ol>
  3. Überwachen Sie die Thread-Erstellungs-API innerhalb des aktuellen Prozesses und prüfen Sie auch, ob die Erstellungs-PID zur aktuellen gehört process - NtQueryProcessInformation , CreateToolhelp32Snapshot .

  4. Monito r Speicherschutz-APIs ( VirtualProtect ), um zu erkennen, ob jemand versucht, Ihren Code zu ändern, und dann zu überprüfen, ob diese "Person" zum legitimen Prozessadressraum gehört.
  5. Führen Sie die Liste von Mit legitim geladenen Modulen kann auch überprüft werden, ob jeder in Bearbeitung befindliche Thread zum Adressraum eines legitimen Moduls aus der Liste gehört.
  6. Überwachen Sie LoadLibrary auf die Möglichkeit, dass jemand versucht, ein unbekanntes Modul zu laden
  7. ol>

    Injizierter Code ohne Thread

    1. Überprüfen Sie die Integrität Ihres Prozesses - Suchen Sie nach Hot Patches für verschiedene APIs, abhängig vom Prozess. Injizierter Code kann durch einen Patch im aktuellen Prozess ausgelöst werden.

    2. Überwachen Sie die APC-Erstellungs-API ( KiUserApcDispatcher ), wenn das Ziel Code gehört zum aktuellen Prozess. Der APC des Betriebssystems könnte auch herausgefiltert werden.

    3. ol>

      Es gibt andere Möglichkeiten, Code einzufügen, noch bevor der legitime Prozess ausgeführt wird und seine Schutzfunktionen platziert - mithilfe der Kombination von WriteProcessMemory / GetThreadContext / SetThreadContext , die theoretisch alle implementierten Schutzmaßnahmen umgehen könnten. Wenn Ihr Code und der injizierte Code nur im selben Ring ausgeführt werden (Benutzermodus), hängt alles davon ab, wer zuerst die Kontrolle erlangt. Suchen Sie nach der Code Cave-Methode und denken Sie beispielsweise daran, wenn Malcode in explorer.exe eingefügt wird und Sie Ihr Programm starten :-).

      Natürlich können Sie Ihren Treiber in laden Kernel, der Ihnen eine solide Kontrolle über die Code-Injection in Ihren Prozess und einen guten Schutz bietet. Die Ursache hängt jedoch von den Fähigkeiten und dem ab, was Sie schützen möchten.

Danke für deine Antwort. Ich bin weit davon entfernt, ein Experte für Winapi zu sein. Daher würde ich mich sehr freuen, wenn Sie bitte einige API-Schlüsselwörter, nach denen ich suchen kann, in jedes der Elemente Ihrer Aufzählungen von oben einfügen könnten. Im zweiten Punkt haben Sie beispielsweise die Suche nach verwaisten Speicherseiten erwähnt. Wie geht das mit Winapi?
In der obigen Aufzählung sagen Sie "Monitor ... API ..." für mehrere Winapi-Funktionen. Meinen Sie die Überwachung, indem Sie diese APIs für alle laufenden Prozesse oder auf andere Weise verknüpfen?
Sie können diese APIs in Ihrem eigenen Prozess überwachen, ohne sich auf alle Systeme erstrecken zu müssen.
peter ferrie
2014-01-20 10:45:19 UTC
view on stackexchange narkive permalink

Ein Prozess, mit dem ein Prozess das Vorhandensein injizierter Threads erkennen kann, ist die Verwendung des lokalen Thread-Speichers. Wenn ein Thread injiziert wird, werden die Thread Local Storage-Rückrufe des Hosts aufgerufen, es sei denn, der Injektor achtet darauf, dies zu deaktivieren. Wenn die Rückrufe aufgerufen werden, kann der Host die Startadresse des neuen Threads abfragen und feststellen, ob sie innerhalb des vom Host definierten Codebereichs liegt (den nur der Host kennen würde). Siehe Abschnitt Lokaler Thread-Speicher in meinem "Ultimate" Anti- Ein Beispiel hierfür ist das Papier mit den Debugging-Tricks ( http://pferrie.host22.com/papers/antidebug.pdf).

Dies erkennt zwar nicht alles (einige verwenden Malware Hohlräume innerhalb des vorhandenen Codeabschnitts des Hosts, um die Injektion durchzuführen, werden sicherlich einige Dinge erfassen.

Die kurze Antwort auf Ihre Frage lautet jedoch tatsächlich "Nein". Es gibt keine Möglichkeit für einen Prozess, in allen Fällen zu "wissen", dass etwas injiziert wurde. In den meisten Fällen ist es "Ja", aber nicht in allen.

+1 für den Hinweis auf das großartige Ultimate Anti-Debugging Tricks Paper :)
Vielen Dank für das Hinzufügen dieses zusätzlichen wurde der Überprüfung auf Code-Injection


Diese Fragen und Antworten wurden automatisch aus der englischen Sprache übersetzt.Der ursprüngliche Inhalt ist auf stackexchange verfügbar. Wir danken ihm für die cc by-sa 3.0-Lizenz, unter der er vertrieben wird.
Loading...