读书人

CreateRemoteThread注入DLL奇怪的有关

发布时间: 2012-08-03 00:12:14 作者: rapoo

CreateRemoteThread注入DLL奇怪的问题

C/C++ code
    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。

各位大大看看,是哪里有问题?

[解决办法]
无人接招。。。。
[解决办法]
每个API调用的返回值都判断下,看看有没有失败的地方。
[解决办法]
我用Vista+VS2008测试没问题。
[解决办法]
看是否有防火墙等拦截
[解决办法]
EmptyDLL.dll是Win32还是MFC程序?如果是MFC扩展DLL,可能会与被注入的EXE有冲突。
另外,系统中有没有安装反木马之类的软件?
[解决办法]
90%是你安装的杀毒软件的问题。
他们会进行SSDT把CreateRemoteThread给拦截下来的
[解决办法]
一般装有杀毒软件,就很难成功。
[解决办法]
探讨
每个API调用的返回值都判断下,看看有没有失败的地方。

[解决办法]
vc6 + win2k3 sp1下测试没有问题。裸奔的,没杀毒软件和防火墙,也没有什么木马专杀。
[解决办法]
EmptyDLL.dll什么都没执行吗?有没有静态对象或者加载了其它DLL?
[解决办法]
可以再换个环境试试,例如用虚拟机。EXE程序也换一个试试。
[解决办法]
试试看能不能调试,在创建进程后用VC attach to process。
[解决办法]
飘过~
[解决办法]
先缩小范围:测试程序不用MFC,直接SDK看是否有问题
[解决办法]
重载WindowProc函数并设置断点看看。
[解决办法]
另外再把DllMain改成return FALSE试试,因为如果return TRUE,线程结束后,DLL会留在进程里面,可能会影响进程的内存分配。
[解决办法]
跟VS200X的vc redist选择性加载有关。如果用VC6生成的DLL就没有这样的问题。
建议你使用静态链接来编译用做注入的DLL。


也可以在DLL的资源里面加入配置文件,控制加载,具体做法我忘了。
[解决办法]
可能是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);

[解决办法]
pszLibFile = (PWSTR)VirtualAllocEx(pi.hProcess, NULL, len, MEM_COMMIT, PAGE_READWRITE);

这句有问题,在多核机器上有问题应该改成这样

pszLibFile = (PWSTR)VirtualAllocEx(pi.hProcess, NULL, len, MEM_COMMIT, PAGE_EXECUTE_READWRITE);

[解决办法]
只有注入代码 你没有写执行代码啊
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 这条算法我也没搞清楚

[解决办法]
我猜测是线程同步的问题
[解决办法]
弄不来啊,顶你一下吧
[解决办法]
学习
[解决办法]
顶一下
[解决办法]
学习
[解决办法]

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


win32的DLL,有卡巴,不过已经退出了。


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

有道理,我试下恢复SSDT。


现在的问题是,注入是成功的,但是一走过ResumeThread(pi.hThr…

[解决办法]
楼主的错误在于:随意的插入到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应该是更优的选择。

读书人网 >VC/MFC

热点推荐