您好,欢迎来到[编程问答]网站首页   源码下载   电子书籍   软件下载   专题
当前位置:首页 >> 编程问答 >> VC/MFC >> CreateRemoteThread注入DLL奇怪的问题

CreateRemoteThread注入DLL奇怪的问题

来源:网络整理     时间:2016/8/15 5:11:01     关键词:

关于网友提出的“ CreateRemoteThread注入DLL奇怪的问题”问题疑问,本网通过在网上对“ CreateRemoteThread注入DLL奇怪的问题”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题: CreateRemoteThread注入DLL奇怪的问题
描述:


PROCESS_INFORMATION pi;
STARTUPINFO si;
memset(&si, 0, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
BOOL bRet = CreateProcess(_T("C:\\111.exe"), NULL, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &si, &pi);
if (bRet)
{
WCHAR wFilePath[256] = _T("C:\\EmptyDLL.dll");
LPWSTR pszLibFile = NULL;
int len = (lstrlenW(wFilePath) + 1) * 2;
pszLibFile = (PWSTR)VirtualAllocEx(pi.hProcess, NULL, len, MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(pi.hProcess, pszLibFile, (PVOID) wFilePath, len, NULL);
PTHREAD_START_ROUTINE pfnThreadRtn = (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(_T("Kernel32")), "LoadLibraryW");
HANDLE hRemoteThread = CreateRemoteThread(pi.hProcess, NULL, 0, pfnThreadRtn, pszLibFile, 0, NULL);
WaitForSingleObject(hRemoteThread, INFINITE);
if (pszLibFile != NULL)
{
VirtualFreeEx(pi.hProcess, pszLibFile, 0, MEM_RELEASE);
}
CloseHandle(hRemoteThread);
ResumeThread(pi.hThread);
DWORD dwErr = GetLastError();
CString str;
str.Format(_T("0x%08x"), dwErr);
MessageBox(str);
}

上段代码在一个exe里调用,就是在新进程主线程CREATE_SUSPENDED时注入一个DLL,CreateProcess的第一个参数111.exe,是MFC程序,注入之后无论如何都无法启动,没有任何报错迹象,GetLastError是0。但如果是console程序注入之后是可以启动的,比如启动cmd.exe。EmptyDLL.dll是一个空的DLL,DllMain直接返回TRUE。
各位大大看看,是哪里有问题?
解决方案1:

引用 10 楼 greatws 的回复:
引用 5 楼 cnzdgs 的回复:
EmptyDLL.dll是Win32还是MFC程序?如果是MFC扩展DLL,可能会与被注入的EXE有冲突。 
另外,系统中有没有安装反木马之类的软件? 
 
win32的DLL,有卡巴,不过已经退出了。 
引用 6 楼 biweilun 的回复:
90%是你安装的杀毒软件的问题。 
他们会进行SSDT把CreateRemoteThread给拦截下来的 
 
有道理,我试下恢复SSDT。 
现在的问题是,注入是成功的,但是一走过ResumeThread(pi.hThr…

1、在CreateProcess()后Sleep()上几秒钟,等待111.exe完全启动。
2、把CreateProcess()的参数CREATE_SUSPENDED去掉,线程注入不一定要求宿主进程挂起来。 解决方案2:

学习

解决方案3:

顶一下

解决方案4:

学习

解决方案5:

   弄不来啊,顶你一下吧

解决方案6:

我猜测是线程同步的问题

解决方案7:

只有注入代码 你没有写执行代码啊
GetExitCodeThread (hRemoteThread, int code);
CloseHandle(hRemoteThread);
handle1=LoadLibraryEx ("C:\\EmptyDLL.dll", 0, 0)
int Faddress=GetProcAddress (handle1, DllFunctionName)
int verityaddress=code+Faddress-handle1
CreateRemoteThread (pHandle, 0, 0, verityaddress, 0, 0, 0)
CloseHandle (hRemoteThread)
CloseHandle (pHandle)
我是其他语言转C++刚接触C++没几天 随手翻译的代码  DLL注入我这边有2种完整的代码都是可以编译执行的 可惜不是C++的 
哪些翻译的不对请指教  上面只有执行代码  verityaddress=code+Faddress-handle1  这条算法我也没搞清楚

解决方案8:

pszLibFile = (PWSTR)VirtualAllocEx(pi.hProcess, NULL, len, MEM_COMMIT, PAGE_READWRITE);
这句有问题,在多核机器上有问题应该改成这样
pszLibFile = (PWSTR)VirtualAllocEx(pi.hProcess, NULL, len, MEM_COMMIT, PAGE_EXECUTE_READWRITE);

解决方案9:

可能是dll加载顺序的问题。
我认为调用CreateProcess,并且设置了CREAT_SUSPEND标志,则主线程创建后,执行前,本exe需要的dll并没有加载到本进程空间,而你的远程线程要使用kernel32.dll中函数。
我觉得这样修改一下估计就不会报错了:
        HANDLE hRemoteThread = CreateRemoteThread(pi.hProcess, NULL, 0, pfnThreadRtn, pszLibFile, 0, NULL);
        ResumeThread(pi.hThread);
        WaitForSingleObject(hRemoteThread, INFINITE);
        if (pszLibFile != NULL)
        {
            VirtualFreeEx(pi.hProcess, pszLibFile, 0, MEM_RELEASE);
        }
        CloseHandle(hRemoteThread);
        DWORD dwErr = GetLastError();
        CString str;
        str.Format(_T("0x%08x"), dwErr);
        MessageBox(str);

解决方案10:

先缩小范围:测试程序不用MFC,直接SDK看是否有问题

解决方案11:

飘过~

解决方案12:

我用Vista+VS2008测试没问题。

解决方案13:

每个API调用的返回值都判断下,看看有没有失败的地方。

解决方案14:

无人接招。。。。

解决方案15:

楼主的错误在于:随意的插入到exe进程中,而没有计算相关数据节,例如PIMAGE_DOS_HEADER我就没有看到。
再转换成PIMAGE_NT_HEADERS,然后还要根据DLL的FileHeader.NumberOfSections;计算Sections,再产生一个PIMAGE_SECTION_HEADER数据,还要将上面的Sections值dwSections * sizeof(IMAGE_SECTION_HEADER),总之相当复杂,手上现在也没有代码,但以前成功实现过,我之前的做法是将DLL读出来写入到SVCHOST.exe中并启动(和你先启动111.exe是一样的)。不过无论如何这种方法最终还是要用到WriteProcessMemory()和CreateRemoteThread(),这就无法跳过防病毒软件这一关,所以我想,你最后直接挂SSDT的NtCreateProcessEx应该是更优的选择。

解决方案16:

跟VS200X的vc redist选择性加载有关。如果用VC6生成的DLL就没有这样的问题。
建议你使用静态链接来编译用做注入的DLL。
也可以在DLL的资源里面加入配置文件,控制加载,具体做法我忘了。

解决方案17:

另外再把DllMain改成return FALSE试试,因为如果return TRUE,线程结束后,DLL会留在进程里面,可能会影响进程的内存分配。

解决方案18:

重载WindowProc函数并设置断点看看。

解决方案19:

试试看能不能调试,在创建进程后用VC attach to process。

解决方案20:

可以再换个环境试试,例如用虚拟机。EXE程序也换一个试试。

解决方案21:

EmptyDLL.dll什么都没执行吗?有没有静态对象或者加载了其它DLL?

解决方案22:

vc6 + win2k3 sp1下测试没有问题。裸奔的,没杀毒软件和防火墙,也没有什么木马专杀。

解决方案23:

引用 2 楼 WaistCoat19 的回复:
每个API调用的返回值都判断下,看看有没有失败的地方。

同意,看是在哪一步失败了 解决方案24:

一般装有杀毒软件,就很难成功。

解决方案25:

90%是你安装的杀毒软件的问题。
他们会进行SSDT把CreateRemoteThread给拦截下来的

解决方案26:

EmptyDLL.dll是Win32还是MFC程序?如果是MFC扩展DLL,可能会与被注入的EXE有冲突。
另外,系统中有没有安装反木马之类的软件?

解决方案27:

看是否有防火墙等拦截


以上介绍了“ CreateRemoteThread注入DLL奇怪的问题”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/3295251.html

相关图片

相关文章