学习学习先
寻找同济的朋友的网络连接
有些目标文件不能感染 原因是由于目标文件中存在.data?段 其中的内容编译器会认为程序在开始执行后才会用到
所以在生成可执行文件得时候只保留了大小的信息 不会占用磁盘空间 有些程序的最后一段为这个段 SizeOfRawData
PointerToRawData这两个值都为0 我的程序实现原理是添加一个节将程序插入并修改pe头 因为在添加节的过程中需要增加我添加节的IMAGE_SECTION_HEADER 上面提到的这两个值是根据上一节(也就是原程序最后一节)的这两个值修改的 所以导致修改的值出错 结果导致有些被感染的文件出现不是有效的win32程序的错误
问题还没有解决 不知道有没有高手能替我解答一下
这是我在网上找的 你自己看看吧
在讲解重定位方法之前,我们有必要复习一下call指令。
call指令一般用来调用一个子程序或用来进行转跳,当这个语句执行的时候,它会先将返回地址(即紧接着call语句之后的那条语句在内存中的真正地址)压入堆栈,然后将IP置为call语句所指向的地址。当子程序碰到ret命令后,就会将堆栈顶端的地址弹出来,并将该地址存放在IP中,这样,主程序就得以继续执行。
假如病毒程序中有如下几行代码:
call delta ;这条语句执行之后,堆栈顶端为delta在内存中的真正地址 delta: pop ebp ;这条语句将delta在内存中的真正地址存放在ebp寄存器中 …… lea eax,[ebp+(offset var1-offset delta)] ;这时eax中存放着var1在内存中的真实地址 |
当pop语句执行完之后,ebp中放的是什么值呢?很明显是病毒程序中标号delta处在内存中的真正地址。如果病毒程序中有一个变量var1,那么该变量实际在内存中的地址应该是ebp+(offset var1-offset delta),即参考量delta在内存中的地址+其它变量与参考量之间的距离=其它变量在内存中的真正地址。有时候我们也采用(ebp-offset delta)+offset var1的形式进行变量var1的重定位。当然还有其它重定位的方法,但是它们的原理基本上都是一样的。这里不在叙述。