Explorer.exe不能注入的原因。

时间:2023-01-16 22:10:09
本人遇到的这个问题,的确是让人很沮丧,注入代码的两种方式,使用hook函数和createremotethread,我都试过了。

希望各位朋友,在阅读我的文章前,如果你遇到这类似的问题,没有耐心看代码的话,可以直接看说明,其实本人也感觉代码没有任何问题,但是现实不得不让我承认,好像真的有问题耶,所以有必要把代码贴出。

1.使用hook函数注入,采用通用的做法,全局钩子,设置钩子的之后,发送一个注册过的自定义消息给explorer.exe,然后再钩子函数中做处理,由于代码比较乱,本人只贴出重要代码,以下为钩子dll的主要函数:



DllExport void installHook()//安装钩子
{
WM_HOOKEX=RegisterWindowMessage("WM_HOOK_MSG");
HWND hwnd=FindWindow("Shell_TrayWnd",NULL);
hhook=SetWindowsHookEx(WH_CALLWNDPROC,(HOOKPROC)MyHookProc,hInst,0);


if(hwnd)
{
SendMessage(hwnd,WM_HOOKEX,0,0);
}

}

LRESULT CALLBACK MyHookProc(int nCode,WPARAM wParam,LPARAM lParam)//钩子函数
{
CWPSTRUCT *pcwp=(CWPSTRUCT*)lParam;
if((pcwp->message==WM_HOOKEX))
{
UnhookWindowsHookEx(hhook);
MessageBoxA(NULL,"explorer hooked","123",0);


}
return CallNextHookEx(hhook,nCode,wParam,lParam);
}


以上的代码,经过编译后,会由explorer.exe弹出一个窗口确认被注入了我的dll文件,在本人的两台电脑上都可以用。
但是在别人的机子上测试的时候都没有用,问题出在全局钩子的挂载对象上,只有一些不特殊的应用程序才能挂上这个钩子,而explorer,甚至是notepad.exe都没有能挂接上,而这些问题在本人的电脑上都没有发生。(注:这些测试机子全部都是windows sp3的系统,cpu是amd的,而我的cpu是intel的,这是我能想到的区别)



2.在以上的这个程序失败后,我反复思考,始终没有找到原因,只能猜测可能是在sp3的系统下有一个不知名的补丁,保护了windows自带的一些应用程序不被hook(比如explorer和notepad),于是用了下面的这样一种方法createremotethread,以下为exe部件


BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
 )
{

switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
{
MessageBoxA(NULL,"explorer","123",0);
break;
}
case DLL_PROCESS_DETACH:break;
case DLL_THREAD_ATTACH:break;
case DLL_THREAD_DETACH:break;

}
return TRUE;
}



以下为exe部件


static char mydata[]="123.dll";

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{

HWND hwnd=FindWindowEx(NULL,NULL,"Shell_TrayWnd",NULL);//找到explorer.exe窗口之一

if(hwnd)
{
HMODULE hKernel=GetModuleHandle("Kernel32");
unsigned long int pid=0;//explorer.exe的pid
GetWindowThreadProcessId(hwnd,&pid);

HANDLE hc=OpenProcess(PROCESS_ALL_ACCESS,false,pid);

int bsize=sizeof(mydata);
void *pdata=VirtualAllocEx(hc,0,bsize,MEM_COMMIT,PAGE_READWRITE);

WriteProcessMemory(hc,pdata,&mydata,bsize,NULL);
HANDLE hThread=CreateRemoteThread(hc,NULL,0,
(LPTHREAD_START_ROUTINE)GetProcAddress(hKernel,"LoadLibraryA"),
pdata,0,NULL);//所有问题出在这里,运行远程线程的时候
CloseHandle(hThread);
}

return 0;
}


以上代码编译后,explorer会弹出一个窗口确认注入,可惜,很可惜,现象跟上一个代码一样,在本人的两台电脑上都可行,没有任何的问题,但是换上其他的测试机器后,没有一台能用。

对了,万恶的VirtualAllocEx,WriteProcessMemory,CreateRemoteThread这几个函数,大家不用担心,所有的机器都是没有任何防护软件的情况下运行的,但是还是不行。

可能有人会想说要提高进程的权限为debug,我也想到了,两个程序都提了权(事实上,在所有的机子上,我的进程权限都是SeDebugPrivilege),所以,最后的一点希望都被泼了冷水。


最后,我再总结下,为了注入explorer,我用了hook函数和createremotethread两种方法,而这两种方法在我的两台电脑上跑的很好,但是一到别人的机子上就不行了,现象不是说不能注入,而是要注入到explorer的时候,就出问题了,给我的感觉,系统有感觉,到了最运行最重要的代码的时候,根本不鸟。

问题差不多分析到这里了,希望各位朋友帮帮忙,如果能帮我解决这个问题,真的是很感激,虽然我也知道注入代码有很多很多的方法,但是这两种方法是市面流行的,而且在我的机子上也都测试通过,但是换了别人的机子就不行了,这是一个很奇怪的问题,所以我决定不管怎么样,都想把这个原因搞清楚。

最后,虽然可能没有什么用,但是我还是把一些差异性的环境写出来,让大家一块来分析分析:

本人的两台ibm本本:

a.
cpu:Intel core2 T5600
系统:ghost xp sp3(补丁打到最新)

b.
cpu:Intel 赛扬700
系统:ghost xp sp2(没有任何的补丁,很早的系统)



其余测试过的机器,以下机器全不能运行:

a.
cpu:AMD 闪龙3000+
系统:ghost xp sp3(补丁最新)

b.
cpu:AMD2 速龙5000+
系统:ghost xp sp3

c.
cpu:AMD 速龙3000
系统:ghost xp sp3

d.
cpu:Intel Core2 T6400
系统:ghost xp sp3

33 个解决方案

#1


写这么多不容易。帮你顶下

#2


权限问题,提个Debug权限应该就没问题了

#3


好了,这么长的帖子,我总结下:

1.hook函数,explorer不上钩

2.createremotethread,explorer不运行(前面的数据复制都没有问题)

3.关键是我自己的机子能行,但是跑到别人的机子上去就不行了。

就是这么简单的问题,希望各位大大畅想欲言,帮忙分析下,到底是怎么回事,对于所有有建设性的回复,本人都会非常期待和欢迎,谢谢了!

#4


引用 2 楼 tr0j4n 的回复:
权限问题,提个Debug权限应该就没问题了


这位朋友,不是进程权限的问题吧,我的程序在所有的机子上运行的时候都是SeDebugPrivilege,debug权限肯定没有问题,但是就是在我的机子上能用,跑到别的机子上就不行了。

#5


explorer.exe记得可以不用提权,winlogon.exe这些才要。
远程线程注入方式,有些杀软没阻止。

#ifdef UNICODE
pfnLoadLibrary = (LPTHREAD_START_ROUTINE)GetProcAddress(hKernel32, "LoadLibraryW");
#else
pfnLoadLibrary = (LPTHREAD_START_ROUTINE)GetProcAddress(hKernel32, "LoadLibraryA");
#endif

hThreadCreate = CreateRemoteThread(hProcess, NULL, NULL, pfnLoadLibrary, (LPVOID)pLIB, NULL, NULL);

if (hThreadCreate == NULL)
{
MessageBox(GetDesktopWindow(), TEXT("远程线程执行失败!"), TEXT("提示"), MB_ICONASTERISK);
return 0;
}

WaitForSingleObject(hThreadCreate, INFINITE);
GetExitCodeThread(hThreadCreate, &hLibModule);


加个个getlasterror()判断下是什么。

#6


引用 5 楼 zwfgdlc 的回复:
explorer.exe记得可以不用提权,winlogon.exe这些才要。
远程线程注入方式,有些杀软没阻止。
C/C++ code

#ifdef UNICODE
    pfnLoadLibrary = (LPTHREAD_START_ROUTINE)GetProcAddress(hKernel32, "LoadLibraryW");
#else
    pfnLoadLibr……


五楼的朋友,非常感谢你的答复,我仔细看了你的代码,由于现在是在自己的机子上,所以不能测试代码。

记得以前在别的机子上有过你的这个思路,我也觉得是createremotethread失败,但是用messagebox测试下,返回的线程句柄不是NULL,也就是说函数顺利运行,但是explorer。exe就是没有反应(应该会弹出d一个msbox的)。

#7


你这样,找个ARK工具,比如冰刃,wsyscheck,xuetr,看下explorer.exe进程有没有你的DLL。
我用xuetr

#8


这么说来感觉很奇怪,不管是我在谷歌上搜索,csdn里搜索还是看发帖各位的回复,好像大家都没有碰到过这个问题。

代码用的就是codeproject上的Three Ways to Inject Your Code into Another Process(代码注入的三种方法),我只是用它的代码,然后自己稍微修改了下,在自己的机器上能运行,很好。

但是当我有一天拿到别人的机子上去测试的时候,却发现没有用,于是试了很多机器,都是没有用的,而只有我自己的两台本本能运行。

个人认为这很是一个问题,这些代码没有任何的特殊性,都是windowsXP系统,唯一不同,而且可能影响到结果的因素就是操作系统版本,补丁和cpu(虽然我也觉得很不可思议,我写的不是汇编代码),所以我在帖子的最后把这些因素都列出来了。

我觉得这个问题,好多人肯定碰到过,希望碰到这个问题的朋友也回复下,大家交流下,看看这是怎么回事。

#9


引用 7 楼 zwfgdlc 的回复:
你这样,找个ARK工具,比如冰刃,wsyscheck,xuetr,看下explorer.exe进程有没有你的DLL。
我用xuetr

这个想法,好像以前用winhex看过内存模块,可能是winhex软件的缘故吧,explorer.exe即使加载了我的dll,我也看不到我的dll(在本机测试的)。

不过你说的icesword软件,我想有必要去试试,不过感觉既然没有提示,应该也不会加载。

#10



    WaitForSingleObject(hThreadCreate, INFINITE);
    GetExitCodeThread(hThreadCreate, &hLibModule);

这两句加上去,一定要等待远程线程结束返回,然后看下GetExitCodeThread返回的DLL加载地址。

#11


引用 10 楼 zwfgdlc 的回复:
C/C++ code

    WaitForSingleObject(hThreadCreate, INFINITE);
    GetExitCodeThread(hThreadCreate, &hLibModule);


这两句加上去,一定要等待远程线程结束返回,然后看下GetExitCodeThread返回的DLL加载地址。


好的,这个我倒是没有想过,写这段代码的时候为了图个省事,直接就CloseHandle了,我想有必要试试。

最难的bug不是本机的bug,而是在别的机器上问题,在没有发现原因的时候,很难调式,在我的机子上如何调式都是正确的,但是跑到别人的机子上,怎么调式都不正确。

莫非我的机子上有什么东西,比如装了什么vc运行库,别人的机子上没有,导致了这样的问题发生?

另外补充一下,我的程序都是release版本,也应该不会有这个问题的吧。

#12


没装VC运行库很有可能。

#13


现在先来试试,我要把本机的c/c++运行库文件全部删除,看看能不能行。

#14


好了,我知道c++库不能乱删的啦。

系统目录下msvc*.dll全部删除,就剩下了msvcrt.dll,为了把msvcrt.dll删除,我把它重命名了,然后重启,结果出现了很壮观的蓝屏,我刚把系统还原过来。

不过仔细想想也不太可能跟c++库有关系,因为所有的系统都有自带的基本c++库,而且在我测试的机子上都装了qq,那就说明会安装qq自带的c++库,也就是说测试机子的c++库不会很低,所以,现在觉得跟visual c/c++ runtime library的可能性不大。

#15


1、SetWindowsHookEx,不要用自定义消息,改成Windows消息试试,例如WM_LBUTTONDOWN等。
2、CreateRemoteThread,执行过程中加上一些判断,看看是否每步操作都成功。
另外注意一下测试系统中有哪些安全类软件。

#16


这种浏览器注入,我以前写的没你这种问题
你看是不是杀毒软件在里边,  反注入其实也容易做的,

#17


看了一下你的代码,怎么刚hook就SendMessage了?你这里涉及到同步的问题,全局钩子要挂到所有进程里需要时间的,可能还没来得及挂完所有的进程,你就SendMessage了,当然就钩不到了,不过这仅是猜测,你可以先找个anti-rootkit tool看一下。不太理解的是你在MyMsgProc里去UnHook hhook,MyMsgProc是运行在被挂进程的地址空间中,你的hhook放在共享数据段里了?不然你这里的卸载无效

#18


今天起来看帖,发现很多人心的朋友给我建议,很是感动,在这里表示感谢

#19


引用 15 楼 cnzdgs 的回复:
1、SetWindowsHookEx,不要用自定义消息,改成Windows消息试试,例如WM_LBUTTONDOWN等。
2、CreateRemoteThread,执行过程中加上一些判断,看看是否每步操作都成功。
另外注意一下测试系统中有哪些安全类软件。


自定义的消息,我是看到教程上是这样写的,所以也没有太注意,也按照这个做法来写。

在自己的机子上,我一开始还做了这样的测试,就是在钩子dll的DLL_PROCESS_ATTACH中加入了messagebox,只要有一个视窗进程加载了我的钩子,就会弹出一个窗口(我只是纯粹的加载全局钩子),结果是桌面上所有的GUI程序都加载了我的钩子(包括explorer)。

可是遗憾的是,我在测试的机器上也用过同样的方法来检测钩子的加载情况,结果是,除了非系统的窗口(比如vc,editplus),系统的窗口(explorer.exe和notepad.exe)都没有加载上我的钩子。

全局钩子的测试,这样测试的结果最直接,但是给我的打击不小,explorer根本就不加载我的钩子。


createremotethread前面的每一步我都查过,VirtualAllocEx分配了explorer的内存,而且WriteProcessMemory也写入了内存(我用winhex实时检查过,的确是复制过去了)。

createremotethread的返回值不是NULL,也就是这个函数没有失败,但是没有任何窗口弹出。


最后,要补充说明的一句,我在测试的所有机子上都注意看过了,全部没有安装什么安全软件,有一台机器安装了冰点还原,还有三台是裸机。

#20


引用 16 楼 sanguomi 的回复:
这种浏览器注入,我以前写的没你这种问题
你看是不是杀毒软件在里边,  反注入其实也容易做的,


这个我也觉得很奇怪,好像我写的这段代码,大家都写过,但是只有我遇见了这样的问题,的确没有杀毒软件。

反注入很简单,这个我也知道(遇上了这些个事情),测试机器上的杀毒软件是绝对没有的。


我感觉大家在写这种程序的时候都是很早的时候写的,而我在测试的机器上都是windowsXp sp3(虽然我自己的一台机器也是sp3)上写的,怀疑是不是微软最近升级了一个什么安全补丁,导致explorer等系统自带的gui程序安全性提高,不能被注入了,以上只是我的推测,希望有哪位朋友可以直接的证明下。

#21


看一下测试机的操作系统是不是64位的?32位DLL无法注入64位进程。

#22


不懂,帮顶
不过注入Explorer进程的dll有MessageBox的话,
一运行到MessageBox程序就会都卡住了,这个我倒是试过

其他的就不了解了,诡异……

#23


MessageBox的问题吧,我也遇到过,有些情况下MessageBox就是死活弹不出来,后来也没找到问题的原因。

ps:注入explorer.exe是没问题的,我的winxp sp3所有的补丁都打了,注入explorer.exe和winlogon.exe都没有问题。

#24


好了,各位朋友,昨天认真的测试过后,我发现了一个惊人的现象。

仔细的研究了其中一台测试机器,在正常模式下,我的dll文件不能注入,但是进入了系统的安全模式后,就可以注入了,代码没有变化,只是在系统变成安全模式后,就可以运行了。

安全模式比正常模式少加载了一些东西,这些大家都知道,但是少加载了哪个重要模块,能让我的程序正常运行,这就很难测试了。

个人理解,安全模式与普通模式的区别就是少加载了驱动和服务,于是我对照安全模式的驱动和服务,在普通模式下对照停止和删除,结果是:由于毕竟不是自己的机器,不能24小时盯着电脑不妨,所以还是没有发现任何的原因。


最后,还有一个消息,7楼的朋友告诉我要等待线程结束,然后获得线程的返回码,我今天照做了(不过不是昨天的那台),得到的返回值是6,6号错误msdn里面的解释是handle错误。

6号错误莫非是dll文件没有找到?这个现在还是只能猜测,我在写下一步的测试程序。

最后,感谢楼上的几位朋友的回复,我做以下几点补充:

首先,所有的测试机器都是32位windowxp系统
其次,messagebox是会让主线程卡住,由于主线程是explorer.exe,所以这个卡法很明显
最后,23楼的朋友,messageBox死活不弹出来,应该不是这个问题,我在测试机器上,人家根本就不加载我的dll文件(用icesword看过了),我也是在自己两台机子上(补丁全满)测试通过能正常通过,而其余的n台机器都不能通过,才感觉郁闷的,这么普通的注入都不能注入,所以很奇怪,发帖向大家求助的。



我觉得有必要再说明下:

1.所有的测试机器都是任意挑选的,没有任何的特殊性
2.所有的测试机器都没有装过杀毒软件,安全软件之类的东西
3.在所有的测试机器中有一台(因为我只测试过这台),进入安全模式就能运行我的程序(能注入)
4.在所有的测试机器中有一台(这个测试也只局限于这台),用createremotethread返回正常,但是等待线程结束,然后获得的结束码是6,The handle is invalid.

以上是我今天的总结,各位有兴趣的朋友们也可以用我的代码在自己的机器上测试下,看看到底能不能运行(在排除杀软的因素后),把结果告诉给大家,看看这到底是不是个例。

#25


能否将
CreateRemoteThread函数的调用以及该函数用到的第四个参数的来源
的代码贴出来看看呢?

#26


试过 可以注入。。

#27


LZ有没有在OllyDBG中查看你的DLL确实没有被加载?确定没有被加载?

#28


咱俩的经历差不多,都是要注册全局的钩子,现在我用的CreateRemoteThread的方式。

第一种方式,我测过,SetWindowsHook(WH_GETMESSAGE....),是不能注入到所有的程序,包括Word,而且有的程序一会可以注入,一会又不能注入。

第二种方式,我昨天才调出来,XP SP3,补丁都打了,没问题,还没在别的机器上测。
如果 有可能的话,你在别的机器上装上VS环境,单步调试一下,不然真的很难确定哪儿问题啊。

Three Ways to Inject Your Code into Another Process的代码如果不能运行,肯定是系统原因。

#29


CreateRemoteThread 后,调用GetLastError , 如果错误返回120, 则是系统问题了,

#30


是用的detours吗? 我好像也有这个问题。。

#31


该回复于2010-08-04 09:17:53被版主删除

#32


我碰到了和楼主一样的问题,

一切比较特殊的程序都不能注入,比如explorer mspaint notepad只有自己编写的编程才可以注入。

我想应该是系统的问题吧。

#33


莫非是数据执行保护?

#1


写这么多不容易。帮你顶下

#2


权限问题,提个Debug权限应该就没问题了

#3


好了,这么长的帖子,我总结下:

1.hook函数,explorer不上钩

2.createremotethread,explorer不运行(前面的数据复制都没有问题)

3.关键是我自己的机子能行,但是跑到别人的机子上去就不行了。

就是这么简单的问题,希望各位大大畅想欲言,帮忙分析下,到底是怎么回事,对于所有有建设性的回复,本人都会非常期待和欢迎,谢谢了!

#4


引用 2 楼 tr0j4n 的回复:
权限问题,提个Debug权限应该就没问题了


这位朋友,不是进程权限的问题吧,我的程序在所有的机子上运行的时候都是SeDebugPrivilege,debug权限肯定没有问题,但是就是在我的机子上能用,跑到别的机子上就不行了。

#5


explorer.exe记得可以不用提权,winlogon.exe这些才要。
远程线程注入方式,有些杀软没阻止。

#ifdef UNICODE
pfnLoadLibrary = (LPTHREAD_START_ROUTINE)GetProcAddress(hKernel32, "LoadLibraryW");
#else
pfnLoadLibrary = (LPTHREAD_START_ROUTINE)GetProcAddress(hKernel32, "LoadLibraryA");
#endif

hThreadCreate = CreateRemoteThread(hProcess, NULL, NULL, pfnLoadLibrary, (LPVOID)pLIB, NULL, NULL);

if (hThreadCreate == NULL)
{
MessageBox(GetDesktopWindow(), TEXT("远程线程执行失败!"), TEXT("提示"), MB_ICONASTERISK);
return 0;
}

WaitForSingleObject(hThreadCreate, INFINITE);
GetExitCodeThread(hThreadCreate, &hLibModule);


加个个getlasterror()判断下是什么。

#6


引用 5 楼 zwfgdlc 的回复:
explorer.exe记得可以不用提权,winlogon.exe这些才要。
远程线程注入方式,有些杀软没阻止。
C/C++ code

#ifdef UNICODE
    pfnLoadLibrary = (LPTHREAD_START_ROUTINE)GetProcAddress(hKernel32, "LoadLibraryW");
#else
    pfnLoadLibr……


五楼的朋友,非常感谢你的答复,我仔细看了你的代码,由于现在是在自己的机子上,所以不能测试代码。

记得以前在别的机子上有过你的这个思路,我也觉得是createremotethread失败,但是用messagebox测试下,返回的线程句柄不是NULL,也就是说函数顺利运行,但是explorer。exe就是没有反应(应该会弹出d一个msbox的)。

#7


你这样,找个ARK工具,比如冰刃,wsyscheck,xuetr,看下explorer.exe进程有没有你的DLL。
我用xuetr

#8


这么说来感觉很奇怪,不管是我在谷歌上搜索,csdn里搜索还是看发帖各位的回复,好像大家都没有碰到过这个问题。

代码用的就是codeproject上的Three Ways to Inject Your Code into Another Process(代码注入的三种方法),我只是用它的代码,然后自己稍微修改了下,在自己的机器上能运行,很好。

但是当我有一天拿到别人的机子上去测试的时候,却发现没有用,于是试了很多机器,都是没有用的,而只有我自己的两台本本能运行。

个人认为这很是一个问题,这些代码没有任何的特殊性,都是windowsXP系统,唯一不同,而且可能影响到结果的因素就是操作系统版本,补丁和cpu(虽然我也觉得很不可思议,我写的不是汇编代码),所以我在帖子的最后把这些因素都列出来了。

我觉得这个问题,好多人肯定碰到过,希望碰到这个问题的朋友也回复下,大家交流下,看看这是怎么回事。

#9


引用 7 楼 zwfgdlc 的回复:
你这样,找个ARK工具,比如冰刃,wsyscheck,xuetr,看下explorer.exe进程有没有你的DLL。
我用xuetr

这个想法,好像以前用winhex看过内存模块,可能是winhex软件的缘故吧,explorer.exe即使加载了我的dll,我也看不到我的dll(在本机测试的)。

不过你说的icesword软件,我想有必要去试试,不过感觉既然没有提示,应该也不会加载。

#10



    WaitForSingleObject(hThreadCreate, INFINITE);
    GetExitCodeThread(hThreadCreate, &hLibModule);

这两句加上去,一定要等待远程线程结束返回,然后看下GetExitCodeThread返回的DLL加载地址。

#11


引用 10 楼 zwfgdlc 的回复:
C/C++ code

    WaitForSingleObject(hThreadCreate, INFINITE);
    GetExitCodeThread(hThreadCreate, &hLibModule);


这两句加上去,一定要等待远程线程结束返回,然后看下GetExitCodeThread返回的DLL加载地址。


好的,这个我倒是没有想过,写这段代码的时候为了图个省事,直接就CloseHandle了,我想有必要试试。

最难的bug不是本机的bug,而是在别的机器上问题,在没有发现原因的时候,很难调式,在我的机子上如何调式都是正确的,但是跑到别人的机子上,怎么调式都不正确。

莫非我的机子上有什么东西,比如装了什么vc运行库,别人的机子上没有,导致了这样的问题发生?

另外补充一下,我的程序都是release版本,也应该不会有这个问题的吧。

#12


没装VC运行库很有可能。

#13


现在先来试试,我要把本机的c/c++运行库文件全部删除,看看能不能行。

#14


好了,我知道c++库不能乱删的啦。

系统目录下msvc*.dll全部删除,就剩下了msvcrt.dll,为了把msvcrt.dll删除,我把它重命名了,然后重启,结果出现了很壮观的蓝屏,我刚把系统还原过来。

不过仔细想想也不太可能跟c++库有关系,因为所有的系统都有自带的基本c++库,而且在我测试的机子上都装了qq,那就说明会安装qq自带的c++库,也就是说测试机子的c++库不会很低,所以,现在觉得跟visual c/c++ runtime library的可能性不大。

#15


1、SetWindowsHookEx,不要用自定义消息,改成Windows消息试试,例如WM_LBUTTONDOWN等。
2、CreateRemoteThread,执行过程中加上一些判断,看看是否每步操作都成功。
另外注意一下测试系统中有哪些安全类软件。

#16


这种浏览器注入,我以前写的没你这种问题
你看是不是杀毒软件在里边,  反注入其实也容易做的,

#17


看了一下你的代码,怎么刚hook就SendMessage了?你这里涉及到同步的问题,全局钩子要挂到所有进程里需要时间的,可能还没来得及挂完所有的进程,你就SendMessage了,当然就钩不到了,不过这仅是猜测,你可以先找个anti-rootkit tool看一下。不太理解的是你在MyMsgProc里去UnHook hhook,MyMsgProc是运行在被挂进程的地址空间中,你的hhook放在共享数据段里了?不然你这里的卸载无效

#18


今天起来看帖,发现很多人心的朋友给我建议,很是感动,在这里表示感谢

#19


引用 15 楼 cnzdgs 的回复:
1、SetWindowsHookEx,不要用自定义消息,改成Windows消息试试,例如WM_LBUTTONDOWN等。
2、CreateRemoteThread,执行过程中加上一些判断,看看是否每步操作都成功。
另外注意一下测试系统中有哪些安全类软件。


自定义的消息,我是看到教程上是这样写的,所以也没有太注意,也按照这个做法来写。

在自己的机子上,我一开始还做了这样的测试,就是在钩子dll的DLL_PROCESS_ATTACH中加入了messagebox,只要有一个视窗进程加载了我的钩子,就会弹出一个窗口(我只是纯粹的加载全局钩子),结果是桌面上所有的GUI程序都加载了我的钩子(包括explorer)。

可是遗憾的是,我在测试的机器上也用过同样的方法来检测钩子的加载情况,结果是,除了非系统的窗口(比如vc,editplus),系统的窗口(explorer.exe和notepad.exe)都没有加载上我的钩子。

全局钩子的测试,这样测试的结果最直接,但是给我的打击不小,explorer根本就不加载我的钩子。


createremotethread前面的每一步我都查过,VirtualAllocEx分配了explorer的内存,而且WriteProcessMemory也写入了内存(我用winhex实时检查过,的确是复制过去了)。

createremotethread的返回值不是NULL,也就是这个函数没有失败,但是没有任何窗口弹出。


最后,要补充说明的一句,我在测试的所有机子上都注意看过了,全部没有安装什么安全软件,有一台机器安装了冰点还原,还有三台是裸机。

#20


引用 16 楼 sanguomi 的回复:
这种浏览器注入,我以前写的没你这种问题
你看是不是杀毒软件在里边,  反注入其实也容易做的,


这个我也觉得很奇怪,好像我写的这段代码,大家都写过,但是只有我遇见了这样的问题,的确没有杀毒软件。

反注入很简单,这个我也知道(遇上了这些个事情),测试机器上的杀毒软件是绝对没有的。


我感觉大家在写这种程序的时候都是很早的时候写的,而我在测试的机器上都是windowsXp sp3(虽然我自己的一台机器也是sp3)上写的,怀疑是不是微软最近升级了一个什么安全补丁,导致explorer等系统自带的gui程序安全性提高,不能被注入了,以上只是我的推测,希望有哪位朋友可以直接的证明下。

#21


看一下测试机的操作系统是不是64位的?32位DLL无法注入64位进程。

#22


不懂,帮顶
不过注入Explorer进程的dll有MessageBox的话,
一运行到MessageBox程序就会都卡住了,这个我倒是试过

其他的就不了解了,诡异……

#23


MessageBox的问题吧,我也遇到过,有些情况下MessageBox就是死活弹不出来,后来也没找到问题的原因。

ps:注入explorer.exe是没问题的,我的winxp sp3所有的补丁都打了,注入explorer.exe和winlogon.exe都没有问题。

#24


好了,各位朋友,昨天认真的测试过后,我发现了一个惊人的现象。

仔细的研究了其中一台测试机器,在正常模式下,我的dll文件不能注入,但是进入了系统的安全模式后,就可以注入了,代码没有变化,只是在系统变成安全模式后,就可以运行了。

安全模式比正常模式少加载了一些东西,这些大家都知道,但是少加载了哪个重要模块,能让我的程序正常运行,这就很难测试了。

个人理解,安全模式与普通模式的区别就是少加载了驱动和服务,于是我对照安全模式的驱动和服务,在普通模式下对照停止和删除,结果是:由于毕竟不是自己的机器,不能24小时盯着电脑不妨,所以还是没有发现任何的原因。


最后,还有一个消息,7楼的朋友告诉我要等待线程结束,然后获得线程的返回码,我今天照做了(不过不是昨天的那台),得到的返回值是6,6号错误msdn里面的解释是handle错误。

6号错误莫非是dll文件没有找到?这个现在还是只能猜测,我在写下一步的测试程序。

最后,感谢楼上的几位朋友的回复,我做以下几点补充:

首先,所有的测试机器都是32位windowxp系统
其次,messagebox是会让主线程卡住,由于主线程是explorer.exe,所以这个卡法很明显
最后,23楼的朋友,messageBox死活不弹出来,应该不是这个问题,我在测试机器上,人家根本就不加载我的dll文件(用icesword看过了),我也是在自己两台机子上(补丁全满)测试通过能正常通过,而其余的n台机器都不能通过,才感觉郁闷的,这么普通的注入都不能注入,所以很奇怪,发帖向大家求助的。



我觉得有必要再说明下:

1.所有的测试机器都是任意挑选的,没有任何的特殊性
2.所有的测试机器都没有装过杀毒软件,安全软件之类的东西
3.在所有的测试机器中有一台(因为我只测试过这台),进入安全模式就能运行我的程序(能注入)
4.在所有的测试机器中有一台(这个测试也只局限于这台),用createremotethread返回正常,但是等待线程结束,然后获得的结束码是6,The handle is invalid.

以上是我今天的总结,各位有兴趣的朋友们也可以用我的代码在自己的机器上测试下,看看到底能不能运行(在排除杀软的因素后),把结果告诉给大家,看看这到底是不是个例。

#25


能否将
CreateRemoteThread函数的调用以及该函数用到的第四个参数的来源
的代码贴出来看看呢?

#26


试过 可以注入。。

#27


LZ有没有在OllyDBG中查看你的DLL确实没有被加载?确定没有被加载?

#28


咱俩的经历差不多,都是要注册全局的钩子,现在我用的CreateRemoteThread的方式。

第一种方式,我测过,SetWindowsHook(WH_GETMESSAGE....),是不能注入到所有的程序,包括Word,而且有的程序一会可以注入,一会又不能注入。

第二种方式,我昨天才调出来,XP SP3,补丁都打了,没问题,还没在别的机器上测。
如果 有可能的话,你在别的机器上装上VS环境,单步调试一下,不然真的很难确定哪儿问题啊。

Three Ways to Inject Your Code into Another Process的代码如果不能运行,肯定是系统原因。

#29


CreateRemoteThread 后,调用GetLastError , 如果错误返回120, 则是系统问题了,

#30


是用的detours吗? 我好像也有这个问题。。

#31


该回复于2010-08-04 09:17:53被版主删除

#32


我碰到了和楼主一样的问题,

一切比较特殊的程序都不能注入,比如explorer mspaint notepad只有自己编写的编程才可以注入。

我想应该是系统的问题吧。

#33


莫非是数据执行保护?