ctrl+alt+del中程序隐藏的问题 (50分)

  • 主题发起人 主题发起人 小城月光
  • 开始时间 开始时间

小城月光

Unregistered / Unconfirmed
GUEST, unregistred user!
各位高手:[:)]
我想让程序隐藏起来,用ctrl+alt+del也看不到,程序如下:
在implementation下声明
function RegisterServiceProcess(a:longint;const b:longint):dword;stdcall;far;external 'Kernel32.dll' name 'RegisterServiceProcess'

然后再RegisterServiceProcess(GetCurrentProcessID, 1);
结果提示无法定位'Kernel32.dll' 的入口点,请问什么原因?
delphi7+winxp
 
在Win2000/WinXP中此办法是行不通的
 
给你些资料参考吧
到www.vckbase.com去看看。

WINDOWS NT/2000下如何屏蔽CTRL+ALT+DEL
作者:ac952_z_cn

前言
在WINDOWS 9X环境中我们可以使用SystemParametersInfo (SPI_SCREENSAVERRUNNING, 1,NULL, 0);来屏蔽CTRL+ALT+DEL,但在NT/2000环境下却行不通,即使使用WH_KEYBOARD_LL这个低级的键盘hook也无法拦截!笔者通过替换GINA DLL的方式很好地实现了在NT/2000下屏蔽CTRL+ALT+DEL的功能。

下载源代码 6K

一、原理
在NT/2000中交互式的登陆支持是由WinLogon调用GINA DLL实现的,GINA DLL提供了一个交互式的界面为用户登陆提供认证请求。在WinLogon初始化时,就向系统注册截获CTRL+ALT+DEL消息,所以其他程序就无法得到CTRL+ALT+DEL的消息。
WinLogon会和GINA DLL进行交互,缺省是MSGINA.DLL(在System32目录下)。微软同时也为我们提供的接口,自己
可以编GINA DLL来代替MSGINA.DLL。

WinLogon初始化时会创建3个桌面:
(1)、winlogon桌面:主要显示window 安全等界面,如你按下CTRL+ALT+DEL,登陆的界面等
(2)、应用程序桌面:我们平时见到的那个有我的电脑的界面
(3)、屏幕保护桌面:屏幕保护显示界面。

在用户登陆以后,按下CTRL+ALT+DEL键的时候,WinLogon回调用GINA DLL的输出函数:WlxLoggedOnSAS,
这时正处于winlogon桌面,我们只要直接将他转向应用程序桌面,系统就不会显示Windows安全那个界面,换一种说法
也就是用户按下CTRL+ALT+DEL后,不会起什么作用。当是我们在切换桌面的时候会出现屏幕闪动!

二、程序实现
GINA DLL要输出下列函数(winlogon会调用)
WlxActivateUserShell
WlxDisplayLockedNotice
WlxDisplaySASNotice
WlxDisplayStatusMessage
WlxGetStatusMessage
WlxInitialize
WlxIsLockOk
WlxIsLogoffOk
WlxLoggedOnSAS
WlxLoggedOutSAS
WlxLogoff
WlxNegotiate
WlxNetworkProviderLoad
WlxRemoveStatusMessage
WlxScreenSaverNotify
WlxShutdown
WlxStartApplication
WlxWkstaLockedSAS
为了简化编程,我们从MSGINA.DLL中动态获取上诉函数,在自定义的DLL中(以下称为NoReboot.DLL)中直接调用MSGINA.DLL
的函数即可。现在我们要处理的就是WlxLoggedOnSAS函数:


int WINAPI WlxLoggedOnSAS (
PVOID pWlxContext,
DWORD dwSasType,
PVOID pReserved)
{
HANDLE hMutex;
WriteInfo("WlxLoggedOnSAS /r/n"); //用于记录信息
if (dwSasType == WLX_SAS_TYPE_CTRL_ALT_DEL){ //屏蔽CTRL_ALT_DEL,也可以根据特定条件来决定是否要屏蔽
//我采用了Mutex来控制是否屏蔽,(注意:要用unicode)
hMutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, L"_ac952_z_cn_CTRL_ALT_DEL");
if (hMutex){
CloseHandle(hMutex);
WriteInfo("disble CTRL+ALT+DEL /r/n");
return WLX_SAS_ACTION_NONE; //将屏幕切换到应用程序桌面,屏蔽掉CTRL+ALT+DEL
}
else
WriteInfo("not disble CTRL+ALT+DEL /r/n");
}
return prcWlxLoggedOnSAS ( //这是我从MSGINA.DLL中获取的函数。
pWlxContext,
dwSasType,
pReserved);
}

我们要在自己的程序中调用hMutex = CreateMutex(NULL, FALSE, "_ac952_z_cn_CTRL_ALT_DEL");就可屏蔽CTRL+ALT+DEL。

三、安装和注意事项:

在编写GIAN DLL中要注意,GINA DLL使用的是unicode。

GINA DLL的安装:
键名 : /HKEY_LOCAL_MACHINE/Software/Microsoft/Windows NT/CurrentVersion/Winlogon
变量名 : GinaDLL
变量类型 : [REG_SZ]
内容 : "你的GINA DLL的名称" 如:"NoReboot.DLL:

将你的GINA DLL(NoReboot.dll)拷贝到系统目录下(system32),重启机器,你的GINA DLL(NoReboot.dll)就会运行。
如果出现进不了你的系统,那你进入DOS后,将msgina.dll拷贝成你的GINA DLL(NoReboot.dll)就可进入了,或者进入
安全模式,删除掉那个键值。
 
谢谢楼上两位!
不过我不懂vc,而且此解决方法也很麻烦,有在delphi下的很好的解决方法吗?
 
2000/xp下唯一可行的办法就是作为线程运行到别人程序的空间里去。光屏蔽ctrl+alt+del没用,即使屏蔽了ctrl+alt+del在任务栏上点鼠标右键直接打开资源管理器一样现形。
 
转贴
请到
http://delphi.mychangshu.com/dispdoc.asp?id=991
下载代码

也谈在Windows2000下屏蔽Ctrl-Alt-Del键
概述:本文通过应用DLL注入,函数替换(HOOK API)等技术达到了在Windows2000下不修改注册表,不重新启动的情况下屏蔽了Ctrl-Alt-Del键

有幸拜读了《程序员》杂志2001年11期上的陆其明先生的《Win2K/NT下屏蔽Ctrl+Alt+Del的响应》,通过这篇文章的启发,我完成了一个可以在应用程序需要屏蔽Ctrl-Alt-Del的时候就屏蔽,不需要屏蔽的时候就取消的方法,不用需要书写一个额外的gina.dll文件,也不需要重新启动系统和修改注册表。
该方法的基本原理是通过HOOK winlogon.exe所使用的gina.dll中的WlxLoggedOnSAS函数,大家通过《Win2K/NT下屏蔽Ctrl+Alt+Del的响应》这篇文章都知道,当按下Ctrl-Alt-Del键时,WinLogon.exe就会调用msgina.dll中的函数WlxLoggedOnSAS来进行验证,此时如果我们能够修改这个函数的返回值,我们也就可以使Windows不进入Logon窗口了。
可是,我们应该怎样做才可以修改WlxLoggedOnSAS函数的返回值?对比大量论坛上讨论的屏幕取词等等技术,我们不难看到答案,使用函数替换(HookAPI)技术,修改WlxLoggedOnSAS函数的入口地址就可以做到这一点,我们只要自己完成一个WlxLoggedOnSAS的替换函数就可以了,在替换函数里,我们返回我们需要的值就达到了修改函数返回值的效果,进而就达到了屏蔽Ctrl-Alt-Del键的目的。
通过上面的讨论,在这个方法中我们至少需要使用到如下的技术:DLL注入,函数替换(Hook API)。为了配合理解本文提供完整的能够运行的Delphi代码,在Windows2000+Delphi5下通过,可以在CSDN相关栏目中进行下载。
DLL注入
所谓的DLL注入是指将DLL文件加载到其他的进程空间中。目前,常用的方法有使用钩子(SetWindowsHook),使用创建远程线程(CreateRemoteThread),以及切换线程执行上下文(SuspendThread,GetThreadContext,SetThreadContext,ResumeThread)等等方法。本文使用的是创建远程线程的方法。

函数替换(HOOK API)
关于这种技术的讨论,网上也同样有大量的论述,在这里我只是讲述我所使用的方法。
 
to Another_eYes:
作为线程运行到别人程序的空间里去?
可以给个例子吗?请多指教!!
 
再转载一篇你看看,实例在下面
利用windows的一个*.dll御截漏洞,可以实现在win9x,nt,w2k下进程的深度隐藏,按CTRL+ALT+DEL看不到,用终极防线也看不到,这是我的最新发现,想和大家一起讨论,
我已实现了这一功能,源程在http://njhhack.freehomepages.com/source/hideproc.zip
我的oicq:10772919
e-mail:njhhack@21cn.com
homepage:hotsky.363.net

-----------------

呵呵,各位兄弟,配合我的Delphi源码,讲一下它的工作原理吧,不过大家不要用来做坏事哟,我可是从不黑人的,谁让我是人民教师哟,原理如下:
我编了个启动程序winexec.exe用它来启动install.dll这个安装库,install.dll中有个安装函数用来启动getkey.dll这个执行库,getkey.dll里面有我的木马程序,这个getkey.dll库被挂到explorer.exe的进空间中,然后winexec.exe和install.dll在内存中自动御载,但是getkey.dll仍在内存中运行(这就是*.dll的御载漏洞),因为这时系统中已没有我的winexec.exe存在,所以按CTRL+ALT+DEL查不到有我的进程在运行,这就是进程三级跳.
呵呵,可是,大家知道getkey.dll是如何被挂到explorer.exe这个系统shell进程的地址空间中吗,请听我慢慢道来:
在windows系统中,要进入另一个进程的空间有很多方法,最标准的方法是微软提供的系统级hook功能,大家知道当一个hook放入*.dll中时会成会系统级hook,这是它能收到所以系统中传输的消息,而且若消息是其它进程的线程发出或接收的,那么该*.dll(就是我程序中的install.dll啦)会被强行映射到该进程的地址空间(比如说我的install.dll被映射到explorer.exe的进程空间中),这时install.dll就成了explorer.exe进程的一个调用模块,这时在install.dll用createthread函数创建的线程会成为explorer.exe进程主线程的子线程,这样我们就在explorer.exe的家中暂时有了一块合法的土地,但这只是开始,因为我们的目标是隐藏自已的进程,所以要把winexec.exe在内存中去掉,但这不是我们想要的结果,大家想想,install.dll是由winexec.exe调用的,所以,当winexec.exe死掉后,install.dll也活不成,我们在explorer.exe中占下的一席之地就又没了,那如何办呢,呵呵,听我慢慢讲来:
上面我们说了,当install.dll在explorer.exe中安家后,我们创建的线程就是explorer.exe的子线程,那么由install.dll中调用的*.dll(就是我们程序中的getkey.dll)也会成为explorer.exe的子模块,根据*.dll的特殊性(就是我认为的*.dll的御载漏洞),在install.dll从内存中御掉后,被它调用的getkey.dll还在内存中好好的活着呢,呵呵,微软真是个好宝宝,为我们提供了这么好的驻留内存的机会,我想之所以这样,是因为*.dll不可以成为另一个*.dll的拥有者,只有*.exe才能成为*.dll的拥有者吧,所以explorer.exe就成了getkey.dll的合法拥有者,呵呵,因为explorer.exe是微软的好东东,所以永远在内存中活着,那我们的好战士getkey.dll当然靠着这棵大树也在内存中活的好好的哟,这样我们可爱的getkey.dll就永远安全地在explorer.exe中安了家,呵呵,我们终于可以过河拆桥了,不要说我坏呀,我不要这么做,可不这样的话我的winexec.exe这会被人发现了呀,好可怜哟,这是你在getkey.dll中发出postmessage(findwindow('winexec',nil),wm_destroy,0,0)指令,就会让讨厌的winexec.exe(不对,是可爱的,只不过你的任务完成了,没有了哟,呵呵)从内存中死掉,当然它的好儿子install.dll也会随父而去,但我们可爱的getkey.dll确好好的活在内存中(啊啊,这是为什么呀,gekey.dll的爷爷winexec.exe都死了,它的孙子getkey.dll为何不死呀,呵呵,别忘了哟,getkey.dll的继父explorer.exe很有本事哟,它把它保护的好好的哟,所以死不了的啦),呵呵,明白了吗,这时的内存中已经没有了winexec.exe和install.dll的身影,只有getkey.dll存在,而且是explorer.exe的一个调用模块,当然用CTRL+ALT+DEL只能看到好人explorer.exe,而winexec.exe送给它的坏儿子是看不到了啦,呵呵,如果你用prcview或用spy++,winsight包括各种深度查木马程序(如终极防线)查的话,你只能看到getkey.dll在内存中,但调用者是explorer.exe(这是比尔的好孩子哟,没人怀疑它做坏事吧,呵呵),所以就没人理这个getkey.dll这个坏孩子啦,呵呵,若实在有高手认为它可疑,那好吧,我们加工加工,把getkey.dll的名字改成winsock.dll,然后放在和windows中自带的winsock不同的目录中,呵呵没人怀疑这个文件吧,当然把getkey.dll的版权信息改成是微软的更好啦,呀呀,比尔你不要生气呀,谁叫你这么坏哪,呵呵,我走了..............
 
多人接受答案了。
 
后退
顶部