問題タブ [dll-injection]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
4270 参照

c++ - LoadLibraryの呼び出しでリモートスレッドが失敗し、エラー87が発生します

作成したDLLをロードし、そこから関数を実行するリモートスレッドを作成しようとしています。DLLは正常に動作しています(チェック済み)が、何らかの理由でリモートスレッドが失敗し、DLLが作成されたプロセスが応答を停止します。

ollyDebugを使用して何が問題になっているのかを確認しましたが、2つのことに気づきました...

  1. 私の文字列(dll名と関数名)がリモートスレッドに正しく渡されます
  2. スレッドはLoadLibraryでlasterrorcode87"ERROR_INVALID_PARAMETER"で失敗します

私の最善の推測は、どういうわけか、リモートスレッドがLoadLibraryを見つけることができないということです(これは、リンカーが私のプロセスを尊重して行われているためですか?、推測です...)

私は何が間違っているのですか?

これは、リモート関数のコードです。

編集:

これは、メモリをリモートプロセスに割り当てる部分です。

編集:問題は、リモートスレッドがLoadLibraryベースアドレスではなく「ガベージ」アドレスを呼び出していることのようです。リモートプロセスのLoadLibraryアドレスに間違ってリンクされている可能性のあるVisualStudioはありますか?

編集:ローカルスレッドとまったく同じコードを実行しようとすると(CreateRemoteThreadの現在のプロセスへのハンドルを使用します)、すべてが正常に機能します。これを引き起こす原因は何ですか?

呼び出し元の関数コードを追加する必要がありますか?コードが正しいパラメータを使用してリモートスレッドで実行されているため、その役割を果たしているようです...

コードはVS2010でコンパイルされます。

dataは、名前にchar*が付いた単純な構造体です。(コードで文字列を明示的に記述すると、元のプロセスへのポインタが表示されます)。

私は何が間違っているのですか?

0 投票する
1 に答える
2210 参照

windows - SetWindowsHookEx() とフックに関する質問

背景情報を少し紹介します。私は、AppInit_DLLsレジストリ エントリを介して dll インジェクション手法で使用されている dll を置き換えることに取り組んでいます。その目的は、すべてのプロセスに存在し、GDI32.dll にフックを設定して、印刷に関する情報を収集することでした。これは、私たちが望むものを手に入れるための一種のファンキーな方法です。.dll 自体は 10 年以上前のもの (Visual Studio 97 で記述) であり、挿入された dll よりも少し侵襲性の低いものに置き換えたいと考えています。

おそらく私たちがSetWindowsHookEx()探しているもののようです。私はそれでいくつかの問題を抱えていましたが、このツリーが吠える価値があるかどうかについて同僚と話し合ったこともあります. 以下は、特定できなかったいくつかの質問です。

  1. たとえばStartDoc()GDI32.dll などの DLL からルーチンをフックすると、他のプロセスがその DLL からそのルーチンを使用するたびに通知を受け取るのでしょうか? これは、注入された .dll で取得していた機能の一種であり、今後も同じ機能が必要です。

  2. フックがトリガーされると、フック処理手順は、実際の呼び出しを開始したプロセスのプロセス空間で実行されますか?それとも、フックをセットアップしたプロセスのプロセス空間で実行されますか? 私の意見では、ルーチンを呼び出したプロセスのプロセス空間で実行する必要があります。たとえば、プログラムが呼び出す場合StartDoc()GDI32.dll から、フック処理プロシージャ コードがそのスペースに「注入」され、実行されます。それ以外の場合は、呼び出しプロセスとフックをセットアップするプロセスとの間で自動的にセットアップされるプロセス間通信が必要になりますが、そうではないと思います。また、このフック処理ルーチンが呼び出しプロセスのプロセス空間で実行される必要があるのは、それが知る必要があることの 1 つはその呼び出しプロセスの名前であるためです。実際にはそのプロセスで実行されていませんでした。

  3. フック処理ルーチンが .NET 管理環境を使用して記述されている場合、.NET 管理環境を利用していないプロセスにフックされると壊れますか? ここで C++ から離れて C# を使用したいのですが、管理されていないプロセスからフックが呼び出されたらどうなるでしょうか? 前に述べたように、フック処理手順は、フックされたルーチンを最初に呼び出したプロセスで実行されると思います。しかし、これが本当なら、このプロセスが .NET ランタイム環境を使用していないのに、着信フック処理コードが使用していると問題が発生すると思います。

0 投票する
3 に答える
9023 参照

dll - AppInit_DLLs を使用した単純な DLL インジェクションが機能しない。DllMain() が呼び出されない

可能な限り単純なインジェクション DLL を作成しました。コード全体は次のとおりです。

超シンプルでしょ?まあ、私はこれを機能させることさえできません。このコードは dll にコンパイルされ、[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs] の下のレジストリにこの dll へのパスを配置しました。また、LoadAppInit_DLLs レジストリ値が 1 に設定されていることにも言及する必要があります。これを行うことで、他のアプリケーション (notepad.exe など) を起動したときに "D:\test.txt" ファイルが表示されることを期待していますが、表示されません。理解できません。非常に古く、Visual Studio '97 で記述された別の .dll があります (これを置き換えようとしています)。これは、AppInit_DLLs をそれを指すように設定し、任意のアプリケーションを開始すると正常に動作します。他のアプリケーションが開始されたときにロードされていることがわかります。

ここで何が起こっているのかわかりませんが、これはうまくいくはずですか?これ以上簡単なことはありません。私はVS 2010を使用しています。すべてのアカウントで、非常にプレーンなJane .dllを作成したと思うので、プロジェクトの設定がうまくいかないとは思いませんが、それについては完全にはわかりません。ここで何が欠けていますか?


設定情報

  • OS:Windows7 64ビット
  • OS バージョン: 6.1.7601 サービス パック 1 ビルド 7601
  • IDE: ビジュアル スタジオ 2010
  • IDE バージョン: 10.0.40219.1 SP1Rel
0 投票する
4 に答える
3685 参照

hook - Win32は、「任意のCPU」に対して構築されたアプリケーションへのDLLインジェクションをフックします

すべてのユーザー インタラクションをキャプチャするプロジェクトに取り組んでいます。MSDN は (これ)を伝えます

SetWindowsHookEx を使用して、DLL を別のプロセスに挿入できます。32 ビット DLL を 64 ビット プロセスに挿入することはできず、64 ビット DLL を 32 ビット プロセスに挿入することもできません。アプリケーションが他のプロセスでフックを使用する必要がある場合、32 ビット アプリケーションは SetWindowsHookEx を呼び出して 32 ビット DLL を 32 ビット プロセスに挿入し、64 ビット アプリケーションは SetWindowsHookEx を呼び出して 64 ビット DLL を挿入する必要があります。 DLL を 64 ビット プロセスに変換します。

私の質問は、アプリケーションが に対して構築された場合はどうなるかということですAny CPUSetWindowsHookExに対してビルドされた DLLから呼び出す必要がありますかAny CPU

HookFunctions_32.dll (x86 の両方) をロードする HookLogger_32.exe と、HookFunctions_64.dll (x64 の両方) の設定WH_CBTWH_MOUSEグローバル (特定のスレッドではない) をロードする HookLogger_64.exe を作成しました。

HookLogger_32.exe、HookLogger_64.exe、HookFunctions_32.dll、および HookFunctions_64.dll は C++ で記述されています。

に対してビルドされた .NET アプリケーションをクリックするとAny CPU、これらの DLL が ( を介してSetWindowHookEx) 挿入されます。Windows OS がハングアップし、マシンを強制的に再起動する必要があります。

同じ .NET アプリケーションが x86 または x64 に対してビルドされ、HookLoggers (32 ビットと 64 ビットの両方) が開始された後にアプリケーションをクリックすると、すべて正常に動作します。

この未定義の動作の理由。

私が作業しているプラ​​ットフォームは 64 ビット マシンです。

0 投票する
2 に答える
831 参照

visual-c++ - WinAPIのmouse_event呼び出しの検出

マウスが人間によって動かされているのか、User32SendInput関数を呼び出す別のプロセスによって動かされているのかを判断するプログラムを作成したいと思います。SendInputが呼び出されたことを検出するためにdllインジェクションを使用することはおそらく可能だと思いましたが、これについての経験はありません-これは可能ですか?

どうもありがとう。

0 投票する
1 に答える
1856 参照

windows - 注入されたDLLがホストプロセスをクラッシュさせるのはなぜですか?

私のソフトウェアの新しいリリースのベータテストで、何人かのユーザーがアプリの実行時に例外を報告しました。どちらの場合も、「アプリケーションを正しく起動できませんでした(0xc0000142)」です。私もそれを0xc0000005として見ました。このエラーのあるローカルシステムも見つかりました。デバッガーで実行すると、「datamngr.dll」にアクセス違反があり、ヒープへの割り当てに失敗しました。「datamngr.dll」がスパイウェアであり、システムのAppInitにあるようにロードされていることをすぐに発見しました。

AppInit regキーをクリアすると、この問題は解消されました。Process Monitorを介してチェックアウトしましたが、このDLLが挿入されるたびに、アプリケーションがクラッシュしました。ひどく書かれたスパイウェアだと思っていましたが、それ以来、他のDLLが同じことをしているのを見つけました(正規のソフトウェアであるacaptuser32.dllなど)。私にとって奇妙なのは、私のソフトウェアの以前のバージョンがクラッシュしないことです。2つのバージョンの間には多くの変更が加えられているため、それが何であるかを判断するのは困難です。

ここからどこから始めればいいですか?一部のオンライン探索では、FirefoxなどのアプリがLoadLibraryに取って代わり、DLLが挿入されないようにブラックリストに登録しています。しかし、もっと基本的なことから始めたいと思います。以前はクラッシュしなかったのに、なぜアプリケーションがクラッシュするのでしょうか。

これは非常に曖昧だと思いますが、それはかなり避けられません。私が間違って行っているプロジェクトのプロパティに明らかな何かがあることを願っています。ASLRのオンとオフ、DEPのオンとオフを試しました... user32.dllの遅延ロードを試し、LoadLibrary(エラーを無視するようにSetErrorModeを設定)を介して手動でロードしましたが、何も機能しません。これは、WindowsXPおよびWindows7(32ビットおよび64ビット)で発生します。

どこから始めればよいかについてのポインタをいただければ幸いです。他の詳細が必要な場合は、できるだけ多くの情報を提供します。

乾杯

0 投票する
1 に答える
249 参照

c++ - ウィンドウの作成をフックします。フックがトリガーされない

基本的に、挿入された DLL を介してプロセスのメモリ内にいるので、ウィンドウの作成を停止したいと考えています。私は以下をフックしようとしました:

  • CreateWindowExW
  • CreateDialogParamW
  • DialogBoxParamW

残念ながら、破棄したいウィンドウを作成しても、フックがトリガーされません。前述のウィンドウ内にはいくつかの IE コントロールがあり、それらに対して CreateWindowExW 呼び出しがヒットしています。しかし、私が望む実際のウィンドウではありません。これは単純なポップアップ ボックスであり、Spy++/Window Hack で表示されるので、実際のウィンドウであると確信しています。

何か案は?

0 投票する
2 に答える
8563 参照

c++ - インジェクトされた DLL で関数を呼び出す

作成したインジェクトされた DLL のリモート プロセスで関数を呼び出したい。

DLL に以下を正常に注入しました。

DllMain が実行され、DLL がスタンバイ モードで実行されます。私がやりたいことは、何らかの作業を行うために、リモートでロードされた DLL を何らかの方法で呼び出すことです。

次のように関数をエクスポートしようとしました:

次に、次のように関数を実行します。

しかし、それはクラッシュを引き起こします。

どうすればこれを解決できますか?

0 投票する
3 に答える
5792 参照

c++ - 迂回路とのWinsockrecvフッキング

Winsock 2.0recv関数を使用するアプリケーションがあり、たとえばRedox Packet Editorで出力をキャッチできます。これにより、バージョンが2.0であることが確認されます。

関数をフックするための次のコードがあります。

の場合send、すべてが完全に機能しますが、の出力は得られませんrecv。Winsockの1.1バージョンを使用して別のアプリケーションで試しましたが、問題なく動作します。WSARecv、WSARecvExを運がなくフックしようとしました。

WinAPIOverride32でアプリを確認したところ、recv関数を使用していることが明確に示され、使用状況が正常にログに記録されました。WinsockPacketEditorもデータをよく読み取っています。

何か案は?

0 投票する
1 に答える
1562 参照

c++ - DLL を挿入すると、Explorer.exe が起動時にデッドロックする

ユーザーが Windows にログオンするたびに ( HKCU\Software\Microsoft\Windows\CurrentVersion\Runレジストリ パスを使用して) レジストリの "run" キーを使用してプログラムを自動的に実行します。私のアプリケーションは、 Command Line DLL-Injector
を使用して、explorer.exe プロセスに DLL を挿入することから始めます。

ユーザーがログインするたびに (Windows の再起動後) - アプリケーションが実行され、DLL が explorer.exe に挿入されます。

場合によっては機能しますが、ほとんどの場合 (タイミングの問題で、ほとんど再現されません)、インジェクターと explorer.exe プロセスの両方がデッドロック状態になり、応答しません。
よくわかりませんが、プロセスが既に別の DLL をロードしている (つまりロックされている) 間に、インジェクターがプロセスに DLL を挿入しようとしている (そして、そうしている間は中断している) ために発生すると思います。そうすれば、両方のプロセスがロックされます ==> デッドロック。

DLL が実際にプロセスに挿入される前にデッドロックが発生することはわかっています。

誰もそれを回避する方法を知っていますか? 注入する前に、explorer.exe の状態を照会することはありますか? エクスプローラーが安定するのを待ってください。もしそうなら - どうすればそれを行うことができますか?

ありがとう