|
分類:[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(){}
を割り込ませても同じ状態です。
解決の糸口が見つからず困っています。
どなたかお知恵をお貸しください。よろしくお願いします。
|