远线程问题~~~~~~~~~~
all4u 2008-06-21 08:54:15 麻烦大家看下这个远线程程序,目的是在程序中启动一个notepad进程,然后将本程序的TestClass函数写到notepad进程中,并用createremotethread启动这个程序。为什执行时能显示最后的inject success,却不能显示TestClass里的消息框?而且,程序被关闭。谢谢啊~~~~~~~~
//---------------------------------------------------------------------------
#include <windows.h>
#include <stdio.h>
DWORD WINAPI TestClass(LPVOID lpParameter)
{
MessageBox(0,"Hello...","INFO",0);
return 0;
}
//--------------------------------------------------------------------------------------------
BOOL EnableDebugPrivilege()
{
HANDLE hToken;
BOOL fOk=FALSE;
LUID luid;
if(OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken))
{
TOKEN_PRIVILEGES tp;
if(!LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&luid))
MessageBox(0,"Can't lookup privilege value.\n","INFO",0);
//在这里使用GetLastError(),返回0
tp.PrivilegeCount=1;
tp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
tp.Privileges[0].Luid=luid;
if(!AdjustTokenPrivileges(hToken,FALSE,&tp,sizeof(TOKEN_PRIVILEGES),NULL,NULL))
MessageBox(0,"Can't adjust privilege value.\n","INFO",0);
//在这里使用GetLastError(),返回997
fOk=true;
CloseHandle(hToken);
}
return fOk;
}
//---------------------------------------------------------------------------------------------
int main(int argc,char* argv[])
{
int i=0;
STARTUPINFO start;
PROCESS_INFORMATION info;
memset(&start,0,sizeof(start));
BOOL bRet=CreateProcess("c:\\windows\\system32\\notepad.exe",
NULL,NULL,NULL,FALSE,
NORMAL_PRIORITY_CLASS|CREATE_NEW_CONSOLE|PROCESS_VM_WRITE,
NULL,NULL,&start,&info);
HANDLE hRemoteProcess;
void *pStart;
void *pParam;
int iReturnCode;
int cb=(int)EnableDebugPrivilege-(int)TestClass+8000;//写入内容的大小
if(!EnableDebugPrivilege())
MessageBox(0,"Can't adjust token.\n","INFO",0);
hRemoteProcess = OpenProcess( PROCESS_CREATE_THREAD| //允许远程创建线程
PROCESS_VM_OPERATION| //允许远程VM操作
PROCESS_VM_WRITE, //允许远程VM写
FALSE,
info.dwProcessId);
if(!hRemoteProcess)
MessageBox(0,"Can't open the process.\n","INFO",0);
//写入函数体
pStart = VirtualAllocEx( hRemoteProcess,NULL,cb,MEM_COMMIT,
PAGE_EXECUTE_READWRITE);
if(!pStart)
exit(0);
iReturnCode = WriteProcessMemory(hRemoteProcess,pStart,&TestClass,cb,NULL);
if(!iReturnCode)
exit(0);
//Write function params//写入函数参数
pParam = VirtualAllocEx( hRemoteProcess,NULL,sizeof(char),MEM_COMMIT,
PAGE_EXECUTE_READWRITE);
if(!pParam)
exit(0);
iReturnCode = WriteProcessMemory(hRemoteProcess, pParam, &i, sizeof(int), NULL);
if(!iReturnCode)
exit(0);
HANDLE hRemoteThread = CreateRemoteThread(
hRemoteProcess, NULL, 0,
(PTHREAD_START_ROUTINE)pStart,//写入函数体时分配的地址
pParam,//函数参数地址
0,
NULL);
if(!hRemoteThread)
exit(0);
WaitForSingleObject(hRemoteThread,INFINITE);
CloseHandle(hRemoteProcess);
MessageBox(0,"Inject success!\n","INFO",0);
return 0;
}