/*************************************************************************************
〖软件说明〗
添加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
- 标 题:Exe程序尾部附加数据添加程序(含源码)
- 作 者:小虾
- 时 间:2010-07-21 19:06:44
- 链 接:http://bbs.pediy.com/showthread.php?t=117209