首页
论坛
课程
招聘
[原创]Exe程序尾部附加数据添加程序(含源码)
2010-7-21 19:06 16290

[原创]Exe程序尾部附加数据添加程序(含源码)

2010-7-21 19:06
16290

/*************************************************************************************
                                     〖软件说明〗
                               添加EXE尾部附加数据 No 1.0
                                 by zhanshen[DFCG][RCT]
  这个程序是在我处理一个有附加数据程序时有感而写的。原来我在处理Exe程序的尾部附加程
序时,一般都是先用WinHex或其它Hex十六进制编辑器打开原程序,再将附加数据拷出来写入到目
标程序中,一次二次还好,n次以上就觉得烦了。所以就写下了一个程序自动添加尾部附加数据。
  这个程序操作很简单:选择两个文件,然后点击【开始写入】按钮就行了。这个程序除了可
以直接输入文件名和浏览文件取得程序文件名外,还支持直接将文件拖曵到文本框中。
  这个程序的写入方式有:
  1、选取两个exe文件,一个要写入附加数据的目标exe文件,一个原 有附加数据的exe文件,
该软件可以直接取出附加数据添加到目标程序中。
  2、选取目标exe文件,另一个选择一个*.bin文件,该程序将会将这个整个*.bin文件直接写
入目标exe程序的尾部。
  3、其它的方式就由用户自行摸索(众:好像没有了吧?作者:-_-!,转身偷逃。众:哪里跑
  附:本软件为开源免费软件,用户可以任意使用本软件,任何人均可从网上等地方获取到本
软件的副本及其源码。用户如若转载,请保持本文档的完整,谢谢!本软件作者只为测试,任何
人均不得将程序用于非法之处,否则由此引起 的问题一概由用户自负。
*************************************************************************************/




附件下载
WriteOverlay.rar

/* WriteOverlay.cpp file */

#include "WriteOverlay.h"

int WINAPI WinMain(IN HINSTANCE hInstance,
                                   IN HINSTANCE hPrevInstance,
                                   IN LPSTR lpCmdLine,
                                   IN int nShowCmd )
{
        g_hInstance = hInstance;
        g_lpszCmdLine = lpCmdLine;
        DialogBox(hInstance,(char *)DLG_MAIN,0,(DLGPROC)MainDlgProc);
        return 0;
}

LRESULT CALLBACK MainDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
        HWND l_hEdit = 0;
        OPENFILENAME l_stOFN;
        void *l_pBuff = NULL;
        int l_nStrLen;
        HANDLE l_hWriteFile;
        char l_szFileName[CHAR_MAX],l_szPatchFileName[CHAR_MAX],l_szOverlayFileName[CHAR_MAX];
        switch(uMsg)
        {
        case WM_INITDIALOG:
                g_hDlgMain = hDlg;
                g_hMainIcon = LoadIcon(g_hInstance,(char *)ICON_MAIN);
                SendMessage(hDlg,WM_SETICON,ICON_SMALL,(LPARAM)g_hMainIcon);
                l_hEdit = GetDlgItem(hDlg,EDIT_PATCH_TO_EXE);
                SetWindowLong(l_hEdit,GWL_USERDATA,GetWindowLong(l_hEdit,GWL_WNDPROC));
                SetWindowLong(l_hEdit,GWL_WNDPROC,(UINT)EditsProc);
                l_hEdit = GetDlgItem(hDlg,EDIT_DATA_TO_PATCH);
                SetWindowLong(l_hEdit,GWL_USERDATA,GetWindowLong(l_hEdit,GWL_WNDPROC));
                SetWindowLong(l_hEdit,GWL_WNDPROC,(UINT)EditsProc);
                g_hHandCur = LoadCursor(g_hInstance,(char *)CUR_HAND);
                l_hEdit = GetDlgItem(hDlg,EDIT_PRINTS);
                g_hPrintfEdit = l_hEdit;
                StringAdd(l_hEdit,lpszCopyRight);
                break;
        case WM_COMMAND:
                switch((WORD)wParam)
                {
                case BTN_PATHC_TO_EXE_OPEN:
                        InitOpenFileName(0,hDlg,&l_stOFN,l_szFileName,sizeof(l_szFileName));
                        l_stOFN.lpstrFilter = "exe files(*.exe)\0*.exe\0all files(*.*)\0*.*\0\0";
                        if (GetOpenFileName(&l_stOFN))
                                SetDlgItemText(hDlg,EDIT_PATCH_TO_EXE,l_szFileName);
                        break;
                case BTN_DATA_TO_PATHC_OPEN:
                        InitOpenFileName(0,hDlg,&l_stOFN,l_szFileName,sizeof(l_szFileName));
                        l_stOFN.lpstrFilter = "exe files(*.exe)\0*.exe\0bin files(*.bin)\0*.bin\0all files(*.*)\0*.*\0\0";
                        if (GetOpenFileName(&l_stOFN))
                                SetDlgItemText(hDlg,EDIT_DATA_TO_PATCH,l_szFileName);
                        break;
                case BTN_START_WRITE:
                        if (!g_IsStartWrite)
                        {
                                SetWindowText(g_hPrintfEdit,"");
                                g_IsStartWrite = TRUE;
                        }
                        ZeroMemory(&l_szPatchFileName,sizeof(l_szPatchFileName));
                        ZeroMemory(&l_szOverlayFileName,sizeof(l_szOverlayFileName));
                        if (!GetDlgItemText(hDlg,EDIT_PATCH_TO_EXE,l_szPatchFileName,sizeof(l_szPatchFileName)))
                        {
                                StringAdd(g_hPrintfEdit,"错误!,要添加尾部附加数据这一栏不能为空!!\r\n");
                                return TRUE;
                        }
                        if (!GetDlgItemText(hDlg,EDIT_DATA_TO_PATCH,l_szOverlayFileName,sizeof(l_szOverlayFileName)))
                        {
                                StringAdd(g_hPrintfEdit,"错误!,要写入的尾部数据这一栏不能为空!!\r\n");
                                return TRUE;
                        }
                        if (StartWriteOverlay(l_szPatchFileName,l_szOverlayFileName))
                                StringAdd(g_hPrintfEdit,"Exe尾部附加数据写入成功!!\r\n");
                        else
                                StringAdd(g_hPrintfEdit,"写入失败!!,详细信息请看信息输出窗口\r\n");
                        break;
                case BTN_SAVE_LOG:
                        if (!g_IsStartWrite)
                        {
                                StringAdd(g_hPrintfEdit,"信息窗口内容为空,不用保存!\r\n");
                                return TRUE;
                        }
                        ZeroMemory(&l_szFileName,sizeof(l_szFileName));
                        InitOpenFileName(0,hDlg,&l_stOFN,l_szFileName,sizeof(l_szFileName));
                        l_stOFN.lpstrFilter = "txt files(*.txt)\0*.txt\0all files(*.*)\0*.*\0\0";
                        if (GetSaveFileName(&l_stOFN))
                        {
                                l_nStrLen = StringAdd(g_hPrintfEdit,"");
                                l_pBuff = malloc(l_nStrLen+4);
                                ZeroMemory(l_pBuff,l_nStrLen+4);
                                l_nStrLen = GetWindowText(g_hPrintfEdit,(char *)l_pBuff,l_nStrLen+4);
                                l_hWriteFile = MyCreateFile(l_szFileName,OPEN_ALWAYS);
                                if (l_hWriteFile == INVALID_HANDLE_VALUE)
                                {
                                        StringAdd(g_hPrintfEdit,"创新或打开文件失败!!\r\n");
                                        free(l_pBuff);
                                        return TRUE;
                                }
                                SetFilePointer(l_hWriteFile,0,0,FILE_END);
                                if (MyWriteFile(l_hWriteFile,l_pBuff,l_nStrLen))
                                        StringAdd(g_hPrintfEdit,"保存文件成功!!\r\n");
                                else
                                        StringAdd(g_hPrintfEdit,"保存文件失败!!\r\n");
                                CloseHandle(l_hWriteFile);
                                free(l_pBuff);
                                return TRUE;
                        }
                        break;
                case BTN_ABOUT:
                        DialogBox(g_hInstance,(char *)DLG_ABOUT,hDlg,(DLGPROC)AboutDlgProc);
                        break;
                case BTN_EXIT:
                        PostMessage(hDlg,WM_CLOSE,0,NULL);
                        break;
                }
                break;
        case WM_CLOSE:
                EndDialog(hDlg,FALSE);
                break;
        default:
                return FALSE;
        }
        return TRUE;
}

LRESULT CALLBACK EditsProc(HWND hEdit,UINT uMsg, WPARAM wParam, LPARAM lParam)
{
        int l_uNumFiles = 0;
        char l_szFilesName[CHAR_MAX];
        int i;
        switch(uMsg)
        {
        case WM_DROPFILES:
                l_uNumFiles = DragQueryFile((HDROP)wParam,-1,l_szFilesName,sizeof(l_szFilesName));
                for (i =0; i < l_uNumFiles; i++)
                {
                        DragQueryFile((HDROP)wParam,i,l_szFilesName,sizeof(l_szFilesName));
                        SetWindowText(hEdit,l_szFilesName);
                }
                DragFinish((HDROP)wParam);
                break;
        default:
                return CallWindowProc((WNDPROC)GetWindowLong(hEdit,GWL_USERDATA),hEdit,uMsg,wParam,lParam);
        }
        return TRUE;
}

LRESULT CALLBACK StaticProc(HWND hStatic, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
        switch(uMsg)
        {
        case WM_NCHITTEST:
                return (LRESULT)TRUE;
                break;
        case WM_SETCURSOR:
                SetCursor(g_hHandCur);
                break;
        case WM_LBUTTONUP:
                switch(GetDlgCtrlID(hStatic))
                {
                case STATIC_BBS_PEDIY:
                        ShellExecute(0,NULL,"http://bbs.pediy.com",NULL,NULL,0);
                        break;
                case STATIC_BBS_DEBUGMAN:
                        ShellExecute(0,NULL,"http://www.debugman.com",NULL,NULL,0);
                        break;
                }
                break;
        default:
                return CallWindowProc((WNDPROC)GetWindowLong(hStatic,GWL_USERDATA),hStatic,uMsg,wParam,lParam);
        }
        return TRUE;
}

BOOL StartWriteOverlay(IN char *lpszPatchFileName, IN char *lpszOverlayFileName)
{
        HANDLE l_hPatchFile, l_hOverlayFile,l_hPatchMap,l_hOverlayMap;
        void *l_lpPatchBuff, *l_lpOverlayBuff,*l_lpPeOverlayBuff;
        char l_szMsgBuff[CHAR_MAX];
        int l_uFileSize,l_uOverSize;
        BOOL l_bIsWrite = FALSE;
        if (IsFiles(g_hPrintfEdit,lpszPatchFileName) && IsFiles(g_hPrintfEdit,lpszOverlayFileName))
        {
                StringAdd(g_hPrintfEdit,"\r\n开始添加EXE尾部附加数据......\r\n");
                ZeroMemory(&l_szMsgBuff,sizeof(l_szMsgBuff));
                wsprintf(l_szMsgBuff,"正在打开%s文件......\r\n",lpszPatchFileName);
                StringAdd(g_hPrintfEdit,l_szMsgBuff);
                l_hPatchFile = MyCreateFile(lpszPatchFileName,OPEN_EXISTING);
                if (l_hPatchFile == INVALID_HANDLE_VALUE)
                {
                        ZeroMemory(&l_szMsgBuff,sizeof(l_szMsgBuff));
                        wsprintf(l_szMsgBuff,"错误!无法打开%s文件!!\r\n",lpszPatchFileName);
                        StringAdd(g_hPrintfEdit,l_szMsgBuff);
                        return FALSE;
                }
                ZeroMemory(&l_szMsgBuff,sizeof(l_szMsgBuff));
                wsprintf(l_szMsgBuff,"正在创建%s文件映像......\r\n",lpszPatchFileName);
                StringAdd(g_hPrintfEdit,l_szMsgBuff);
                l_uFileSize = GetFileSize(l_hPatchFile,NULL);
                l_hPatchMap = MyCreateMapFile(l_hPatchFile);
                if (l_hPatchMap)
                {
                        l_lpPatchBuff = MyMapViewOfFile(l_hPatchMap);
                        if (l_lpPatchBuff)
                        {
                                if (!IsPeFile(l_lpPatchBuff))
                                {
                                        ZeroMemory(&l_szMsgBuff,sizeof(l_szMsgBuff));
                                        wsprintf(l_szMsgBuff,"错误!%s文件必须是PE文件!!\r\n",lpszPatchFileName);
                                        StringAdd(g_hPrintfEdit,l_szMsgBuff);
                                        UnmapViewOfFile(l_lpPatchBuff);
                                        CloseHandle(l_hPatchMap);
                                        CloseHandle(l_hPatchFile);
                                        return FALSE;
                                }
                                if ((int)GetPeOverlay(l_lpPatchBuff) - (int)l_lpPatchBuff != l_uFileSize)
                                {
                                        StringAdd(g_hPrintfEdit,"该程序已有尾部附加数据,是否继续添加数据『Y/N』!!\r\n");
                                        if (MessageBox(0,"该程序已有尾部附加数据,是否继续添加数据","添加提示",MB_YESNO) != IDYES)
                                        {
                                                StringAdd(g_hPrintfEdit,"『N』用户中止\r\n");
                                                UnmapViewOfFile(l_lpPatchBuff);
                                                CloseHandle(l_hPatchMap);
                                                CloseHandle(l_hPatchFile);
                                                return FALSE;
                                        }
                                        StringAdd(g_hPrintfEdit,"『Y』用户继续...\r\n");
                                }
                                UnmapViewOfFile(l_lpPatchBuff);
                        }
                }else
                {
                        ZeroMemory(&l_szMsgBuff,sizeof(l_szMsgBuff));
                        wsprintf(l_szMsgBuff,"错误!无法创建%s文件映像!!\r\n",lpszPatchFileName);
                        StringAdd(g_hPrintfEdit,l_szMsgBuff);
                        CloseHandle(l_hPatchFile);
                        return FALSE;
                }
                CloseHandle(l_hPatchMap);
                ZeroMemory(&l_szMsgBuff,sizeof(l_szMsgBuff));
                wsprintf(l_szMsgBuff,"%s文件验效完成!!\r\n\r\n",lpszPatchFileName);
                StringAdd(g_hPrintfEdit,l_szMsgBuff);
                ZeroMemory(&l_szMsgBuff,sizeof(l_szMsgBuff));
                wsprintf(l_szMsgBuff,"正在打开%s文件......\r\n",lpszOverlayFileName);
                StringAdd(g_hPrintfEdit,l_szMsgBuff);
                l_hOverlayFile = MyCreateFile(lpszOverlayFileName,OPEN_EXISTING);
                if (l_hOverlayFile == INVALID_HANDLE_VALUE)
                {
                        ZeroMemory(&l_szMsgBuff,sizeof(l_szMsgBuff));
                        wsprintf(l_szMsgBuff,"错误!无法打开%s文件!!\r\n",lpszOverlayFileName);
                        StringAdd(g_hPrintfEdit,l_szMsgBuff);
                        CloseHandle(l_hPatchFile);
                        return FALSE;
                }
                ZeroMemory(&l_szMsgBuff,sizeof(l_szMsgBuff));
                wsprintf(l_szMsgBuff,"正在创建%s文件映像......\r\n",lpszOverlayFileName);
                StringAdd(g_hPrintfEdit,l_szMsgBuff);
                l_uFileSize = GetFileSize(l_hOverlayFile,NULL);
                if (!l_uFileSize)
                {
                        ZeroMemory(&l_szMsgBuff,sizeof(l_szMsgBuff));
                        wsprintf(l_szMsgBuff,"错误!%s文件大小不能为零!!\r\n",lpszOverlayFileName);
                        StringAdd(g_hPrintfEdit,l_szMsgBuff);
                        CloseHandle(l_hOverlayFile);
                        CloseHandle(l_hPatchFile);
                        return FALSE;
                }
                l_hOverlayMap = MyCreateMapFile(l_hOverlayFile);
                if (l_hOverlayMap)
                {
                        l_lpOverlayBuff = MyMapViewOfFile(l_hOverlayMap);
                        if (l_lpOverlayBuff)
                        {
                                if (IsPeFile(l_lpOverlayBuff))
                                {
                                        l_lpPeOverlayBuff = GetPeOverlay(l_lpOverlayBuff);
                                        if ((int)l_lpPeOverlayBuff - (int)l_lpOverlayBuff == l_uFileSize)
                                        {
                                                StringAdd(g_hPrintfEdit,"错误!该程序没有尾部附加数据,是否继续添加数据\r\n");
                                                StringAdd(g_hPrintfEdit,"如果继续添加,将会将整个exe文件添加进去。『Y/N』!!\r\n");
                                                if (MessageBox(0,"该程序没有尾部附加数据,是否继续添加数据\r\n如果继续添加,将会将整个exe文件添加进去。","添加提示",MB_YESNO) != IDYES)
                                                {
                                                        StringAdd(g_hPrintfEdit,"『N』用户中止\r\n");
                                                        UnmapViewOfFile(l_lpOverlayBuff);
                                                        CloseHandle(l_hOverlayMap);
                                                        CloseHandle(l_hOverlayFile);
                                                        CloseHandle(l_hPatchFile);
                                                        return FALSE;
                                                }else
                                                {
                                                        StringAdd(g_hPrintfEdit,"『Y』用户继续...\r\n");
                                                        l_lpPeOverlayBuff = l_lpOverlayBuff;
                                                        l_uOverSize = l_uFileSize;
                                                }
                                        }else
                                                l_uOverSize = l_uFileSize - ((int)l_lpPeOverlayBuff - (int)l_lpOverlayBuff);
                                }else
                                {
                                        l_lpPeOverlayBuff = l_lpOverlayBuff;
                                        l_uOverSize = l_uFileSize;
                                }
                        }
                }else
                {
                        ZeroMemory(&l_szMsgBuff,sizeof(l_szMsgBuff));
                        wsprintf(l_szMsgBuff,"错误!无法创建%s文件映像!!\r\n",lpszOverlayFileName);
                        StringAdd(g_hPrintfEdit,l_szMsgBuff);
                        CloseHandle(l_hOverlayFile);
                        CloseHandle(l_hPatchFile);
                        return FALSE;
                }
                ZeroMemory(&l_szMsgBuff,sizeof(l_szMsgBuff));
                wsprintf(l_szMsgBuff,"%s文件验效完成!!\r\n\r\n",lpszOverlayFileName);
                StringAdd(g_hPrintfEdit,l_szMsgBuff);
                StringAdd(g_hPrintfEdit,"正在写入尾部附加数据...\r\n");
                SetFilePointer(l_hPatchFile,0,0,FILE_END);
                if (MyWriteFile(l_hPatchFile,l_lpPeOverlayBuff,l_uOverSize))
                        l_bIsWrite = TRUE;
                UnmapViewOfFile(l_lpOverlayBuff);
                CloseHandle(l_hOverlayMap);
                CloseHandle(l_hOverlayFile);
                CloseHandle(l_hPatchFile);
        }
        return l_bIsWrite;
}

LPOPENFILENAME InitOpenFileName(IN HINSTANCE hInstance,
                                                                IN HWND hOwner,
                                                                OUT LPOPENFILENAME lpstOFN,
                                                                OUT char *lpszFileNameBuff,
                                                                IN int nFileNameBuffSize)
{
        if (lpstOFN)
        {
                ZeroMemory(lpstOFN,sizeof(OPENFILENAME));
                ZeroMemory(lpszFileNameBuff,nFileNameBuffSize);
                lpstOFN->lStructSize = sizeof(OPENFILENAME);
                lpstOFN->hInstance = hInstance;
                lpstOFN->hwndOwner = hOwner;
                lpstOFN->lpstrFile = lpszFileNameBuff;
                lpstOFN->nMaxFile = nFileNameBuffSize;
                lpstOFN->lpstrFilter = "all Files(*.*)\0*.*\0\0";
                lpstOFN->Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST;
        }
        return lpstOFN;
}

LRESULT CALLBACK AboutDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
        HWND l_hStatic;
        switch(uMsg)
        {
        case WM_INITDIALOG:
                l_hStatic = GetDlgItem(hDlg,STATIC_BBS_PEDIY);
                SetWindowLong(l_hStatic,GWL_USERDATA,GetWindowLong(l_hStatic,GWL_WNDPROC));
                SetWindowLong(l_hStatic,GWL_WNDPROC,(UINT)StaticProc);
                l_hStatic = GetDlgItem(hDlg,STATIC_BBS_DEBUGMAN);
                SetWindowLong(l_hStatic,GWL_USERDATA,GetWindowLong(l_hStatic,GWL_WNDPROC));
                SetWindowLong(l_hStatic,GWL_WNDPROC,(UINT)StaticProc);
                AnimateShow(hDlg);
                break;
        case WM_LBUTTONDOWN:
                SendMessage(hDlg,WM_CLOSE,0,0);
                break;
        case WM_CTLCOLORSTATIC:
                if ((GetDlgCtrlID((HWND)lParam) == STATIC_BBS_PEDIY) || (GetDlgCtrlID((HWND)lParam) == STATIC_BBS_DEBUGMAN))
                        return (LRESULT)DrawStatic((HDC)wParam,(HWND)lParam);
                return (LRESULT)FALSE;
        case WM_CLOSE:
                EndDialog(hDlg,FALSE);
                break;
        default:
                return (LRESULT)FALSE;
        }
        return TRUE;
}

int StringAdd(IN HWND hWnd,IN char *lpszBuff)
{
        int l_index;
        int l_nSelStart,l_uLineLen;
        if (hWnd && lpszBuff)
        {
                l_index = SendMessage(hWnd,EM_GETLINECOUNT,0,0);
                if (!(SendMessage(hWnd,EM_LINELENGTH,SendMessage(hWnd,EM_LINEINDEX,l_index-1,0),0)))
                        l_index--;
                if (l_index)
                {
                        l_nSelStart = SendMessage(hWnd,EM_LINEINDEX,l_index,0);
                        if (l_nSelStart == -1)
                        {
                                l_nSelStart = SendMessage(hWnd,EM_LINEINDEX,l_index-1,0);
                                if (l_nSelStart == -1)
                                        return 0;
                                l_uLineLen = SendMessage(hWnd,EM_LINELENGTH,l_nSelStart,0);
                                if (!l_uLineLen)
                                        return 0;
                                l_nSelStart += l_uLineLen;
                        }
                        SendMessage(hWnd,EM_SETSEL,l_nSelStart,l_nSelStart);
                        SendMessage(hWnd,EM_REPLACESEL,0,(UINT)lpszBuff);
                }else
                        SendMessage(hWnd,EM_REPLACESEL,0,(UINT)lpszBuff);
                return l_nSelStart;
        }
        return 0;
}

HBRUSH DrawStatic(IN HDC hDc, IN HWND hStatic)
{
        HFONT l_hFontOut;
        LOGFONT l_stFont;
        l_hFontOut = (HFONT)SendMessage(hStatic,WM_GETFONT,0,0);
        GetObject(l_hFontOut,sizeof(LOGFONT),&l_stFont);
        l_stFont.lfUnderline = FALSE;
        l_hFontOut = CreateFontIndirect(&l_stFont);
        SelectObject(hDc,l_hFontOut);
        SetTextColor(hDc,0xff0000);
        SetBkColor(hDc,GetSysColor(COLOR_BTNFACE));
        DeleteObject((HGDIOBJ)l_hFontOut);
        return (HBRUSH)GetStockObject(NULL_BRUSH);
}

BOOL IsPeFile(IN void *lpFileModule)
{
        PIMAGE_DOS_HEADER l_lpstDosHeader;
        PIMAGE_NT_HEADERS l_lpstNtHeaders;
        l_lpstDosHeader = (PIMAGE_DOS_HEADER)lpFileModule;
        if (l_lpstDosHeader->e_magic == IMAGE_DOS_SIGNATURE)
        {
                l_lpstNtHeaders = (PIMAGE_NT_HEADERS)((UINT)lpFileModule + l_lpstDosHeader->e_lfanew);
                if (l_lpstNtHeaders->Signature == IMAGE_NT_SIGNATURE)
                        return TRUE;
        }
        return FALSE;
}

HANDLE MyCreateFile(IN char *lpszFileName,UINT uOpenFlag)
{
        return CreateFile(lpszFileName,
                                          GENERIC_READ | GENERIC_WRITE,
                                          FILE_SHARE_READ,
                                          NULL,
                                          uOpenFlag,
                                          0,
                                          NULL);
}

HANDLE MyCreateMapFile(IN HANDLE hFile)
{
        return CreateFileMapping(hFile,NULL,PAGE_READWRITE,0,0,NULL);
}

ULONG MyReadFile(IN HANDLE hFile,OUT void *lpBuff,IN int nNumToRead)
{
        ULONG nNumOfRead = 0;
        if (ReadFile(hFile,lpBuff,nNumToRead,&nNumOfRead,NULL))
                return nNumOfRead;
        return 0;
}

ULONG MyWriteFile(IN HANDLE hFile,IN void *lpBuff,IN int nNumToWrite)
{
        ULONG nNumOfWrite;
        if (WriteFile(hFile,lpBuff,nNumToWrite,&nNumOfWrite,NULL))
                return nNumOfWrite;
        return 0;
}

void *MyMapViewOfFile(IN HANDLE hMap)
{
        return MapViewOfFile(hMap,FILE_MAP_READ | FILE_MAP_WRITE,0,0,0);
}

BOOL IsFiles(IN HWND hEdit,IN char *lpszFileName)
{
        HANDLE l_hFile;
        HANDLE l_hMap;
        void *l_lpFileBuff;  
        char l_szMsgBuff[CHAR_MAX];
        ZeroMemory(&l_szMsgBuff,sizeof(l_szMsgBuff));
        l_hFile = MyCreateFile(lpszFileName,OPEN_EXISTING);
        if (l_hFile == INVALID_HANDLE_VALUE)
        {
                wsprintf(l_szMsgBuff,"打开%s文件出错!!\r\n",lpszFileName);
                StringAdd(hEdit,l_szMsgBuff);
                return FALSE;
        }
        l_hMap = MyCreateMapFile(l_hFile);
        if (!l_hMap)
        {
                StringAdd(hEdit,"打开文件映射出错!!\r\n");
                CloseHandle(l_hFile);
                return FALSE;
        }
        l_lpFileBuff = MyMapViewOfFile(l_hMap);
        if (!l_lpFileBuff)
        {
                StringAdd(hEdit,"打开文件映射缓冲出错!!\r\n");
                CloseHandle(l_hMap);
                CloseHandle(l_hFile);
                return FALSE;
        }
        if (IsPeFile(l_lpFileBuff))
        {
                ZeroMemory(&l_szMsgBuff,sizeof(l_szMsgBuff));
                wsprintf(l_szMsgBuff,"%s是有效的PE文件!\r\n",lpszFileName);
                StringAdd(hEdit,l_szMsgBuff);
        }else
        {
                ZeroMemory(&l_szMsgBuff,sizeof(l_szMsgBuff));
                wsprintf(l_szMsgBuff,"%s不是一个PE文件!\r\n",lpszFileName);
                StringAdd(hEdit,l_szMsgBuff);
        }
        UnmapViewOfFile(l_lpFileBuff);
        CloseHandle(l_hMap);
        CloseHandle(l_hFile);
        return TRUE;
}

void AnimateShow(IN HWND hWnd)
{
        RECT l_stRC;
        HRGN l_hRgn;
        int i,x,y;
        ShowWindow(hWnd,SW_HIDE);
        GetWindowRect(hWnd,&l_stRC);
        x = (l_stRC.right - l_stRC.left) / 2;
        y = (l_stRC.bottom - l_stRC.top) / 2;
        for (i = 0; i < l_stRC.right / 2; i++)
        {
                l_hRgn = CreateRectRgn(x-i,y-i,x+i,y+i);
                SetWindowRgn(hWnd,l_hRgn,TRUE);
                ShowWindow(hWnd,SW_SHOW);
                DeleteObject(l_hRgn);
        }
}

void *GetPeOverlay(IN void *lpPeBuff)
{
        PIMAGE_DOS_HEADER l_lpstDosHeader;
        PIMAGE_NT_HEADERS l_lpstNtHeaders;
        PIMAGE_SECTION_HEADER l_lpstSecHeader;
        int l_uSecSize;

        l_lpstDosHeader = (PIMAGE_DOS_HEADER)lpPeBuff;
        l_lpstNtHeaders = (PIMAGE_NT_HEADERS)((UINT)lpPeBuff + l_lpstDosHeader->e_lfanew);
        l_lpstSecHeader = (PIMAGE_SECTION_HEADER)((UINT)l_lpstNtHeaders + sizeof(IMAGE_NT_HEADERS));
        l_uSecSize = l_lpstNtHeaders->FileHeader.NumberOfSections;
        l_lpstSecHeader = (PIMAGE_SECTION_HEADER)((UINT)l_lpstSecHeader + (sizeof(IMAGE_SECTION_HEADER) * (l_uSecSize-1)));
        return (void *)((UINT)lpPeBuff + (l_lpstSecHeader->PointerToRawData + l_lpstSecHeader->SizeOfRawData));
}

/*************************************************************************************
*************************************************************************************
*************************************************************************************/


/* WriteOverlay.h File */

#ifndef _WRITE_OVERLAY_

#define _WRITE_OVERLAY_

#include <windows.h>
#include <winnt.h>

#include "resource.h"

#define CHAR_MAX 0xff

LRESULT CALLBACK MainDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK EditsProc(HWND hEdit,UINT uMsg, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK AboutDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK StaticProc(HWND hStatic, UINT uMsg, WPARAM wParam, LPARAM lParam);

LPOPENFILENAME InitOpenFileName(IN HINSTANCE hInstance,
                                                                IN HWND hOwer,
                                                                OUT LPOPENFILENAME lpstOFN,
                                                                OUT char *lpszFileNameBuff,
                                                                IN int nFileNameBuffSize);

BOOL StartWriteOverlay(IN char *lpszPatchFileName,
                                           IN char *lpszOverlayFileName);
int StringAdd(IN HWND hWnd,IN char *lpszBuff);
HBRUSH DrawStatic(IN HDC hDc, IN HWND hStatic);
HANDLE MyCreateFile(IN char *lpszFileName,UINT uOpenFlag);
HANDLE MyCreateMapFile(IN HANDLE hFile);
ULONG MyReadFile(IN HANDLE hFile,OUT void *lpBuff,IN int nNumToRead);
ULONG MyWriteFile(IN HANDLE hFile,IN void *lpBuff,IN int nNumToWrite);
void *MyMapViewOfFile(IN HANDLE hMap);
BOOL IsPeFile(IN void *lpFileModule);
BOOL IsFiles(IN HWND hEdit,IN char *lpszFileName);
void AnimateShow(IN HWND hWnd);
void *GetPeOverlay(IN void *lpPeBuff);

HINSTANCE g_hInstance;
LPSTR g_lpszCmdLine;
HCURSOR g_hHandCur;
HWND g_hDlgMain;
HWND g_hPrintfEdit;
BOOL g_IsStartWrite;
HICON g_hMainIcon;

char *lpszCopyRight =
"                  〖软件说明〗\r\n\
              添加EXE尾部附加数据 No 1.0 \r\n\
            『由zhanshen[DFCG][RCT]编写』\r\n\
  本软件为开源免费软件,任何人均可从网上等地方获取到本\r\n\
软件的副本及其源码。本软件作者只为测试,任何人均不得用于\r\n\
非法之处,否则由此引起的问题一概自负。\r\n";

#endif
本代码的着色效果由xTiNt自动完成
下载xTiNt http://211.90.75.84/web/kanaun/download/xTiNt.rar

[2023春季班]《安卓高级研修班(网课)》月薪两万班招生中~

上传的附件:
收藏
点赞0
打赏
分享
最新回复 (12)
雪    币: 350
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
fangdalei 活跃值 2010-7-21 19:10
2
0
沙发~学习
雪    币: 327
活跃值: 活跃值 (313)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
renminbi 活跃值 2010-7-21 21:47
3
0
学习一下技术
雪    币: 34
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lsay 活跃值 2010-7-21 22:38
4
0
收下了,谢谢.
雪    币: 89
活跃值: 活跃值 (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
worms 活跃值 2010-7-22 20:50
5
0
学习。。。楼主强大了
雪    币: 1481
活跃值: 活跃值 (161)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
cntrump 活跃值 13 2010-7-22 21:15
6
0
直接用命令行下的copy不也一样么?
用批处理还可以处理多个文件。
雪    币: 215
活跃值: 活跃值 (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lvb 活跃值 2010-9-30 10:25
7
0
收下,学习!!!!!!!!!!
雪    币: 13
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Greater 活跃值 2010-9-30 10:35
8
0
peid 的插件有这个功能
楼主开源的啊
很好很强大
雪    币: 1259
活跃值: 活跃值 (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
stu 活跃值 2010-9-30 21:31
9
0
本代码的着色效果由xTiNt自动完成
下载xTiNt http://211.90.75.84/web/kanaun/download/xTiNt.rar
雪    币: 564
活跃值: 活跃值 (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lixupeng 活跃值 2010-10-1 10:59
10
0
学习了!!
雪    币: 206
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ZUNAMI 活跃值 2010-10-1 12:05
11
0
http://211.90.75.84/web/kanaun/download/xTiNt.rar - LINK DEATCH, pls UPLOAD
雪    币: 5822
活跃值: 活跃值 (876)
能力值: ( LV13,RANK:283 )
在线值:
发帖
回帖
粉丝
littlewisp 活跃值 2 2010-10-1 12:23
12
0
多谢分享!!!!
雪    币: 284
活跃值: 活跃值 (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jerrynpc 活跃值 2010-10-2 01:20
13
0
小虾欺负人
游客
登录 | 注册 方可回帖
返回