加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 Billy+Belceb病毒编写教程---Win32篇

Billy+Belceb病毒编写教程---Win32篇.pdf

Billy+Belceb病毒编写教程---Win32篇

正月点灯笼
2009-10-20 0人阅读 举报 0 0 暂无简介

简介:本文档为《Billy+Belceb病毒编写教程---Win32篇pdf》,可适用于IT/计算机领域

BillyBelceb病毒编写教程Win篇翻译:onlyu【译者声明】~~~~~~~~~~~这是一篇关于病毒基础知识的教程作者BillyBelceb西班牙人在岁时写的这篇教程曾创建了病毒组织DDT。翻译这篇教程的目的是想揭开病毒的神秘面纱从编写病毒的角度来学习病毒希望对大家有用。由于原文为西班牙人写的英文译者翻译教程也不多英语只是凑合错误之处还请大家原谅如果大家发现翻译有什么不当之处欢迎改正大家也可对照原文学习。(原文在A#中)。大家都知道我们脱一个壳经常见到某某壳用了某某病毒技术到底病毒技术是那些呢比较经典而全面的Win病毒教程就是BillyBelceb写的本教程可惜一直没有人翻译成中文我作为一个大傻鸟就决定翻译了。谨以此翻译献给所有的Cracker和所有对Win汇编感兴趣的人。下面为原文译文祝你好运!【声明】~~~~~~~作者对因对此文档使用不当而造成的任何损失概不负责。这篇教程的目的是教会人们编写病毒和防护一些破坏力大的病毒的破坏。这篇教程仅作为教学目的。所以如果有人利用这篇文章编写了破坏力很大的病毒我可不负责任。如果通过这篇文章你看到我鼓励人们破坏数据的字眼先去买副眼镜再说。【介绍】~~~~~~~亲爱的同志们大家好你还记得BillyBelceb的病毒编写教程吗?那是一篇关于过时的MSDOS病毒的教程。在那篇教程中我一步一步地介绍了很多有名的DOS病毒技术的知识而且它是为初学者写的使他们尽快地入门。现在我又写了一篇很酷(我希望是)的教程但是这一次我将介绍现在计算机的新威胁Win病毒毫无疑问所有的东西都是和那个有关了。我发现现在一个完整的教程很缺所以我曾问自己为什么我不写一篇关于这个的教程?所以我又写出来了:)真正的在Win病毒的先驱是VLAD组织而用这种方式来写教程的作者是LordJulus。但是我不会忘记那些写了很多有趣教程的人和在LordJulus的教程之前的所有相关东西当然我在说JHB啦。有趣的技术是由Murkry研究的后来JackyQwerty我希望我没有忘记在Win病毒编写(很短)史上的重要的人。注意我从来没有忘本。象在我的病毒编写教程系列里一样我要谢谢一些音乐组织如BlindGuardian,HammerFall,Stratovarius,Rhapsody,MarilynManson,IronMaiden,Metallica,IcedEarth,RAMMSEIN,MagoDeOz,Avalanch,FearFactory,Korn,Hamlet和DefConDos。所有这些东西营造了写一篇巨大的教程和代码的完美的氛围。嗨我的教程的结构已经有了很大的改变现在我给出一个索引几乎所有给出的代码都是我编写的或者基于其他人的但是被我改编了的或者有一点删改的)但是嗨我已经努力的解决在我的现在已经绝种了的MSDOS(RIP)版VWG中遇到的所有问题。我必须向SuperA问好是他帮助了这篇教程的一些方面的东西他是我的beta测试人之一而且他已经对这篇教程贡献了一些东西。说明:英语不是我的母语(西班牙语才是)【译者注:所以这篇西班牙式的病毒教程很难翻译不当之处还请原谅】所以原谅我的许多拼写错误请告知我我会修正的。我已经引用了已经在一些独立的病毒杂志里发表了的文章但是它们仍然值得一读因为我已经修改了进行了语法检查并加入了一些额外的信息。记住:这篇文章并不完美所以原谅在这篇教程中的错误。跟我联系EmailbillybelcebuhotmailcombillybelcebucryogencomICQ#个人主页http:membersxoomcombillybelhttp:wwwcryogencombillybelcebu组织主页http:sourceofkaoscomhomesddtIRCBillyBelUndernet#vir,IrcHispano#virus祝玩得快乐!BillyBelceb美梦从这里开始(c)BillyBelcebuiKX【索引】~~~~~~~有人(HiQozah!)已经告诉我当他读这篇教程的beta版本时它有一点混乱因为容易迷失在各章之间。无论如何我已经对这个重新组织了我仍然很混乱而且我的教程也是:)声明介绍索引病毒编写中的有用的东西简单介绍PE文件头Ring用户级编码Ring系统级编码PerProcessresidencyWin优化Win反调试Win多态高级Win技术附录一:病毒发作附录二:关于作者结束语【病毒编写中的有用的东西】~~~~~~~~~~~~~~~~~~~~~~~~~在开始编写病毒之前你需要一些东西。下面是我给你推荐的程序(如果你没有足够的金钱来买它们下载!):)Windows或WindowNT或Windows或WindowsxWins:)TASM包(包括TASM和TLINK)SoftICE(或更好)forWinX和forWinNT。API列表(WinHLP)WindowsDDKWindowsDDKWindowsDDK即所有的微软DDK和SDK。强烈推荐MattPietrek关于PE文件头的文章。JackyQwerty的PEWRSEC工具(在你在'code'里添加代码时用)。一些hash哦shit!它是我想要的!:)一些电子杂志如A(#,#),Xine(#,#,#),VLAD(#),DDT(#)一些Windows病毒如WinCabanas,WinPadania,WinLegacy一些Windows病毒查杀工具(强烈推荐NODICE)>wwwesetskNeuromancer,byWilliamGibson,它是一本好书。毫无疑问这篇教程!我希望没有忘掉任何重要的东西。【简要介绍】~~~~~~~~~~~好了开始把你的大脑中的位MSDOS编码概念迷人的位偏移地址中断驻留内存的方法都清除掉。所有这些我们已经使用了很多年的东西现在已经再也不用了。是的它们确实现在用不到了。在这篇教程里面当我说Win我的意思是Windows(normal,OSR,OSR)WindowsWindowsNT或WindowsxWins。最最明显的变化至少在我看来是由中断变成了API在这之前是由位寄存器和偏移地址变到了位的。Windows给我们开了使用其它语言代替ASM(和C)的方便之门但是我仍然对ASM情有独钟:利用它能更好的理解一些东西和更容易的优化(hiSuper!)。正如我在上面所说的你必须使用一种新东西叫做API。你必须知道这些参数必须在堆栈中而且调用这些API是使用的CALL。注:在上面我把上面所有提到的平台叫做Win我把Win(它的所有版本)和Win叫做Winx把Windows叫做Wink。请注意这一点。由位到位编程的改变~~~~~~~~~~~~~~~~~~~~~~~~我们现在将会使用双字(DWORD)而不是单字(WORD)了而这个改变将会给我们一个全新的世界。在已知的CS,DS,ES和SS:FS,GS之外我们又多了两个段。而且我们有位寄存器如EAX,EBX,ECX,EDX,ESI,EDI,EBP和ESP。让我们来看看对这些寄存器怎么操作:假如我们要使用EAX的lesssignificantword(简称LSW)我们该怎么做呢?这个部分可以使用AX来访问即处理LSW。假如EAX=我们想要在它的LSW放置h。我们必须简单地使用一个"movax,h"就可以了。但是如果我们想要访问EAX的MSW(MostSignificantWord)该怎么做呢?为了达到这个目的我们不能使用一个寄存器了:我们必须使用ROL。问题并不是在这里它是把MSW值移到了LSW。当我们得到一个新语言的时候我们总是要试的一个经典的例子:"Helloworld!":)Win中的HelloWorld~~~~~~~~~~~~~~~~~~~~~~它很简单我们必须使用"MessageBoxA"这个API所以我们用大家已经知道的"extrn"命令来定义它把参数压栈然后调用这个API。注意这个字符串必须为ASCIIZ(ASCII,)记住参数必须以相反的顺序压栈。从这里开始剪切Processor()modelflatUsesbitregistersextrnExitProcess:procTheAPIitusesextrnMessageBoxA:proc利用"extrn"我们把在程序中要用到的所有API列出来。ExitProcess是我们用来把控制权交给操作系统的API而MessageBoxA用来显示一个经典的Windows消息框。dataszMessagedb"HelloWorld!",MessageforMsgBoxszTitledb"Winrocks!",TitleofthatMsgBox这里我们不能把真正病毒的数据放这里了因为这是一个例子我们不能使用它而且又因为如果我们不在这里放置一些数据TASM将会拒绝汇编。无论如何在第一次产生你的病毒主体的时候用它放置数据。codeHerewego!HelloWorld:pushhSytleofMessageBoxpushoffsetszTitleTitleofMessageBoxpushoffsetszMessageThemessageitselfpushhHandleofownercallMessageBoxATheAPIcallitselfintMessageBox(HWNDhWnd,handleofownerwindowLPCTSTRlpText,addressoftextinmessageboxLPCTSTRlpCaption,addressoftitleofmessageboxUINTuTypestyleofmessagebox)在调用这个API之前我们把参数压栈如果你还记得堆栈使用那个迷人的东西叫做LIFO(后进先出LastInFirstOut)所以我们要按相反的顺序来压参数。让我们看看这个函数的每个参数的简要描述:hWnd:标志将要被创建的消息框的宿主窗口(ownerwindow)。如果这个参数是这个消息框没有宿主窗口。lpText:指向以空字符结尾的包含将要显示消息的字符串的指针。lpCaption:指向一个以空字符结尾的字符串的指针这个字符串是这个对话框的标题。如果这个参数是一个缺省的标题Error被使用。uType:以一些位标志来确定对话框的样式和行为。这个参数可为一些标志的组合。pushhcallExitProcessVOIDExitProcess(UINTuExitCodeexitcodeforallthreads)这个函数在Win环境下相当于著名的Inth和Inth的,C功能等等。它是关闭当前进程的简单方式即结束程序执行。下面给出唯一的一个参数:uExitCode:标志进程退出的代码并作为所有线程终止时的代码。使用GetExitCodeProcess函数来刷新这个进程的退出值。使用GetExitCodeThread函数来刷新一个线程的退出值。endHelloWorld到这里为止剪切正如你看到的编写代码很简单。可能没有位环境下那么简单但是如果你考虑到位所带给我们的优点确实很简单了。现在既然你已经知道怎么来编写"HelloWorld"你就有能力来感染整个世界了)Rings~~~~~~~我知道你对下面的东西很害怕但是正如我所演示的它看起来没有那么难。让我们记住你必须清楚的东西:处理器有个特权级别:Ring,Ring,Ring和Ring越往后就有越多的限制而病毒要是用第一个特权级别几乎编码时没有任何限制。只要记住在迷人的DOS下面我们总是处于Ring现在想到在Win平台下你还可以做相同的事情好了停止幻想了让我们开始工作。Ring还表示"用户"级在这个级别下我们有很多的限制那确实不能我们的需要。Microsoft程序员在他们发行Win的时候犯了个错误声称它是"无法感染"的正如在这个操作系统卖出去之前所表明的利用可怕的Bizatch(后来改名为Boza但那是另外一段历史了)。他们认为这些API不能被一个病毒访问和使用但是他们没有想到病毒编写者们的超级智慧所以我们可以在用户级下编写病毒毫无疑问你只要看看大量近期发布的新的Win运行期病毒它们都是Ring级下的它们不差不要误解了我Ring病毒是现在有可能感染所有Win环境下文件的病毒。它们是未来主要是因为即将发布的WindowsNT(或者Windows)。我们不得不寻找能使我们的病毒(由Bizatch生成的病毒传播很差因为它对API地址"harcoded"并且它们可能会因Windows版本的改变而改变)存活的API而且我们可以用其它不同的方法来实现正如我后面解释到的。Ring是另外一段历史了和Ring有着很大的区别。在这个级别下我们拥有内核编码的级别"内核(kernel)级别"。是不是很迷人啊?我们可以访问端口放置我们还没有梦想过的代码和原先的汇编最接近的东西。我们不使用一些已知的花招是不能直接访问一些东西的如IDT修改SoPinKyA在A#里发表的"CallGate"技术或者VMM插入在Padania或者FuckHarry病毒里见到的技术。当我们直接利用VxD的服务时我们不需要API而且它们的地址在所有Winx系统中是被假设为相同的所以我们"hardcode"它们。我将在fullydedicatedtoRing这一章里面深入讨论。重要的东西~~~~~~~~~~~~我想无论如何我应该在这篇教程的开头放上这些然而我知道知道总比不知道好啊:)好了让我们来讨论Win操作系统内部的东西。首先你必须清楚一些概念。让我们从selector开始。什么是一个selector呢相当简单它是一个非常大的段而且它组成了Win的内存也叫做平坦内存。我们可以用G内存(,,,字节)仅仅通过使用位地址。那所有这些内存是怎么组织的呢?看看下面的示意图:||<OFFSET=h<>FFFFFFFh|应用程序代码和数据|||||<OFFSET=h<>FFFFFFFh|共享内存|||||<OFFSET=h<>BFFFFFFFh|内核|||||<OFFSET=Ch<>FFFFFFFFh|设备驱动|||结果:我们拥有G可用内存。是不是很迷人啊?注意一件事情:WinNT的后两段是分开的。现在我将给出你必须知道的一些定义其它的一些本文之外的一些概念我假设你已经知道了。VA:VA表示VirtualAddress即某些程序的地址但是在内存中(记住在Windows中在内存中和在磁盘上是不一样的)。RVA:RVA表示RelativeVirtualAddress。清楚这个概念很重要RVA是文件在内存映射(由你或由系统)时的偏移地址。RAWData:RAWData是我们用来表示数据物理的存储的也就是说在磁盘(磁盘上的数据!=内存中的数据)上的存储。VirtualData:VirtualData是指那些已经被系统载入内存的数据。FileMapping:一种技术在所有的Win环境下都有由一种快速的(并使用更少内存)文件操作方法和比DOS更容易理解的方法组成。所有我们在内存中改变的东西在磁盘上也会改变。文件映射还是所有Win环境(甚至NT)下内存之间交换信息的唯一方法。怎么来编译东西~~~~~~~~~~~~~~~~该死我几乎忘记了这个:)编译一个WinASM程序的通常参数是至少在这篇教程的所有例子中按如下(当ASM文件的名字为'program'但是没有任何扩展名):tasmmmlprogram,,tlinkTpeaaprogram,program,,importlibpewrsecprogramexe我希望足够清晰了。你还可以使用makefiles或者建立一个bat文件来使它自动完成(就象我做的!)。【PE文件头】~~~~~~~~~~这是这篇文件的最重要的一章。仔细读!介绍~~~~~~对PE头的结构很清晰在写我们的Windows病毒很重要。下面我将给出我认为重要的东西但是并不是关于PE文件的所有的信息想要知道更多的东西看看我在上面关于PE文件推荐的资料在"有用的东西"这一章。||<OFFSET=h|DOSstub|||||<OFFSET=DOSStubCh|PEstuff|||让我们对这两大部分进行深入的分析让我们看看MichealJO'Leary的示意图:||<BaseofImageHeader|DOScompatibleEXEheader|||||||||Unused|||||||||OEMidentifier|||||||||OEMinfo||>Uninteresting(DOSCompatibility)|||||||OffsettoPEHeader|>Veryinteresting|||||||DOSStubprogramandreloctable|||||||||Unused|||||||PEheader(IMAGEFILEHEADER)|||||||||PEheader(IMAGEOPTIONALHEADER)|||||>Veryveryinteresting:)||||SectionTable|||||||||Sections||||现在你已经对PE文件头已经有了一个大体的了解确实很新奇(但也很复杂)我们的新目标。Ok,ok你对那些东西有了一个"大体"的了解但是你仍然需要知道PE文件头中IMAGEFILEHEADER本身的内部结构。勒紧你的裤腰带!IMAGEFILEHEADER^^^^^^^^^^^^^^^^^|"PE"|<h||Size:DWORD|Machine|<h||Size:WORD|NumberOfSection|<h||Size:WORD|TimeDateStamp|<h||Size:DWORD|pointerToSymbolTable|<Ch||Size:DWORD|NumberOfSymbols|<h||Size:DWORD|SizeOfOptionalHeader|<h||Size:WORD|Characteristics|<h||Size:WORDTotalSize:hBYTES我将继续对IMAGEFILEHEADER的各个域给出简要的描述。PE:它是每个PE文件都有的标志只要在编写你的感染程序的时候检查它是否存在。如果它在那儿它就不是一个PE文件okMachine:因为我们所使用的计算机的理想可以是一个非PC兼容的(NT对这些东西有一个开放等级你知道的)又因为PE文件是普遍的在这个域中是这个应用程序所编写的代码的机器类型可以为下面的值:IMAGEFILEMACHINEIequChIntelIMAGEFILEMACHINERequhMIPSlittleendian,hbigendianIMAGEFILEMACHINERequhMIPSlittleendianIMAGEFILEMACHINERequhMIPSlittleendianIMAGEFILEMACHINEALPHAequhAlphaAXPIMAGEFILEMACHINEPOWERPCequFhIBMPowerPCLittleEndianNumberOfSections:我们的感染程序的非常重要的域它告诉我们这个文件的节(section)的个数。TimeDateStamp:保存了从:到文件连结时所过的秒数。PointerToSymbolTable:没意思因为它仅仅被OBJ文件使用。NumberOfSymbols:没意思因为它仅仅被OBJ文件使用。SizeOfOptionalheader:保存了IMAGEOPTIONALHEADER域的字节数(看下面IMAGEOPTIONALHEADER的描述)。Characteristics:这些标志给了我们关于这个文件的更多信息对于我们所有人都没意思。IMAGEOPTIONALHEADER^^^^^^^^^^^^^^^^^^^^^|Magic|<h||Size:WORD|MajorLinkerVersion|<Ah||Size:BYTE|MinorLinkerVersion|<Bh||Size:BYTE|SizeOfCode|<Ch||Size:DWORD|SizeOfInitializedData|<h||Size:DWORD|SizeofUnInitializedData|<h||Size:DWORD|AddressOfEntryPoint|<h||Size:DWORD|BaseOfCode|<Ch||Size:DWORD|BaseOfData|<h||Size:DWORD|ImageBase|<h||Size:DWORD|SectionALignment|<h||Size:DWORD|FileAlignment|<Ch||Size:DWORD|MajorOperatingSystemVersion|<h||Size:WORD|MinorOperatingSystemVersion|<h||Size:WORD|MajorImageVersion|<h||Size:WORD|MinorImageVersion|<h||Size:WORD|MajorSubsystemVersion|<h||Size:WORD|MinorSubsystemVersion|<Ah||Size:WORD|Reserved|<Ch||Size:DWORD|SizeOfHeaders|<h||Size:DWORD|CheckSum|<h||Size:DWORD|SubSystem|<h||Size:DWORD|DllCharacteristics|<Eh||Size:WORD|SizeOfStackReserve|<h||Size:DWORD|SizeOfStackCommit|<h||Size:DWORD|SizeOFHeapReserve|<h||Size:DWORD|SizeOfHeapCommit|<Ch||Size:DWORD|LoaderFlags|<h||Size:DWORD|NumberOfRvaAndSizes|<h||Size:DWORDTotalSize:hBYTES(加上IMAGEFILEHEADER^^^^^^^^^)Magic:看起来总为Bh实际上会使我们认为它是一种签名没有意思。MajorLinkerVersionandMinorLinkerVersion:产生这个文件的连结器的版本没有意思。SizeofCode:它是所有包含可执行代码的段的总字节数。SizeofInitializedData:它是所有包含初始数据的段的总大小。SizeofUninitializeddata未初始数据不占磁盘空间但是当系统装载这个文件的时候它会分配一些内存(实际上是虚拟内存)。AddressofEntryPoint:是装载器开始执行代码的地方。它是一个RVA当系统装载这个文件的时候和imagebase相关。非常有意思。BaseOfCode:是文件的code段开始的RVA。code段在内存中通常在data段之前在PE文件头之后。这个RVA在用Microsoft连结器产生的EXE文件中通常为x。Borland的TLINK看起来把imagebase加到了第一个code段的RVA处并把结果存储在这个域中。BaseOfData:是文件的data段开始的RVAdata段通常在内存中处于最后在PE文件头和code段之后。ImageBase(基址):当连结器创造一个可执行文件的时候它会假定将会内存映射到内存的某个地址当中。这个地址被保存在这个域中假定的一个装载地址来允许连结器进行优化。如果这个文件确实被装载器内存映射到那个地址在它可以运行之前代码就不需要任何补丁了。在为WindowsNT产生的可执行文件中缺省的ImageBase为x。对DLL来说缺省的为x。在WinX中地址x不能被用来装载EXE文件因为它在被所有进程的共享地址中。因为这个Microsoft就把Win的缺省ImageBase改为x。老的以基址x进行连结而成的可执行文件在Winx下装载将会花费更长的时间因为装载器需要进行基址重定位。SectionAlignment:当映射到内存中的时候每一节要保证是这个值的一个倍数的虚拟地址作为开始地址。对于按页的时候缺省的节对齐方式是x。FileAlingnment:在PE文件中构成每一节的原始数据要保证从这个值的倍数开始。缺省的值为x字节可能是为了保证各节总是以磁盘节(disksector它的长度也为x)的开始作为开始。这个域在NE文件中等价于segmentresourcealignment。和NE文件不同的是PE文件通常不会有成百个节所以由于对齐文件的节而浪费的空间几乎很少。MajorOperatingSystemVersionandMinorOperatingSystemVersion:使用这种类型的可执行文件的操作系统的最低版本号。既然subsystemfields目的看起来和它相类似这个域有点摸棱两可。这个域在所有的WinEXE文件中缺省为。MajorImageVersionandMinorImageVersion:是一个用户可定义的域它允许你可以有不同版本的EXE或DLL。你可以通过连结器的VERSION开关来设置这个域。如:"LINKVERSION:muobjobj"。MajorSubsystemVersionandMinorSubsystemVersion:包含了运行这个可执行文件所需要的最小子系统版本。这个域的一个经典值为(意思为WindowsNT)。Reserved:看起来总为(最为感染标志太完美了)。SizeOfHeaders:PE文件头的大小和节(对象)表。这些节的原始数据就从这些所有文件头组件之后开始。Checksum:为这个文件的CRC校验值。正如在其它的Microsoft可执行文件格式中这个域是忽略的并总设为这个规则的例外是这些EXE文件必须有合法的校验值。SubSystem:这些可执行文件的子系统的类型被它用来用户界面。WINNTh定义了下面的值:NATIVEDoesn'trequireasubsystem(suchasadevicedriver)WINDOWSGUIRunsintheWindowsGUIsubsystemWINDOWSCUIRunsintheWindowscharactersubsystem(consoleapp)OSCUIRunsintheOScharactersubsystem(OSxonly)POSIXCUIRunsinthePosixcharactersubsystem一个标志集表明了在什么环境下一个DLL的初始函数(如DLLMain)将会调用。这个值看起来总是设置为然而操作系统仍然对所有四个事件调用DLL初始函数。下面是定义的值:当DLL第一次装载到一个进程的地址空间中时调用当一个线程终止时调用当一个线程开始时调用当DLL已经存在时调用SizeOfStackReserve:为初始线程的堆栈而保留的虚拟内存数量然而并不是所有的内存都可以做(看下一个域)。这个域的缺省值为x(MB)。如果你用CreateThread把作为堆栈的大小那么创建出来的堆栈就会有相同的大小。SizeOfStackCommit:保证初始线程的堆栈时的内存数量。对于Microsoft的连结器这个域的初始值为x字节(页)而TLINK为页。SizeOfHeapReserve:用来保留给初始进程堆时的虚拟内存这个堆的句柄可以通过调用GetProcessHeap函数来获得。并不能保证所有内存(看下一个域)。SizeOfHeapCommit:在进程堆中初始时的内存数量。缺省值为页。LoaderFlags:从WINNTh来看这个域和调试支持相关。我还没有看到任何一个这些位都有效的可执行文件也没有看到这些位都清空的。怎么用连结器设置它们呢下面是定义的值:在开始进程前唤醒一个断点指令当进程已经载入后唤醒一个调试器NumberOfRvaandSizes:DataDirectory数组(下面)的入口个数这个值用当前的工具总是设置为。IMAGESECTIONHEADER^^^^^^^^^^^^^^^^^^^^|SectionName|<Beginofsectionheader||Size:BYTES|VirtualSize|<h||Size:DWORD|VirtualAddress|<Ch||Size:DWORD|SizeOfRawData|<h||Size:DWORD|PointerToRawData|<h||Size:DWORD|PointerToRelocations|<h||Size:DWORD|PointerToLineNumbers|<Ch||Size:DWORD|NumberOfRelocations|<h||Size:WORD|NumberOfLineNumbers|<h||Size:WORD|Characteristics|<h||Size:DWORDTotalSize:hBYTESSectionName:命名节用的是一个byte的ANSI名字(非UNICODE)大多数的节的名字以一个(如"text")作为开始但是这不是必须的你可以在一些关于PE的文章里验证这一点。你可以直接用汇编语言来命名你的节或者在MicrosoftCC编译器下用"#pragmadataseg"和"pragmacodeseg"。注意节名是否占了满满个字节很重要没有终止符。如果你是一个printf的热爱者你可以使用s来避免把名字字符串拷贝到另外一个你可以用来终止的缓冲区里面。VirtualSize:这个域在EXE或者OBJ中有不同的意思。在一个EXE中它存储代码或者数据的实际大小。这个大小是在把文件凑整到文件对齐大小的倍数之前的大小。后面的SizeOfRawData域(看起来有点用词不当)存储的是凑整之后的值。Borland的连接器把这两个域的意思颠倒过来了看起来是正确的。对于OBJ文件这个域表示节的物理地址。第一个节是从地址开始的。为了寻找在一个OBJ文件中的下一个节的物理地址把当前节的物理地址加上SizeOfRawData值就可以了。VirtualAddress:在EXE中这个域指装载器应该对节进行映射的RVA。为了计算一个给定的节在内存中的真正起始地址把映象的基址加上存储在这个域中的VirtualAddress就可以了。利用Microsoft的工具第一个节的缺省的RVA为x。在OBJ文件中这个域是没有意义的并设置成。SizeOfRawData:在EXE中这个域包含了节在按文件对齐大小凑整之后的大小。例如假设一个文件的对齐大小为x如果上述的VirtualSize域的节的长度为xA这个域就会以x作为节长。在OBJ文件中这个域包含了由编译器或汇编程序所设置的精确大小。也就是说对于OBJ文件来说它等于EXE中的VirtualSize域的值。PointerToRawData:这是节基于文件的偏移量原始数据是由编译器或汇编器设置的。如果你的程序内存映射了一个PE文件或者COFF文件本身(而不是由操作系统来装载它)这个域比VirtualAddress域重要。在这种情况下你将会拥有完全的线形文件映射所以你将会发现在这个偏移地址出的节的数据而不是在VirtualAddress处的特定RVA。PointerToRelocations在OBJ文件中这个是节基于文件的偏移量的重定位信息对于每一个节的重定位信息直接跟在那个节的原始数据后面。在EXE文件中这个域(和子域)是没有意义的并设置成。当连接器产生EXE文件的时候它解决了大多数的修正问题只剩基址重定位和输入函数。关于基址重定位和输入函数的信息是保存在它们自己的节中所以没有必要使一个EXE文件的每一个节的重定位数据在原始节数据后面。PointerToLineNumbers:这是基于文件的行号表的偏移量一个行号表使源文件的行号和一个给定的行所产生的代码地址相关联。在现代的调试格式如CodeView格式中行号信息是作为调试信息的一部分存储的。在COFF调试格式中然而行号信息是和符号名符号类型分开存储的。通常只有code节(如text)有行号。在EXE文件中行号是在节的rawdata(原始数据)之后向文件尾累加的。在OBJ文件中一个节的行号表是在原始节数据和这个节的重定位表之后开始的。NumberOfRelocations:在节的行号表中的行号的数值(上面的PointerToLinenumbers域)。Characteristics:大多数程序员叫做标志(flag)在COFFPE格式中叫做特征(characterstic)。这个域是一些表面节属性(如代码数据可读或可写)的标志。要看所有可能的节属性的列表看看定义在WINNTH中的IMAGESCNXXXXXX。下面给出一些比较重要的标志:x这个节包含代码。通常和可执行标志(x)联合设置。x这个节包含了初始化了的数据(initializeddata)。除了可执行和bss节之外几乎所

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/25

Billy+Belceb病毒编写教程---Win32篇

仅供在线阅读

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利