首页
社区
课程
招聘
PeClean (清除PE头中的无用数据, 附源)
发表于: 2005-10-15 09:14 21847

PeClean (清除PE头中的无用数据, 附源)

2005-10-15 09:14
21847

以LordPE和OD成功加载为基础,清除PE头部中的“垃圾”数据
实际情况可能没多大用处,昨天晚上想温习一下PE头的格式就写了这个
使用时把PE文件拖进对话框即可

xp sp2 + VC6

附件:peclean.rar

#include "PeClean.h"

DWORD IsPE(HANDLE hFile)
{
        char        ReadBuffer[4];
        DWORD        dwRead;
        DWORD        dwOffset;
        DWORD        dwSizeOfHeader;

        memset(ReadBuffer, 0, 4);
        SetFilePointer(hFile, 0, NULL, FILE_BEGIN);
        ReadFile(hFile, ReadBuffer, 4, &dwRead, NULL);
        if (ReadBuffer[0]!='M' || ReadBuffer[1]!='Z')
        {
                return 0;
        }
       
        memset(ReadBuffer, 0, 4);
        SetFilePointer(hFile, 0x3C, NULL, FILE_BEGIN);
        ReadFile(hFile, &dwOffset,  4, &dwRead, NULL);
        SetFilePointer(hFile, dwOffset, NULL, FILE_BEGIN);
        ReadFile(hFile, ReadBuffer, 4, &dwRead, NULL);
        if (ReadBuffer[0]!='P' || ReadBuffer[1]!='E')
        {
                return 0;
        }

    SetFilePointer(hFile, dwOffset+0x54, NULL,  FILE_BEGIN);
        ReadFile(hFile, &dwSizeOfHeader, 4, &dwRead, NULL);

        return dwSizeOfHeader;
}

BYTE* ReadHeader(HANDLE hFile, DWORD dwSizeOfHeader)
{
        BYTE*        hMapOfHeader;
        DWORD        dwRead;

        hMapOfHeader = VirtualAlloc(NULL, dwSizeOfHeader, MEM_COMMIT, PAGE_READWRITE);
        if (NULL == hMapOfHeader)
        {
                return NULL;
        }
        SetFilePointer(hFile, 0, NULL, FILE_BEGIN);
        ReadFile(hFile, hMapOfHeader, dwSizeOfHeader, &dwRead, NULL);
        if (dwRead != dwSizeOfHeader)
        {
                VirtualFree(hMapOfHeader, 0, MEM_RELEASE);
                return NULL;
        }

        return hMapOfHeader;
}

void WriteHeader(HANDLE hFile, BYTE* hMapOfHeader, DWORD dwSizeOfHeader)
{
        DWORD        dwWritten;

        SetFilePointer(hFile, 0, NULL, FILE_BEGIN);
        WriteFile(hFile, hMapOfHeader, dwSizeOfHeader, &dwWritten, NULL);

        return ;
}

void BackupFile(char* szFileName)
{
        BOOL        bBackupFile;
        char        szBackupName[MAX_PATH];

        bBackupFile = SendMessage(GetDlgItem(hWnd, IDC_CHECK_BAKFILE), BM_GETCHECK, 0, 0);
        if (bBackupFile)
        {
                strcpy(szBackupName, szFileName);
                strcat(szBackupName, ".bak");
                CopyFile(szFileName, szBackupName, FALSE);
        }

        return ;
}

void CleanDosHeader(BYTE* hMapOfHeader)
{
        BOOL        bMZ;
        BYTE*        i;

        bMZ = SendMessage(GetDlgItem(hWnd, IDC_CHECK_MZ), BM_GETCHECK, 0, 0) ^ 1;
       
        for (i=hMapOfHeader+2; i<(BYTE *)peHeader; i++)
        {
                (*i) *= bMZ;
        }
        *(LPWORD)(hMapOfHeader+0x3C) = (WORD)((BYTE *)peHeader-hMapOfHeader);

        return ;
}

void CleanFileHeader(BYTE* hMapOfHeader)
{
        peHeader->FileHeader.TimeDateStamp        *=
                SendMessage(GetDlgItem(hWnd, IDC_CHECK_FILE1), BM_GETCHECK, 0, 0) ^ 1 ;
        peHeader->FileHeader.PointerToSymbolTable *=
                SendMessage(GetDlgItem(hWnd, IDC_CHECK_FILE2), BM_GETCHECK, 0, 0) ^ 1 ;
        peHeader->FileHeader.NumberOfSymbols      *=
                SendMessage(GetDlgItem(hWnd, IDC_CHECK_FILE3), BM_GETCHECK, 0, 0) ^ 1 ;

        return ;
}

void CleanOptionalHeader(BYTE* hMapOfHeader)
{
        peHeader->OptionalHeader.MajorLinkerVersion          *=
                SendMessage(GetDlgItem(hWnd, IDC_CHECK_OPTIONAL1), BM_GETCHECK, 0, 0) ^ 1 ;
        peHeader->OptionalHeader.MinorLinkerVersion          *=
                SendMessage(GetDlgItem(hWnd, IDC_CHECK_OPTIONAL1), BM_GETCHECK, 0, 0) ^ 1 ;
        peHeader->OptionalHeader.MajorOperatingSystemVersion *=
                SendMessage(GetDlgItem(hWnd, IDC_CHECK_OPTIONAL2), BM_GETCHECK, 0, 0) ^ 1 ;
    peHeader->OptionalHeader.MinorOperatingSystemVersion *=
                SendMessage(GetDlgItem(hWnd, IDC_CHECK_OPTIONAL2), BM_GETCHECK, 0, 0) ^ 1 ;

        peHeader->OptionalHeader.SizeOfCode              *=
                SendMessage(GetDlgItem(hWnd, IDC_CHECK_OPTIONAL3), BM_GETCHECK, 0, 0) ^ 1 ;
        peHeader->OptionalHeader.SizeOfInitializedData   *=
                SendMessage(GetDlgItem(hWnd, IDC_CHECK_OPTIONAL4), BM_GETCHECK, 0, 0) ^ 1 ;
        peHeader->OptionalHeader.SizeOfUninitializedData *=
                SendMessage(GetDlgItem(hWnd, IDC_CHECK_OPTIONAL4), BM_GETCHECK, 0, 0) ^ 1 ;

        peHeader->OptionalHeader.BaseOfCode   *=
                SendMessage(GetDlgItem(hWnd, IDC_CHECK_OPTIONAL5), BM_GETCHECK, 0, 0) ^ 1 ;
        peHeader->OptionalHeader.BaseOfData   *=
                SendMessage(GetDlgItem(hWnd, IDC_CHECK_OPTIONAL6), BM_GETCHECK, 0, 0) ^ 1 ;

    peHeader->OptionalHeader.MajorImageVersion   *=
                SendMessage(GetDlgItem(hWnd, IDC_CHECK_OPTIONAL7), BM_GETCHECK, 0, 0) ^ 1 ;
    peHeader->OptionalHeader.MinorImageVersion   *=
                SendMessage(GetDlgItem(hWnd, IDC_CHECK_OPTIONAL7), BM_GETCHECK, 0, 0) ^ 1 ;
        peHeader->OptionalHeader.Win32VersionValue   *=
                SendMessage(GetDlgItem(hWnd, IDC_CHECK_OPTIONAL8), BM_GETCHECK, 0, 0) ^ 1 ;

        peHeader->OptionalHeader.CheckSum    *=
                SendMessage(GetDlgItem(hWnd, IDC_CHECK_OPTIONAL9), BM_GETCHECK, 0, 0) ^ 1 ;

        peHeader->OptionalHeader.LoaderFlags *=
                SendMessage(GetDlgItem(hWnd, IDC_CHECK_OPTIONAL10), BM_GETCHECK, 0, 0) ^ 1 ;

        peHeader->OptionalHeader.DllCharacteristics *=
                SendMessage(GetDlgItem(hWnd, IDC_CHECK_OPTIONAL11), BM_GETCHECK, 0, 0) ^ 1 ;

        return ;
}

void CleanFile(char* szFileName)
{
        HANDLE        hFile;
        DWORD        dwSizeOfHeader;
        BYTE*        hMapOfHeader;

        hFile = CreateFile(szFileName,
                                           GENERIC_READ+GENERIC_WRITE,
                                           FILE_SHARE_READ+FILE_SHARE_WRITE,
                                           0,
                                           OPEN_EXISTING,
                                           FILE_ATTRIBUTE_NORMAL,NULL);

        if (hFile == INVALID_HANDLE_VALUE)
        {
                MessageBox(hWnd, "Cannot Open the File", "Error", 0);
                return ;
        }
        dwSizeOfHeader = IsPE(hFile);
        if (dwSizeOfHeader == 0)
        {
                CloseHandle(hFile);
                MessageBox(hWnd, "Invalid PE File", "Error", 0);
                return ;
        }
        hMapOfHeader = ReadHeader(hFile, dwSizeOfHeader);
        if (NULL == hMapOfHeader)
        {
                CloseHandle(hFile);
                MessageBox(hWnd, "Cannot Read PeHeader", "Error", 0);
                return ;
        }

        peHeader = (IMAGE_NT_HEADERS32 *)(hMapOfHeader + *(LPWORD)(hMapOfHeader+0x3C));

        BackupFile(szFileName);

        CleanDosHeader(hMapOfHeader);

        CleanFileHeader(hMapOfHeader);

        CleanOptionalHeader(hMapOfHeader);

        *(LPWORD)(hMapOfHeader+0x3C) = (WORD)((BYTE *)peHeader-hMapOfHeader);
        WriteHeader(hFile, hMapOfHeader, dwSizeOfHeader);

        VirtualFree(hMapOfHeader, 0, MEM_RELEASE);
        CloseHandle(hFile);

        MessageBox(hWnd, "Done!", "ok", 0);
        return ;
}

void SetCheck(BOOL bFlag)
{
        SendMessage(GetDlgItem(hWnd, IDC_CHECK_BAKFILE)    , BM_SETCHECK, bFlag, 0);
        SendMessage(GetDlgItem(hWnd, IDC_CHECK_MZ)         , BM_SETCHECK, bFlag, 0);
        SendMessage(GetDlgItem(hWnd, IDC_CHECK_FILE1)      , BM_SETCHECK, bFlag, 0);
        SendMessage(GetDlgItem(hWnd, IDC_CHECK_FILE2)      , BM_SETCHECK, bFlag, 0);
        SendMessage(GetDlgItem(hWnd, IDC_CHECK_FILE3)      , BM_SETCHECK, bFlag, 0);
        SendMessage(GetDlgItem(hWnd, IDC_CHECK_OPTIONAL1)  , BM_SETCHECK, bFlag, 0);
        SendMessage(GetDlgItem(hWnd, IDC_CHECK_OPTIONAL2)  , BM_SETCHECK, bFlag, 0);
        SendMessage(GetDlgItem(hWnd, IDC_CHECK_OPTIONAL3)  , BM_SETCHECK, bFlag, 0);
        SendMessage(GetDlgItem(hWnd, IDC_CHECK_OPTIONAL4)  , BM_SETCHECK, bFlag, 0);
        SendMessage(GetDlgItem(hWnd, IDC_CHECK_OPTIONAL5)  , BM_SETCHECK, bFlag, 0);
        SendMessage(GetDlgItem(hWnd, IDC_CHECK_OPTIONAL6)  , BM_SETCHECK, bFlag, 0);
        SendMessage(GetDlgItem(hWnd, IDC_CHECK_OPTIONAL7)  , BM_SETCHECK, bFlag, 0);
        SendMessage(GetDlgItem(hWnd, IDC_CHECK_OPTIONAL8)  , BM_SETCHECK, bFlag, 0);
        SendMessage(GetDlgItem(hWnd, IDC_CHECK_OPTIONAL9)  , BM_SETCHECK, bFlag, 0);
        SendMessage(GetDlgItem(hWnd, IDC_CHECK_OPTIONAL10) , BM_SETCHECK, bFlag, 0);
        SendMessage(GetDlgItem(hWnd, IDC_CHECK_OPTIONAL11) , BM_SETCHECK, bFlag, 0);

        SendMessage(GetDlgItem(hWnd, IDC_CHECK_ALL)  , BM_SETCHECK, bFlag,   0);
        SendMessage(GetDlgItem(hWnd, IDC_CHECK_NONE) , BM_SETCHECK, bFlag^1, 0);
}

int CALLBACK DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
        switch (uMsg)
        {
        case WM_CLOSE:
                PostQuitMessage(0);
                break;

        case WM_INITDIALOG:
                hWnd = hDlg;

                hIcon = LoadIcon(hInst, MAKEINTRESOURCE(IDI_ICON1));
                SendMessage(hWnd, WM_SETICON, (WPARAM)TRUE, (LPARAM)hIcon);
                SetCheck(TRUE);
                break;

        case WM_DROPFILES:
                if (DragQueryFile((HDROP)wParam, 0, szFileName, MAX_PATH))
                {
                        CleanFile(szFileName);
                }
                break;

        case WM_COMMAND:
                if (lParam == GetDlgItem(hWnd, IDC_CHECK_ALL))
                {
                        SetCheck(1);
                }
                else if (lParam == GetDlgItem(hWnd, IDC_CHECK_NONE))
                {
                        SetCheck(0);
                }
                break;
        default:
                break;
        }

        return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
        InitCommonControls();

        hInst = hInstance;
        DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG_PECLEAN), NULL, (DLGPROC)DlgProc);

        return 0;
}


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 8
支持
分享
最新回复 (27)
雪    币: 239
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
support u
2005-10-15 09:36
0
雪    币: 133
活跃值: (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
up
2005-10-15 15:31
0
雪    币: 1223
活跃值: (469)
能力值: (RANK:460 )
在线值:
发帖
回帖
粉丝
4
不错,支持
2005-10-15 16:31
0
雪    币: 389
活跃值: (912)
能力值: ( LV9,RANK:770 )
在线值:
发帖
回帖
粉丝
5
学习.
2005-10-15 17:14
0
雪    币: 172
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
不错, 以后不用手工来清理了。
2005-10-16 20:37
0
雪    币: 229
活跃值: (70)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
7
似乎上场的机会很少哦
2005-10-17 00:09
0
雪    币: 61
活跃值: (160)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
8
Good job!
2005-10-22 12:11
0
雪    币: 1540
活跃值: (2807)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
你的窗口是不是能够总在最前面,当选中pe文件的时候,
你的程序总是要最小话,操作起来很不方便

最初由 shoooo 发布
以LordPE和OD成功加载为基础,清除PE头部中的“垃圾”数据
实际情况可能没多大用处,昨天晚上想温习一下PE头的格式就写了这个
使用时把PE文件拖进对话框即可

xp sp2 + VC6
........
2005-10-22 21:35
0
雪    币: 233
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
此工具对我还是很有用
THANKS!・~
2006-2-25 11:21
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
有用的工具支持一下
2006-2-25 14:50
0
雪    币: 342
活跃值: (323)
能力值: ( LV9,RANK:450 )
在线值:
发帖
回帖
粉丝
12
看看
2006-3-19 02:18
0
雪    币: 250
活跃值: (103)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
13
支持!
2006-3-25 21:20
0
雪    币: 0
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
14
支持啊!
2006-3-29 00:01
0
雪    币: 333
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wan
15
大侠们的东东肯定要收藏了~~~哈~~~
2006-3-29 10:44
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
感谢感谢,我在一破站上看到还要RMB买他会员,倒塌..
2006-4-1 21:57
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
用od加载了程序 ,打开peclean 然后怎么做啊
2006-4-4 08:07
0
雪    币: 134
活跃值: (84)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
18
好东西,但LOADPE已经够用了.
2006-4-8 12:07
0
雪    币: 152
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
没付件
现在来是不是晚了
2010-1-4 22:20
0
雪    币: 198
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
thx~!
2010-1-6 16:07
0
雪    币: 266
活跃值: (204)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
今天在暗组也看到了
2010-1-7 14:59
0
雪    币: 235
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
很好用的工具,谢谢LZ了!!
2010-3-11 23:22
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
支持楼主!!!!
2010-4-8 00:18
0
雪    币: 1731
活跃值: (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
学习了!顶!
2010-4-8 01:58
0
雪    币: 44
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
fyd
25
下载了,学习学习!谢谢!
2010-4-14 17:12
0
游客
登录 | 注册 方可回帖
返回
//