HANDLE rmtThread=CreateRemoteThread(hProcess,NULL,0,startAddr,buf,0,NULL);
这个创建的远程线程无法成功。
PTHREAD_START_ROUTINE startAddr= (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle( TEXT("kernel32")), "LoadLibraryA");
这个也没有错误。
buf是dll的绝对路径名,并且在目标进程空间中申请了内存,为什么走到创建远程线程时就会失败呢?
这个创建的远程线程无法成功。
PTHREAD_START_ROUTINE startAddr= (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle( TEXT("kernel32")), "LoadLibraryA");
这个也没有错误。
buf是dll的绝对路径名,并且在目标进程空间中申请了内存,为什么走到创建远程线程时就会失败呢?
最好贴全代码。
if(hProcess==NULL)
{
AfxMessageBox("打开目标进程失败!");
return 0;
} AfxMessageBox("打开目标进程成功!");
char * path="D:\\dll.dll"; DWORD sz=strlen(path)+1;
LPVOID buf=VirtualAllocEx(hProcess, NULL,sz,MEM_COMMIT,PAGE_READWRITE);
if ( NULL == buf)
{
CloseHandle( hProcess );
// 失败处理
AfxMessageBox(_T("NULL == lpBuf"));
return 0;
}
DWORD dwWritten;
if ( WriteProcessMemory( hProcess, buf, (LPVOID)path, sz, &dwWritten ) )
{
// 要写入字节数与实际写入字节数不相等,仍属失败
if ( dwWritten != sz )
{
VirtualFreeEx( hProcess, buf, sz, MEM_DECOMMIT );
CloseHandle( hProcess );
// 失败处理
AfxMessageBox(_T("要写入字节数与实际写入字节数不相等"));
return 0;
}
HMODULE hkernel = GetModuleHandle( TEXT("kernel32"));
if(hkernel==NULL)
{
AfxMessageBox("打开kernel错误!");
return 0;
}
PTHREAD_START_ROUTINE startAddr= (PTHREAD_START_ROUTINE)GetProcAddress(hkernel, "LoadLibraryA");
if(startAddr==NULL)
{
AfxMessageBox("入口地址错误!");
return 0;
}
HANDLE rmtThread=CreateRemoteThread(hProcess,NULL,0,startAddr,buf,0,NULL);
if(NULL==rmtThread)
{
AfxMessageBox("远程线程创建失败!");
return 0;
}
WaitForSingleObject(rmtThread,INFINITE);
AfxMessageBox("远程注入成功!");
VirtualFreeEx(hProcess,buf,sz,MEM_DECOMMIT);
CloseHandle(rmtThread);
CloseHandle(hProcess);
return 0;
}
这个是代码 就执行到创建远程线程那就失败了,创建不了~
我在朋友的xp系统下运行也成功了,我的系统是win7,是不是win7和这个不兼容啊!求解释~
Terminal Services isolates each terminal session by design. Therefore,
CreateRemoteThread fails if the target process is in a different session
than the calling process.
.text:7C81059E call ds:CsrClientCallServer
.text:7C8105A4 mov eax, [ebp-0BCh]
.text:7C8105A4
.text:7C8105AA
.text:7C8105AA loc_7C8105AA: CODE XREF: CreateRemoteThread+2A7A2j
.text:7C8105AA mov [ebp-3ACh], eax;
.text:7C8105AA
.text:7C8105B0
.text:7C8105B0 loc_7C8105B0: CODE XREF: CreateRemoteThread+1B3A9j
.text:7C8105B0 CreateRemoteThread+2A78Dj
.text:7C8105B0 cmp [ebp-3ACh], ebx//这里发生了跳转,引起CreateRemoteThread失败。
.text:7C8105B6 jl loc_7C83ABD3
看到了么,Win7在CreateRemoteThread里面调用了CsrClientCallServer,然后判断是否创建远程线程。具体原理比较有难度,不知道你有没有兴趣仔细研究。建议你看下看雪的解决办法,解决要驱动的。
http://bbs.pediy.com/showthread.php?t=101469
我也用过,在我的电脑上(win7)没问题。
还是看看Getlasterror看看吧