16,472
社区成员
发帖
与我相关
我的任务
分享
#include<windows.h>
#include<stdio.h>
char *szText;
/*程序Release下编译*/
void ThreadFunc(FARPROC AddrMessageBoxA)
{
((int (WINAPI*)(HWND,LPCSTR,LPCSTR,UINT))AddrMessageBoxA)(NULL,NULL,NULL,MB_OK);/*第二个参数,如果传递szText,远程进程就会崩溃,数据已经写入远程进程,怎么会呢????*/
}
void AfterThreadFunc()
{
}
void main()
{
char *szBuffer="good luck";
SIZE_T sizeData=sizeof(szBuffer);
SIZE_T sizeCode=(SIZE_T)AfterThreadFunc-(SIZE_T)ThreadFunc;
HWND hwnd=FindWindow(NULL,"扫雷");/*随便找一个窗口*/
if(hwnd==NULL)
{
puts("Cannot find window");
return;
}
DWORD dwProcess;
GetWindowThreadProcessId(hwnd,&dwProcess);
HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwProcess);
if(hProcess==NULL)
{
puts("OpenProcess failed");
return;
}
LPVOID pAddrData;
LPVOID pAddrCode;
//////////////////////写数据//////////////////////////////////////////////////////////
pAddrData=VirtualAllocEx(hProcess,NULL,sizeData,MEM_COMMIT,PAGE_READWRITE);
if(pAddrData==NULL)
{
puts("VirtualAllocEx failed");
return;
}
if(WriteProcessMemory(hProcess,pAddrData,szBuffer,sizeData,NULL)==0)
{
puts("WriteProcessMemory failed");
return;
}
szText=(char*)pAddrData;//就是这里,已经把指针指向远程的字符串地址了啊?
///////////////写代码/////////////////////////////////////////////////////////////////
pAddrCode=VirtualAllocEx(hProcess,NULL,sizeCode,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
if(pAddrCode==NULL)
{
puts("VirtualAllocEx failed");
return;
}
if(WriteProcessMemory(hProcess,pAddrCode,ThreadFunc,sizeCode,NULL)==0)
{
puts("WriteProcessMemory failed");
return;
}
///////////////////////远程线程启动代码//////////////////////////////////////////////////////
HMODULE hUser32=GetModuleHandle("USER32.dll");
if(hUser32==NULL)
{
puts("GetModuleHandle failed");
return;
}
FARPROC AddrMessageBoxA=GetProcAddress(hUser32,"MessageBoxA");
HANDLE hThread=CreateRemoteThread(hProcess,NULL,NULL,LPTHREAD_START_ROUTINE(pAddrCode),AddrMessageBoxA,0,NULL);
//////////////////////////////////////////////////////////////////////////////////////////////
WaitForSingleObject(hThread,INFINITE);
VirtualFreeEx(hProcess,pAddrData,sizeData,MEM_DECOMMIT);
VirtualFreeEx(hProcess,pAddrCode,sizeCode,MEM_DECOMMIT);
CloseHandle(hThread);
CloseHandle(hProcess);
CloseHandle(hwnd);
}