2017-02-13 1 views
-3

私はsmss.exeまたはcsrssに自分のdllを注入する必要があるので、これを実行したいと思います。 Win32 DLLサンプルsrcのすべてのコードを削除しましたが、役に立たないです。 PEtoolsにDLLを置くと、インポートテーブルにkernel32.dllとmsvcXXXX.dllが見つかりました。インポートテーブルなしで、またはインポートテーブル内のNtdll.dllだけで、DLLを作成するにはどうすればよいですか?

"native dll"または "no import table dll"のGoogle検索を試しましたが、それについて何も見つかりませんでした。

#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

ようこそスタックオーバーフローすることを知っていると仮定しています。 [The Tour](http://stackoverflow.com/tour)を読み、[ヘルプセンター](http://stackoverflow.com/help/asking)の資料を参考にしてください。ここに聞いてください。 –

答えて

1

あなたは静的(/MTコマンドラインスイッチ)、それをリンクすることにより、CRTのDLLから依存関係を削除することができます。

ntdll.dllとkernel32.dllに関しては、/NODEFAULTLIBコマンドラインスイッチを使用することができます。暗黙的な依存関係は避けてください。少なくともntdll.dllを明示的にリンクしないと、 (たとえ静的にリンクされていても、Win32の中核となるDLLに依存していても)CRTは機能しません.Wy32やNT APIを使用することはできません。例えば、CreateThreadを使用するには、kernel32 .dllはntdll.dllから依存します; NTネイティブAPIの場合はNtCreateThread - ntdll.dllが必要です。

.dllをリンクせずに行うことができるのは、他のライブラリやシステム機能を使用せずに「プレーン」計算を行うこと、またはint 0x2e/sysenterアセンブリ命令(32またはsyscall(64ビット) - 本質的にはntdll.dllの機能を再実装しています。

+1

* "明示的に少なくともntdll.dllをリンクしていないと、あなたができることはあまりありません" * ...実際にはそうではありませんが、子供に伝えるのはうれしい嘘です。 :-) – Mehrdad

+0

@Mehrdad:もちろん、あなたはまだ生のシステムコールを実行することができます(私が答えの最後に言ったように)、ntdllは魔法のようなものではありません:-) ...または何か他のものが欠けていますか? –

+0

ナー、私はsyscallsを意味しません。何もインポートしなくても、NTDLLは常にプロセスにロードされます。そこからは、LdrLoadDllやLdrGetDllhandleのような重要な関数を見つけることができます。純粋にあなたは、正当な署名を探してブルートフォースメモリスキャンでこれを行うことができますが、それを実際に直接見つけることも、信じることもそうでないことも実際に可能です。私はここに投稿しません。 ;) – Mehrdad

1

/NoDefaultLibとリンクしても、SMSSとCSRSSはWin32サブシステムを使用しないため、問題は解決しません。ネイティブNTサブシステムを使用します。 SMSSのようなネイティブプログラムにDLLを置く場合は、ネイティブのNT DLLを作成する必要があります。 CSRSSとSMSSいじり、言っ

は悪いアイデアですが、私はあなたがすでに...

関連する問題