议木马自启动应用

时间:2022-08-20 05:34:00

议木马自启动应用

摘要:木马一种具有远程控制功能的程序。文件关联是木马实现自启动的方法之一,这种方式的实现有三个关键技术。在详细分析这三个关键技术后,用VC++编程实现木马的自启动从而深刻地揭示该方法的原理。

关键词:文件关联;木马;自启动

1木马启动的方式

木马是一种能实现远程控制的黑客程序,具有窃取密码,屏幕控制,文件传输等危害[1]。从广义上来讲,木马是一种病毒,但不具有自我复制的特点,因此,木马要使用各种方法让程序在计算机上运行而又不被用户发现。木马首次被执行后可能被用户关闭或木马程序随着计算机的重启或关闭,因此木马还需要解决自启动的问题,以达到长期控制被害机器的目的。木马常用的启动方法有以下几种:

1.1通过注册表

Windows操作系统的注册表提供了一个注册表项,它的具体路径是:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run。通过该表项可以实现程序的自启动,一些重要的程序也是通过该表项来实现自启动的,例如输入法程序,防火墙程序等。而该表项也为木马的启动提供了可乘之机,一些木马就是利用该表项来实现自启动,例如冰河。

1.2通过服务

Windows的很多后台服务是通过系统“服务”程序来启动的,例如www服务,telnet服务等。一些木马程序也会注册成后台服务从而随着计算机的启动而运行。例如某些版本的灰鸽子就是使用这个方法。一些论文[2]详细讨论了这种方法的实现。

1.3通过文件关联

文件关联是指木马与某一种类型的文件或程序关联在一起,当打开文件或程序被运行时,木马也悄悄随着运行。木马一般选择与常用的文件建立关联,否则即使建立了关联,木马也可能由于文件没有被打开而不能自启动。冰河除了使用注册表的方法外,也使用了关联的方法,它通常关联文本文件,当然也可能关联其它类型的文件。而广外女生则关联了EXE文件和COM文件,因此,任何一个EXE文件运行都启动了木马程序。一些论文[5]讨论了另类的文件关联的方法。

2文件关联的关键技术

用文件关联的方法实现木马自启动有三个关键技术,一是如何与文件或程序建立关联;二是调用正常的程序;三是如何获得用户需要打开的文件名或程序名。本文以关联文本文件为例进行讨论,并在VC++下编程实现。

2.1建立文件关联

一个文件可以用某个程序打开,也可以用另外一个程序打开,但有一个默认的打开程序。默认的打开程序其实是由注册表来决定的。在Windows的注册表HKEY_CLASSES_ROOT表项中,包括很多类型的文件的相关信息,例如文件的图标,文件打开程序等。如果想修改文件的默认打开程序,修改这个注册表项就可以了。因此,当我们要与文本文件建立关联,通过程序修改注册表项

HKEY_CLASSES_ROOT\txtfile中的shell\open\command键的键值为木马程序就可以了。正常情况下,该键值的内容为notepad.exe%1,其中%1表示txt文件名。

2.2调用正常的程序

通过修改注册表,木马能够随着用户双击文件而悄悄运行了,但如果默认的正常程序没有运行,便会引起用户的怀疑,所以木马还需要解决运行正常程序的问题。对于文本文件,默认的打开程序是记事本程序,因此木马还需要调用记事本程序,也就是notepad程序。

2.3获得文件名

木马调用记事本程序的同时,还要获得用户所需要打开的文件名(一般是用户双击的文件名),同时把文件名传递给记事本程序,这样用户所看到的就是文本文件被正常打开了。

3编程思路及实现

在本文中,我们的木马程序命名为server.exe,我们的目标是server程序首次执行时(server程序的首次执行可以通过欺骗用户或捆绑文件等方法来实现),把server程序与txt文件建立关联,此后每当用户双击一个txt文件时,server程序就悄悄地运行,同时txt文件能正常地显示在记事本程序中。因为server程序是悄悄运行,所以用户看到的仅仅是一个记事本程序把txt文件打开了。程序首先实现文件关联,主要通过修改注册表实现;程序获得txt文件完整路径及正确文件名;调用notepad程序,并把获得的文件名传递给notepad程序。当然,server程序作为木马还应包括其它功能,但这些功能不在本文讨论之列。

3.1文件关联的实现

与txt建立关联的方法是,修改注册表的HKEY_CLASSES_ROOT\txtfile\shell\open\command项,把它的键值修改为server.exe程序。这需要用到注册表RegOpenKeyEx()函数以及RegSetValueEx()函数。这部分关键程序代码如下:

//写入注册表,建立关系

HKEYhKey;

HKEYhKey1;

//找到注册表项

LPCTSTRlpCommand="txtfile\\shell\\open\\command";

//打开注册项Key

long

lRet1=RegOpenKeyEx(HKEY_CLASSES_ROOT,lpCommand,0,KEY_WRITE,&hKey1);

if(lRet1==ERROR_SUCCESS)

{//定义并获得木马程序名

charpFileName[100]={0};

DWORDdwRet=GetModuleFileName(NULL,pFileName,MAX_PATH);

chartt[200]={0};

strcpy(tt,pFileName);

strcat(tt,"%1");//%1表示txt文件本身

//添加一个子Key,并设置值

lRet1=RegSetValueEx(hKey1,NULL,0,REG_EXPAND_SZ,(BYTE*)tt,strlen(tt));

//关闭注册表

RegCloseKey(hKey1);

3.2调用正常程序的实现

在server中调用notepad主要用ShellExceute()函数,详细的函数调用见“获得文件名的实现”部分的代码。

3.3获得文件名的实现

由于已经建立关系,当用户双击一个txt文件时,server.exe则会启动,而txt文件名则需要用GetCommandLine()函数进行并且进行处理,这是GetCommandLine()函数所获得的文件名包括一些空字符以及server程序路径以及程序名等。

char*ptr=(char*)GetCommandLine();//获得文件名,如果没有双击txt文件名,则这个文件名是server程序名

intj,k;

j=0;

j=strlen(ptr);

k=strlen(pFileName);//server路径及程序名长度

k=k+3;

if(j>k)//用户双击txt文件

ShellExecute(0,NULL,"notepad.exe",ptr+k,NULL,1);//调用notepad并且把txt文件名传递给notepad程序。

4小结

木马的自启动方法对黑客实现控制被害机器是至关重要的一项功能。关联文件的方法是木马实现自启动的常用方法之一。建立关联,调用正常程序以及获取用户打开文件名是这种方法的三个关键技术。本文讨论木马关联txt文件的实现技术和方法,并在VC++中编程实现。木马的自启动还应考虑是否运行多个木马程序的问题,也就是程序互斥的实现,程序在这一方面并没有解决和实现这个问题,如果解决了这个问题,则程序则更加完善。