PeClean.c
上传用户:kuaidait
上传日期:2013-03-31
资源大小:4k
文件大小:8k
源码类别:

文件操作

开发平台:

C/C++

  1. #include "PeClean.h"
  2. DWORD IsPE(HANDLE hFile)
  3. {
  4. char ReadBuffer[4];
  5. DWORD dwRead;
  6. DWORD dwOffset;
  7. DWORD dwSizeOfHeader;
  8. memset(ReadBuffer, 0, 4);
  9. SetFilePointer(hFile, 0, NULL, FILE_BEGIN);
  10. ReadFile(hFile, ReadBuffer, 4, &dwRead, NULL);
  11. if (ReadBuffer[0]!='M' || ReadBuffer[1]!='Z')
  12. {
  13. return 0;
  14. }
  15. memset(ReadBuffer, 0, 4);
  16. SetFilePointer(hFile, 0x3C, NULL, FILE_BEGIN);
  17. ReadFile(hFile, &dwOffset,  4, &dwRead, NULL);
  18. SetFilePointer(hFile, dwOffset, NULL, FILE_BEGIN);
  19. ReadFile(hFile, ReadBuffer, 4, &dwRead, NULL);
  20. if (ReadBuffer[0]!='P' || ReadBuffer[1]!='E')
  21. {
  22. return 0;
  23. }
  24.     SetFilePointer(hFile, dwOffset+0x54, NULL,  FILE_BEGIN);
  25. ReadFile(hFile, &dwSizeOfHeader, 4, &dwRead, NULL); 
  26. return dwSizeOfHeader;
  27. }
  28. BYTE* ReadHeader(HANDLE hFile, DWORD dwSizeOfHeader)
  29. {
  30. BYTE* hMapOfHeader;
  31. DWORD dwRead;
  32. hMapOfHeader = VirtualAlloc(NULL, dwSizeOfHeader, MEM_COMMIT, PAGE_READWRITE);
  33. if (NULL == hMapOfHeader)
  34. {
  35. return NULL;
  36. }
  37. SetFilePointer(hFile, 0, NULL, FILE_BEGIN);
  38. ReadFile(hFile, hMapOfHeader, dwSizeOfHeader, &dwRead, NULL);
  39. if (dwRead != dwSizeOfHeader)
  40. {
  41. VirtualFree(hMapOfHeader, 0, MEM_RELEASE);
  42. return NULL;
  43. }
  44. return hMapOfHeader;
  45. }
  46. void WriteHeader(HANDLE hFile, BYTE* hMapOfHeader, DWORD dwSizeOfHeader)
  47. {
  48. DWORD dwWritten;
  49. SetFilePointer(hFile, 0, NULL, FILE_BEGIN);
  50. WriteFile(hFile, hMapOfHeader, dwSizeOfHeader, &dwWritten, NULL);
  51. return ;
  52. }
  53. void BackupFile(char* szFileName)
  54. {
  55. BOOL bBackupFile;
  56. char szBackupName[MAX_PATH];
  57. bBackupFile = SendMessage(GetDlgItem(hWnd, IDC_CHECK_BAKFILE), BM_GETCHECK, 0, 0);
  58. if (bBackupFile)
  59. {
  60. strcpy(szBackupName, szFileName);
  61. strcat(szBackupName, ".bak");
  62. CopyFile(szFileName, szBackupName, FALSE);
  63. }
  64. return ;
  65. }
  66. void CleanDosHeader(BYTE* hMapOfHeader)
  67. {
  68. BOOL bMZ;
  69. BYTE* i;
  70. bMZ = SendMessage(GetDlgItem(hWnd, IDC_CHECK_MZ), BM_GETCHECK, 0, 0) ^ 1;
  71. for (i=hMapOfHeader+2; i<(BYTE *)peHeader; i++)
  72. {
  73. (*i) *= bMZ;
  74. }
  75. *(LPWORD)(hMapOfHeader+0x3C) = (WORD)((BYTE *)peHeader-hMapOfHeader);
  76. return ;
  77. }
  78. void CleanFileHeader(BYTE* hMapOfHeader)
  79. {
  80. peHeader->FileHeader.TimeDateStamp        *= 
  81. SendMessage(GetDlgItem(hWnd, IDC_CHECK_FILE1), BM_GETCHECK, 0, 0) ^ 1 ;
  82. peHeader->FileHeader.PointerToSymbolTable *= 
  83. SendMessage(GetDlgItem(hWnd, IDC_CHECK_FILE2), BM_GETCHECK, 0, 0) ^ 1 ;
  84. peHeader->FileHeader.NumberOfSymbols      *= 
  85. SendMessage(GetDlgItem(hWnd, IDC_CHECK_FILE3), BM_GETCHECK, 0, 0) ^ 1 ;
  86. return ;
  87. }
  88. void CleanOptionalHeader(BYTE* hMapOfHeader)
  89. {
  90. peHeader->OptionalHeader.MajorLinkerVersion          *=
  91. SendMessage(GetDlgItem(hWnd, IDC_CHECK_OPTIONAL1), BM_GETCHECK, 0, 0) ^ 1 ;
  92. peHeader->OptionalHeader.MinorLinkerVersion          *=
  93. SendMessage(GetDlgItem(hWnd, IDC_CHECK_OPTIONAL1), BM_GETCHECK, 0, 0) ^ 1 ;
  94. peHeader->OptionalHeader.MajorOperatingSystemVersion *=
  95. SendMessage(GetDlgItem(hWnd, IDC_CHECK_OPTIONAL2), BM_GETCHECK, 0, 0) ^ 1 ;
  96.     peHeader->OptionalHeader.MinorOperatingSystemVersion *=
  97. SendMessage(GetDlgItem(hWnd, IDC_CHECK_OPTIONAL2), BM_GETCHECK, 0, 0) ^ 1 ;
  98. peHeader->OptionalHeader.SizeOfCode              *=
  99. SendMessage(GetDlgItem(hWnd, IDC_CHECK_OPTIONAL3), BM_GETCHECK, 0, 0) ^ 1 ;
  100. peHeader->OptionalHeader.SizeOfInitializedData   *=
  101. SendMessage(GetDlgItem(hWnd, IDC_CHECK_OPTIONAL4), BM_GETCHECK, 0, 0) ^ 1 ;
  102. peHeader->OptionalHeader.SizeOfUninitializedData *=
  103. SendMessage(GetDlgItem(hWnd, IDC_CHECK_OPTIONAL4), BM_GETCHECK, 0, 0) ^ 1 ;
  104. peHeader->OptionalHeader.BaseOfCode   *=
  105. SendMessage(GetDlgItem(hWnd, IDC_CHECK_OPTIONAL5), BM_GETCHECK, 0, 0) ^ 1 ;
  106. peHeader->OptionalHeader.BaseOfData   *=
  107. SendMessage(GetDlgItem(hWnd, IDC_CHECK_OPTIONAL6), BM_GETCHECK, 0, 0) ^ 1 ;
  108.     peHeader->OptionalHeader.MajorImageVersion   *=
  109. SendMessage(GetDlgItem(hWnd, IDC_CHECK_OPTIONAL7), BM_GETCHECK, 0, 0) ^ 1 ;
  110.     peHeader->OptionalHeader.MinorImageVersion   *=
  111.   SendMessage(GetDlgItem(hWnd, IDC_CHECK_OPTIONAL7), BM_GETCHECK, 0, 0) ^ 1 ;
  112. peHeader->OptionalHeader.Win32VersionValue   *=
  113. SendMessage(GetDlgItem(hWnd, IDC_CHECK_OPTIONAL8), BM_GETCHECK, 0, 0) ^ 1 ;
  114. peHeader->OptionalHeader.CheckSum    *=
  115. SendMessage(GetDlgItem(hWnd, IDC_CHECK_OPTIONAL9), BM_GETCHECK, 0, 0) ^ 1 ;
  116. peHeader->OptionalHeader.LoaderFlags *=
  117. SendMessage(GetDlgItem(hWnd, IDC_CHECK_OPTIONAL10), BM_GETCHECK, 0, 0) ^ 1 ;
  118. peHeader->OptionalHeader.DllCharacteristics *=
  119. SendMessage(GetDlgItem(hWnd, IDC_CHECK_OPTIONAL11), BM_GETCHECK, 0, 0) ^ 1 ;
  120. return ;
  121. }
  122. void CleanFile(char* szFileName)
  123. {
  124. HANDLE hFile;
  125. DWORD dwSizeOfHeader;
  126. BYTE* hMapOfHeader;
  127. hFile = CreateFile(szFileName, 
  128.    GENERIC_READ+GENERIC_WRITE, 
  129.    FILE_SHARE_READ+FILE_SHARE_WRITE,
  130.    0, 
  131.    OPEN_EXISTING, 
  132.    FILE_ATTRIBUTE_NORMAL,NULL);
  133. if (hFile == INVALID_HANDLE_VALUE)
  134. {
  135. MessageBox(hWnd, "Cannot Open the File", "Error", 0);
  136. return ;
  137. }
  138. dwSizeOfHeader = IsPE(hFile);
  139. if (dwSizeOfHeader == 0)
  140. {
  141. CloseHandle(hFile);
  142. MessageBox(hWnd, "Invalid PE File", "Error", 0);
  143. return ;
  144. }
  145. hMapOfHeader = ReadHeader(hFile, dwSizeOfHeader);
  146. if (NULL == hMapOfHeader)
  147. {
  148. CloseHandle(hFile);
  149. MessageBox(hWnd, "Cannot Read PeHeader", "Error", 0);
  150. return ;
  151. }
  152. peHeader = (IMAGE_NT_HEADERS32 *)(hMapOfHeader + *(LPWORD)(hMapOfHeader+0x3C));
  153. BackupFile(szFileName);
  154. CleanDosHeader(hMapOfHeader);
  155. CleanFileHeader(hMapOfHeader);
  156. CleanOptionalHeader(hMapOfHeader);
  157. *(LPWORD)(hMapOfHeader+0x3C) = (WORD)((BYTE *)peHeader-hMapOfHeader);
  158. WriteHeader(hFile, hMapOfHeader, dwSizeOfHeader);
  159. VirtualFree(hMapOfHeader, 0, MEM_RELEASE);
  160. CloseHandle(hFile);
  161. MessageBox(hWnd, "Done!", "ok", 0);
  162. return ;
  163. }
  164. void SetCheck(BOOL bFlag)
  165. {
  166. SendMessage(GetDlgItem(hWnd, IDC_CHECK_BAKFILE)    , BM_SETCHECK, bFlag, 0);
  167. SendMessage(GetDlgItem(hWnd, IDC_CHECK_MZ)         , BM_SETCHECK, bFlag, 0);
  168. SendMessage(GetDlgItem(hWnd, IDC_CHECK_FILE1)      , BM_SETCHECK, bFlag, 0);
  169. SendMessage(GetDlgItem(hWnd, IDC_CHECK_FILE2)      , BM_SETCHECK, bFlag, 0);
  170. SendMessage(GetDlgItem(hWnd, IDC_CHECK_FILE3)      , BM_SETCHECK, bFlag, 0);
  171. SendMessage(GetDlgItem(hWnd, IDC_CHECK_OPTIONAL1)  , BM_SETCHECK, bFlag, 0);
  172. SendMessage(GetDlgItem(hWnd, IDC_CHECK_OPTIONAL2)  , BM_SETCHECK, bFlag, 0);
  173. SendMessage(GetDlgItem(hWnd, IDC_CHECK_OPTIONAL3)  , BM_SETCHECK, bFlag, 0);
  174. SendMessage(GetDlgItem(hWnd, IDC_CHECK_OPTIONAL4)  , BM_SETCHECK, bFlag, 0);
  175. SendMessage(GetDlgItem(hWnd, IDC_CHECK_OPTIONAL5)  , BM_SETCHECK, bFlag, 0);
  176. SendMessage(GetDlgItem(hWnd, IDC_CHECK_OPTIONAL6)  , BM_SETCHECK, bFlag, 0);
  177. SendMessage(GetDlgItem(hWnd, IDC_CHECK_OPTIONAL7)  , BM_SETCHECK, bFlag, 0);
  178. SendMessage(GetDlgItem(hWnd, IDC_CHECK_OPTIONAL8)  , BM_SETCHECK, bFlag, 0);
  179. SendMessage(GetDlgItem(hWnd, IDC_CHECK_OPTIONAL9)  , BM_SETCHECK, bFlag, 0);
  180. SendMessage(GetDlgItem(hWnd, IDC_CHECK_OPTIONAL10) , BM_SETCHECK, bFlag, 0);
  181. SendMessage(GetDlgItem(hWnd, IDC_CHECK_OPTIONAL11) , BM_SETCHECK, bFlag, 0);
  182. SendMessage(GetDlgItem(hWnd, IDC_CHECK_ALL)  , BM_SETCHECK, bFlag,   0);
  183. SendMessage(GetDlgItem(hWnd, IDC_CHECK_NONE) , BM_SETCHECK, bFlag^1, 0);
  184. }
  185. int CALLBACK DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
  186. {
  187. switch (uMsg)
  188. {
  189. case WM_CLOSE:
  190. PostQuitMessage(0);
  191. break;
  192. case WM_INITDIALOG:
  193. hWnd = hDlg;
  194. hIcon = LoadIcon(hInst, MAKEINTRESOURCE(IDI_ICON1));
  195. SendMessage(hWnd, WM_SETICON, (WPARAM)TRUE, (LPARAM)hIcon);
  196. SetCheck(TRUE);
  197. break;
  198. case WM_DROPFILES:
  199. if (DragQueryFile((HDROP)wParam, 0, szFileName, MAX_PATH))
  200. {
  201. CleanFile(szFileName);
  202. }
  203. break;
  204. case WM_COMMAND:
  205. if (lParam == GetDlgItem(hWnd, IDC_CHECK_ALL))
  206. {
  207. SetCheck(1);
  208. }
  209. else if (lParam == GetDlgItem(hWnd, IDC_CHECK_NONE))
  210. {
  211. SetCheck(0);
  212. }
  213. break;
  214. default:
  215. break;
  216. }
  217. return 0;
  218. }
  219. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
  220. {
  221. InitCommonControls();
  222. hInst = hInstance;
  223. DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG_PECLEAN), NULL, (DLGPROC)DlgProc);
  224. return 0;
  225. }