1

私のexeはntdll、user32、およびkernel32に依存しています。これらの dll をローカル コピーとして保存し、最初の文字を「V」に変更します。次に、exe のインポート dll 名を、kernel32 の Vernel32.dll として編集します。アプリケーションは、vernel32.dll をローカル スペースにロードすることで正常に動作します。次に、exe のインポート dll 仕様を vtdll として ntdll として編集します。プロセスはローカルから vtdll をロードし、そのコードを実行して、vtdll 命令で _stackhash 例外をスローします。

これは、すべての Windows 依存関係をバンドルするアプリケーションを開発するために必要です。なぜ ntdll をローカル空間で実行できないのか。

4

4 に答える 4

2

いいえ!ntdll を置き換えることはできません。おそらくコードがロードされる前に、カーネルによってすべてのプロセスにマップされます。カーネルとの複雑な関係があります。すべての正しいシステム コール番号を認識しています。NT 5.1 の ntdll を使用してみると、NT 6.1 でクラッシュします。ntdll は、システム コールのエントリ コードと終了コードをホストします。カーネル ユーザー コールバック ディスパッチャ コード。カーネルがアドレスを知っているスレッド開始関数。ユーザー例外ディスパッチャー。ユーザー APC ハンドラー。私は続けることができますが、私はしません。

これらの DLL をプログラムに「バンドル」しようとしている理由がわかりません。Windows のインストールにこれらの DLL がないということはありません。セッションマネージャーとCSRがなければ、そもそもプログラムを実行する方法がわからないため、ntdll.dllの可能性はゼロです。

于 2010-07-09T12:45:08.463 に答える
2

システム DLL を「バンドル」するという考えは、お勧めできません。

まず第一に、この DLL をアプリケーションと一緒に再配布することは違法です。DLL がいくつかのグローバル オブジェクトを作成できること、および同じ DLL (vtdll.dll と ntdll.dll) の 2 つのコピーを使用することはできないことを理解する必要があります。dllのインポートをどのように変更したかを書いていません。ディスク上でこれを行うと違法であり、さらにファイルの署名が壊れます (任意の dll のファイル プロパティを開き、[デジタル署名] タブを確認します)。

システム dll のさまざまなコピーを試してみたい場合は、myapp.exe という名前のファイルを作成してDLL リダイレクトを使用することをお勧めします ( http://msdn.microsoft.com/en-us/library/ms682600.aspxを参照)。 .local ここで、myapp.exe はアプリケーションの名前です。これを行うには、いくつかのエントリを削除する必要がある場合がありますHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs。この後、コンピュータの動作が遅くなることを理解する必要があります。このような実験は、起動しなくなった場合に簡単に復元できる仮想マシン内で行うことをお勧めします。

于 2010-07-07T13:21:37.240 に答える
0

情報のおかげで。それは私がそれについて研究するのを助けました。

自分のアプリケーション用にdllをバンドルしていません。私は既存のアプリケーションに対して、Windowsクロスプラットフォームの独立したソリューションを提供するためにそれを行っています。

私はあなたが投稿したdllリダイレクト技術をすべてのアプリケーションで試しました。NTdllとUser32.dllを除くすべてのdllでうまく機能します

User32.dll: カーネルスペースではなくローカルスペースからのみuser32.dllをロードします。確認しました。ただし、その命令を実行すると、フォールトモジュール名StackHash_5964のヌルアドレスアクセス例外(c0000005)が発生します。

ntdll: アプリケーションは起動時に、system32からntdllをロードし、ローカルスペースからntdllを再度ロードします。これにより、前述のエラーが発生する可能性があります(グローバルオブジェクト共有違反)。これはntdllでのみ発生し、user32.dllでは発生しません。

ntdllを一度(ローカルスペースからのみ)ロードして、ローカルスペースのuser32.dllによって引き起こされるエラーを回避する方法はありますか?

于 2010-07-08T11:21:11.280 に答える
0

お送りいただいた参考文献を試してみましたが、結果は次のとおりです。

User32.dll

以下の機能を持つ user32.dll をビルドできませんでした。IsThreadDesktopComposited = user33.IsThreadDesktopComposited、User32InitializeImmEntry = user33.User32InitializeImmEntry リンカ エラー (未解決の外部シンボル "IsThreadDesktopComposited") が発生します。

したがって、user32.dll の 800 個の関数のうち 100 個の関数を残しました。DLLが最終的にビルドされました。次に、dll を user33.dll と共にローカル空間に配置しました。アプリケーションを実行すると、100 個の欠落した関数のプロシージャ エントリ ポイントが見つからないというメッセージが表示されます。

Ntdll.dll

既知のdllを削除してみました。ただし、変更または削除操作にはアクセスできません。私はただ読むことができました。私は管理者であり、管理者として regedit を実行しました。

ntdll または user32.dll に対してそのような実装を行うことは可能ですか。私は、繰り返し来ていると思います。ご助力いただきありがとうございます。ですが、他に何か方法やアドバイスがありましたら、よろしくお願いします。

于 2010-07-09T12:35:47.003 に答える