家电维修班,手机维修班,电脑维修班,电工班,焊工班,液晶电视维修班,电动工具维修班、电动车摩托车维修班、网络营销培训、网站设计培训、淘宝培训---全国招生 家电维修班,手机维修班,电脑维修班,电工班,焊工班,液晶电视维修班,电动工具维修班、电动车摩托车维修班、网络营销培训、网站设计培训、淘宝培训---全国招生
您现在的位置:首页 >> 技术园地 >> 电脑维修技术 >> 信息正文

菜鸟认识揭开DLL木马

2009-2-16 23:36:04 来源: 不详 作者:佚名 访问:0次 字号:【
    相信经常玩木马的朋友们都会知道一些木马的特性,也会有自己 喜爱的木马,不过,很多朋友依然不知道近年兴起的“dll木马”为何物。什么是“dll木马”呢?它与一般的木马有什么不同?

一、从dll技术说起

要了解dll木马,就必须知道这个“dll”是什么意思,所以,让我们追溯到几年前,dos系统大行其道的日子里。在那时候,写程序是一件繁琐的事情,因为每个程序的代码都是独立的,有时候为了实现一个功能,就要为此写很多代码,后来随着编程技术发展,程序员们把很多常用的代码集合(通用代码)放进一个独立的文件里,并把这个文件称为“库”(library),在写程序的时候,把这个库文件加入编译器,就能使用这个库包含的所有功能而不必自己再去写一大堆代码,这个技术被称为“静态链接”(static link)。静态链接技术让劳累的程序员松了口气,一切似乎都很美好。可是事实证明,美好的事物不会存在太久,因为静态链接就像一个粗鲁的推销员,不管你想不想要宣传单,他都全部塞到你的手上来。写一个程序只想用到一个库文件包含的某个图形效果,就因为这个,你不得不把这个库文件携带的所有的图形效果都加入程序,留着它们当花瓶摆设,这倒没什么重要,可是这些花瓶却把道路都阻塞了——静态链接技术让 终的程序成了大块头,因为编译器把整个库文件也算进去了。

时代在发展,静态链接技术由于天生的弊端,不能满足程序员的愿望,人们开始寻找一种更好的方法来解决代码重复的难题。后来,windows系统出现了,时代的分水岭终于出现。windows系统使用一种新的链接技术,这种被称为“动态链接”(dynamic link)的新技术同样也是使用库文件,微软称它们为“动态链接库”——dynamic link library,dll的名字就是这样来的。动态链接本身和静态链接没什么区别,也是把通用代码写进一些独立文件里,但是在编译方面,微软绕了个圈子,并没有采取把库文件加进程序的方法,而是把库文件做成已经编译好的程序文件,给它们开个交换数据的接口,程序员写程序的时候,一旦要使用某个库文件的一个功能函数,系统就把这个库文件调入内存,连接上这个程序占有的任务进程,然后执行程序要用的功能函数,并把结果返回给程序显示出来,在我们看来,就像是程序自己带有的功能一样。完成需要的功能后,这个dll停止运行,整个调用过程结束。微软让这些库文件能被多个程序调用,实现了比较完美的共享,程序员无论要写什么程序,只要在代码里加入对相关dll的调用声明就能使用它的全部功能。 重要的是,dll绝对不会让你多拿一个花瓶,你要什么它就给你什么,你不要的东西它才不会给你。这样,写出来的程序就不能再携带一大堆垃圾了——绝对不会让你把吃剩的东西带回家,否则罚款,这是自助餐。

dll技术的诞生,使编写程序变成一件简单的事情,windows为我们提供了几千个函数接口,足以满足大多数程序员的需要。而且,windows系统自身就是由几千个dll文件组成,这些dll相互扶持,组成了强大的windows系统。如果windows使用静态链接技术,它的体积会有多大?我不敢想。

二、应用程序接口api

上面我们对dll技术做了个大概分析,在里面我提到了“接口”,这又是什么呢?因为dll不能像静态库文件那样塞进程序里,所以,如何让程序知道实现功能的代码和文件成了问题,微软就为dll技术做了标准规范,让一个dll文件像奶酪一样开了许多小洞,每个洞口都注明里面存放的功能的名字,程序只要根据标准规范找到相关洞口就可以取得它要的美味了,这个洞口就是“应用程序接口”(application programming interface),每个dll带的接口都不相同,尽 大可能的减少了代码的重复。用steven的一句话:api就是一个工具箱,你根据需要取出螺丝刀、扳手,用完后再把它们放回原处。在windows里, 基本的3个dll文件是kernel32.dll、user32.dll、gdi32.dll。它们共同构成了基本的系统框架。

三、dll与木马

dll是编译好的代码,与一般程序没什么大差别,只是它不能独立运行,需要程序调用。那么,dll与木马能扯上什么关系呢?如果你学过编程并且写过dll,就会发现,其实dll的代码和其他程序几乎没什么两样,仅仅是接口和启动模式不同,只要改动一下代码入口,dll就变成一个独立的程序了。当然,dll文件是没有程序逻辑的,这里并不是说dll=exe,不过,依然可以把dll看做缺少了main入口的exe,dll带的各个功能函数可以看作一个程序的几个函数模块。dll木马就是把一个实现了木马功能的代码,加上一些特殊代码写成dll文件,导出相关的api,在别人看来,这只是一个普通的dll,但是这个dll却携带了完整的木马功能,这就是dll木马的概念。也许有人会问,既然同样的代码就可以实现木马功能,那么直接做程序就可以,为什么还要多此一举写成dll呢?这是为了隐藏,因为dll运行时是直接挂在调用它的程序的进程里的,并不会另外产生进程,所以相对于传统exe木马来说,它很难被查到。

四、dll的运行

虽然dll不能自己运行,可是windows在加载dll的时候,需要一个入口函数,就如同exe的main一样,否则系统无法引用dll。所以根据编写规范,windows必须查找并执行dll里的一个函数dllmain作为加载dll的依据,这个函数不作为api导出,而是内部函数。dllmain函数使dll得以保留在内存里,有的dll里面没有dllmain函数,可是依然能使用,这是因为windows在找不到dllmain的时候,会从其它运行库中找一个不做任何操作的缺省dllmain函数启动这个dll使它能被载入,并不是说dll可以放弃dllmain函数。

五、dll木马技术分析

到了这里,您也许会想,既然dll木马有那么多好处,以后写木马都采用dll方式不就好了吗?话虽然是这么说没错,但是dll木马并不是一些人想象的那么容易写的。要写一个能用的dll木马,你需要了解更多知识。

1.木马的主体

千万别把木马模块写得真的像个api库一样,这不是开发winapi。dll木马可以导出几个辅助函数,但是必须有一个过程负责主要执行代码,否则这个dll只能是一堆零碎api函数,别提工作了。

如果涉及一些通用代码,可以在dll里写一些内部函数,供自己的代码使用,而不是把所有代码都开放成接口,这样它自己本身都难调用了,更不可能发挥作用。

dll木马的标准执行入口为dllmain,所以必须在dllmain里写好dll木马运行的代码,或者指向dll木马的执行模块。

2.动态嵌入技术

windows中,每个进程都有自己的私有内存空间,别的进程是不允许对这个私人领地进行操作的,但是,实际上我们仍然可以利用种种方法进入并操作进程的私有内存,这就是动态嵌入,它是将自己的代码嵌入正在运行的进程中的技术。动态嵌入有很多种, 常见的是钩子、api以及远程线程技术,现在的大多数dll木马都采用远程线程技术把自己挂在一个正常系统进程中。其实动态嵌入并不少见,罗技的mouseware驱动就挂着每一个系统进程-_-

远程线程技术就是通过在另一个进程中创建远程线程(remotethread)的方法进入那个进程的内存地址空间。在dll木马的范畴里,这个技术也叫做“注入”,当载体在那个被注入的进程里创建了远程线程并命令它加载dll时,木马就挂上去执行了,没有新进程产生,要想让木马停止惟有让挂接这个木马dll的进程退出运行。但是,很多时候我们只能束手无策——它和explorer.exe挂在一起了,你确定要关闭windows吗?

3.木马的启动

有人也许会迫不及待的说,直接把这个dll加入系统启动项目不就可以了。答案是no,前面说过,dll不能独立运行,所以无法在启动项目里直接启动它。要想让木马跑起来,就需要一个exe使用动态嵌入技术让dll搭上其他正常进程的车,让被嵌入的进程调用这个dll的dllmain函数,激发木马运行, 后启动木马的exe结束运行,木马启动完毕。

启动dll木马的exe是个重要角色,它被称为loader,如果没有loader,dll木马就是破烂一堆,因此,一个算得上成熟的dll木马会想办法保护它的loader不会那么容易被毁灭。记得狼狈为奸的故事吗?dll木马就是爬在狼loader上的狈。

loader可以是多种多样的,windows的rundll32.exe也被一些dll木马用来做了loader,这种木马一般不带动态嵌入技术,它直接挂着rundll32进程运行,用rundll32的方法(rundll32.exe [dll名],[函数] [参数])像调用api一样去引用这个dll的启动函数激发木马模块开始执行,即使你杀了rundll32,木马本体还是在的,一个 常见的例子就是3721中文实名,虽然它不是木马。

注册表的appinit_dlls键也被一些木马用来启动自己,如求职信病毒。利用注册表启动,就是让系统执行dllmain来达到启动木马的目的。因为它是kernel调入的,对这个dll的稳定性有很大要求,稍有错误就会导致系统崩溃,所以很少看到这种木马。

有一些更复杂点的dll木马通过svchost.exe启动,这种dll木马必须写成nt-service,入口函数是servicemain,一般很少见,但是这种木马的隐蔽性也不错,而且loader有保障。

4.其它

到这里大家也应该对dll木马有个了解了,是不是很想写一个?别急,不知道大家想过没有,既然dll木马这么好,为什么到现在能找到的dll木马寥寥无几?现在让我来泼冷水, 重要的原因只有一个:由于dll木马挂着系统进程运行,如果它本身写得不好,例如没有防止运行错误的代码或者没有严格规范用户的输入,dll就会出错崩溃。别紧张,一般的exe也是这样完蛋的,但是dll崩溃会导致它挂着的程序跟着遭殃,别忘记它挂接的是系统进程哦,结局就是……惨不忍睹。所以写一个能公布的dll木马,在排错检查方面做的工作要比一般的exe木马多,写得多了自己都烦躁……

六、dll木马的发现和查杀

经常看看启动项有没有多出莫名其妙的项目,这是loader的所在,只要杀了狼,狈就不能再狂了。而dll木马本体比较难发现,需要你有一定编程知识和分析能力,在loader里查找dll名称,或者从进程里看多挂接了什么陌生的dll,可是对新手来说……总之就是比较难啊比较难,所以, 简单的方法:杀毒软件和防火墙(不是万能药,切忌长期服用)。

打印本文   加入收藏   返回顶部   关闭窗口Tags:菜鸟|鸟认|认识|识  

网站: http://www.hnygpx.net 报名电话:0731-5579057   13807313137 报名信箱: yp5579@263.net 咨询QQ: 361928696,873219118 

校址:湖南省长沙市雨花区红花坡路176号(正圆厂内)。 来校路线:长沙火车站售票处后坪乘135路至"鼓风站"下车,回走100米即到

电工培训学校 电动车维修学校 摩托车维修学校 摩托车维修培训 手机维修培训 家电维修培训 电脑维修培训 电动工具维修培训 液晶电视维修培训 安防监控培训 空调维修培训 网络营销培训 网站设计培训 淘宝网店培训 电器维修培训 家电维修学校 电工培训 焊工培训 电工学校
中山市,固原市,银川市,玉树,海东,陇南市,酒泉市,张掖市,天水市,金昌市,兰州市,榆林市,延安市,渭南市,铜川市,阿里,山南,拉萨市,怒江,文山州,楚雄州,普洱市,昭通市,玉溪市,昆明市,毕节,铜仁,遵义市,贵阳市,甘孜州,资阳市,达州市,宜宾市,南充市,遂宁市,绵阳市,泸州市,自贡市,三亚市,崇左市,河池市,玉林市,钦州市,梧州市,柳州市,梅州市,肇庆市,湛江市,佛山市,珠海市,韶关市,湘西州,怀化市,郴州市,张家界市,邵阳市,株洲市,仙桃市,随州市,荆州市,荆门市,襄樊市,黄石市,驻马店市,信阳市,南阳市,漯河市,中卫市,石嘴山市,海西,海南藏州,黄南州,海北,甘南,庆阳市,平凉市,武威市,白银市,嘉峪关市,安康市,汉中市,咸阳市,宝鸡市,林芝,日喀则,昌都,迪庆,德宏,大理,西双版纳,红河州,临沧市,丽江市,保山市,曲靖市,黔东州,黔西州,安顺市,六盘水市,凉山州,阿坝州,雅安市,广安市,眉山市,内江市,广元市,德阳市,攀枝花市,成都市,海口市,来宾市,百色市,贵港市,北海市,桂林市,南宁市,云浮市,揭阳市,潮州市,清远市,阳江市,汕尾市,惠州市,茂名市,江门市,汕头市,深圳市,广州市,娄底市,永州市,益阳市,岳阳市,湘潭市,长沙市,恩施州,黄冈市,孝感市,鄂州市,十堰市,武汉市,周口市,商丘市,三门峡市,许昌市,焦作市,安阳市,鹤壁市,平顶山市,开封市,郑州市,聊城市,滨州市,德州市,莱芜市,日照市,泰安市,烟台市,潍坊市,东营市,淄博市,上饶市,济南市,抚州市,宜春市,赣州市,新余市,九江市,景德镇市,宁德市,南平市,泉州市,莆田市,厦门市,宣城市,亳州市,六安市,宿州市,黄山市,滁州市,安庆市,淮北市,马鞍山市,蚌埠市,芜湖市,合肥市,丽水市,舟山市,衢州市,金华市,湖州市,嘉兴市,宁波市,宿迁市,镇江市,盐城市,连云港市,苏州市,徐州市,南京市,绥化市,牡丹江市,佳木斯市,大庆市,鹤岗市,哈尔滨市,白城市,白山市,辽源市,吉林市,葫芦岛市,铁岭市,盘锦市,阜新市,锦州市,本溪市,鞍山市,沈阳市,锡林郭勒盟,通辽市,乌海市,吕梁市,忻州市,晋中市,晋城市,阳泉市,太原市,廊坊市,承德市,保定市,邯郸市,唐山市,宁夏,甘肃省,西藏,贵州省,重庆市,广西,湖南省,河南省,江西省,安徽省,江苏省,黑龙江省,辽宁省,山西省,天津市,四平市,内蒙古,吴忠市,果洛,西宁市,定西市,商洛市,西安市,那曲,黔南州,巴中市,乐山市,贺州市,防城港市,东莞市,河源市,常德市,衡阳市,咸宁市,宜昌市,濮阳市,新乡市,洛阳市,菏泽市,临沂市,威海市,济宁市,枣庄市,青岛市,吉安市,鹰潭市,萍乡市,南昌市,龙岩市,漳州市,三明市,福州市,池州市,巢湖市,阜阳市,铜陵市,淮南市,台州市,绍兴市,温州市,杭州市,泰州市,扬州市,淮安市,南通市,常州市,无锡市,大兴安岭,黑河市,七台河市,伊春市,双鸭山市,鸡西市,齐齐哈尔市,延边,松原市,通化市,长春市,朝阳市,辽阳市,营口市,丹东市,抚顺市,大连市,阿拉善盟,兴安盟,乌兰察布市,巴彦淖尔市,呼伦贝尔市,鄂尔多斯市,赤峰市,包头市,呼和浩特市,临汾市,运城市,朔州市,长治市,大同市,衡水市,沧州市,张家口市,邢台市,秦皇岛市,石家庄市,青海省,陕西省,云南省,四川省,海南省,广东省,湖北省,山东省,福建省,浙江省,上海市,吉林省,河北省,北京市