VC下揭开“特洛伊木马”的隐藏面纱
2010-08-18 16:06
295 查看
摘要:本文针对于黑软隐藏程式的技术对其基本原理和多种实现方法做了较为深入的剖析。
关键字:黑客软件、隐藏程式、Visual C++
一、引言
“特洛伊木马”曾在网上造成很大恐慌,此类黑客程式通过欺骗手段在普通网络用户端安装木马的服务端,使用户的电脑在上网时留有后门,而黑客则能够通过这个后门对被感染的电脑随心所欲地进行监控、破坏。显然这种黑软对于普通网络用户的危害是很严重的。
就本质而言黑客软件仍然属于应用程式,是基于套接字的网络通讯程式。因此黑客能成功攻击被感染电脑的一个很必要的先决条件就是此时被攻击方已有木马程式的服务端在运行。由于木马程式是一种恶意程式,能在被攻击者没有察觉的情况下悄悄启动运行为攻击者打开后门,故显然不能象其他程式相同堂而皇之的显示在任务栏和任务列表中,否则会立即为用户所察觉而将其关闭,也就失去了为攻击者提供后门的作用。本文下面就针对其隐藏程式的机理展开讨论。
二、程式在任务栏中的隐藏原理
程式在任务栏的隐藏比较简单,首先要确保程式主界面的隐藏,一般是通过修改应用程式类的初始化实例函数InitInstance()的ShowWindow()语句的SW_SHOW参数为SW_HIDE来实现的。主界面隐藏的同时任务栏虽然也会消失,但在程式启动时会闪一下,因此需要修改程式的扩展属性。一种方法是SDK的写法,即直接利用GetWindowLong()获取到当前的扩展属性然后通过逻辑运算去掉原有的WS_EX_APPWINDOW属性,并新添加一个WS_EX_TOOLWINDOW属性,这样系统会将其认为是个工具条窗口而不会再在任务栏中加以显示。最后需要将修改过的扩展属性通过SetWindowLong()函数将其写回。这两个函数的声明分别如下:
另一种很简便的是MFC的写法:在程式框架类的预创建窗口函数里通过直接对CREATESTRUCT结构对象的逻辑操作而将程式属性进行改变:
这两种写法虽然表现形式各不相同,其本质都是相同的。
三、程式在任务列表中的隐藏原理
任务列表(Ctrl+Alt+Del时弹出的对话框)显示了当前系统正在运行的一些应用程式,假如实现了上一步,虽然在任务栏看不见程式,但有经验的用户能够通过观察任务列表而发现一些值得怀疑的应用程式而在此将其关闭。所以大多数黑软也都通过较复杂的手段实现了自身在任务列表中的隐藏,使被发现的机会大大降低。
在Win9x/2000中,一般每个应用程式都要通过一个API(应用程式接口)函数RegisterServiceProcess()向系统申请注册成为一个服务进程,并且也是通过这个函数注销其服务进程来结束这个服务进程的运行。假如一个进程注册为一个服务进程,通过Ctrl+Alt+Del就能够在任务列表里看见该进程的标题。而假如一个进程运行了但没有向系统申请注册成为服务进程那么就不会在任务列表里显示。黑软也正是利用这个原理使自身在运行时能在任务列表中实现隐藏。该函数存放于系统内核Kernel32.dll中,具体声明如下:
其第一个参数指定为一个服务进程的进程标识,假如是0则注册当前的进程;第二个参数指出是注册还是注销当前的进程,其状态分别为:RSP_SIMPLE_SERVICE和RSP_UNREGISTER_SERVICE。黑软一般是在程式启动初始化时首先从Kernel32.dll动态连接库中将RegisterServiceProcess()函数加载到内存,然后再通过该函数将程式从任务列表中隐藏:
另外,更有一部分黑软是通过ShowWindowAsync()函数启动一个新的线程来显示一个新窗口的。该函数的原形为:
而黑软正是钻了该函数的第二个参数能够配置窗体显示状态的空子,在配置成SW_HIDE时就能够使目标窗体(黑软)从任务列表中隐藏。
四、小结
以上就是Win9x/2000下的黑客程式所具备的一些基本功能,在此基础上我们能够借助于其实现技巧来编写出一些诸如后台监控之类的实用程式。并且能够通过对黑客类软件的隐藏机理的分析能使广大用户对此类黑软采取一些必要的措施,通过加强防范来使自己的损失防患于未然。
关键字:黑客软件、隐藏程式、Visual C++
一、引言
“特洛伊木马”曾在网上造成很大恐慌,此类黑客程式通过欺骗手段在普通网络用户端安装木马的服务端,使用户的电脑在上网时留有后门,而黑客则能够通过这个后门对被感染的电脑随心所欲地进行监控、破坏。显然这种黑软对于普通网络用户的危害是很严重的。
就本质而言黑客软件仍然属于应用程式,是基于套接字的网络通讯程式。因此黑客能成功攻击被感染电脑的一个很必要的先决条件就是此时被攻击方已有木马程式的服务端在运行。由于木马程式是一种恶意程式,能在被攻击者没有察觉的情况下悄悄启动运行为攻击者打开后门,故显然不能象其他程式相同堂而皇之的显示在任务栏和任务列表中,否则会立即为用户所察觉而将其关闭,也就失去了为攻击者提供后门的作用。本文下面就针对其隐藏程式的机理展开讨论。
二、程式在任务栏中的隐藏原理
程式在任务栏的隐藏比较简单,首先要确保程式主界面的隐藏,一般是通过修改应用程式类的初始化实例函数InitInstance()的ShowWindow()语句的SW_SHOW参数为SW_HIDE来实现的。主界面隐藏的同时任务栏虽然也会消失,但在程式启动时会闪一下,因此需要修改程式的扩展属性。一种方法是SDK的写法,即直接利用GetWindowLong()获取到当前的扩展属性然后通过逻辑运算去掉原有的WS_EX_APPWINDOW属性,并新添加一个WS_EX_TOOLWINDOW属性,这样系统会将其认为是个工具条窗口而不会再在任务栏中加以显示。最后需要将修改过的扩展属性通过SetWindowLong()函数将其写回。这两个函数的声明分别如下:
LONG GetWindowLong(HWND hWnd,int nIndex); LONG SetWindowLong(HWND hWnd,int nIndex,LONG dwNewLong); |
cs.style=WS_POPUP; cs.dwExStyle|=WS_EX_TOOLWINDOW; |
三、程式在任务列表中的隐藏原理
任务列表(Ctrl+Alt+Del时弹出的对话框)显示了当前系统正在运行的一些应用程式,假如实现了上一步,虽然在任务栏看不见程式,但有经验的用户能够通过观察任务列表而发现一些值得怀疑的应用程式而在此将其关闭。所以大多数黑软也都通过较复杂的手段实现了自身在任务列表中的隐藏,使被发现的机会大大降低。
在Win9x/2000中,一般每个应用程式都要通过一个API(应用程式接口)函数RegisterServiceProcess()向系统申请注册成为一个服务进程,并且也是通过这个函数注销其服务进程来结束这个服务进程的运行。假如一个进程注册为一个服务进程,通过Ctrl+Alt+Del就能够在任务列表里看见该进程的标题。而假如一个进程运行了但没有向系统申请注册成为服务进程那么就不会在任务列表里显示。黑软也正是利用这个原理使自身在运行时能在任务列表中实现隐藏。该函数存放于系统内核Kernel32.dll中,具体声明如下:
DWORD RegisterServiceProcess(DWORD dwProcessId,DWORD dwType); |
//从Kernel32.dll中加载RegisterServiceProcess() HMODULE m_hKernel=::GetModuleHandle("Kernel32.DLL"); RSP m_rsp=(RSP)::GetProcAddress(m_hKernel,"RegisterServiceProcess"); m_rsp(::GetCurrentProcessId(),1);//此时为隐藏,当第二个参数为0时显示 |
BOOL ShowWindowAsync(HWND hWnd,int nCmdShow); |
四、小结
以上就是Win9x/2000下的黑客程式所具备的一些基本功能,在此基础上我们能够借助于其实现技巧来编写出一些诸如后台监控之类的实用程式。并且能够通过对黑客类软件的隐藏机理的分析能使广大用户对此类黑软采取一些必要的措施,通过加强防范来使自己的损失防患于未然。
相关文章推荐
- VC下揭开“特洛伊木马”的隐藏面纱
- VC下揭开“特洛伊木马”的隐藏面纱
- VC下揭开“特洛伊木马”的隐藏面纱 转自天极网
- VC下揭开“特洛伊木马”的隐藏面纱
- VC下揭开“特洛伊木马”的隐藏面纱
- 揭开隐藏数据的面纱,优化应用程序性能
- 【软件测试自动化-QTP系列讲座 14】 == 揭开QTP的神秘面纱 (一)隐藏对象篇 ==
- 揭开隐藏数据的面纱,优化应用程序性能
- 揭开隐藏数据的面纱,优化应用程序性能
- 【软件测试自动化-QTP系列讲座 15】 == 揭开QTP的神秘面纱 (二)隐藏方法篇 ==
- 揭开隐藏数据的面纱,优化应用程序性能
- Visual C解开特洛伊木马的隐藏面纱
- 揭开隐藏数据的面纱,优化应用程序性能(转)
- 揭开枚举类的面纱(Unlocking the Enumeration/enum Mystery)
- PhoneGap揭开你的神秘面纱
- 揭开Socket编程的面纱
- 揭开ZigBee 2006协议栈Z-Stack的”开源“面纱 以及其它的开源协议
- 推荐系统--揭开推荐的神秘面纱
- 15问答为专业测试人员揭开“精准测试”的面纱
- 用大白话揭开Ajax长轮询(long polling)的神秘面纱