当前位置: 首页 > 编程笔记 >

C++实现查壳程序代码实例

曾永新
2023-03-14
本文向大家介绍C++实现查壳程序代码实例,包括了C++实现查壳程序代码实例的使用技巧和注意事项,需要的朋友参考一下

本文实例讲述了C++实现查壳程序代码,分享给大家供大家参考。具体方法分析如下:

一般来说,PEID是基于特征码的,用python只需要两行代码,用VC实现用了这么多代码……。

python中只要引入pefile模块,第一句代码指定数据库文件,第二句代码返回结果。具体的看pefile官方介绍吧

下面是C++的代码:

void CMyPeidDlg::OnBnClickedBtnOpen()  

{  

    // 获取当前工作路径  

    CString strAppName;//当前工作目录  

    ::GetModuleFileName(NULL, strAppName.GetBuffer(_MAX_PATH), _MAX_PATH);  

    strAppName.ReleaseBuffer();  

    int nPos = strAppName.ReverseFind('//');  

    strAppName = strAppName.Left(nPos + 1);  

  

    // AfxMessageBox(strAppName);  

  

  

    // 文件扩展名过滤器  

    LPCTSTR szFilter = "EXE Files (*.EXE)|*.EXE|DLL Files (*.DLL)|*.DLL|All Files (*.*)|*.*||";  

  

    //初始目录是c:/windows, 初始选择的文件名是test,初始后缀过滤器是 Chart Files (*.xlc)  

    CFileDialog dlg(TRUE,NULL ,strAppName.GetBuffer(_MAX_PATH) ,OFN_ENABLESIZING ,szFilter,NULL);  

    if(dlg.DoModal() == IDOK)  

    {  

        CString strFile = dlg.GetPathName(); // 全路径  

        GetDlgItem(IDC_EDT_FILE)->SetWindowText(strFile.GetBuffer(_MAX_PATH));  

  

        TRACE("/n&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&/n");  

        TRACE(strFile);  

        TRACE("/n&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&/n");  

    }  

}  

  

void CMyPeidDlg::OnBnClickedBtnOk()  

{  

    GetDlgItem(IDC_EDT_FILE)->SetWindowText("c:\\1.exe");  

  

    char buf[_MAX_PATH];  

    ZeroMemory(buf, _MAX_PATH);  

    GetDlgItemText(IDC_EDT_FILE, buf, _MAX_PATH-1);  

    HANDLE hFile = CreateFile(buf, GENERIC_READ,FILE_SHARE_READ, NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);  

    if (!hFile)  

    {  

        MessageBox("createFile failed..");  

        return;  

    }  

    HANDLE hMap = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0,NULL);  

    if (!hMap)  

    {  

        MessageBox("hMap failed..");  

        return;  

    }  

    LPVOID lpBase = MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0);  

    if (!lpBase)  

    {  

        MessageBox("lpBase failed..");  

        return;  

    }  

  

    DWORD dwOEP;  

    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_HEADER pSectionHeader = IMAGE_FIRST_SECTION(pNtHeader);  

      

    CString strTemp;  

    strTemp.Format("%0x",dwOEP);  

    SetDlgItemText(IDC_EDT_OEP, strTemp.GetBuffer(4));  

  

    DWORD FileOffset;  

    for(int i=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));  

  

    //从文件偏移开始读特征码  

    CString strBuf;  

    DWORD dwReaded;  

    SetFilePointer(hFile, FileOffset,0, FILE_BEGIN);  

    ReadFile(hFile, strBuf.GetBuffer(16), 16, &dwReaded,NULL);  

    MessageBox(strBuf.GetBuffer(16));  

  

    char code[] = "\x60\xE8\x03\x00\x00\x00\xE9\xEB\04\x5D\x45\x55\xC3\xE8\x01";  

    char fileBuf[16];  

    memcpy(fileBuf, strBuf.GetBuffer(16),16);  

    char ctype[20];  

    for (int i=0;i<16;i++)  

    {  

        if (code[i]!=fileBuf[i])  

        {  

            StrCpy(ctype,"not found");  

            break;  

        }  

        else if (i==15)  

        {  

            StrCpy(ctype, "aspack");  

        }  

    }  

    SetDlgItemText(IDC_EDT_SHELLTYPE, ctype);  

}

希望本文所述对大家的C++程序设计有所帮助。

 类似资料:
  • 本文向大家介绍C++ 基数排序的实现实例代码,包括了C++ 基数排序的实现实例代码的使用技巧和注意事项,需要的朋友参考一下 C++ 基数排序  大家好,今天带来的是自己实现的用C++完成基数排序.在数据结构,算法分析和程序设计的学习过程中,我们经常也无法避免的要学到排序的算法.排序算法是程序设计过程中使用频率极高的算法之一,其输入是一组无序的序列,要求以升序或者降序的方式输出一组有序的序列.对于如

  • 本文向大家介绍C语言实现密码程序,包括了C语言实现密码程序的使用技巧和注意事项,需要的朋友参考一下 本文为大家分享了C语言实现密码程序的具体代码,供大家参考,具体内容如下 题目要求 编写代码实现,模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则提示 登录成,如果三次均输入错误,则退出程序。 逻辑分析 3次循环,如果输入正确的话,则输入正确登录成功,否则输入错误请重新输入,循

  • 本文向大家介绍C#实现闹钟AlarmClock实例代码,包括了C#实现闹钟AlarmClock实例代码的使用技巧和注意事项,需要的朋友参考一下 本文所述是一个小巧且功能简单的C#闹钟程序代码AlarmClock,程序涉及到了AxInterop.MSMask.dll与Interop.MSMask.dll两个控件,对编写时间闹钟或许有点参考价值。 完整实例代码如下: 本文实例代码备有较为详尽的注释,可

  • 本文向大家介绍C语言实现树的动态查找实例代码,包括了C语言实现树的动态查找实例代码的使用技巧和注意事项,需要的朋友参考一下 C语言实现树的动态查找实例代码 本例演示一种树数据结构存储记录集合时的动态查找方法。首先程序通过construct()函数,利用已经存在的结构体数组数据建立一个二叉树,建立树的过程中,要保证每个节点的值都大于它的左子树上节点的值而小于它右子树所有节点的值,该函数返回建立树的根

  • 本文向大家介绍c# GridControl的模糊查询实现代码,包括了c# GridControl的模糊查询实现代码的使用技巧和注意事项,需要的朋友参考一下 如上图所示,如果查询供应商名称包括机械的公司,正常设置是不可以的,只能从头开始筛选: 方法1: 以下是以为网名为[不是小宽]的网友发给我的完美解决方案,我在此贴出来,大家可以共同学习: 在要查询的窗体中调用即可: SetFilter( grid

  • 本文向大家介绍C++ 模拟实现list(迭代器)实现代码,包括了C++ 模拟实现list(迭代器)实现代码的使用技巧和注意事项,需要的朋友参考一下 C++ 模拟实现list(迭代器) 实现代码: 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!