关于网友提出的“ 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:
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:
同意,看是在哪一步失败了
解决方案24: 一般装有杀毒软件,就很难成功。
解决方案25: 90%是你安装的杀毒软件的问题。
他们会进行SSDT把CreateRemoteThread给拦截下来的
解决方案26: EmptyDLL.dll是Win32还是MFC程序?如果是MFC扩展DLL,可能会与被注入的EXE有冲突。
另外,系统中有没有安装反木马之类的软件?
解决方案27: 看是否有防火墙等拦截
以上介绍了“ CreateRemoteThread注入DLL奇怪的问题”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/3295251.html