C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: CreatRemoteThreadについて


(過去ログ 96 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■57578 / inTopicNo.1)  CreatRemoteThreadについて
  
□投稿者/ コウ (1回)-(2011/03/05(Sat) 12:31:21)

分類:[C++/CLI] 

C++/CLI VS2010を使用して
CreatRemoteThreadとWriteProcessMemoryを使って、他プロセスにコードを割り込ませようとしています。
以下、某サイトを参考に作ってみたソースです(一部簡略化)

//割り込ませるデータ構造体
//
typedef struct
{
	public:
			HANDLE pHandle;
			DWORD CodeAddress;
			DWORD DataAddress;

			PDWORD pCodeRemote;
			PDWORD pDataRemote;
}TestData , *pTestData;

//割り込ませたい関数です
//
static DWORD WINAPI Test(pTestData pData)
{
         PDWORD rSize;
	WriteProcessMemory(pData->pHandle, (LPVOID)pData->CodeAddress, &pData->DataAddress, sizeof(pData->DataAddress), rSize);
	return 0;
}

static void AfterTest (void) {
}

//
void Form1::TestCode()
{
	TestData TData;
	TData.pHandle = OpenProcess(PROCESS_CREATE_THREAD | PROCESS_QUERY_INFORMATION | PROCESS_VM_OPERATION | PROCESS_VM_WRITE | PROCESS_VM_READ, false, ProcessID);
	TData.CodeAddress = DataA; //変数の中身はwriteprocessmemoryで書き換えたいアドレス
	TData.DataAddress = DataB; //変数の中身はwriteprocessmemoryで書き換えたいデータ
	HANDLE hThread = NULL;
	DWORD dwLen;
	TData.pDataRemote = (PDWORD) VirtualAllocEx( TData.pHandle, 0, sizeof(TData), MEM_COMMIT, PAGE_READWRITE );
	WriteProcessMemory( TData.pHandle, TData.pDataRemote, &TData, sizeof(TestData), &dwLen ));
	const int cbCodeSize = ((LPBYTE) AfterTest - (LPBYTE) Test);
	TData.pCodeRemote = (PDWORD) VirtualAllocEx( TData.pHandle, 0, cbCodeSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE );		
	WriteProcessMemory( TData.pHandle, TData.pCodeRemote, &Test, cbCodeSize, &dwLen ));
	DWORD OldAcces = 0;
	PDWORD rSize = 0;
		
	hThread = CreateRemoteThread(TData.pHandle, NULL, 0, 
			(LPTHREAD_START_ROUTINE) TData.pCodeRemote,
			TData.pDataRemote, 0 , &dwLen);
				
	WaitForSingleObject(hThread, 500);

	if ( TData.pDataRemote != 0 )
		VirtualFreeEx( TData.pHandle, TData.pDataRemote, 0, MEM_RELEASE );

	if ( TData.pCodeRemote != 0 )
		VirtualFreeEx( TData.pHandle, TData.pCodeRemote, 0, MEM_RELEASE );

	if ( hThread != NULL )
		CloseHandle(hThread);

	CloseHandle(TData.pHandle);
}
エラーの発見処理なんかは省きました。
コンパイルエラーは出ていません。
他プロセスにメモリは取得するのとそこに書き込む関数は共に成功しています。
CreatRemoteThreadを実行後、対象プロセスがクラッシュします。
割り込ませた関数に問題があるのかと思い、空の関数
static void Test2(){}
を割り込ませても同じ状態です。

解決の糸口が見つからず困っています。
どなたかお知恵をお貸しください。よろしくお願いします。

引用返信 編集キー/
■57580 / inTopicNo.2)  Re[1]: CreatRemoteThreadについて
□投稿者/ オショウ (579回)-(2011/03/05(Sat) 15:04:40)
No57578 (コウ さん) に返信
> CreatRemoteThreadを実行後、対象プロセスがクラッシュします。

  素人がそういう危ないことをするもんじゃ〜ないかと。

  API HOOK 等、アンドキュメント的なことを行うならば
  それなりの知識が無いと、いくら他人に教えられてできてしまっても
  後でOSクラッシュや2度と起動できないようなことになってしまう
  危険性をはらんでいるので。

  英語圏サイトなら、その辺の情報がゴロゴロしているので、ご自身の
  責任において、調べて頑張って下さい。

※ ヒントと言えば・・・
  CLI は使わない!MFCも使わない!

以上。
引用返信 編集キー/
■57587 / inTopicNo.3)  Re[1]: CreatRemoteThreadについて
□投稿者/ とっちゃん (565回)-(2011/03/05(Sat) 20:40:37)
とっちゃん さんの Web サイト
No57578 (コウ さん) に返信

オショウさんも書いてますが、C++/CLI では書けません。
理由は、C# でグローバルフックができないのと同じです。



一応。
MFCはスタティックリンクしている or 使ってるDLLのバージョンが同じものであると保証できる
なら使えます。

個人的にはグローバルフックや、スレッド割り込みさせるようなモジュールは、ランタイムを極小化して作ることをお勧めします。

...経験者よりw

引用返信 編集キー/
■57592 / inTopicNo.4)  Re[2]: CreatRemoteThreadについて
□投稿者/ オショウ (580回)-(2011/03/06(Sun) 01:38:03)
> MFCはスタティックリンクしている or 使ってるDLLのバージョンが同じものであると保証できる
> なら使えます。

  ええ〜と・・・
  スタック大量に消費する場合はNG

  回避策は当然あるけど、高級言語にのっかっている程度なら無理
  食いつくアプリが何で製作されているかにも依存しますので、容
  易く動く場合と、クラッシュしまくりになる場合と・・・

  昔はSoftICE 使ってよくデバッグしたものです・・・

※ さて何年前かネ〜懐かしい話。(余談でした)

以上。参考まで
引用返信 編集キー/
■57594 / inTopicNo.5)  Re[3]: CreatRemoteThreadについて
□投稿者/ とっちゃん (566回)-(2011/03/06(Sun) 10:25:03)
とっちゃん さんの Web サイト
No57592 (オショウ さん) に返信
>   ええ〜と・・・
>   スタック大量に消費する場合はNG
>
この場合は、MFCとか関係なしにNGのような。。。w

16bitのころは、MFCアプリにするってだけでスタックサイズを調整しないと
普通の操作でもスタックオーバーフローで落ちたりしたけどw
#もちろん割り込みでも再帰でもないw


>   昔はSoftICE 使ってよくデバッグしたものです・・・
>
うちもその昔ICEの導入を迫られたことがあります。当時はリモートデバッグできるのが
それくらいしかなかった。。。というのが主な理由ですがw
まぁ結局は入れる前に問題個所が特定できて入れずじまいでしたけどw

あの当時のハードベンダーさんは本当に厳しかったなぁ。。。

> ※ さて何年前かネ〜懐かしい話。(余談でした)
>
たぶん3ケタはいってないと思います<おい!

引用返信 編集キー/
■57606 / inTopicNo.6)  Re[4]: CreatRemoteThreadについて
□投稿者/ コウ (2回)-(2011/03/06(Sun) 21:55:23)
オショウさん、とっちゃんさん、ありがとうございました。
C++/CLIでは不可能と分かっただけでも一歩前進です。
自己責任でもう少し調べてみようと思います。
解決済み
引用返信 編集キー/
■57619 / inTopicNo.7)  Re[2]: CreatRemoteThreadについて
□投稿者/ 渋木宏明 (62回)-(2011/03/07(Mon) 11:15:35)
渋木宏明 さんの Web サイト
> 理由は、C# でグローバルフックができないのと同じです。

.NET4 以降なら…
引用返信 編集キー/
■57651 / inTopicNo.8)  Re[3]: CreatRemoteThreadについて
□投稿者/ とっちゃん (567回)-(2011/03/07(Mon) 18:57:14)
とっちゃん さんの Web サイト
No57619 (渋木宏明 さん) に返信
>>理由は、C# でグローバルフックができないのと同じです。
>
> .NET4 以降なら…

これって、接続先が...ではないの?
真面目に調査してないのもあってわかってないところが多いんですが...w

フックしたい側(接続元)が .NET 4 なら、フックされる側(接続先)でどの .NET Framework が動いていても問題ない?

引用返信 編集キー/
■57661 / inTopicNo.9)  Re[4]: CreatRemoteThreadについて
□投稿者/ 渋木宏明 (63回)-(2011/03/07(Mon) 22:54:05)
渋木宏明 さんの Web サイト
>これって、接続先が...ではないの?

ちゃんと調べてないけど、できそーな気がしてる。

いくつもの .NET Framework が混在していても、mscoree.dll は system32 配下に1個だけ。

ここが出発点になるはずなので、「うんんと頑張って」るならできるんじゃまいかと。


引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -