PE区段添加编写中的一点心得~
2011-11-10 14:24
459 查看
为PE区段的加区段,修改PE头的映像大小= =
代码如下:
BOOL LPESection::AddSection(char *pSectionName, DWORD &dwSectionSize,DWORD dwSectionStact)
{
LPVOID lPointer=NULL;
PBYTE pData=NULL;
DWORD newSectionAddr=0;
if (!IsPEFile())
{
return FALSE;
}
PIMAGE_NT_HEADERS pNTHdr=GetNtHeader();
//是否有足够空间容纳节头
if ((pNTHdr->FileHeader.NumberOfSections+1)*sizeof(IMAGE_SECTION_HEADER)>pNTHdr->OptionalHeader.SizeOfHeaders)
{
return FALSE;
}
//对齐数据
DWORD uCodeDelta=ZALIGN(dwSectionSize,pNTHdr->OptionalHeader.SectionAlignment);
DWORD uFileDelta=ZALIGN(dwSectionSize,pNTHdr->OptionalHeader.FileAlignment);
PIMAGE_SECTION_HEADER pNewSec=(PIMAGE_SECTION_HEADER)(pNTHdr+1)+pNTHdr->FileHeader.NumberOfSections;
PIMAGE_SECTION_HEADER pLaseSec=pNewSec-1;
//----------为将要创建的节赋值----------
strcpy((char*)pNewSec->Name,pSectionName);
pNewSec->VirtualAddress=pLaseSec->VirtualAddress+ZALIGN(pLaseSec->Misc.VirtualSize,pNTHdr->OptionalHeader.SectionAlignment);
newSectionAddr=pNewSec->PointerToRawData=pLaseSec->PointerToRawData+pLaseSec->SizeOfRawData;
pNewSec->Misc.VirtualSize=dwSectionSize;
pNewSec->SizeOfRawData=uFileDelta;
pNewSec->Characteristics=dwSectionStact;
//-------PE头的一些设置-----------------
pNTHdr->FileHeader.NumberOfSections++;
pNTHdr->OptionalHeader.SizeOfCode+=uFileDelta;
pNTHdr->OptionalHeader.SizeOfImage+=uCodeDelta;
pNTHdr->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].Size=0;
pNTHdr->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].VirtualAddress=0;
dwSectionSize=uFileDelta;
//改变自身数据
DWORD dwOldSize=pstMapFile->dwFileSize;
pstMapFile->dwFileSize+=dwSectionSize;
UnmapViewOfFile(pstMapFile->hMapping);
CloseHandle(pstMapFile->hMapping);
pstMapFile->hMapping=CreateFileMapping(pstMapFile->hFile,NULL,PAGE_READWRITE,0,pstMapFile->dwFileSize,NULL);
pstMapFile->ImageBase=MapViewOfFile(pstMapFile->hMapping,FILE_MAP_ALL_ACCESS,0,0,pstMapFile->dwFileSize);
return TRUE;
}
pNTHdr->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].Size=0;
pNTHdr->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].VirtualAddress=0;
上面这两行是平常在其他加区段的代码中不常见的,比如zapline的添加区段代码。如果没有上面这两句,那么对一些有bound iat的程序加壳后不能运行。原因
是IMAGE_BOUND_IMPORT_DESCTIPTOR结构中的OffsetModuleName变量存放的是与第一个IBID结构之间的偏移(不是RVA)。当你加了个新区段后,这个偏
移改变了,所以加壳就失败了~~
代码如下:
BOOL LPESection::AddSection(char *pSectionName, DWORD &dwSectionSize,DWORD dwSectionStact)
{
LPVOID lPointer=NULL;
PBYTE pData=NULL;
DWORD newSectionAddr=0;
if (!IsPEFile())
{
return FALSE;
}
PIMAGE_NT_HEADERS pNTHdr=GetNtHeader();
//是否有足够空间容纳节头
if ((pNTHdr->FileHeader.NumberOfSections+1)*sizeof(IMAGE_SECTION_HEADER)>pNTHdr->OptionalHeader.SizeOfHeaders)
{
return FALSE;
}
//对齐数据
DWORD uCodeDelta=ZALIGN(dwSectionSize,pNTHdr->OptionalHeader.SectionAlignment);
DWORD uFileDelta=ZALIGN(dwSectionSize,pNTHdr->OptionalHeader.FileAlignment);
PIMAGE_SECTION_HEADER pNewSec=(PIMAGE_SECTION_HEADER)(pNTHdr+1)+pNTHdr->FileHeader.NumberOfSections;
PIMAGE_SECTION_HEADER pLaseSec=pNewSec-1;
//----------为将要创建的节赋值----------
strcpy((char*)pNewSec->Name,pSectionName);
pNewSec->VirtualAddress=pLaseSec->VirtualAddress+ZALIGN(pLaseSec->Misc.VirtualSize,pNTHdr->OptionalHeader.SectionAlignment);
newSectionAddr=pNewSec->PointerToRawData=pLaseSec->PointerToRawData+pLaseSec->SizeOfRawData;
pNewSec->Misc.VirtualSize=dwSectionSize;
pNewSec->SizeOfRawData=uFileDelta;
pNewSec->Characteristics=dwSectionStact;
//-------PE头的一些设置-----------------
pNTHdr->FileHeader.NumberOfSections++;
pNTHdr->OptionalHeader.SizeOfCode+=uFileDelta;
pNTHdr->OptionalHeader.SizeOfImage+=uCodeDelta;
pNTHdr->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].Size=0;
pNTHdr->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].VirtualAddress=0;
dwSectionSize=uFileDelta;
//改变自身数据
DWORD dwOldSize=pstMapFile->dwFileSize;
pstMapFile->dwFileSize+=dwSectionSize;
UnmapViewOfFile(pstMapFile->hMapping);
CloseHandle(pstMapFile->hMapping);
pstMapFile->hMapping=CreateFileMapping(pstMapFile->hFile,NULL,PAGE_READWRITE,0,pstMapFile->dwFileSize,NULL);
pstMapFile->ImageBase=MapViewOfFile(pstMapFile->hMapping,FILE_MAP_ALL_ACCESS,0,0,pstMapFile->dwFileSize);
return TRUE;
}
pNTHdr->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].Size=0;
pNTHdr->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].VirtualAddress=0;
上面这两行是平常在其他加区段的代码中不常见的,比如zapline的添加区段代码。如果没有上面这两句,那么对一些有bound iat的程序加壳后不能运行。原因
是IMAGE_BOUND_IMPORT_DESCTIPTOR结构中的OffsetModuleName变量存放的是与第一个IBID结构之间的偏移(不是RVA)。当你加了个新区段后,这个偏
移改变了,所以加壳就失败了~~
相关文章推荐
- 用j2me编写palm软件的一点心得(一)
- ASP.NET控件编写心得总结- 以后会写详细一点
- 关于编写“AUTORUN.inf”一点心得!!!
- 编写JNI的一点心得
- 编写JNI的一点心得
- [原创].关于编写Nios II的延时函数的一点心得
- 编写优雅程序的一点小小心得
- 关于用java编写生成word文档,动态添加数据到word文档的一些心得
- 编写图形软件的一点心得
- 用.NET编写串口程序的一点心得
- 编写优雅程序的一点小小心得
- 用j2me编写palm软件的一点心得(一)
- 专家讲解用.NET编写串口程序的一点心得
- 用.NET编写串口程序的一点心得
- ListBox的一点心得!
- 《ODAY安全:软件漏洞分析技术》学习心得-----shellcode的一点小小的思考
- SNMP学习的一点心得
- cvsnt配置用户权限的一点心得
- [转]使用xrc的一点心得
- hpp文件编写心得