SkiиArtDlg.cpp
上传用户:tjjuxin
上传日期:2021-06-01
资源大小:3552k
文件大小:36k
源码类别:

Shell编程

开发平台:

Visual C++

  1. // SkiиArtDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "SkiиArt.h"
  5. #include "SkiиArtDlg.h"
  6. #include "SkinPPWTL.h"
  7. #include "DlgSections.h"
  8. #include "DlgStruct.h"
  9. #ifdef _DEBUG
  10. #define new DEBUG_NEW
  11. #undef THIS_FILE
  12. static char THIS_FILE[] = __FILE__;
  13. #endif
  14. #define ADD_SECTION_SIZE 0x1000
  15. BYTE *g_pPEBuffer = NULL;
  16. BYTE *g_pShellCodeStart = NULL;
  17. BYTE *g_pShellCodeEnd = NULL;
  18. DWORD g_dwSectionBase = 0;
  19. BOOL g_bShellCode = TRUE;
  20. void ShellCode();
  21. typedef struct _SKIN_ART
  22. {
  23. _SKIN_ART()
  24. {
  25. memset(&dwSign, 0, sizeof(_SKIN_ART));
  26. //  dwSign = 0x7e69ac4e;
  27. }
  28. DWORD dwSign;
  29. DWORD dwDllFileSize;
  30. DWORD dwSkinFileSize;
  31. char szDllName[50];
  32. char szSkinName[50];
  33. }SKIN_ART, * PSKIN_ART;
  34. /////////////////////////////////////////////////////////////////////////////
  35. // CSkiArtDlg dialog
  36. CSkiArtDlg::CSkiArtDlg(CWnd* pParent /*=NULL*/)
  37. : CDialog(CSkiArtDlg::IDD, pParent)
  38. {
  39. //{{AFX_DATA_INIT(CSkiArtDlg)
  40. // NOTE: the ClassWizard will add member initialization here
  41. //}}AFX_DATA_INIT
  42. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  43. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  44. }
  45. CSkiArtDlg::~CSkiArtDlg()
  46. {
  47. if (g_pPEBuffer)
  48. {
  49. delete [] g_pPEBuffer;
  50. g_pPEBuffer = NULL;
  51. }
  52. }
  53. void CSkiArtDlg::DoDataExchange(CDataExchange* pDX)
  54. {
  55. CDialog::DoDataExchange(pDX);
  56. //{{AFX_DATA_MAP(CSkiArtDlg)
  57. DDX_Control(pDX, IDC_LIST_SKIN, m_SkinList);
  58. //}}AFX_DATA_MAP
  59. }
  60. BEGIN_MESSAGE_MAP(CSkiArtDlg, CDialog)
  61. //{{AFX_MSG_MAP(CSkiArtDlg)
  62. ON_WM_SYSCOMMAND()
  63. ON_WM_PAINT()
  64. ON_WM_QUERYDRAGICON()
  65. ON_BN_CLICKED(IDC_CHECK_TOP, OnCheckTop)
  66. ON_BN_CLICKED(IDC_BTN_ABOUT, OnBtnAbout)
  67. ON_BN_CLICKED(IDC_BTN_EXIT, OnBtnExit)
  68. ON_BN_CLICKED(IDC_BTN_SELECT, OnBtnSelect)
  69. ON_WM_DROPFILES()
  70. ON_BN_CLICKED(IDC_BTN_ADDSKIN, OnBtnAddskin)
  71. ON_BN_CLICKED(IDC_BTN_SECTIONS, OnBtnSections)
  72. ON_BN_CLICKED(IDC_BTN_LOOK, OnBtnLook)
  73. ON_LBN_SELCHANGE(IDC_LIST_SKIN, OnSelchangeListSkin)
  74. //}}AFX_MSG_MAP
  75. END_MESSAGE_MAP()
  76. void CSkiArtDlg::OnBtnLook() 
  77. {
  78. if (!g_pPEBuffer)
  79. {
  80. return ;
  81. }
  82. char *szbigbuff = new char[50*100];
  83. if (szbigbuff == NULL)
  84. {
  85. ::MessageBox(m_hWnd, "申请内存失败", "错误", NULL);
  86. return ;
  87. }
  88. PIMAGE_DOS_HEADER   pDosHead=NULL;
  89. PIMAGE_NT_HEADERS   pNtHead=NULL;
  90. pDosHead=(PIMAGE_DOS_HEADER)g_pPEBuffer;
  91. pNtHead=(PIMAGE_NT_HEADERS)((unsigned char *)pDosHead+pDosHead->e_lfanew);
  92. memset(szbigbuff, 0, 50*100);
  93. char szTemp100[100] = {0};
  94. //1. Dos Header
  95. sprintf(szTemp100, "->IMAGE_DOS_HEADER 结构体:rn");
  96. strcpy(szbigbuff, szTemp100);
  97. sprintf(szTemp100, "    e_magic:        0x%.4X  //Dos 头标志,为0x5A4D,ASCII码值"MZ".rn", pDosHead->e_magic);
  98. strcat(szbigbuff, szTemp100);
  99. sprintf(szTemp100, "    e_cblp:         0x%.4X  //Bytes on last page of file.rn", pDosHead->e_cblp);
  100. strcat(szbigbuff, szTemp100);
  101. sprintf(szTemp100, "    e_cp:           0x%.4X  //Pages in file.rn", pDosHead->e_cp);
  102. strcat(szbigbuff, szTemp100);
  103. sprintf(szTemp100, "    e_crlc:         0x%.4X  //Relocations.rn", pDosHead->e_crlc);
  104. strcat(szbigbuff, szTemp100);
  105. sprintf(szTemp100, "    e_cparhdr:      0x%.4X  //Size of header in paragraphs.rn", pDosHead->e_cparhdr);
  106. strcat(szbigbuff, szTemp100);
  107. sprintf(szTemp100, "    e_minalloc:     0x%.4X  //Minimum extra paragraphs needed.rn", pDosHead->e_minalloc);
  108. strcat(szbigbuff, szTemp100);
  109. sprintf(szTemp100, "    e_maxalloc:     0x%.4X  //Maximum extra paragraphs needed.rn", pDosHead->e_maxalloc);
  110. strcat(szbigbuff, szTemp100);
  111. sprintf(szTemp100, "    e_ss:           0x%.4X  //Initial (relative) SS value.rn", pDosHead->e_ss);
  112. strcat(szbigbuff, szTemp100);
  113. sprintf(szTemp100, "    e_csum:         0x%.4X  //Checksum.rn", pDosHead->e_csum);
  114. strcat(szbigbuff, szTemp100);
  115. sprintf(szTemp100, "    e_ip:           0x%.4X  //Initial IP value.rn", pDosHead->e_ip);
  116. strcat(szbigbuff, szTemp100);
  117. sprintf(szTemp100, "    e_cs:           0x%.4X  //Initial (relative) CS value.rn", pDosHead->e_cs);
  118. strcat(szbigbuff, szTemp100);
  119. sprintf(szTemp100, "    e_lfarlc:       0x%.4X  //File address of relocation table.rn", pDosHead->e_lfarlc);
  120. strcat(szbigbuff, szTemp100);
  121. sprintf(szTemp100, "    e_ovno:         0x%.4X  //Overlay number.rn", pDosHead->e_ovno);
  122. strcat(szbigbuff, szTemp100);
  123. sprintf(szTemp100, "    e_res[4]:       0x%.2X%.2X%.2X%.2X  //File address of relocation table.rn", pDosHead->e_res[0], pDosHead->e_res[1], pDosHead->e_res[2], pDosHead->e_res[3]);
  124. strcat(szbigbuff, szTemp100);
  125. sprintf(szTemp100, "    e_oemid:        0x%.4X  //File address of relocation table.rn", pDosHead->e_oemid);
  126. strcat(szbigbuff, szTemp100);
  127. sprintf(szTemp100, "    e_oeminfo:      0x%.4X  //File address of relocation table.rn", pDosHead->e_oeminfo);
  128. strcat(szbigbuff, szTemp100);
  129. sprintf(szTemp100, "    e_res2[10]:     0x%.2X%.2X%.2X%.2X%.2X%.2X%.2X%.2X%.2X%.2X  //File address of relocation table.rn", pDosHead->e_res2[0], pDosHead->e_res2[1], pDosHead->e_res2[2], pDosHead->e_res2[3], pDosHead->e_res2[4], pDosHead->e_res2[5], pDosHead->e_res2[6], pDosHead->e_res2[7], pDosHead->e_res2[8], pDosHead->e_res2[9]);
  130. strcat(szbigbuff, szTemp100);
  131. sprintf(szTemp100, "    e_lfanew:       0x%.8X  //File address of new exe header.rn", pDosHead->e_lfanew);
  132. strcat(szbigbuff, szTemp100);
  133. //2. Image NT Headers
  134. sprintf(szTemp100, "rn->IMAGE_NT_HEADERS 结构体:rn");
  135. strcat(szbigbuff, szTemp100);
  136. sprintf(szTemp100, "   Signature:      0x%.8X  //此字段设置为0x00004550, ASCII码值"PE00".rn", pNtHead->Signature);
  137. strcat(szbigbuff, szTemp100);
  138. sprintf(szTemp100, "   一个IMAGE_FILE_HEADER结构体,在下面介绍.rn");
  139. strcat(szbigbuff, szTemp100);
  140. sprintf(szTemp100, "   一个IMAGE_OPTIONAL_HEADER结构体,下面介绍.rn");
  141. strcat(szbigbuff, szTemp100);
  142. //3. Image File Header
  143. sprintf(szTemp100, "rn->IMAGE_FILE_HEADER 结构体:rn");
  144. strcat(szbigbuff, szTemp100);
  145. sprintf(szTemp100, "    Machine:                0x%.4X  //(I386)rn", pNtHead->FileHeader.Machine);
  146. strcat(szbigbuff, szTemp100);
  147. sprintf(szTemp100, "    NumberOfSections:       0x%.4X  //区块的数量.rn", pNtHead->FileHeader.NumberOfSections);
  148. strcat(szbigbuff, szTemp100);
  149. sprintf(szTemp100, "    TimeDateStamp:          0x%.8X  //文件时间信息.rn", pNtHead->FileHeader.TimeDateStamp);
  150. strcat(szbigbuff, szTemp100);
  151. sprintf(szTemp100, "    PointerToSymbolTable:   0x%.8X  //调试信息.rn", pNtHead->FileHeader.PointerToSymbolTable);
  152. strcat(szbigbuff, szTemp100);
  153. sprintf(szTemp100, "    NumberOfSymbols:        0x%.8X  //调试信息.rn", pNtHead->FileHeader.NumberOfSymbols);
  154. strcat(szbigbuff, szTemp100);
  155. sprintf(szTemp100, "    SizeOfOptionalHeader:   0x%.4X  //结构体IMAGE_OPTIONAL_HEADER 的大小.rn", pNtHead->FileHeader.SizeOfOptionalHeader);
  156. strcat(szbigbuff, szTemp100);
  157. sprintf(szTemp100, "    Characteristics:        0x%.4X  //特征值.rn", pNtHead->FileHeader.Characteristics);
  158. strcat(szbigbuff, szTemp100);
  159. //4. Image Optional Header
  160. sprintf(szTemp100, "rn->IMAGE_OPTIONAL_HEADER 结构体:rn");
  161. strcat(szbigbuff, szTemp100);
  162. sprintf(szTemp100, "    Magic:                       0x%.4X  //标识字.rn", pNtHead->OptionalHeader.Magic);
  163. strcat(szbigbuff, szTemp100);
  164. sprintf(szTemp100, "    MajorLinkerVersion:          0x%.2X  //rn", pNtHead->OptionalHeader.MajorLinkerVersion);
  165. strcat(szbigbuff, szTemp100);
  166. sprintf(szTemp100, "    MinorLinkerVersion:          0x%.2X  //rn", pNtHead->OptionalHeader.MinorLinkerVersion);
  167. strcat(szbigbuff, szTemp100);
  168. sprintf(szTemp100, "    SizeOfCode:                  0x%.8X  //rn", pNtHead->OptionalHeader.SizeOfCode);
  169. strcat(szbigbuff, szTemp100);
  170. sprintf(szTemp100, "    SizeOfInitializedData:       0x%.8X  //rn", pNtHead->OptionalHeader.SizeOfInitializedData);
  171. strcat(szbigbuff, szTemp100);
  172. sprintf(szTemp100, "    SizeOfUninitializedData:     0x%.8X  //rn", pNtHead->OptionalHeader.SizeOfUninitializedData);
  173. strcat(szbigbuff, szTemp100);
  174. sprintf(szTemp100, "    AddressOfEntryPoint:         0x%.8X  //rn", pNtHead->OptionalHeader.AddressOfEntryPoint);
  175. strcat(szbigbuff, szTemp100);
  176. sprintf(szTemp100, "    BaseOfCode:                  0x%.8X  //rn", pNtHead->OptionalHeader.BaseOfCode);
  177. strcat(szbigbuff, szTemp100);
  178. sprintf(szTemp100, "    BaseOfData:                  0x%.8X  //rn", pNtHead->OptionalHeader.BaseOfData);
  179. strcat(szbigbuff, szTemp100);
  180. sprintf(szTemp100, "    ImageBase:                   0x%.4X  //rn", pNtHead->OptionalHeader.ImageBase);
  181. strcat(szbigbuff, szTemp100);
  182. sprintf(szTemp100, "    SectionAlignment:            0x%.4X  //段对齐rn", pNtHead->OptionalHeader.SectionAlignment);
  183. strcat(szbigbuff, szTemp100);
  184. sprintf(szTemp100, "    FileAlignment:               0x%.4X  //文件对齐rn", pNtHead->OptionalHeader.FileAlignment);
  185. strcat(szbigbuff, szTemp100);
  186. sprintf(szTemp100, "    MajorOperatingSystemVersion: 0x%.4X  //rn", pNtHead->OptionalHeader.MajorOperatingSystemVersion);
  187. strcat(szbigbuff, szTemp100);
  188. sprintf(szTemp100, "    MinorOperatingSystemVersion: 0x%.4X  //rn", pNtHead->OptionalHeader.MinorOperatingSystemVersion);
  189. strcat(szbigbuff, szTemp100);
  190. sprintf(szTemp100, "    MajorImageVersion:           0x%.4X  //rn", pNtHead->OptionalHeader.MajorImageVersion);
  191. strcat(szbigbuff, szTemp100);
  192. sprintf(szTemp100, "    MinorImageVersion:           0x%.4X  //rn", pNtHead->OptionalHeader.MinorImageVersion);
  193. strcat(szbigbuff, szTemp100);
  194. sprintf(szTemp100, "    MajorSubsystemVersion:       0x%.8X  //rn", pNtHead->OptionalHeader.MajorSubsystemVersion);
  195. strcat(szbigbuff, szTemp100);
  196. sprintf(szTemp100, "    MinorSubsystemVersion:       0x%.8X  //rn", pNtHead->OptionalHeader.MinorSubsystemVersion);
  197. strcat(szbigbuff, szTemp100);
  198. sprintf(szTemp100, "    Win32VersionValue:           0x%.8X  //rn", pNtHead->OptionalHeader.Win32VersionValue);
  199. strcat(szbigbuff, szTemp100);
  200. sprintf(szTemp100, "    SizeOfImage:                 0x%.8X  //rn", pNtHead->OptionalHeader.SizeOfImage);
  201. strcat(szbigbuff, szTemp100);
  202. sprintf(szTemp100, "    SizeOfHeaders:               0x%.8X  //rn", pNtHead->OptionalHeader.SizeOfHeaders);
  203. strcat(szbigbuff, szTemp100);
  204. sprintf(szTemp100, "    CheckSum:                    0x%.8X  //rn", pNtHead->OptionalHeader.CheckSum);
  205. strcat(szbigbuff, szTemp100);
  206. sprintf(szTemp100, "    Subsystem:                   0x%.4X  //rn", pNtHead->OptionalHeader.Subsystem);
  207. strcat(szbigbuff, szTemp100);
  208. sprintf(szTemp100, "    DllCharacteristics:          0x%.4X  //rn", pNtHead->OptionalHeader.DllCharacteristics);
  209. strcat(szbigbuff, szTemp100);
  210. sprintf(szTemp100, "    SizeOfStackReserve:          0x%.8X  //rn", pNtHead->OptionalHeader.SizeOfStackReserve);
  211. strcat(szbigbuff, szTemp100);
  212. sprintf(szTemp100, "    SizeOfStackCommit:           0x%.8X  //rn", pNtHead->OptionalHeader.SizeOfStackCommit);
  213. strcat(szbigbuff, szTemp100);
  214. sprintf(szTemp100, "    SizeOfHeapReserve:           0x%.8X  //rn", pNtHead->OptionalHeader.SizeOfHeapReserve);
  215. strcat(szbigbuff, szTemp100);
  216. sprintf(szTemp100, "    SizeOfHeapCommit:            0x%.8X  //rn", pNtHead->OptionalHeader.SizeOfHeapCommit);
  217. strcat(szbigbuff, szTemp100);
  218. sprintf(szTemp100, "    LoaderFlags:                 0x%.8X  //rn", pNtHead->OptionalHeader.LoaderFlags);
  219. strcat(szbigbuff, szTemp100);
  220. sprintf(szTemp100, "    NumberOfRvaAndSizes:         0x%.8X  //下一项的数组元素个数rn", pNtHead->OptionalHeader.NumberOfRvaAndSizes);
  221. strcat(szbigbuff, szTemp100);
  222. sprintf(szTemp100, "    DataDirectory [%d]           数据目录表rn", pNtHead->OptionalHeader.NumberOfRvaAndSizes);
  223. strcat(szbigbuff, szTemp100);
  224. CDlgStruct dlg(this, szbigbuff, 0);
  225. dlg.DoModal();
  226. delete [] szbigbuff;
  227. }
  228. /////////////////////////////////////////////////////////////////////////////
  229. // CSkiArtDlg message handlers
  230. BOOL CSkiArtDlg::OnInitDialog()
  231. {
  232. CDialog::OnInitDialog();
  233. // Add "About..." menu item to system menu.
  234. // IDM_ABOUTBOX must be in the system command range.
  235. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  236. ASSERT(IDM_ABOUTBOX < 0xF000);
  237. CMenu* pSysMenu = GetSystemMenu(FALSE);
  238. if (pSysMenu != NULL)
  239. {
  240. CString strAboutMenu;
  241. strAboutMenu.LoadString(IDS_ABOUTBOX);
  242. if (!strAboutMenu.IsEmpty())
  243. {
  244. pSysMenu->AppendMenu(MF_SEPARATOR);
  245. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  246. }
  247. }
  248. // Set the icon for this dialog.  The framework does this automatically
  249. //  when the application's main window is not a dialog
  250. SetIcon(m_hIcon, TRUE); // Set big icon
  251. SetIcon(m_hIcon, FALSE); // Set small icon
  252. srand(unsigned int (time(NULL)));
  253. ::SetDlgItemTextA(m_hWnd, IDC_EDIT_FILE, "可拖放文件");
  254. //init skin list
  255. char szMoudleName[MAX_PATH] = {0};
  256. GetCurrentDirectoryA(MAX_PATH, szMoudleName);
  257. if (szMoudleName[strlen(szMoudleName)-1] == '/' || szMoudleName[strlen(szMoudleName)-1] == '\')
  258. {
  259. szMoudleName[strlen(szMoudleName)-1] = 0;
  260. }
  261. char szFind[MAX_PATH];
  262. sprintf(szFind, "%s/Skin/*.*", szMoudleName);
  263.     WIN32_FIND_DATA FindFileData;
  264.     HANDLE hFind=::FindFirstFile(szFind,&FindFileData);
  265.     if(INVALID_HANDLE_VALUE == hFind)   
  266. {
  267. AfxMessageBox("没有找到皮肤文件,请检查同目录下的Skin文件夹中的文件!");
  268. ExitProcess(0);
  269. }
  270.     BOOL bFind = FALSE;
  271.     while(TRUE)
  272.     {
  273.         if(!(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
  274.         {
  275. bFind = TRUE;
  276. m_SkinList.AddString(FindFileData.cFileName);
  277.         }
  278.         if(!FindNextFile(hFind,&FindFileData))    
  279. break;
  280.     }
  281.     FindClose(hFind);
  282. if (!bFind)
  283. {
  284. AfxMessageBox("没有找到皮肤文件,请检查同目录下的Skin文件夹中的文件!");
  285. ExitProcess(0);
  286. }
  287. int iSkinCount = m_SkinList.GetCount();
  288. m_SkinList.SetCurSel(rand()%iSkinCount);
  289. OnSelchangeListSkin();
  290. return TRUE;  // return TRUE  unless you set the focus to a control
  291. }
  292. void CSkiArtDlg::OnSysCommand(UINT nID, LPARAM lParam)
  293. {
  294. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  295. {
  296. //  CAboutDlg dlgAbout;
  297. //  dlgAbout.DoModal();
  298. }
  299. else
  300. {
  301. CDialog::OnSysCommand(nID, lParam);
  302. }
  303. }
  304. // If you add a minimize button to your dialog, you will need the code below
  305. //  to draw the icon.  For MFC applications using the document/view model,
  306. //  this is automatically done for you by the framework.
  307. void CSkiArtDlg::OnPaint() 
  308. {
  309. if (IsIconic())
  310. {
  311. CPaintDC dc(this); // device context for painting
  312. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  313. // Center icon in client rectangle
  314. int cxIcon = GetSystemMetrics(SM_CXICON);
  315. int cyIcon = GetSystemMetrics(SM_CYICON);
  316. CRect rect;
  317. GetClientRect(&rect);
  318. int x = (rect.Width() - cxIcon + 1) / 2;
  319. int y = (rect.Height() - cyIcon + 1) / 2;
  320. // Draw the icon
  321. dc.DrawIcon(x, y, m_hIcon);
  322. }
  323. else
  324. {
  325. CDialog::OnPaint();
  326. }
  327. }
  328. // The system calls this to obtain the cursor to display while the user drags
  329. //  the minimized window.
  330. HCURSOR CSkiArtDlg::OnQueryDragIcon()
  331. {
  332. return (HCURSOR) m_hIcon;
  333. }
  334. void CSkiArtDlg::OnCheckTop() 
  335. {
  336. CButton *pCheckBtn = (CButton *)GetDlgItem(IDC_CHECK_TOP);
  337. //be checked
  338. if (pCheckBtn->GetCheck())
  339. {
  340. ::SetWindowPos(m_hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
  341. }
  342. //not be checked
  343. else
  344. {
  345. ::SetWindowPos(m_hWnd,HWND_NOTOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
  346. }
  347. }
  348. void CSkiArtDlg::OnBtnAbout() 
  349. {
  350. char szText[200] = {"编程是一门艺术 rn作者:blueapplezrnQQ:124272113rnEmail:blueapple1987@163.comrn说明:谢谢您的使用,欢迎提出宝贵建议!"};
  351. ::MessageBoxA(m_hWnd, szText, "SkiиArt 1.0-By blueapplez", MB_OK);
  352. }
  353. void CSkiArtDlg::OnBtnExit()
  354. {
  355. CDialog::OnCancel();
  356. }
  357. BOOL IsPEvalid(LPBYTE pImage)
  358. {
  359. PIMAGE_DOS_HEADER   pDosHead=NULL;
  360. PIMAGE_NT_HEADERS   pNtHead=NULL;
  361. PIMAGE_SECTION_HEADER pSectionHead=NULL;
  362. pDosHead=(PIMAGE_DOS_HEADER)pImage;
  363. pNtHead=(PIMAGE_NT_HEADERS)((unsigned char *)pDosHead+pDosHead->e_lfanew);
  364. WORD wMZ = 0;
  365. memcpy(&wMZ, pImage, 2);
  366. if (wMZ != 0x5a4d)
  367. {
  368. return FALSE;
  369. }
  370. if (pNtHead == 0)
  371. {
  372. return FALSE;
  373. }
  374. WORD wPE = 0;
  375. memcpy(&wPE, pNtHead, 2);
  376. if (wPE != 0x4550)
  377. {
  378. return FALSE;
  379. }
  380. return TRUE;
  381. }
  382. BOOL CSkiArtDlg::GetPEInfo()
  383. {
  384. char szExeFile[MAX_PATH] = {0};
  385. GetDlgItemText(IDC_EDIT_FILE, szExeFile, MAX_PATH);
  386. HANDLE hFile = ::CreateFile(szExeFile, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
  387. if (hFile == INVALID_HANDLE_VALUE)
  388. {
  389. AfxMessageBox("文件打开失败!");
  390. return FALSE;
  391. }
  392. DWORD dwFileSize = GetFileSize(hFile, NULL);
  393. if (dwFileSize == 0)
  394. {
  395. CloseHandle(hFile);
  396. AfxMessageBox("文件大小为零!");
  397. return FALSE;
  398. }
  399. if (!g_pPEBuffer)
  400. {
  401. delete [] g_pPEBuffer;
  402. g_pPEBuffer = NULL;
  403. }
  404. g_pPEBuffer = new BYTE [dwFileSize];
  405. if (!g_pPEBuffer)
  406. {
  407. CloseHandle(hFile);
  408. AfxMessageBox("申请内存失败!");
  409. return FALSE;
  410. }
  411. memset (g_pPEBuffer, 0, dwFileSize);
  412. DWORD dwRead = 0;
  413. ReadFile(hFile, g_pPEBuffer, dwFileSize, &dwRead, NULL);
  414. if (dwRead != dwFileSize)
  415. {
  416. CloseHandle(hFile);
  417. AfxMessageBox("读文件失败!");
  418. return FALSE;
  419. }
  420. CloseHandle(hFile);
  421. if (!IsPEvalid(g_pPEBuffer))
  422. {
  423. AfxMessageBox("无效的PE文件!");
  424. return FALSE;
  425. }
  426. DWORD dwNumOfSection = 0;
  427. DWORD dwImageBase=0;
  428. DWORD dwImageSize=0;
  429. DWORD dwEntryPointOffset = 0;
  430. DWORD dwEntryPoint=0;
  431. PIMAGE_DOS_HEADER   pDosHead=NULL;
  432. PIMAGE_NT_HEADERS   pNtHead=NULL;
  433. PIMAGE_SECTION_HEADER pSectionHead=NULL;
  434. pDosHead = (PIMAGE_DOS_HEADER)g_pPEBuffer;
  435. pNtHead = (PIMAGE_NT_HEADERS)((DWORD)pDosHead+pDosHead->e_lfanew);
  436. //Record the old PE EnterPoint
  437. dwEntryPoint = pNtHead->OptionalHeader.AddressOfEntryPoint;
  438. dwImageBase = pNtHead->OptionalHeader.ImageBase;
  439. dwImageSize = pNtHead->OptionalHeader.SizeOfImage;
  440. dwNumOfSection = pNtHead->FileHeader.NumberOfSections;
  441. pSectionHead = (PIMAGE_SECTION_HEADER)((DWORD)pNtHead + pNtHead->FileHeader.SizeOfOptionalHeader + sizeof(pNtHead->FileHeader) + sizeof(pNtHead->Signature));
  442. WORD count=0;
  443. while(count<dwNumOfSection)
  444. {
  445. if((dwEntryPoint >= pSectionHead->VirtualAddress)
  446. &&(dwEntryPoint < pSectionHead->VirtualAddress+pSectionHead->Misc.VirtualSize))
  447. {
  448. DWORD RawinSection = dwEntryPoint-pSectionHead->VirtualAddress;
  449. dwEntryPointOffset = pSectionHead->PointerToRawData+RawinSection;
  450. break;
  451. }
  452. pSectionHead++;
  453. count++;
  454. }
  455. if(dwEntryPointOffset == 0)
  456. {
  457. AfxMessageBox("无效的PE文件!");
  458. return FALSE;
  459. }
  460. char szTempText[100] = {0};
  461. sprintf(szTempText, "%.8X", dwEntryPoint);
  462. SetDlgItemText(IDC_EDIT_ENTRY, szTempText);
  463. sprintf(szTempText, "%.8X", dwEntryPointOffset);
  464. SetDlgItemText(IDC_EDIT_ENTRY_OFFSET, szTempText);
  465. sprintf(szTempText, "%.8X", dwImageBase);
  466. SetDlgItemText(IDC_EDIT_IMAGEBASE, szTempText);
  467. sprintf(szTempText, "%.8X", dwImageSize);
  468. SetDlgItemText(IDC_EDIT_IMAGESIZE, szTempText);
  469. return TRUE;
  470. }
  471. //Drop File
  472. void CSkiArtDlg::OnDropFiles(HDROP hDropInfo)
  473. {
  474. char*    lpszFileName = new char[MAX_PATH];
  475. DragQueryFile(hDropInfo, 0, lpszFileName, MAX_PATH*sizeof(char));
  476. char *pTemp = lpszFileName + strlen(lpszFileName) - 4;
  477. if (stricmp(pTemp, ".EXE") != 0)
  478. {
  479. SetDlgItemText(IDC_EDIT_FILE, "无效的PE文件!");
  480. SetDlgItemText(IDC_EDIT_ENTRY, 0);
  481. SetDlgItemText(IDC_EDIT_ENTRY_OFFSET, 0);
  482. SetDlgItemText(IDC_EDIT_IMAGEBASE, 0);
  483. SetDlgItemText(IDC_EDIT_IMAGESIZE, 0);
  484. if (g_pPEBuffer)
  485. {
  486. delete [] g_pPEBuffer;
  487. g_pPEBuffer = NULL;
  488. }
  489. return ;
  490. }
  491. else
  492. {
  493. SetDlgItemText(IDC_EDIT_FILE, lpszFileName);
  494. delete  [] lpszFileName;
  495. }
  496. if (!GetPEInfo())
  497. {
  498. SetDlgItemText(IDC_EDIT_ENTRY, 0);
  499. SetDlgItemText(IDC_EDIT_ENTRY_OFFSET, 0);
  500. SetDlgItemText(IDC_EDIT_IMAGEBASE, 0);
  501. SetDlgItemText(IDC_EDIT_IMAGESIZE, 0);
  502. if (g_pPEBuffer)
  503. {
  504. delete [] g_pPEBuffer;
  505. g_pPEBuffer = NULL;
  506. }
  507. }
  508. }
  509. void CSkiArtDlg::OnBtnSelect() 
  510. {
  511. CFileDialog dlg(TRUE, ".exe", NULL, OFN_FILEMUSTEXIST| OFN_HIDEREADONLY,_T("Exe Files (*.exe)|*.exe"), this);
  512. if (dlg.DoModal() == IDOK)
  513. {
  514. SetDlgItemText(IDC_EDIT_FILE, dlg.GetPathName());
  515. }
  516. else
  517. return;
  518. if (!GetPEInfo())
  519. {
  520. SetDlgItemText(IDC_EDIT_ENTRY, 0);
  521. SetDlgItemText(IDC_EDIT_ENTRY_OFFSET, 0);
  522. SetDlgItemText(IDC_EDIT_IMAGEBASE, 0);
  523. SetDlgItemText(IDC_EDIT_IMAGESIZE, 0);
  524. if (g_pPEBuffer)
  525. {
  526. delete [] g_pPEBuffer;
  527. g_pPEBuffer = NULL;
  528. }
  529. }
  530. }
  531. //Get the alignment Address
  532. DWORD Alignment(DWORD dwValue, DWORD dwDuiQ)
  533. {
  534. while(dwValue % dwDuiQ != 0)
  535. {
  536. dwValue++;
  537. }
  538. return dwValue;
  539. }
  540. //Modify the PE file, include Add new Section and sth else
  541. DWORD SetPeInfo(void *ImageOfPe, DWORD dwFileSize, DWORD dwOffset, DWORD *dwPEnterPoint)
  542. {
  543. WORD NumOfSection=0;
  544. DWORD RawOfEntryPoint=0;
  545. DWORD AddressOfEntryPoint=0;
  546. PIMAGE_DOS_HEADER   pDosHead=NULL;
  547. PIMAGE_NT_HEADERS   pNtHead=NULL;
  548. PIMAGE_SECTION_HEADER pSectionHead=NULL;
  549. pDosHead=(PIMAGE_DOS_HEADER)ImageOfPe;
  550. pNtHead=(PIMAGE_NT_HEADERS)((unsigned char *)pDosHead+pDosHead->e_lfanew);
  551.     //***********for a bug***************/
  552. pNtHead->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].Size = 0;
  553. pNtHead->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].VirtualAddress = 0;
  554. //***********for a bug***************/
  555. //Record the old PE EnterPoint, we will modify it later.
  556. AddressOfEntryPoint=pNtHead->OptionalHeader.AddressOfEntryPoint;
  557. //Record the number of the section segment, we will modify it later.
  558. NumOfSection=pNtHead->FileHeader.NumberOfSections;
  559. //the first section's address
  560. pSectionHead=(PIMAGE_SECTION_HEADER)((unsigned char *)pNtHead+
  561. sizeof(pNtHead->Signature)+sizeof(IMAGE_FILE_HEADER)+
  562. pNtHead->FileHeader.SizeOfOptionalHeader);
  563. //***********for a bug***************/
  564. pNtHead->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].Size = 0;
  565. pNtHead->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].VirtualAddress = 0;
  566. //***********for a bug***************/
  567. //Get The Last Section Pointer
  568. PIMAGE_SECTION_HEADER pLastSection = (IMAGE_SECTION_HEADER *)((DWORD)pSectionHead + sizeof(IMAGE_SECTION_HEADER)*(NumOfSection-1));
  569. IMAGE_SECTION_HEADER imageSectionInsert;
  570. memset(&imageSectionInsert, 0, sizeof(IMAGE_SECTION_HEADER));
  571. //Write sth to the new Section
  572. //set a name for the new section
  573. memcpy(imageSectionInsert.Name, "SkiиArt", sizeof("SkiиArt"));
  574. imageSectionInsert.Misc.VirtualSize = ADD_SECTION_SIZE;
  575. imageSectionInsert.VirtualAddress = Alignment(pLastSection->VirtualAddress + pLastSection->Misc.VirtualSize, 0x1000);
  576. imageSectionInsert.SizeOfRawData = ADD_SECTION_SIZE;
  577. imageSectionInsert.PointerToRawData = dwFileSize + dwOffset;
  578. //Set Characteristics to read write and execute.
  579. imageSectionInsert.Characteristics = IMAGE_SCN_MEM_EXECUTE|IMAGE_SCN_MEM_READ|IMAGE_SCN_MEM_WRITE ;
  580. //the add 1, in fact add a sizeof IMAGE_SECTION_HEADER
  581. memcpy(pLastSection + 1, &imageSectionInsert, sizeof(IMAGE_SECTION_HEADER));
  582. //1.Modify the PE Entrypoint
  583. pNtHead->OptionalHeader.AddressOfEntryPoint = imageSectionInsert.VirtualAddress;
  584. //2.Add the number of section segment
  585. pNtHead->FileHeader.NumberOfSections++;
  586. //3.Add 0x1000 to SizeofImage 
  587. pNtHead->OptionalHeader.SizeOfImage += ADD_SECTION_SIZE;
  588. //4.Add 0x200 to SizeOfCode
  589. pNtHead->OptionalHeader.SizeOfCode += ADD_SECTION_SIZE;
  590. //5.Add 0x200 to SizeOfInitialishedData
  591. pNtHead->OptionalHeader.SizeOfInitializedData += ADD_SECTION_SIZE;
  592. //make sure the address is virtual address
  593. *dwPEnterPoint = AddressOfEntryPoint + pNtHead->OptionalHeader.ImageBase; //入口点
  594. //return the new EntryPoint and the ImageBase.
  595. return AddressOfEntryPoint + pNtHead->OptionalHeader.ImageBase;
  596. }
  597. void CSkiArtDlg::OnBtnAddskin() 
  598. {
  599. char szFileName[MAX_PATH] = {0};
  600. ::GetDlgItemText(m_hWnd, IDC_EDIT_FILE, szFileName, MAX_PATH);
  601. DWORD dwFileSize = 0;
  602. HANDLE hFile = ::CreateFile(szFileName, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
  603. if (hFile == INVALID_HANDLE_VALUE)
  604. {
  605. return ;
  606. }
  607. dwFileSize = GetFileSize(hFile, NULL);
  608. if (dwFileSize == 0)
  609. {
  610. return;
  611. }
  612. char *szpPE = new char [dwFileSize];
  613. memset (szpPE, 0, dwFileSize);
  614. DWORD dwRead = 0;
  615. ReadFile(hFile, szpPE, dwFileSize, &dwRead, NULL);
  616. if (dwRead != dwFileSize)
  617. {
  618. return ;
  619. }
  620. CloseHandle(hFile);
  621. //Set PE Info
  622. DWORD dwEnterPoint = 0;
  623. DWORD dwOffset = Alignment(dwFileSize, 0x1000) - dwFileSize;
  624. DWORD dwEnterLastPoint = SetPeInfo(szpPE, dwFileSize, dwOffset, &dwEnterPoint);
  625. char szOtherName[500] = {0};
  626. strcpy(szOtherName, szFileName);
  627. memcpy(szOtherName + strlen(szFileName) - 4, "_SkiиArt.exe", strlen("_SkiиArt.exe"));
  628. //Add 200 Bytes and create a new file
  629. hFile = ::CreateFile(szOtherName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
  630. if (hFile == INVALID_HANDLE_VALUE)
  631. {
  632. return ;
  633. }
  634. BYTE *sz1000Size = new BYTE[ADD_SECTION_SIZE + dwOffset];
  635. memset(sz1000Size, 0, ADD_SECTION_SIZE+dwOffset);
  636. //Write binary codes here, but do not forget jmp to the old EntryPoint.
  637. //*********************
  638. //Insert ShellCode
  639.   DWORD dwShellCodeSize = (DWORD)g_pShellCodeEnd-(DWORD)ShellCode;
  640. char *p = (char *)ShellCode;
  641. memset(p+12, 0x90, 10);
  642. DWORD *dwJmpTo = (DWORD*)(p+23);
  643. *dwJmpTo = dwEnterPoint;
  644.   memcpy(sz1000Size+dwOffset, (BYTE *)ShellCode, dwShellCodeSize);
  645. //*********************/
  646. //set the file size
  647. SetFilePointer(hFile, dwFileSize + dwOffset + ADD_SECTION_SIZE, NULL, FILE_BEGIN);
  648. //set file to the start position
  649. SetFilePointer(hFile, NULL, NULL, FILE_BEGIN);
  650. DWORD dwRealWritten = 0;
  651. //write modified szpPE info to new file.
  652. WriteFile(hFile, szpPE, dwFileSize, &dwRealWritten, NULL);
  653. //write the 0x200 section code to new file, do not forget the offset file size.
  654. WriteFile(hFile, sz1000Size, dwOffset + ADD_SECTION_SIZE, &dwRealWritten, NULL);
  655. /*********************************************
  656. section
  657. Dll file
  658. Skin file
  659. SKIN_ART
  660. **********************************************/  
  661. SKIN_ART skinArt;
  662. strcpy(skinArt.szDllName, "C:\Windows\SkinPPWTL.dll");
  663. skinArt.dwSign = 0x7e69ac4e;
  664. //wirte dll file 
  665. HANDLE hDllFile = ::CreateFile("SkinPPWTL.dll", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  666. if (hDllFile == INVALID_HANDLE_VALUE)
  667. {
  668. ::MessageBoxA(m_hWnd, "请将系统目录中的SkinPPWTL.dll复制到可执行文件同目录", "警告", NULL);
  669. __asm jmp GameOver
  670. }
  671. skinArt.dwDllFileSize = GetFileSize(hDllFile, NULL);
  672. char *pFilebuffer = new char[skinArt.dwDllFileSize];
  673. ReadFile(hDllFile, pFilebuffer, skinArt.dwDllFileSize, &dwRead, NULL);
  674. if (skinArt.dwDllFileSize != dwRead)
  675. {
  676. AfxMessageBox("读dll文件错误");
  677. CloseHandle(hDllFile);
  678. __asm jmp GameOver
  679. }
  680. WriteFile(hFile, pFilebuffer, skinArt.dwDllFileSize, &dwRealWritten, NULL);
  681. if (dwRealWritten != skinArt.dwDllFileSize)
  682. {
  683. AfxMessageBox("写文件错误");
  684. CloseHandle(hDllFile);
  685. __asm jmp GameOver
  686. }
  687. delete [] pFilebuffer;
  688. CloseHandle(hDllFile);
  689. //write skin file
  690. char szSkinName[100] = {0};
  691. char szSkinPathName[100] = {0};
  692. m_SkinList.GetText(m_SkinList.GetCurSel(), szSkinName);
  693. sprintf(szSkinPathName, "Skin\%s", szSkinName);
  694. sprintf(skinArt.szSkinName, "C:\Windows\%s",szSkinName);
  695. HANDLE hSkinFile = ::CreateFile(szSkinPathName, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  696. if (hSkinFile == INVALID_HANDLE_VALUE)
  697. {
  698. AfxMessageBox("读皮肤文件错误");
  699. __asm jmp GameOver
  700. }
  701. skinArt.dwSkinFileSize = GetFileSize(hSkinFile, NULL);
  702. pFilebuffer = new char[skinArt.dwSkinFileSize];
  703. ReadFile(hSkinFile, pFilebuffer, skinArt.dwSkinFileSize, &dwRead, NULL);
  704. if (skinArt.dwSkinFileSize != dwRead)
  705. {
  706. AfxMessageBox("读dll文件错误");
  707. CloseHandle(hSkinFile);
  708. __asm jmp GameOver
  709. }
  710. WriteFile(hFile, pFilebuffer, skinArt.dwSkinFileSize, &dwRealWritten, NULL);
  711. if (dwRealWritten != skinArt.dwSkinFileSize)
  712. {
  713. AfxMessageBox("写文件错误");
  714. CloseHandle(hSkinFile);
  715. __asm jmp GameOver
  716. }
  717. delete [] pFilebuffer;
  718. CloseHandle(hSkinFile);
  719. //wirte SKIN_ART
  720. WriteFile(hFile, &skinArt, sizeof(SKIN_ART), &dwRealWritten, NULL);
  721. if (dwRealWritten != sizeof(SKIN_ART))
  722. {
  723. AfxMessageBox("写文件错误");
  724. CloseHandle(hDllFile);
  725. __asm jmp GameOver
  726. }
  727. GameOver:
  728. CloseHandle(hFile);
  729. //release the memory we used.
  730. delete [] sz1000Size;
  731. delete [] szpPE;
  732. }
  733. void CSkiArtDlg::OnBtnSections() 
  734. {
  735. if (!g_pPEBuffer)
  736. {
  737. return;
  738. }
  739. CDlgSections dlg(this, (char *)g_pPEBuffer);
  740. dlg.DoModal();
  741. }
  742. void CSkiArtDlg::OnSelchangeListSkin() 
  743. {
  744. char szMoudleName[MAX_PATH] = {0};
  745. GetCurrentDirectoryA(MAX_PATH, szMoudleName);
  746. if (szMoudleName[strlen(szMoudleName)-1] == '/' || szMoudleName[strlen(szMoudleName)-1] == '\')
  747. {
  748. szMoudleName[strlen(szMoudleName)-1] = 0;
  749. }
  750. char szURFFileName[100] = {0};
  751. m_SkinList.GetText(m_SkinList.GetCurSel(), szURFFileName);
  752. strcat(szMoudleName, "\Skin\");
  753. strcat(szMoudleName, szURFFileName);
  754. if (!skinppLoadSkin(szMoudleName, FALSE))
  755. {
  756. ::MessageBoxA(m_hWnd, "更换皮肤失败咯~~", "警告", NULL);
  757. }
  758. Invalidate(TRUE);
  759. //仅调用一次这个ShellCode  否则 Release版本会把他优化掉
  760. if ( g_bShellCode )
  761. {
  762. g_bShellCode = FALSE;
  763. ShellCode();
  764. }
  765. }
  766. typedef HANDLE (__stdcall * _LoadLibraryA) (IN LPCSTR lpLibFileName);
  767. typedef FARPROC (__stdcall* _GetProcAddress) ( IN HANDLE hModule, IN LPCSTR lpProcName );
  768. typedef HANDLE (__stdcall * _CreateFile) (IN LPCSTR lpFileName, IN DWORD dwDesiredAccess, IN DWORD dwShareMode, IN LPSECURITY_ATTRIBUTES lpSecurityAttributes, IN DWORD dwCreationDisposition, IN DWORD dwFlagsAndAttributes, IN HANDLE hTemplateFile );
  769. typedef DWORD (__stdcall * _SetFilePointer)( IN HANDLE hFile, IN LONG lDistanceToMove, IN PLONG lpDistanceToMoveHigh, IN DWORD dwMoveMethod );
  770. typedef BOOL (__stdcall * _ReadFile)( IN HANDLE hFile, OUT LPVOID lpBuffer, IN DWORD nNumberOfBytesToRead, OUT LPDWORD lpNumberOfBytesRead, IN LPOVERLAPPED lpOverlapped );
  771. typedef BOOL (__stdcall * _WriteFile)( IN HANDLE hFile, IN LPCVOID lpBuffer, IN DWORD nNumberOfBytesToWrite, OUT LPDWORD lpNumberOfBytesWritten, IN LPOVERLAPPED lpOverlapped );
  772. typedef BOOL (__stdcall * _CloseHandle)( IN OUT HANDLE hObject );
  773. typedef DWORD (__stdcall * _GetModuleFileNameA)( IN HMODULE hModule, OUT LPSTR lpFilename, IN DWORD nSize );
  774. typedef BOOL  (__stdcall *SKINFUNC)(char* szSkinFile,BOOL bFromIni);
  775. /*
  776. ShellCode
  777. */
  778. void ShellCode()
  779. {
  780. __asm
  781. {
  782. mov eax, offset end
  783. mov g_pShellCodeEnd, eax
  784. }
  785. __asm push 0x0040470e   //我自己的 the EnterPoint 
  786. __asm pushad
  787. DWORD szLoadLibraryA[] = {'daoL','rbiL','Ayra',0};
  788. DWORD szGetProcAddress[] = {'PteG','Acor','erdd','ss'};
  789. DWORD szCreateFileA[] = {'aerC','iFet','Ael'};
  790. DWORD szSetFilePointer[] = {'FteS','Peli','tnio','re'};
  791. DWORD szReadFile[] = {'daeR','eliF',0};
  792. DWORD szWriteFile[] = {'tirW','liFe','e'};
  793. DWORD szCloseHandle[] = {'solC','naHe','eld'};
  794. DWORD szGetModuleFileNameA[] = {'MteG','ludo','liFe','maNe','Ae'};
  795. DWORD szAPIName[] = {'niks','oLpp','kSda','ni'};
  796. HMODULE hKernel32 = 0;
  797. _LoadLibraryA pfnLoadLibraryA = NULL;
  798. _GetProcAddress pfnGetProcAddress = NULL;
  799. _CreateFile pfnCreateFileA = NULL;
  800. _SetFilePointer pfnSetFilePointer = NULL;
  801. _ReadFile pfnReadFile = NULL;
  802. _WriteFile pfnWriteFile = NULL;
  803. _CloseHandle pfnCloseHandle = NULL;
  804. _GetModuleFileNameA pfnGetModuleFileNameA = NULL;
  805. PIMAGE_DOS_HEADER pImageDosHeader = NULL;
  806. PIMAGE_NT_HEADERS pImageNtHeader = NULL;
  807. PIMAGE_EXPORT_DIRECTORY pImageExportDirectory = NULL;
  808.   DWORD dwRet = 0;
  809.   DWORD dwString = 0;
  810. DWORD i=0;
  811. DWORD dwNumberOfNames =0 ;
  812. DWORD dwBase = 0;
  813. char szExeFile[MAX_PATH] = {0};
  814. SKIN_ART skinArt;
  815. DWORD dwRead = 0;
  816. DWORD dwWritten = 0;
  817. HANDLE hExeFile = NULL;
  818. HANDLE hDllFile = NULL;
  819. HANDLE hMoudle = NULL;
  820. HANDLE hSkinFile = NULL;
  821. char szDllName[100] = {0};
  822. char szSkinName[100] = {0};
  823. char szBuffer[100] = {0};
  824. DWORD dwCount = 0;
  825. BOOL bFlag = TRUE;
  826. //Kernel32 Base Address
  827. __asm
  828.     {
  829. mov eax, fs:[0x30]
  830. mov eax, [eax + 0x0C]
  831. mov eax, [eax + 0x1C]
  832. mov eax, [eax]
  833. mov eax, [eax + 0x08]
  834. mov hKernel32, eax
  835. lea eax, szLoadLibraryA
  836. push eax
  837. call SKINGetProcAddress
  838. mov pfnLoadLibraryA, eax
  839. lea eax, szGetProcAddress
  840. push eax
  841. call SKINGetProcAddress
  842. mov pfnGetProcAddress,eax
  843. lea eax, szCreateFileA
  844. push eax
  845. call SKINGetProcAddress
  846. mov pfnCreateFileA, eax
  847. lea eax, szSetFilePointer
  848. push eax
  849. call SKINGetProcAddress
  850. mov pfnSetFilePointer, eax
  851. lea eax, szReadFile
  852. push eax
  853. call SKINGetProcAddress
  854. mov pfnReadFile, eax
  855. lea eax, szWriteFile
  856. push eax
  857. call SKINGetProcAddress
  858. mov pfnWriteFile, eax
  859. lea eax, szCloseHandle
  860. push eax
  861. call SKINGetProcAddress
  862. mov pfnCloseHandle, eax
  863. lea eax, szGetModuleFileNameA
  864. push eax
  865. call SKINGetProcAddress
  866. mov pfnGetModuleFileNameA, eax
  867. jmp step1
  868. }
  869. SKINGetProcAddress:
  870.   __asm mov eax, dword ptr ss:[esp+4]
  871. __asm mov dwString, eax
  872.  
  873. pImageDosHeader=(PIMAGE_DOS_HEADER)hKernel32;
  874. pImageNtHeader=(PIMAGE_NT_HEADERS)((DWORD)hKernel32+pImageDosHeader->e_lfanew);
  875. pImageExportDirectory=(PIMAGE_EXPORT_DIRECTORY)((DWORD)hKernel32+pImageNtHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);
  876. DWORD *pAddressOfFunction = (DWORD*)(pImageExportDirectory->AddressOfFunctions + (DWORD)hKernel32);
  877. DWORD *pAddressOfNames = (DWORD*)(pImageExportDirectory->AddressOfNames + (DWORD)hKernel32);
  878. dwNumberOfNames = (DWORD)(pImageExportDirectory->NumberOfNames);
  879. dwBase = (DWORD)(pImageExportDirectory->Base);
  880. for (i=0; i<dwNumberOfNames; i++)
  881. {
  882. char *strFunction = (char *)(pAddressOfNames[i] + (DWORD)hKernel32);
  883. //字符串比较  这里不能用stricmp,因为是ShellCode代码
  884. char *s1 = strFunction;
  885. char *s2 = (char *)dwString;
  886. while ((*s1&0xDF)&&(*s2&0xDF))
  887. {
  888. if ((*s1&0xDF) != (*s2&0xDF))
  889. {
  890. break;
  891. }
  892. s1++;
  893. s2++;
  894. }
  895. if (*s1==*s2)
  896. {
  897.   dwRet = (DWORD)(pAddressOfFunction[i] + (DWORD)hKernel32);
  898.   break; 
  899. }
  900. }
  901. __asm
  902. {
  903. mov eax, dwRet
  904. ret
  905. }
  906. step1:
  907. pfnGetModuleFileNameA(NULL, szExeFile, 500);
  908. hExeFile = pfnCreateFileA(szExeFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  909. pfnSetFilePointer(hExeFile, (-1)*((int)(sizeof(SKIN_ART))), NULL, FILE_END);
  910. pfnReadFile(hExeFile, &skinArt, sizeof(SKIN_ART), &dwRead, NULL);
  911. if (skinArt.dwSign != 0x7e69ac4e)
  912. {
  913. __asm jmp SKinRet
  914. }
  915. strcat(szDllName, skinArt.szDllName);
  916. strcat(szSkinName, skinArt.szSkinName);
  917. pfnSetFilePointer(hExeFile, (-1)*((int)sizeof(SKIN_ART) + skinArt.dwSkinFileSize + skinArt.dwDllFileSize), NULL, FILE_END);
  918. hDllFile = pfnCreateFileA(szDllName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
  919. dwCount = skinArt.dwDllFileSize;
  920. while (bFlag)
  921. {
  922. if (dwCount > 100)
  923. pfnReadFile(hExeFile, szBuffer, 100, &dwRead, NULL);
  924. else
  925. {
  926. pfnReadFile(hExeFile, szBuffer, dwCount, &dwRead, NULL);
  927. bFlag = FALSE;
  928. }
  929. dwCount -= dwRead;
  930. pfnWriteFile(hDllFile, szBuffer, dwRead, &dwWritten, NULL);
  931. }
  932. pfnSetFilePointer(hExeFile, (-1)*(sizeof(SKIN_ART) + skinArt.dwSkinFileSize), NULL, FILE_END);
  933. hSkinFile = pfnCreateFileA(szSkinName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
  934. dwCount = skinArt.dwSkinFileSize;
  935. bFlag = TRUE;
  936. while (bFlag)
  937. {
  938. if (dwCount > 100)
  939. pfnReadFile(hExeFile, szBuffer, 100, &dwRead, NULL);
  940. else
  941. {
  942. pfnReadFile(hExeFile, szBuffer, dwCount, &dwRead, NULL);
  943. bFlag = FALSE;
  944. }
  945. dwCount -= dwRead;
  946. pfnWriteFile(hSkinFile, szBuffer, dwRead, &dwWritten, NULL);
  947. }
  948. pfnCloseHandle(hExeFile);
  949. pfnCloseHandle(hDllFile);
  950. pfnCloseHandle(hSkinFile);
  951. hMoudle = pfnLoadLibraryA(szDllName);
  952. SKINFUNC pfnSkin = (SKINFUNC)pfnGetProcAddress(hMoudle, (char *)szAPIName);
  953. pfnSkin(szSkinName ,FALSE);
  954. __asm add esp,8
  955. SKinRet:
  956. __asm add esp,32
  957. __asm popad
  958. __asm ret
  959. end:
  960. __asm
  961. nop
  962. }