/*************************************************************************************
〖软件说明〗
添加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
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
上传的附件: