問題タブ [createremotethread]
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.
windows - CreateRemoteThread は舞台裏でどのように機能しますか?
CreateRemoteThread は実際にリモート スレッドを作成するために何をしますか?
c# - CreateRemoteThread からの DllImport コマンドの実行
Msg
という名前のdllからインポートされたという名前の関数がありますtier0.dll
。私はDllImport
これで問題ありませんが、コマンドは、DLLがMsgコマンドを完了することができる別のプロセスに接続されている場合にのみ機能します。を使用すると、コマンドを完了するために必要なアタッチされたプロセスの変数にアクセスできるようにしながら、C# を使用してCreateRemoteThread
呼び出すことができますか? Msg
ありがとう!
c++ - DLL注射。パラメータで CreateRemoteThread を実行する
問題なく動作するdllインジェクションプログラムを作成しました。dll をリモート プロセスにロードし、何らかの関数を呼び出します。今、私はその関数に引数を渡したいです。CreateRemoteThread にはそのための lpParameter がありますが、関数で使用するために dll 内で渡された引数を取得する方法は?
更新: dll エントリ ポイントは一般的です:
DLL には、次のプロトタイプを持つ関数が 1 つだけ含まれています。
その関数を呼び出すコードは次のとおりです。
ご覧のとおり、TestFunction 内で「テスト」文字列を渡そうとしています。しかし、その後、いくつかのゴミが含まれている TestFunction 内の ua 引数をチェックします。
プロジェクト ファイル全体は次のとおりです。
http://pastebin.com/gh4SnhmV
http://pastebin.com/Sq7hpSVx
http://pastebin.com/dvgXpUYz
更新 2
TestFunction には特定のプロポタイプが必要ですか、それとも LPVOID タイプのパラメーターが 1 つしかない限り、どれでも使用できますか? よくわかりません。注入された dll の関数を引数で呼び出す方法の例を教えてもらえますか?
windows - メモリアドレスをパラメータとしてリモート関数を実行
実行中の (古い) Win32 Borland アプリケーションで関数を実行しようとしています (ウィンドウにはクラス OLW_WINDOW があります)。OllyDbg を使用することで、関数にはメモリ アドレスである 1 つのパラメーターがあることがわかりました。関数によって使用される 1 つの変数/値は、そのアドレスのオフセットに格納されます。私の考えは、そのメモリアドレス(メモリブロックの一定のオフセットにある)を見つけ、変数/値を必要なものに変更してから関数を実行することです。WriteProcessMemory と CreateRemoteThread を使用して実行するのは問題ありませんが、問題はメモリ アドレス/ブロックを見つける方法ですか? OllyDbg で「メモリ マップ」を開くと、メモリ ブロックに所有者、セクション、または内容がありません。指定したスレッドによって作成されたメモリ ブロックの一覧を取得することはできますか? または、どうにかしてアプリケーションから取得できますか? ところで:
winapi - ASLR は DLL インジェクションでアドレスに摩擦を引き起こしますか?
私は DLL インジェクション手法について読んでいましたが、この質問を念頭に置いていました。
kernel32.dll に対して ASLR が有効になっている Windows 7 の宛先プロセスに DLL を挿入するとします。
したがって、注入されたコードのどの部分も winapi またはシステム コールを使用できません。これは、インジェクター コードの loadLibrary 関数のアドレスが宛先プロセスの loadLibrary のアドレスと異なるためです。
したがって、そのような呼び出しは機能しCreateRemoteThread
ません:
この推論が間違っている場合は訂正してください。
c++ - LoadLibraryの呼び出しでリモートスレッドが失敗し、エラー87が発生します
作成したDLLをロードし、そこから関数を実行するリモートスレッドを作成しようとしています。DLLは正常に動作しています(チェック済み)が、何らかの理由でリモートスレッドが失敗し、DLLが作成されたプロセスが応答を停止します。
ollyDebugを使用して何が問題になっているのかを確認しましたが、2つのことに気づきました...
- 私の文字列(dll名と関数名)がリモートスレッドに正しく渡されます
- スレッドはLoadLibraryでlasterrorcode87"ERROR_INVALID_PARAMETER"で失敗します
私の最善の推測は、どういうわけか、リモートスレッドがLoadLibraryを見つけることができないということです(これは、リンカーが私のプロセスを尊重して行われているためですか?、推測です...)
私は何が間違っているのですか?
これは、リモート関数のコードです。
編集:
これは、メモリをリモートプロセスに割り当てる部分です。
編集:問題は、リモートスレッドがLoadLibraryベースアドレスではなく「ガベージ」アドレスを呼び出していることのようです。リモートプロセスのLoadLibraryアドレスに間違ってリンクされている可能性のあるVisualStudioはありますか?
編集:ローカルスレッドとまったく同じコードを実行しようとすると(CreateRemoteThreadの現在のプロセスへのハンドルを使用します)、すべてが正常に機能します。これを引き起こす原因は何ですか?
呼び出し元の関数コードを追加する必要がありますか?コードが正しいパラメータを使用してリモートスレッドで実行されているため、その役割を果たしているようです...
コードはVS2010でコンパイルされます。
dataは、名前にchar*が付いた単純な構造体です。(コードで文字列を明示的に記述すると、元のプロセスへのポインタが表示されます)。
私は何が間違っているのですか?
winapi - ERROR_ACCESS_DENIED を返す CreateRemoteThread - Windows 7 DLL インジェクション
CreateRemoteThread
dll を挿入するために使用するプログラムを作成しようとしています。
問題は、CreateRemoteThread が動作を拒否していることです。GetLastError() は、ERROR_ACCESS_DENIED である 5 を返しています。理由がわかりません!
私はこのビデオhttp://www.youtube.com/watch?v=H3O3hmXkt1Iから作業しています。
かなりの量のグーグルの後、これが機能しない理由を見つけることができません。
CreateRemoteThread は Windows 7 では機能しませんか? もしそうなら、私は明らかな間違いを犯しましたか?
multithreading - Win32 プロセス内で実行される最初のスレッドは「プライマリ スレッド」ですか? セマンティクスを理解する必要がある
CreateProcess()
withを使用してプロセスを作成し、リモート プロセス内に小さなコード パッチを作成して DLL をロードし、関数(CREATE_SUSPENDED
その DLL によってエクスポートされた) を呼び出します。コードで。VirtualAllocEx()
..., MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE
WriteProcessMemory()
FlushInstructionCache()
その後、CreateRemoteThread()
呼び出してそのコードを呼び出し、hRemoteThread
. リモート コードが意図したとおりに動作することを確認しました。注:LoadLibrary()
このコードは単純に戻ります。と以外の API は呼び出しませんGetProcAddress()
。その後、エクスポートされたスタブ関数を呼び出します。この関数は、現在は単純に値を返し、スレッドの終了ステータスとして渡されます。
PROCESS_INFORMATION::hThread
ここで、奇妙な観察が行われます。 がまだ中断されていることを思い出してください。の終了コードを単に無視hRemoteThread
し、それが終了するのを待たない場合、すべてが「正常」になります。呼び出したルーチンがCreateRemoteThread()
戻っPROCESS_INFORMATION::hThread
て再開され、(リモート) プログラムが実際に実行されます。
ただし、次のことを呼び出すWaitForSingleObject(hRemoteThread, INFINITE)
か実行すると(同じ効果があります):
これが続くと、再開される前CloseHandle()
に終了し、プロセスは単に「消えます」。プロセスを停止させずに何とか終了させれば十分です。hRemoteThread
PROCESS_INFORMATION::hThread
hRemoteThread
PROCESS_INFORMATION::hThread
これは、競合状態のように疑わしく見えます。コードをそのままにしても、特定の状況下でhRemoteThread
はまだ高速であり、プロセスが「消える」可能性が高いからです。
これは、プロセス内で最初に実行されるスレッドが自動的にプライマリ スレッドになり、そのプライマリ スレッドには特別なルールがあることを意味するのでしょうか?
特定のスレッドが終了したときではなく、最後のスレッドが終了したときにプロセスが終了するという印象を常に受けていました。
また、注意してください:単純に戻り、戻るのを待っている間はまだ中断されているExitProcess()
ため、ここに関与する呼び出しはありません。hRemoteThread
PROCESS_INFORMATION::hThread
hRemoteThread
これは、Windows XP SP3、32 ビットで発生します。
編集: Sysinternals Process Monitor を試して何が起こっているのかを確認したところ、以前からの観察結果を確認できました。挿入されたコードはクラッシュなどしません。代わりに、コードが挿入されたプログラムを閉じる前に、スレッドを待機しないとスレッドが終了しないことがわかります。への電話をCloseHandle(hRemoteThread)
延期するか何か考えています...
編集 + 1:ではありませんCloseHandle()
。テストのためだけにそれを省略した場合、スレッドが終了するのを待っているときの動作は変わりません。
c++ - CreateRemoteThread:メモリ管理
CreateRemoteThread関数のLPVOID lpParameter
パラメーターについて疑問に思っています。プロセスはメモリを共有しないため、リモートスレッドはプロセス内の構造体にアクセスできません。それで、関数はパラメーターをコピーしてそれを独自に管理しますか、それともVirtualAllocExでメモリを割り当ててから、 WriteProcessMemoryを呼び出して構造体をリモートプロセスに実際にコピーする必要がありますか?