2009-05-15 3 views

Antwort

27

Die beste technische Lösung wäre, etwas zu tun, dass der Loader-Code verursacht nicht in der Lage, richtig zu laufen nach dem Prozess initialisiert. Eine Möglichkeit besteht darin, die NT-Ladersperre zu aktivieren, wodurch effektiv verhindert wird, dass eine Laderaktion stattfindet. Andere Optionen umfassen das Patchen des Loader-Codes direkt im Speicher, um Aufrufe von LoadLibrary für den Angreifer fehlzuschlagen (z. B. Einfügen eines int3-Breakpoints und Selbst-Debugging, um die erwarteten Fälle zu behandeln).

Aber sprechen als Hacker (wer verwaltet die die Website, mit der Sie tatsächlich verbunden sind), Sie werden die Leute niemals daran hindern, Code in Ihren Prozess zu bringen, auf die eine oder andere Weise. LoadLibrary ist nur eine praktische Abkürzung, aber es gibt Unmengen von verschiedenen Möglichkeiten, um Code manuell zu laden, die Sie nie hoffen könnten, ganz zu stoppen, mit Ausnahme von einigen extrem beteiligten Ring0-Code. Und selbst wenn Sie zu Ring0 gehen, sind die Hacker direkt neben Ihnen.

Auch gibt es viele legitime Verwendungen für DLL-Injektion. Themenprogramme, Eingabehilfen und verschiedene Programme, die die Betriebssystemfunktionalität erweitern, können potenziell die DLL-Injektion nutzen, um jedem Programm zusätzliche Funktionalität zu verleihen.

+0

Obwohl es wahr ist, dass es unmöglich ist ALLE Hacker zu stoppen, möchte ich nur diese drei aufgelisteten Techniken stoppen. Dies sind die meisten Befehle, und die Technik wird fast ausschließlich verwendet, aber die Mehrheit der Leechers und Script Kiddies. Just FYI, der Code ist in einer injizierten DLL, so alles, was ich tun möchte, ist sicherzustellen, dass, sobald ich drin bin, niemand sonst hinein kommen kann. –

+8

Wohlgemerkt, die Loader-Sperre ist eine globale Ressource, und sie sollte (sollte) Grund zur sofortigen Kündigung sein. – MSalters

+0

"kann jeder DLL-Injektion nutzen, um jedem Programm zusätzliche Funktionalität zu geben" - und meistens sogar abstürzen (mit dem Programm, das injiziert wird, weil der ahnungslose Benutzer für den Absturz verantwortlich gemacht wird). –

6

Der beste Weg wäre sicherzustellen, dass kein nicht vertrauenswürdiger Prozess Administratorzugriff erhält oder als das gleiche Benutzerkonto wie Ihre Anwendung ausgeführt wird. Ohne diesen Zugriff ist eine Code-Injektion in Ihre Anwendung nicht möglich. und sobald solch ein Prozess diesen Zugang bekommt, kann er alle Arten von Unfug verursachen, ohne sich in einen anderen Prozess einspritzen zu müssen - die Injektion macht es einfach, sich zu verstecken.

+1

Ja ... das ist nicht hilfreich. Wie kann ich den Prozess innerhalb des Prozesses unter einem neuen Benutzerkonto ablegen? –

1

Warum möchten Sie das verhindern? Ist es ein tatsächliches "Business" -Bedürfnis, oder sind Sie nur an einem "Hack" interessiert, um dem "Hack" entgegenzutreten?

Wenn die Benutzerrechte dies zulassen, ist es von Entwurf - das Betriebssystem bietet die Möglichkeit für alle Benutzer, die Sie, haben die Systemadministratoren den Konten zugeordnet, unter denen sie ausgeführt werden.

Raymond Chen geht hier bald zu verknüpfen ...

+7

DLL Injection ist beim Hacking von Spielen üblich. Ich spiele nur mit Möglichkeiten, das zu verhindern. Und wiederum Wege, um diese zu umgehen. Wie wäre es, wenn wir aufhören würden, die Moral der Frage in Frage zu stellen und sie stattdessen zu beantworten? –

+2

Moral überhaupt nicht in Frage stellen. Je mehr Informationen auf beiden Seiten der Gleichung verfügbar sind, desto besser. Mein Punkt war, dass die Einrichtung ein absichtlich bereitgestelltes OS-Feature ist, und daher nicht wirklich etwas ist, was "nicht passieren sollte". Jeder Versuch, sie zu verhindern, ist daher eher ein "Hack" als ein "Umgehen". Aber mein Hauptziel war es, zu bestätigen, dass man sich auf ein Wettrüsten einlässt, anstatt zu denken, dass dies normalerweise auf App-Ebene geschieht. Klar bist du, also ist das geklärt ... –

+0

Das liefert keine Antwort auf die Frage. Um einen Autor zu kritisieren oder um Klärung zu bitten, hinterlasse einen Kommentar unter seinem Beitrag. – Kcvin

0

Ich bin nicht vertraut mit der Windows-API, aber ich kann Ihnen einige allgemeinere Hinweise geben:

  1. Sehen Sie, wenn Sie Windows Data Execution Prevention (DPE) verwenden können. Es wird wahrscheinlich nicht für alle (lesen: die meisten) Situationen funktionieren, da der in Ihrem Link beschriebene Prozess vom Standpunkt des Betriebssystems aus ein gültiger Prozess ist. Verteidigung in der Tiefe obwohl

  2. Stellen Sie sicher, dass Ihre Prozessmethoden Sicherheitsberechtigungen in der gesamten Anwendung

  3. Statisch zuteilen Ihren Speicherplatz behaupten, so dass alle neuen Threads gelaicht in wird es entweder nicht oder überschreiben Speicherplatz vorhanden sind; Sie brauchen wahrscheinlich einen kräftigen Brocken der Logik, um dies zu erkennen und zu korrigieren.

  4. Factor Ihren Code in einen Gerätetreiber oder einen anderen Low-Level-Typ-Prozess, den Sie unter dem Windows-Dateischutz Regenschirm erhalten können.

Gerade gesehen Cthulon Antwort (schöner Name, btw!) Und ich fürchte, er ist wahrscheinlich richtig: Wer einen Weg, dies zu tun haben möchte Code-Injektion auf Ihre Anwendung auszuführen. Die obigen Schritte könnten es nur ein bisschen schwieriger machen.

hoffe, das hilft

1

Nur kurze Gedanken zur Diskussion :)

einen Code Höhle Mit einem CRC-Prüfung in Ihrem eigenen Code zu injizieren, wird vielleicht auch andere verlangsamen aus anderen Code Höhlen verwenden.

Das Abrufen der Prozessmodulliste nach unbekannten geladenen DLLs kann dabei helfen, Leute zu verlangsamen, die nur ein altes Ding mit angehängten Thread- und Nachrichten-Hooks injizieren.

+1

Ref: "Abfrage der Prozessmodulliste nach unbekannter DLL". Ich fühle mich, als ob ich mich in den Büschen versteckt hätte, als du vorbei gegangen bist. Ich Code injiziere aber nicht DLL injizieren, so dass Sie nichts sehen. – Joshua

2

Suchen Sie nach einer Ring3-Lösung? Wenn dies der Fall ist, möchten Sie zusätzliche Funktionen in das System einbauen, die derzeit (zumindest meines Wissens) nicht sofort zur Verfügung stehen, so dass es etwas Arbeit erfordert. Dies ist auch von einem Treiber möglich, tatsächlich werden diese Aktivitäten von den meisten Ihrer AV-Software regelmäßig ausgeführt.

Zum Beenden der oben genannten Methoden aus dem Benutzermodus wird es ein wenig komplizierter, da Sie sich nicht einfach als Rückruf für die Erstellung von Prozessen oder das Laden von DLLs registrieren können. Sie können jedoch, wenn Sie davon ausgehen, dass Ihr Prozess vor ihnen gestartet wurde, CreateRemoteThread und ähnliche Funktionen global haken und diese Art der Überprüfung selbst durchführen.

In Wirklichkeit sollten Sie überprüfen, wo CreateRemoteThread einen Thread erstellen und einen Fehler zurückgeben möchten, wenn Sie nicht zufrieden sind.

Dies würde die ersten beiden Methoden negieren. Wenn Sie bei der dritten Methode gültige Hashes des ursprünglichen Programms auf der Festplatte haben, können Sie den Hash vor dem Laden überprüfen. Wenn Sie ohne Hashes sind, könnten Sie zumindest einfach einige der einfachen Stellen überprüfen, an denen jemand diesen Code hinzufügen würde, und nach DLLs suchen, die Sie nicht erwarten (z. B. die IAT oder Strings ausführen).

Es ist nicht narrensicher, aber es scheint die gewünschte Funktionalität zu geben.

11

Wie gegen diese drei Techniken zu verteidigen:

Create

Sie können die erste Technik (Create die Loadlibrary aufruft) verhindern, indem Loadlibrary Einhaken. In Ihrem Hook überprüfen Sie eine Liste von DLL-Namen, von denen Sie wissen, dass sie Teil des Prozesses sind und die geladen werden können, oder Sie können nach einer Liste bekannter DLLs suchen, die Sie nicht laden möchten.

Wenn Sie eine DLL finden, die Sie SetLastError (ERROR_ACCESS_DENIED) nicht laden möchten, geben Sie NULL zurück. Ich setze den letzten Fehler so, dass Leute, die Code schreiben, nach einem Fehlercode suchen, einen bekommen. Dies scheint zu funktionieren, vielleicht ist ein anderer Code geeigneter.

Das wird das Laden der DLL stoppen.

SetWindowsHookEx

Ich denke, die gleiche Technik für Create Blockierung für SetWindowsHookEx wird funktionieren, aber nur, wenn Sie Ihren Haken installiert werden können, bevor die SetWindowsHookEx Technik begonnen hat seinen Code zu laden (die in der Regel ist, wenn das erste Fenster erstellt wird, in einer App - so früh in seiner Lebenszeit).

Code Cave

Schöne Technik. Das vorher nicht gesehen. Sie können sich dagegen wehren, aber Sie müssen den LoadLibrary-Einstiegspunkt (nicht die IAT-Tabelle) anhängen, da die Code Cave LoadLibrary direkt aufruft.

Wie der Autor des Artikels kommentiert - gibt es viele Möglichkeiten, wie Sie angegriffen werden können und Sie werden wahrscheinlich eine harte Zeit haben, sie alle zu besiegen. Aber oft wollen Sie nur gegen bestimmte DLL-Lasten (wie eine bestimmte 3rd-Party-DLL, die mit Ihrer Software nicht kompatibel ist, weil die 3rd-Party-DLL nicht richtig geschrieben wurde, um die Tatsache zu berücksichtigen, dass ein anderer Hook auch vorhanden sein kann, also Sie blockieren, nur verteidigen es vom Laden).

+1

Ich schreibe Haken mit CreateRemoteThread. Hooting LoadLibrary ist keine Verteidigung, da ich LoadLibrary nicht aufrufen kann. Ich habe interne Kopien der FindLibrary- und GetProcedure-Adresse im Assembly-Stub. – Joshua

4

Da dieses Plakat darauf hinweist, dass er Spiel Anti-Hacking investiert, lassen Sie mich etwas Licht auf, was ich denke. Als Ex-Betrüger.

Nur ein Zeiger über Anti-Hacking-Spiel.

Der beste Weg ist lassen Sie den Server die Kernspiel Logik laufen lassen. z.B. Kontrollieren Sie in einem Ego-Shooter die Bewegungen der Clients zum Server. Erlaube ihnen nicht, sich zufällig zu bewegen. Lassen Sie den Server den Clients mitteilen, wo jeder Player auf seiner eigenen Logik basiert. Befehle nicht immer weiterleiten. Sie könnten falsch sein.

Wen kümmert es, wenn der Hacker seinen eigenen Client hackt? lehne es einfach auf den anderen ab und alles ist gut. Für Starcraft Maphacks ist die Lösung einfach. Geben Sie keinen Gamestate für Bereiche aus, die unbekannt sein sollten. Es spart auch Bandbreite.

Ich war ein großer Betrüger in Delta Force (es ist ein altes Spiel). Der Haupttrick, den ich verwendet habe, war, sich irgendwo im Spiel zu verziehen, indem ich den Prozessspeicher direkt änderte. Keine DLL erforderlich!