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++程序设计有所帮助。