2016-07-14 23 views
-2

Ich habe versucht, die DLL-Datei "bcryptprimitives.dll" (die in meinem Fall ursprünglich sitzt unter "C: \ Windows \ syswow64 \ bcryptprimitives.dll") von einem anderen Ort, mit diesem Code-snippet:STATUS_INVALID_IMAGE_HASH (0xc0000428) auf gültige PE-Dateien

LoadLibraryW(L"<altered path>\\bcryptprimitives.dll"); 

jedoch direkt nach dieser Zeile Code ausführen bekomme ich folgende Fehlermeldung:

enter image description here

C: \ Program Files (x86) \ Notepad ++ \ bcryptprimitives.dll ist entweder nicht entworfen, um unter Windows zu laufen, oder es enthält einen Fehler. Versuchen Sie, das Programm erneut auf dem ursprünglichen Installationsmedium zu installieren, oder wenden Sie sich an den Systemadministrator oder den Softwarehersteller, um Unterstützung zu erhalten. Fehlerstatus 0xc0000428.

Ich suchte den 0xc0000428 NTSTATUS im folgenden Wörterbuch: https://msdn.microsoft.com/en-us/library/cc704588.aspx und anscheinend dieser Status bedeutet STATUS_INVALID_IMAGE_HASH.

Der Fehler zuerst macht Sinn, weil ich das "LoaderFlags" -Feld in der Image-PE-Header von 0x00000000 zu 0x00000001 geändert hat (was nichts zu beeinflussen hat, weil dieses Feld veraltet ist), aber obwohl ich geändert habe Feld, reparierte ich die PE-Prüfsumme.

enter image description here

Wie Sie sehen können: enter image description here

jedoch Loadlibrary weigert sich immer noch die DLL zu laden. Tauchen tief in ntdll zeigt, dass der Fehler von Kernel zurückgegeben:

enter image description here

Es lässt mich denken, dass die DLL irgendwie unterzeichnet und die Kernel überprüft, ob die DLL geändert wurde. Also zu meinem Punkt, wie kann ich diese DLL sowieso von einem anderen Ort laden und die Zeichenprüfung entfernen?

+1

Warum fühlen Sie sich verpflichtet, dies zu tun? Wäre es nicht einfacher, sich an das System anzupassen, anstatt es zu unterlaufen? –

+0

@DavidHeffernan, das ist der ganze Spaß daran. Ich arbeite in einem Unternehmen, das einzigartige Sicherheitslösungen entwickelt, die nur durch Subversion des Systems implementiert werden können. – Aviv

+0

Riecht wie Malware –

Antwort

4

Wenn eine DLL signiert ist, wird durch das Ändern eines einzelnen Bytes in der Datei die Signatur ungültig. Es scheint, dass Sie genau das tun, indem Sie den PE-Header ändern.

This blog post könnte für einen tieferen Einblick von Interesse sein, wie diese Technik funktioniert:

Code Integrity is a feature that improves the security of the operating system by validating the integrity of a driver or system file each time it is loaded into memory. Code Integrity detects whether an unsigned driver or system file is being loaded into the kernel, or whether a system file has been modified by malicious software that is being run by a user account with administrative permissions. On x64-based versions of the operating system, kernel-mode drivers must be digitally signed.

1

Gefunden eine schnelle Lösung:

DWORD dwIndex = 0; 

hFile = CreateFileW(L"C:\\Program Files (x86)\\Notepad++\\bcryptprimitives.dll", FILE_READ_DATA | FILE_WRITE_DATA, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 

while (ImageRemoveCertificate(hFile, dwIndex)) 
{ 
    ++dwIndex; 
} 

LoadLibraryW(L"C:\\Program Files (x86)\\Notepad++\\bcryptprimitives.dll"); 

Es ist wie ein Zauber funktioniert :)

So funktioniert die API:

    1. Berechnen Sie den Versatz des Endes des letzten Abschnitts.
    1. Entfernen Sie alle Daten, die diesem Abschnitt folgen.
    1. Entfernen Sie das Sicherheitsdatenverzeichnis.
    1. Verkleinern Sie das Bild.
    1. Berechnen einer aktualisierten Prüfsumme des PE.
+1

Was ist der Zweck dieses Codes? Sie behaupten, Sicherheitsforschung zu betreiben, aber Sie scheinen es von der anderen Seite der luftdichten Luke aus zu tun. Wenn Sie dazu berechtigt sind, haben Sie das System bereits angemeldet. Warum sollten Sie mit dem Entfernen von Zertifikaten herumhantieren, wenn Sie nur beliebigen Binärcode direkt ausführen können? –

+0

@CodyGray, weil ich keine Malware entwickle wie die Leute hier denken. – Aviv