滴水三期(win32课堂作业)PE查看器 源码

效果图

// PE_View.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include "resource.h"
#include <commdlg.h>
#include <commctrl.h>
#include <tlhelp32.h>    
#include <stdio.h>
#include <stdlib.h>
#pragma comment(lib,"comctl32.lib")        
HINSTANCE hAPPInstance;
HWND hAppHwnd;

void EnumProcess(HWND hListProcess)//在列表框中显示内容的函数.
{
    LV_ITEM  vitem;
    memset(&vitem,0,sizeof(LV_ITEM));
    vitem.mask=LVIF_TEXT;

    //这里是获取所有进程信息的代码
    PROCESSENTRY32 pe32 = { 0 };//这个结构存放的是一个进程的信息
   MODULEENTRY32 me32 = { sizeof(MODULEENTRY32) };
    pe32.dwSize = sizeof(PROCESSENTRY32);
    DWORD n=0;
  HANDLE hProcessSnap =CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);// 获取全部进程快照
if (hProcessSnap!=INVALID_HANDLE_VALUE)//判断句柄是否有效
{
    BOOL bRet =    Process32First(hProcessSnap, &pe32);
    while(bRet)
    {
        HANDLE hprocess=OpenProcess(PROCESS_ALL_ACCESS, FALSE,pe32.th32ProcessID);//这里必须要打开某一个进程的快照才能察看到里面的信息。
        HANDLE hSnap_proc =CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pe32.th32ProcessID);//对某个模块进行快照。
                                            Module32First(hSnap_proc, &me32);
        vitem.pszText=pe32.szExeFile;
        vitem.iItem=n;//行
        vitem.iSubItem=0;//列
        SendMessage(hListProcess, LVM_INSERTITEM,0,(DWORD)&vitem);
        sprintf(vitem.pszText,TEXT("%d"), pe32.th32ProcessID);
        vitem.iItem=n;//行
        vitem.iSubItem=1;//列
        //ListView_SetItem(hListProcess,&vitem);
        SendMessage(hListProcess, LVM_SETITEM,0,(DWORD)&vitem);    
        
        sprintf(vitem.pszText,TEXT("%08X"), me32.modBaseAddr);
        vitem.iItem=n;//行
        vitem.iSubItem=2;//列
        //ListView_SetItem(hListProcess,&vitem);
        SendMessage(hListProcess, LVM_SETITEM,0,(DWORD)&vitem);    
        
        sprintf(vitem.pszText,TEXT("%08X"), me32.modBaseSize);
        vitem.iItem=n;//行
        vitem.iSubItem=3;//列
        //ListView_SetItem(hListProcess,&vitem);
    SendMessage(hListProcess, LVM_SETITEM,0,(DWORD)&vitem);    

        bRet = Process32Next(hProcessSnap, &pe32);
        n++;
        CloseHandle(hSnap_proc);
    } 
    CloseHandle(hProcessSnap);
}
}

void EnumModule(HWND hwndDlg,WPARAM wparam,LPARAM lparam)//在列表框中显示内容的函数.
{
    
    DWORD dwRowId;
    LV_ITEM lv;
    TCHAR szPid[0x20];
    
    
    memset(&lv, 0, sizeof(LV_ITEM));
    memset(&szPid, 0, 0x20);
    
    dwRowId = SendMessage(hwndDlg, LVM_GETNEXTITEM, -1, LVNI_SELECTED);
    
    if (dwRowId == -1) 
    {
        MessageBox(NULL, TEXT("请选择进程"), TEXT("出错了"), MB_OK);
        return;
    }
    
    lv.iSubItem = 1;
    lv.pszText = szPid;
    lv.cchTextMax = 0x20;
    SendMessage(hwndDlg, LVM_GETITEMTEXT, dwRowId, (DWORD)&lv);
    
MessageBox(NULL, szPid, TEXT("PID"), MB_OK);
//根据PID 调用API,将内容插入 到插入到下面。
/***************************************/

LV_ITEM  vitem;
memset(&vitem,0,sizeof(LV_ITEM));
vitem.mask=LVIF_TEXT;

//这里是获取所有进程信息的代码
PROCESSENTRY32 pe32 = { 0 };//这个结构存放的是一个进程的信息
MODULEENTRY32 me32 = { sizeof(MODULEENTRY32) };
pe32.dwSize = sizeof(PROCESSENTRY32);
DWORD n=0;

        HANDLE hprocess=OpenProcess(PROCESS_ALL_ACCESS, FALSE,atoi(szPid));//这里必须要打开某一个进程的快照才能察看到里面的信息。
        HANDLE hSnap_proc =CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, atoi(szPid));//对某个模块进行快照。
    

        BOOL  FLG=    Module32First(hSnap_proc, &me32);
        HWND hListProcess=GetDlgItem(hAppHwnd,IDC_LIST_MODULE);
        SendMessage(hListProcess,LVM_DELETEALLITEMS,0,0);//先清空列表所有数据。

            if(FLG)
            {
                do 
                {

                    vitem.pszText=me32.szModule;
                    vitem.iItem=n;//行
                    vitem.iSubItem=0;//列
                    SendMessage(hListProcess, LVM_INSERTITEM,0,(DWORD)&vitem);
                    
                    vitem.pszText=me32.szExePath;
                    vitem.iItem=n;//行
                    vitem.iSubItem=1;//列
                    SendMessage(hListProcess, LVM_SETITEM,0,(DWORD)&vitem);

            
                    sprintf(vitem.pszText,"%d",n+1);
                    vitem.iItem=n;//行
                    vitem.iSubItem=2;//列
                    SendMessage(hListProcess, LVM_SETITEM,0,(DWORD)&vitem);

                    n++;
                } while (Module32Next(hSnap_proc, &me32));
                CloseHandle(hSnap_proc);
            }CloseHandle(hprocess);
                
}        
void InitProcess(HWND hDlg)//初始化成LIST 进程列表框 的值的函数,所有都在这里初使化.
{
/*    typedef struct _LV_COLUMN
    {
        UINT mask; //屏蔽位的组合(见下面括号),表明哪些成员是有效的. 
        int fmt; 该列的表头和子项的标题显示格式(LVCF_FMT).可以是LVCFMT_CENTER、LVCFMT_LEFT或LVCFMT_RIGHT
        int cx; //以像素为单位的列的宽度(LVCF_FMT)
        LPTSTR pszText; //指向存放列表头标题正文的缓冲区(LVCF_TEXT)
        int cchTextMax; //标题正文缓冲区的长度(LVCF_TEXT)
        int iSubItem; //说明该列的索引(LVCF_SUBITEM)
    } LV_COLUMN;*/
    LV_COLUMN lv;//创建一个变量LV(list view)
    HWND hListProcess;
    memset(&lv,0,sizeof(LV_COLUMN));
    hListProcess=GetDlgItem(hDlg,IDC_LIST_PROCESS);//获取名字PROCESS的控件句柄.
    SendMessage(hListProcess,LVM_SETEXTENDEDLISTVIEWSTYLE,LVS_EX_FULLROWSELECT,LVS_EX_FULLROWSELECT);//设置整行可选的message
    
        lv.mask=LVCF_TEXT|LVCF_WIDTH|LVCF_SUBITEM;//窗口显示模式.  文本
        lv.pszText=TEXT("进程名");//列标题.
        lv.cx=200;                      //列宽. 
        lv.iSubItem=0;                 //索引.
    SendMessage(hListProcess,LVM_INSERTCOLUMN,0,(DWORD)&lv);   //界面显示必须要sendmessage,WINDOWS才知道下一步做什么,否则界面就不显示.

        lv.mask=LVCF_TEXT|LVCF_WIDTH|LVCF_SUBITEM|LVS_EX_GRIDLINES;//窗口显示模式.  文本
        lv.pszText=TEXT("PID");//列标题.
        lv.cx=100;                      //列宽. 
        lv.iSubItem=1;                 //索引.
    SendMessage(hListProcess,LVM_INSERTCOLUMN,1,(DWORD)&lv);

    lv.mask=LVCF_TEXT|LVCF_WIDTH|LVCF_SUBITEM;//窗口显示模式.  文本
    lv.pszText=TEXT("镜像基址");//列标题.
    lv.cx=100;                      //列宽. 
    lv.iSubItem=2;                 //索引.
    SendMessage(hListProcess,LVM_INSERTCOLUMN,2,(DWORD)&lv);

    lv.mask=LVCF_TEXT|LVCF_WIDTH|LVCF_SUBITEM;//窗口显示模式.  文本
    lv.pszText=TEXT("镜像大小");//列标题.
    lv.cx=100;                      //列宽. 
    lv.iSubItem=3;                 //索引.
    SendMessage(hListProcess,LVM_INSERTCOLUMN,3,(DWORD)&lv);
    EnumProcess(hListProcess);
}

void InitModule(HWND hDlg)//初始化成LIST 进程列表框 的值的函数,所有都在这里初使化.
{

    LV_COLUMN lv;//创建一个变量LV(list view)
    HWND hListModule;
    memset(&lv,0,sizeof(LV_COLUMN));
    hListModule=GetDlgItem(hDlg,IDC_LIST_MODULE);//获取名字hListModule的控件句柄.
    SendMessage(hListModule,LVM_SETEXTENDEDLISTVIEWSTYLE,LVS_EX_FULLROWSELECT,LVS_EX_FULLROWSELECT);//设置整行可选的message


    
  lv.mask=LVCF_TEXT|LVCF_WIDTH|LVCF_SUBITEM;//窗口显示模式.  文本
        lv.pszText=TEXT("模块名");//列标题.
        lv.cx=200;                      //列宽. 
        lv.iSubItem=0;                 //索引.
    SendMessage(hListModule,LVM_INSERTCOLUMN,0,(DWORD)&lv);   //界面显示必须要sendmessage,WINDOWS才知道下一步做什么,否则界面就不显示.

    lv.mask=LVCF_TEXT|LVCF_WIDTH|LVCF_SUBITEM;//窗口显示模式.  文本
        lv.pszText=TEXT("模块位置");//列标题.
        lv.cx=400;                      //列宽. 
        lv.iSubItem=1;                 //索引.
    SendMessage(hListModule,LVM_INSERTCOLUMN,1,(DWORD)&lv);

    
    lv.mask=LVCF_TEXT|LVCF_WIDTH|LVCF_SUBITEM;//窗口显示模式.  文本
    lv.pszText=TEXT("序号");//列标题.
    lv.cx=60;                      //列宽. 
    lv.iSubItem=2;                 //索引.
    SendMessage(hListModule,LVM_INSERTCOLUMN,2,(DWORD)&lv);

    //EnumModule(hListModule);
}

BOOL CALLBACK PEDialogProc(                                    
                             HWND hwndDlg,  // handle to dialog box            
                             UINT uMsg,     // message            
                             WPARAM wParam, // first message parameter            
                             LPARAM lParam  // second message parameter            
                             )            
{        
    
    switch(uMsg)                                
    {    
    case    WM_CLOSE:
        EndDialog(hwndDlg,0);
        break; 
    case  WM_INITDIALOG :    //

        break;         
    case  WM_COMMAND :                                
        switch (LOWORD (wParam))                            
        {    
        case IDC_BUTTON_PE: 
            return TRUE;
        case   IDC_BUTTON_ABOUT:
            return TRUE;                            
        case   IDC_BUTTON_QUIT:                            
            EndDialog(hwndDlg, 0);                        
            return TRUE;                        
        }
        break ;                            
    }                                    
    return FALSE ;                                
}                                    

BOOL CALLBACK MAINDialogProc(                                    
                         HWND hwndDlg,  // handle to dialog box            
                         UINT uMsg,     // message            
                         WPARAM wParam, // first message parameter            
                         LPARAM lParam  // second message parameter            
                         )            
{        

    OPENFILENAME stopenfile;
    TCHAR szPeFileExt[100]="*.sys;*.exe;*.dll;*.scr;*.drv";//提前定义需要筛选的文件类型。
hAppHwnd=hwndDlg;
    switch(uMsg)                                
    {
    case    WM_CLOSE:
        EndDialog(hwndDlg,0);
         break; 
    case  WM_INITDIALOG :    //
        InitProcess(hwndDlg);    
        InitModule(hwndDlg);
         break;         
    case  WM_COMMAND :                                
        switch (LOWORD (wParam))                            
        {    
            case IDC_BUTTON_PE: 
                TCHAR szFileName[256];
                memset(szFileName,0,256);                
                memset(&stopenfile,0,sizeof(OPENFILENAME));
                stopenfile.lStructSize=sizeof(OPENFILENAME);//设置这结构体的大小。
                stopenfile.Flags=OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST;//设置对话框的显示类型。
                stopenfile.hwndOwner=hwndDlg;
                stopenfile.lpstrFilter=szPeFileExt;//设置筛选的文件类型。//过滤器
                stopenfile.lpstrFile=szFileName;
                stopenfile.nMaxFile=MAX_PATH;
                GetOpenFileName(&stopenfile);//此API为弹出打开文件的对话框 ,选中后文件路径就存储在szFileName中了。
            //    MessageBox(0,szFileName,0,0);
            DialogBox(hAPPInstance,MAKEINTRESOURCE(IDD_DIALOG_PE),hwndDlg,PEDialogProc);
                return TRUE;
            case   IDC_BUTTON_ABOUT:
                return TRUE;                            
            case   IDC_BUTTON_QUIT:                            
                    EndDialog(hwndDlg, 0);                        
                return TRUE;                        
        }
        break ;    
        case    WM_NOTIFY:
            {
                NMHDR* pHnmhdr=(NMHDR*)lParam;
                if (wParam==IDC_LIST_PROCESS && pHnmhdr->code==NM_CLICK)
                {
                    EnumModule(GetDlgItem(hwndDlg,IDC_LIST_PROCESS),wParam,lParam);
                }
            }    
         break; 
    }                                    
    return FALSE ;                                
}                                    


int APIENTRY WinMain(HINSTANCE  hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
     // TODO: Place code here.
        hAPPInstance=hInstance;
    INITCOMMONCONTROLSEX icex;                
    icex.dwSize = sizeof(INITCOMMONCONTROLSEX);                
    icex.dwICC = ICC_WIN95_CLASSES;                
    InitCommonControlsEx(&icex);                

    DialogBox(hInstance,  MAKEINTRESOURCE (IDD_DIALOG_MAIN),NULL,MAINDialogProc);

    return 0;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值