希望各位朋友,在阅读我的文章前,如果你遇到这类似的问题,没有耐心看代码的话,可以直接看说明,其实本人也感觉代码没有任何问题,但是现实不得不让我承认,好像真的有问题耶,所以有必要把代码贴出。
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.关键是我自己的机子能行,但是跑到别人的机子上去就不行了。
就是这么简单的问题,希望各位大大畅想欲言,帮忙分析下,到底是怎么回事,对于所有有建设性的回复,本人都会非常期待和欢迎,谢谢了!
1.hook函数,explorer不上钩
2.createremotethread,explorer不运行(前面的数据复制都没有问题)
3.关键是我自己的机子能行,但是跑到别人的机子上去就不行了。
就是这么简单的问题,希望各位大大畅想欲言,帮忙分析下,到底是怎么回事,对于所有有建设性的回复,本人都会非常期待和欢迎,谢谢了!
#4
这位朋友,不是进程权限的问题吧,我的程序在所有的机子上运行的时候都是SeDebugPrivilege,debug权限肯定没有问题,但是就是在我的机子上能用,跑到别的机子上就不行了。
#5
explorer.exe记得可以不用提权,winlogon.exe这些才要。
远程线程注入方式,有些杀软没阻止。
加个个getlasterror()判断下是什么。
远程线程注入方式,有些杀软没阻止。
#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
五楼的朋友,非常感谢你的答复,我仔细看了你的代码,由于现在是在自己的机子上,所以不能测试代码。
记得以前在别的机子上有过你的这个思路,我也觉得是createremotethread失败,但是用messagebox测试下,返回的线程句柄不是NULL,也就是说函数顺利运行,但是explorer。exe就是没有反应(应该会弹出d一个msbox的)。
#7
你这样,找个ARK工具,比如冰刃,wsyscheck,xuetr,看下explorer.exe进程有没有你的DLL。
我用xuetr
我用xuetr
#8
这么说来感觉很奇怪,不管是我在谷歌上搜索,csdn里搜索还是看发帖各位的回复,好像大家都没有碰到过这个问题。
代码用的就是codeproject上的Three Ways to Inject Your Code into Another Process(代码注入的三种方法),我只是用它的代码,然后自己稍微修改了下,在自己的机器上能运行,很好。
但是当我有一天拿到别人的机子上去测试的时候,却发现没有用,于是试了很多机器,都是没有用的,而只有我自己的两台本本能运行。
个人认为这很是一个问题,这些代码没有任何的特殊性,都是windowsXP系统,唯一不同,而且可能影响到结果的因素就是操作系统版本,补丁和cpu(虽然我也觉得很不可思议,我写的不是汇编代码),所以我在帖子的最后把这些因素都列出来了。
我觉得这个问题,好多人肯定碰到过,希望碰到这个问题的朋友也回复下,大家交流下,看看这是怎么回事。
代码用的就是codeproject上的Three Ways to Inject Your Code into Another Process(代码注入的三种方法),我只是用它的代码,然后自己稍微修改了下,在自己的机器上能运行,很好。
但是当我有一天拿到别人的机子上去测试的时候,却发现没有用,于是试了很多机器,都是没有用的,而只有我自己的两台本本能运行。
个人认为这很是一个问题,这些代码没有任何的特殊性,都是windowsXP系统,唯一不同,而且可能影响到结果的因素就是操作系统版本,补丁和cpu(虽然我也觉得很不可思议,我写的不是汇编代码),所以我在帖子的最后把这些因素都列出来了。
我觉得这个问题,好多人肯定碰到过,希望碰到这个问题的朋友也回复下,大家交流下,看看这是怎么回事。
#9
这个想法,好像以前用winhex看过内存模块,可能是winhex软件的缘故吧,explorer.exe即使加载了我的dll,我也看不到我的dll(在本机测试的)。
不过你说的icesword软件,我想有必要去试试,不过感觉既然没有提示,应该也不会加载。
#10
WaitForSingleObject(hThreadCreate, INFINITE);
GetExitCodeThread(hThreadCreate, &hLibModule);
这两句加上去,一定要等待远程线程结束返回,然后看下GetExitCodeThread返回的DLL加载地址。
#11
好的,这个我倒是没有想过,写这段代码的时候为了图个省事,直接就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的可能性不大。
系统目录下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,执行过程中加上一些判断,看看是否每步操作都成功。
另外注意一下测试系统中有哪些安全类软件。
2、CreateRemoteThread,执行过程中加上一些判断,看看是否每步操作都成功。
另外注意一下测试系统中有哪些安全类软件。
#16
这种浏览器注入,我以前写的没你这种问题
你看是不是杀毒软件在里边, 反注入其实也容易做的,
你看是不是杀毒软件在里边, 反注入其实也容易做的,
#17
看了一下你的代码,怎么刚hook就SendMessage了?你这里涉及到同步的问题,全局钩子要挂到所有进程里需要时间的,可能还没来得及挂完所有的进程,你就SendMessage了,当然就钩不到了,不过这仅是猜测,你可以先找个anti-rootkit tool看一下。不太理解的是你在MyMsgProc里去UnHook hhook,MyMsgProc是运行在被挂进程的地址空间中,你的hhook放在共享数据段里了?不然你这里的卸载无效
#18
今天起来看帖,发现很多人心的朋友给我建议,很是感动,在这里表示感谢
#19
自定义的消息,我是看到教程上是这样写的,所以也没有太注意,也按照这个做法来写。
在自己的机子上,我一开始还做了这样的测试,就是在钩子dll的DLL_PROCESS_ATTACH中加入了messagebox,只要有一个视窗进程加载了我的钩子,就会弹出一个窗口(我只是纯粹的加载全局钩子),结果是桌面上所有的GUI程序都加载了我的钩子(包括explorer)。
可是遗憾的是,我在测试的机器上也用过同样的方法来检测钩子的加载情况,结果是,除了非系统的窗口(比如vc,editplus),系统的窗口(explorer.exe和notepad.exe)都没有加载上我的钩子。
全局钩子的测试,这样测试的结果最直接,但是给我的打击不小,explorer根本就不加载我的钩子。
createremotethread前面的每一步我都查过,VirtualAllocEx分配了explorer的内存,而且WriteProcessMemory也写入了内存(我用winhex实时检查过,的确是复制过去了)。
createremotethread的返回值不是NULL,也就是这个函数没有失败,但是没有任何窗口弹出。
最后,要补充说明的一句,我在测试的所有机子上都注意看过了,全部没有安装什么安全软件,有一台机器安装了冰点还原,还有三台是裸机。
#20
这个我也觉得很奇怪,好像我写的这段代码,大家都写过,但是只有我遇见了这样的问题,的确没有杀毒软件。
反注入很简单,这个我也知道(遇上了这些个事情),测试机器上的杀毒软件是绝对没有的。
我感觉大家在写这种程序的时候都是很早的时候写的,而我在测试的机器上都是windowsXp sp3(虽然我自己的一台机器也是sp3)上写的,怀疑是不是微软最近升级了一个什么安全补丁,导致explorer等系统自带的gui程序安全性提高,不能被注入了,以上只是我的推测,希望有哪位朋友可以直接的证明下。
#21
看一下测试机的操作系统是不是64位的?32位DLL无法注入64位进程。
#22
不懂,帮顶
不过注入Explorer进程的dll有MessageBox的话,
一运行到MessageBox程序就会都卡住了,这个我倒是试过
其他的就不了解了,诡异……
不过注入Explorer进程的dll有MessageBox的话,
一运行到MessageBox程序就会都卡住了,这个我倒是试过
其他的就不了解了,诡异……
#23
MessageBox的问题吧,我也遇到过,有些情况下MessageBox就是死活弹不出来,后来也没找到问题的原因。
ps:注入explorer.exe是没问题的,我的winxp sp3所有的补丁都打了,注入explorer.exe和winlogon.exe都没有问题。
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.
以上是我今天的总结,各位有兴趣的朋友们也可以用我的代码在自己的机器上测试下,看看到底能不能运行(在排除杀软的因素后),把结果告诉给大家,看看这到底是不是个例。
仔细的研究了其中一台测试机器,在正常模式下,我的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函数的调用以及该函数用到的第四个参数的来源
的代码贴出来看看呢?
CreateRemoteThread函数的调用以及该函数用到的第四个参数的来源
的代码贴出来看看呢?
#26
试过 可以注入。。
#27
LZ有没有在OllyDBG中查看你的DLL确实没有被加载?确定没有被加载?
#28
咱俩的经历差不多,都是要注册全局的钩子,现在我用的CreateRemoteThread的方式。
第一种方式,我测过,SetWindowsHook(WH_GETMESSAGE....),是不能注入到所有的程序,包括Word,而且有的程序一会可以注入,一会又不能注入。
第二种方式,我昨天才调出来,XP SP3,补丁都打了,没问题,还没在别的机器上测。
如果 有可能的话,你在别的机器上装上VS环境,单步调试一下,不然真的很难确定哪儿问题啊。
Three Ways to Inject Your Code into Another Process的代码如果不能运行,肯定是系统原因。
第一种方式,我测过,SetWindowsHook(WH_GETMESSAGE....),是不能注入到所有的程序,包括Word,而且有的程序一会可以注入,一会又不能注入。
第二种方式,我昨天才调出来,XP SP3,补丁都打了,没问题,还没在别的机器上测。
如果 有可能的话,你在别的机器上装上VS环境,单步调试一下,不然真的很难确定哪儿问题啊。
Three Ways to Inject Your Code into Another Process的代码如果不能运行,肯定是系统原因。
#29
CreateRemoteThread 后,调用GetLastError , 如果错误返回120, 则是系统问题了,
#30
是用的detours吗? 我好像也有这个问题。。
#31
#32
我碰到了和楼主一样的问题,
一切比较特殊的程序都不能注入,比如explorer mspaint notepad只有自己编写的编程才可以注入。
我想应该是系统的问题吧。
一切比较特殊的程序都不能注入,比如explorer mspaint notepad只有自己编写的编程才可以注入。
我想应该是系统的问题吧。
#33
莫非是数据执行保护?
#1
写这么多不容易。帮你顶下
#2
权限问题,提个Debug权限应该就没问题了
#3
好了,这么长的帖子,我总结下:
1.hook函数,explorer不上钩
2.createremotethread,explorer不运行(前面的数据复制都没有问题)
3.关键是我自己的机子能行,但是跑到别人的机子上去就不行了。
就是这么简单的问题,希望各位大大畅想欲言,帮忙分析下,到底是怎么回事,对于所有有建设性的回复,本人都会非常期待和欢迎,谢谢了!
1.hook函数,explorer不上钩
2.createremotethread,explorer不运行(前面的数据复制都没有问题)
3.关键是我自己的机子能行,但是跑到别人的机子上去就不行了。
就是这么简单的问题,希望各位大大畅想欲言,帮忙分析下,到底是怎么回事,对于所有有建设性的回复,本人都会非常期待和欢迎,谢谢了!
#4
这位朋友,不是进程权限的问题吧,我的程序在所有的机子上运行的时候都是SeDebugPrivilege,debug权限肯定没有问题,但是就是在我的机子上能用,跑到别的机子上就不行了。
#5
explorer.exe记得可以不用提权,winlogon.exe这些才要。
远程线程注入方式,有些杀软没阻止。
加个个getlasterror()判断下是什么。
远程线程注入方式,有些杀软没阻止。
#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
五楼的朋友,非常感谢你的答复,我仔细看了你的代码,由于现在是在自己的机子上,所以不能测试代码。
记得以前在别的机子上有过你的这个思路,我也觉得是createremotethread失败,但是用messagebox测试下,返回的线程句柄不是NULL,也就是说函数顺利运行,但是explorer。exe就是没有反应(应该会弹出d一个msbox的)。
#7
你这样,找个ARK工具,比如冰刃,wsyscheck,xuetr,看下explorer.exe进程有没有你的DLL。
我用xuetr
我用xuetr
#8
这么说来感觉很奇怪,不管是我在谷歌上搜索,csdn里搜索还是看发帖各位的回复,好像大家都没有碰到过这个问题。
代码用的就是codeproject上的Three Ways to Inject Your Code into Another Process(代码注入的三种方法),我只是用它的代码,然后自己稍微修改了下,在自己的机器上能运行,很好。
但是当我有一天拿到别人的机子上去测试的时候,却发现没有用,于是试了很多机器,都是没有用的,而只有我自己的两台本本能运行。
个人认为这很是一个问题,这些代码没有任何的特殊性,都是windowsXP系统,唯一不同,而且可能影响到结果的因素就是操作系统版本,补丁和cpu(虽然我也觉得很不可思议,我写的不是汇编代码),所以我在帖子的最后把这些因素都列出来了。
我觉得这个问题,好多人肯定碰到过,希望碰到这个问题的朋友也回复下,大家交流下,看看这是怎么回事。
代码用的就是codeproject上的Three Ways to Inject Your Code into Another Process(代码注入的三种方法),我只是用它的代码,然后自己稍微修改了下,在自己的机器上能运行,很好。
但是当我有一天拿到别人的机子上去测试的时候,却发现没有用,于是试了很多机器,都是没有用的,而只有我自己的两台本本能运行。
个人认为这很是一个问题,这些代码没有任何的特殊性,都是windowsXP系统,唯一不同,而且可能影响到结果的因素就是操作系统版本,补丁和cpu(虽然我也觉得很不可思议,我写的不是汇编代码),所以我在帖子的最后把这些因素都列出来了。
我觉得这个问题,好多人肯定碰到过,希望碰到这个问题的朋友也回复下,大家交流下,看看这是怎么回事。
#9
这个想法,好像以前用winhex看过内存模块,可能是winhex软件的缘故吧,explorer.exe即使加载了我的dll,我也看不到我的dll(在本机测试的)。
不过你说的icesword软件,我想有必要去试试,不过感觉既然没有提示,应该也不会加载。
#10
WaitForSingleObject(hThreadCreate, INFINITE);
GetExitCodeThread(hThreadCreate, &hLibModule);
这两句加上去,一定要等待远程线程结束返回,然后看下GetExitCodeThread返回的DLL加载地址。
#11
好的,这个我倒是没有想过,写这段代码的时候为了图个省事,直接就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的可能性不大。
系统目录下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,执行过程中加上一些判断,看看是否每步操作都成功。
另外注意一下测试系统中有哪些安全类软件。
2、CreateRemoteThread,执行过程中加上一些判断,看看是否每步操作都成功。
另外注意一下测试系统中有哪些安全类软件。
#16
这种浏览器注入,我以前写的没你这种问题
你看是不是杀毒软件在里边, 反注入其实也容易做的,
你看是不是杀毒软件在里边, 反注入其实也容易做的,
#17
看了一下你的代码,怎么刚hook就SendMessage了?你这里涉及到同步的问题,全局钩子要挂到所有进程里需要时间的,可能还没来得及挂完所有的进程,你就SendMessage了,当然就钩不到了,不过这仅是猜测,你可以先找个anti-rootkit tool看一下。不太理解的是你在MyMsgProc里去UnHook hhook,MyMsgProc是运行在被挂进程的地址空间中,你的hhook放在共享数据段里了?不然你这里的卸载无效
#18
今天起来看帖,发现很多人心的朋友给我建议,很是感动,在这里表示感谢
#19
自定义的消息,我是看到教程上是这样写的,所以也没有太注意,也按照这个做法来写。
在自己的机子上,我一开始还做了这样的测试,就是在钩子dll的DLL_PROCESS_ATTACH中加入了messagebox,只要有一个视窗进程加载了我的钩子,就会弹出一个窗口(我只是纯粹的加载全局钩子),结果是桌面上所有的GUI程序都加载了我的钩子(包括explorer)。
可是遗憾的是,我在测试的机器上也用过同样的方法来检测钩子的加载情况,结果是,除了非系统的窗口(比如vc,editplus),系统的窗口(explorer.exe和notepad.exe)都没有加载上我的钩子。
全局钩子的测试,这样测试的结果最直接,但是给我的打击不小,explorer根本就不加载我的钩子。
createremotethread前面的每一步我都查过,VirtualAllocEx分配了explorer的内存,而且WriteProcessMemory也写入了内存(我用winhex实时检查过,的确是复制过去了)。
createremotethread的返回值不是NULL,也就是这个函数没有失败,但是没有任何窗口弹出。
最后,要补充说明的一句,我在测试的所有机子上都注意看过了,全部没有安装什么安全软件,有一台机器安装了冰点还原,还有三台是裸机。
#20
这个我也觉得很奇怪,好像我写的这段代码,大家都写过,但是只有我遇见了这样的问题,的确没有杀毒软件。
反注入很简单,这个我也知道(遇上了这些个事情),测试机器上的杀毒软件是绝对没有的。
我感觉大家在写这种程序的时候都是很早的时候写的,而我在测试的机器上都是windowsXp sp3(虽然我自己的一台机器也是sp3)上写的,怀疑是不是微软最近升级了一个什么安全补丁,导致explorer等系统自带的gui程序安全性提高,不能被注入了,以上只是我的推测,希望有哪位朋友可以直接的证明下。
#21
看一下测试机的操作系统是不是64位的?32位DLL无法注入64位进程。
#22
不懂,帮顶
不过注入Explorer进程的dll有MessageBox的话,
一运行到MessageBox程序就会都卡住了,这个我倒是试过
其他的就不了解了,诡异……
不过注入Explorer进程的dll有MessageBox的话,
一运行到MessageBox程序就会都卡住了,这个我倒是试过
其他的就不了解了,诡异……
#23
MessageBox的问题吧,我也遇到过,有些情况下MessageBox就是死活弹不出来,后来也没找到问题的原因。
ps:注入explorer.exe是没问题的,我的winxp sp3所有的补丁都打了,注入explorer.exe和winlogon.exe都没有问题。
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.
以上是我今天的总结,各位有兴趣的朋友们也可以用我的代码在自己的机器上测试下,看看到底能不能运行(在排除杀软的因素后),把结果告诉给大家,看看这到底是不是个例。
仔细的研究了其中一台测试机器,在正常模式下,我的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函数的调用以及该函数用到的第四个参数的来源
的代码贴出来看看呢?
CreateRemoteThread函数的调用以及该函数用到的第四个参数的来源
的代码贴出来看看呢?
#26
试过 可以注入。。
#27
LZ有没有在OllyDBG中查看你的DLL确实没有被加载?确定没有被加载?
#28
咱俩的经历差不多,都是要注册全局的钩子,现在我用的CreateRemoteThread的方式。
第一种方式,我测过,SetWindowsHook(WH_GETMESSAGE....),是不能注入到所有的程序,包括Word,而且有的程序一会可以注入,一会又不能注入。
第二种方式,我昨天才调出来,XP SP3,补丁都打了,没问题,还没在别的机器上测。
如果 有可能的话,你在别的机器上装上VS环境,单步调试一下,不然真的很难确定哪儿问题啊。
Three Ways to Inject Your Code into Another Process的代码如果不能运行,肯定是系统原因。
第一种方式,我测过,SetWindowsHook(WH_GETMESSAGE....),是不能注入到所有的程序,包括Word,而且有的程序一会可以注入,一会又不能注入。
第二种方式,我昨天才调出来,XP SP3,补丁都打了,没问题,还没在别的机器上测。
如果 有可能的话,你在别的机器上装上VS环境,单步调试一下,不然真的很难确定哪儿问题啊。
Three Ways to Inject Your Code into Another Process的代码如果不能运行,肯定是系统原因。
#29
CreateRemoteThread 后,调用GetLastError , 如果错误返回120, 则是系统问题了,
#30
是用的detours吗? 我好像也有这个问题。。
#31
#32
我碰到了和楼主一样的问题,
一切比较特殊的程序都不能注入,比如explorer mspaint notepad只有自己编写的编程才可以注入。
我想应该是系统的问题吧。
一切比较特殊的程序都不能注入,比如explorer mspaint notepad只有自己编写的编程才可以注入。
我想应该是系统的问题吧。
#33
莫非是数据执行保护?