2017-02-13 4 views
-3

Ich möchte das tun, weil ich meine DLL zu ssss.exe oder CSRSS injizieren muss. Ich habe alle Codes in der Win32 DLL Sample src gelöscht, aber es ist nutzlos; Als ich meine DLL auf PEtools gesetzt habe, habe ich Kernel32.dll und msvcXXXX.dll bereits in der Import-Tabelle gefunden.Wie kann ich eine DLL ohne eine Import-Tabelle oder mit nur Ntdll.dll in der Import-Tabelle erstellen?

Ich habe eine Google-Suche nach "native dll" oder "keine Import-Tabelle dll" versucht, aber ich kann nichts darüber finden.

#include "stdafx.h" 
#include "Dr.h" 
BOOL APIENTRY DllMain(HMODULE hModule, 
         DWORD ul_reason_for_call, 
         LPVOID lpReserved 
        ) 
{ 
    switch (ul_reason_for_call) 
    { 
    case DLL_PROCESS_ATTACH: 
     CreateThread(NULL, 9999, &Foo, NULL, 0, NULL); 
    case DLL_THREAD_ATTACH: 
    case DLL_THREAD_DETACH: 
    case DLL_PROCESS_DETACH: 
     break; 
    } 
    return TRUE; 
} 
+1

Willkommen Überlauf zu stapeln. Bitte nehmen Sie sich die Zeit, [The Tour] (http://stackoverflow.com/tour) zu lesen und beziehen Sie sich auf das Material aus der [Hilfe] (http://stackoverflow.com/help/asking), was und wie Sie können fragen Sie hier. –

Antwort

1

Sie können die Abhängigkeit von dem CRT-DLL entfernen, indem es statische Verknüpfung (/MT Befehlszeilenschalter).

Wie für ntdll.dll und kernel32.dll, können Sie die /NODEFAULTLIB Befehlszeilenoption verwenden, vermeiden Sie keine implizite Abhängigkeit, aber bedenken Sie, dass, wenn Sie nicht mindestens ntdll.dll verknüpfen, dann gibt es keine Viel können Sie tun - die CRT wird nicht funktionieren (auch wenn sie statisch verknüpft ist, hängt sie immer noch von den Kern-Win32-DLLs ab) und Sie können keine Win32- oder NT-API verwenden (um beispielsweise CreateThread zu verwenden, benötigen Sie kernel32 .dll, die ihrerseits von ntdll.dll abhängt, für das native API-Pendant von NT - NtCreateThread - Sie brauchen nur ntdll.dll zu verwenden.

Ohne DLL das einzige, was die Verknüpfung können Sie tun, ist „plain“ Berechnung zu tun (ohne andere Bibliothek oder Systemfunktion verwendet wird), oder führen Sie „raw“ Kernel ruft die int 0x2e/sysenter Montageanleitung mit (auf 32 Bit) oder syscall (auf 64 Bit) - was im Wesentlichen reimplementiert was ntdll.dll tut.

+1

* "bedenke, dass, wenn du nicht mindestens' ntdll.dll' verlinkt, dann gibt es nicht viel, was du tun kannst "* ... das stimmt nicht, aber es ist eine schöne Lüge, Kindern zu erzählen. :-) – Mehrdad

+0

@Mehrdad: naja, natürlich kann man immer noch "rohe" syscalls durchführen (wie ich am ende der antwort gesagt habe), es ist nicht wie ntdll magisch :-) ... oder fehle ich noch etwas anderes? –

+0

Nein, ich meine nicht syscalls. NTDLL wird immer in Ihren Prozess geladen, auch wenn Sie nichts importieren. Von da an ist es nur eine Frage der Suche nach einer oder zwei kritischen Funktionen wie 'LdrLoadDll' oder' LdrGetDllhandle'. Naiv könnte man dies durch Brute-Force-Memory-Scans machen, die nach den richtigen Signaturen suchen, aber es ist tatsächlich möglich, sie auch direkt zu finden, ob Sie es glauben oder nicht. Ich werde es hier aber nicht posten. ;) – Mehrdad

1

Was Sie fordern, ist möglich, wenn Sie mit /NoDefaultLib verknüpfen, aber es löst Ihr Problem nicht, da SMSS und CSRSS das Win32-Subsystem nicht verwenden; Sie verwenden das native NT-Subsystem. Sie müssen eine native NT-DLL erstellen, wenn Sie Ihre DLL in ein natives Programm wie SMSS einfügen möchten.

Das heißt, mit CSRSS und SMSS Messing ist eine schlechte Idee, aber ich nehme an, Sie wissen, dass schon ...

Verwandte Themen