这里填入节的名字sn1(这个域有8个字节哟),并且给VirtualSize(有的地方称作PhysicalSize)我的病毒的大小,这个不需要对齐。说到对齐,大家要清楚一个概念就是内存中的数据节对齐,文件中的数据文件对齐。
movecx,DWORDptr[esi38h]
moveax,DWORDptr[edi-28h0ch]
addeax,DWORDptr[edi-28h8h]
movecx,DWORDptr[esi38h]
invokeAlign1
movDWORDptr[edi0ch],eax
取得节对齐后,给节的VirtualAddress成员即在内存中装入本节时的内存地址赋。方法是取得上一个节的起始地址加上上一节的未对齐的大小即VirtualSize还要经过节对齐,就可以了。
movecx,DWORDptr[esi3ch]
moveax,Virus_End-Virus_Start
invokeAlign1
movDWORDptr[edi10h],eax
现在我们该给节的SizeOfRawData给了。这个域是指节在文件中的大小,必须要经过文件对齐,那好,我们取得病毒大小,文件对齐后就行了
moveax,DWORDptr[edi-28h10h]
addeax,DWORDptr[edi-28h14h]
movDWORDptr[edi14h],eax
还有个节在文件中偏移的叫PointerToRawData,这个的计算方法是上一个节的SizeOfRawData加上上一个节的PointerToRawData。为什么呢?自己动脑壳吧。不动脑壳学会了也没用。
movDWORDptr[edi24h],0E00000E0h
这个域是最好理解的了,成员名字叫Characteristics中文意思是属性。有可读,可读可写,可执行,可共享等等,比较重要的几个属性就是我列出的几个,其中可共享是比较难理解的,讲讲,可共享属性可以让该节的数据或代码拒绝写时拷贝(CopyOnWrite),什么是写时拷贝呢,比如记事本有10个实例在运行,Windows就给同样的程序分配10个同样大小的进程空间,微软可没那么傻,他为了能节省内存使用了一种技术叫写入时拷贝。10个记事本同时运行就将10个记事本的进程空间映射到1个相同的物理内存上去,当有一个记事本想往里面写入时,数据一变全变,就会影响了其他9个记事本,但是有了写入时拷贝技术的干涉,就给那个写入数据的记事本另外分配块内存,将新分配的物理内存影射到记事本写入的那块进程空间地址上去,并且将原来的数据拷贝到这块新的内存中去,这样它再写入时就是写的新内存了,高兴写啥都不会影响其他的进程。如果还没懂的去看看“windows核心编程”内存管理那部分。再回到我们的感染问题上来,如果你的节有共享属性,就意味着它拒绝写入时拷贝技术,就是那个写数据的记事本,将会影响到其他9个记事本了,如果这是个变量的话,就是10个记事本都可以影响到的全局或称共享变量了。
moveax,DWORDptr[edi0ch]
addeax,Start-Virus_Start
上面两行代码是将病毒的代码入口点计算出来后头有用,计算方法简单,是我病毒开始执行地方的标号Start减去病毒开始的地方标号Virus_Start,你可能会有点不理解,这是因为病毒开始的地方不是我病毒开始执行代码的地方,我病毒开始执行代码的地方前面有一大段的数据,这些数据也是包含在代码段里的。就是说我的病毒只有一个节.text。(代码节叫。Text)-
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-37949-5.html