C++实现查壳程序代码实例
本文实例讲述了C++实现查壳程序代码,分享给大家供大家参考。具体方法分析如下:
一般来说,PEID是基于特征码的,用python只需要两行代码,用VC实现用了这么多代码……。
python中只要引入pefile模块,第一句代码指定数据库文件,第二句代码返回结果。具体的看pefile官方介绍吧
下面是C++的代码:
voidCMyPeidDlg::OnBnClickedBtnOpen() { //获取当前工作路径 CStringstrAppName;//当前工作目录 ::GetModuleFileName(NULL,strAppName.GetBuffer(_MAX_PATH),_MAX_PATH); strAppName.ReleaseBuffer(); intnPos=strAppName.ReverseFind('//'); strAppName=strAppName.Left(nPos+1); //AfxMessageBox(strAppName); //文件扩展名过滤器 LPCTSTRszFilter="EXEFiles(*.EXE)|*.EXE|DLLFiles(*.DLL)|*.DLL|AllFiles(*.*)|*.*||"; //初始目录是c:/windows,初始选择的文件名是test,初始后缀过滤器是ChartFiles(*.xlc) CFileDialogdlg(TRUE,NULL,strAppName.GetBuffer(_MAX_PATH),OFN_ENABLESIZING,szFilter,NULL); if(dlg.DoModal()==IDOK) { CStringstrFile=dlg.GetPathName();//全路径 GetDlgItem(IDC_EDT_FILE)->SetWindowText(strFile.GetBuffer(_MAX_PATH)); TRACE("/n&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&/n"); TRACE(strFile); TRACE("/n&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&/n"); } } voidCMyPeidDlg::OnBnClickedBtnOk() { GetDlgItem(IDC_EDT_FILE)->SetWindowText("c:\\1.exe"); charbuf[_MAX_PATH]; ZeroMemory(buf,_MAX_PATH); GetDlgItemText(IDC_EDT_FILE,buf,_MAX_PATH-1); HANDLEhFile=CreateFile(buf,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); if(!hFile) { MessageBox("createFilefailed.."); return; } HANDLEhMap=CreateFileMapping(hFile,NULL,PAGE_READONLY,0,0,NULL); if(!hMap) { MessageBox("hMapfailed.."); return; } LPVOIDlpBase=MapViewOfFile(hMap,FILE_MAP_READ,0,0,0); if(!lpBase) { MessageBox("lpBasefailed.."); return; } DWORDdwOEP; IMAGE_DOS_HEADER*pDosHeader=(IMAGE_DOS_HEADER*)lpBase; IMAGE_NT_HEADERS*pNtHeader=(IMAGE_NT_HEADERS*)((char*)lpBase+pDosHeader->e_lfanew); dwOEP=pNtHeader->OptionalHeader.AddressOfEntryPoint; PIMAGE_SECTION_HEADERpSectionHeader=IMAGE_FIRST_SECTION(pNtHeader); CStringstrTemp; strTemp.Format("%0x",dwOEP); SetDlgItemText(IDC_EDT_OEP,strTemp.GetBuffer(4)); DWORDFileOffset; for(inti=0;i<pNtHeader->FileHeader.NumberOfSections;i++) { if(dwOEP>=pSectionHeader->VirtualAddress&& dwOEP<pSectionHeader->VirtualAddress+pSectionHeader->SizeOfRawData) { FileOffset=dwOEP-pSectionHeader->VirtualAddress+pSectionHeader->PointerToRawData; } pSectionHeader++; } strTemp.Empty(); strTemp.Format("%0x",FileOffset); SetDlgItemText(IDC_EDT_FILEOFFSET,strTemp.GetBuffer(4)); //从文件偏移开始读特征码 CStringstrBuf; DWORDdwReaded; SetFilePointer(hFile,FileOffset,0,FILE_BEGIN); ReadFile(hFile,strBuf.GetBuffer(16),16,&dwReaded,NULL); MessageBox(strBuf.GetBuffer(16)); charcode[]="\x60\xE8\x03\x00\x00\x00\xE9\xEB\04\x5D\x45\x55\xC3\xE8\x01"; charfileBuf[16]; memcpy(fileBuf,strBuf.GetBuffer(16),16); charctype[20]; for(inti=0;i<16;i++) { if(code[i]!=fileBuf[i]) { StrCpy(ctype,"notfound"); break; } elseif(i==15) { StrCpy(ctype,"aspack"); } } SetDlgItemText(IDC_EDT_SHELLTYPE,ctype); }
希望本文所述对大家的C++程序设计有所帮助。