EXE捆绑器

释放的方法真没想到  太神奇了

  1 // 文件捆绑器Dlg.cpp : 实现文件
  2 //
  3
  4 #include "stdafx.h"
  5 #include "文件捆绑器.h"
  6 #include "文件捆绑器Dlg.h"
  7 #include "afxdialogex.h"
  8
  9 #ifdef _DEBUG
 10 #define new DEBUG_NEW
 11 #endif
 12
 13
 14 struct MODIFY_DATA {
 15     unsigned int finder; // 常量(定位自身)
 16     _off_t my_length;      //文件长度(自身)
 17 } modify_data = { 0x12345678, 0 };
 18 //枚举所有图标资源
 19 BOOL CALLBACK my_enum_res_callback(
 20     HMODULE hExe,   // 资源句柄
 21     LPCTSTR lpszType,  // 资源类型
 22     LPTSTR lpszName,   // 资源名称
 23     LPARAM lParam    // 自定义消息参数
 24 );
 25
 26 // 用于应用程序“关于”菜单项的 CAboutDlg 对话框
 27
 28 class CAboutDlg : public CDialogEx
 29 {
 30 public:
 31     CAboutDlg();
 32
 33 // 对话框数据
 34 #ifdef AFX_DESIGN_TIME
 35     enum { IDD = IDD_ABOUTBOX };
 36 #endif
 37
 38     protected:
 39     virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
 40
 41 // 实现
 42 protected:
 43     DECLARE_MESSAGE_MAP()
 44 };
 45
 46 CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
 47 {
 48 }
 49
 50 void CAboutDlg::DoDataExchange(CDataExchange* pDX)
 51 {
 52     CDialogEx::DoDataExchange(pDX);
 53 }
 54
 55 BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
 56 END_MESSAGE_MAP()
 57
 58
 59 // C文件捆绑器Dlg 对话框
 60
 61
 62
 63 C文件捆绑器Dlg::C文件捆绑器Dlg(CWnd* pParent /*=NULL*/)
 64     : CDialogEx(IDD_MY_DIALOG, pParent)
 65     , m_DestPathName(_T(""))
 66 {
 67     //m_DestPathName = _T("");
 68     m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
 69 }
 70
 71 void C文件捆绑器Dlg::DoDataExchange(CDataExchange* pDX)
 72 {
 73     CDialogEx::DoDataExchange(pDX);
 74     DDX_Control(pDX, IDC_LIST_CONTROL, m_List);
 75     DDX_Text(pDX, IDC_EDIT1, m_DestPathName);
 76 }
 77
 78 BEGIN_MESSAGE_MAP(C文件捆绑器Dlg, CDialogEx)
 79     ON_WM_SYSCOMMAND()
 80     ON_WM_PAINT()
 81     ON_WM_QUERYDRAGICON()
 82     ON_BN_CLICKED(IDOK, &C文件捆绑器Dlg::OnBnClickedOk)
 83     ON_BN_CLICKED(IDC_BUTTON_ADD, &C文件捆绑器Dlg::OnBnClickedButtonAdd)
 84     ON_BN_CLICKED(IDC_BUTTON_DELETE, &C文件捆绑器Dlg::OnBnClickedButtonDelete)
 85     ON_BN_CLICKED(IDC_BUTTON_SELECT, &C文件捆绑器Dlg::OnBnClickedButtonSelect)
 86     ON_BN_CLICKED(IDC_BUTTON2, &C文件捆绑器Dlg::OnBnClickedButton2)
 87     ON_BN_CLICKED(IDC_BUTTON3, &C文件捆绑器Dlg::OnBnClickedButton3)
 88 END_MESSAGE_MAP()
 89
 90
 91 // C文件捆绑器Dlg 消息处理程序
 92
 93 BOOL C文件捆绑器Dlg::OnInitDialog()
 94 {
 95     CDialogEx::OnInitDialog();
 96
 97     // 将“关于...”菜单项添加到系统菜单中。
 98
 99     // IDM_ABOUTBOX 必须在系统命令范围内。
100     ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
101     ASSERT(IDM_ABOUTBOX < 0xF000);
102
103     CMenu* pSysMenu = GetSystemMenu(FALSE);
104     if (pSysMenu != NULL)
105     {
106         BOOL bNameValid;
107         CString strAboutMenu;
108         bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
109         ASSERT(bNameValid);
110         if (!strAboutMenu.IsEmpty())
111         {
112             pSysMenu->AppendMenu(MF_SEPARATOR);
113             pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
114         }
115     }
116
117     // 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
118     //  执行此操作
119     SetIcon(m_hIcon, TRUE);            // 设置大图标
120     SetIcon(m_hIcon, FALSE);        // 设置小图标
121
122     // TODO: 在此添加额外的初始化代码
123
124     ListView_SetExtendedListViewStyle(m_List.m_hWnd, LVS_EX_GRIDLINES | LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT);
125
126     m_List.InsertColumn(0, "选择", LVCFMT_LEFT, 50);
127     m_List.InsertColumn(1, "要捆绑的文件", LVCFMT_LEFT, 280);
128
129
130     //初始化变量
131     prog1_length = 0;
132     buf = NULL;
133     his_name = "";
134
135
136     //获取自身文件名
137     ::GetModuleFileName(0, my_name, sizeof(my_name));
138
139     struct _stat ST;
140     _stat(my_name, &ST);
141     //此外加入捆绑器程序的最终大小,来判断是绑定文件还是分解执行文件
142     if (ST.st_size > 264256)
143     {
144         OnBnClickedButton2(); //分离文件并运行
145         exit(0);    //直接退出程序,不显示捆绑程序画面
146     }
147
148     return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
149 }
150
151
152
153 void C文件捆绑器Dlg::OnSysCommand(UINT nID, LPARAM lParam)
154 {
155     if ((nID & 0xFFF0) == IDM_ABOUTBOX)
156     {
157         CAboutDlg dlgAbout;
158         dlgAbout.DoModal();
159     }
160     else
161     {
162         CDialogEx::OnSysCommand(nID, lParam);
163     }
164 }
165
166 // 如果向对话框添加最小化按钮,则需要下面的代码
167 //  来绘制该图标。  对于使用文档/视图模型的 MFC 应用程序,
168 //  这将由框架自动完成。
169
170 void C文件捆绑器Dlg::OnPaint()
171 {
172     if (IsIconic())
173     {
174         CPaintDC dc(this); // 用于绘制的设备上下文
175
176         SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
177
178         // 使图标在工作区矩形中居中
179         int cxIcon = GetSystemMetrics(SM_CXICON);
180         int cyIcon = GetSystemMetrics(SM_CYICON);
181         CRect rect;
182         GetClientRect(&rect);
183         int x = (rect.Width() - cxIcon + 1) / 2;
184         int y = (rect.Height() - cyIcon + 1) / 2;
185
186         // 绘制图标
187         dc.DrawIcon(x, y, m_hIcon);
188     }
189     else
190     {
191         CDialogEx::OnPaint();
192     }
193 }
194
195 //当用户拖动最小化窗口时系统调用此函数取得光标
196 //显示。
197 HCURSOR C文件捆绑器Dlg::OnQueryDragIcon()
198 {
199     return static_cast<HCURSOR>(m_hIcon);
200 }
201
202
203
204 void C文件捆绑器Dlg::OnBnClickedOk()
205 {
206     // TODO: 在此添加控件通知处理程序代码
207     FILE* myself;   //自身文件
208     FILE* out;      //最终合成文件
209     FILE* in;       //待绑定文件
210     int bytesin;
211     int totalbytes = 0;
212     struct _stat ST;
213     unsigned int finder = 0x12345678;
214     unsigned int i, k;
215     GetDlgItemText(IDC_EDIT1, m_DestPathName);
216
217     int n = m_List.GetItemCount();
218     if (n > 0)
219     {
220         CString strIconPathName;
221         GetDlgItemText(IDC_EDIT2, strIconPathName);
222
223         strIconPathName.TrimLeft();
224         if (strIconPathName.IsEmpty())
225         {
226             his_name = m_List.GetItemText(0, 1); //第一个绑定的文件名
227         }
228         else
229         {
230             his_name = strIconPathName;
231         }
232         //AfxMessageBox(his_name);
233     }
234     else
235     {
236         MessageBox("请先添加文件!", "提示", MB_ICONINFORMATION);
237         return ;
238     }
239
240     _stat(my_name, &ST);
241     modify_data.my_length = ST.st_size;
242     if (modify_data.my_length == 0)
243     {
244         MessageBox("绑定文件中,自身文件长度为零时出错!", "错误");
245         return ;
246     }
247
248     buf = (BYTE *)malloc(modify_data.my_length);
249     if (buf == NULL)
250     {
251         MessageBox("绑定文件中,分配自身文件长度时出错!", "错误");
252         return ;
253     }
254
255     myself = fopen(my_name, "rb");  //打开自身文件
256     if (myself == NULL)
257     {
258         free(buf);
259         MessageBox("绑定文件中,打开自身文件时出错!", "错误");
260         return ;
261     }
262
263     bytesin = fread(buf, 1, modify_data.my_length, myself);
264     fclose(myself);
265
266     if (bytesin != modify_data.my_length)
267     {
268         free(buf);
269         MessageBox("绑定文件中,不能完全读取自身文件内容时出错!", "错误");
270         return ;
271     }
272
273      for (i = 0; i < modify_data.my_length - sizeof(finder); i += sizeof(finder))
274     {
275         for (k = 0; k < sizeof(finder); k++)
276         {
277             if (buf[i + k] != ((BYTE*)&finder)[k])
278                 break;
279         }
280         if (k == sizeof(finder))   //定位并保存自身数据文件大小
281         {
282             memcpy(buf + i, &modify_data, sizeof(modify_data));
283             break;
284         }
285     }
286
287     if (i >= modify_data.my_length - sizeof(finder))
288     {
289         free(buf);
290         MessageBox("绑定文件中,不能定位自身文件时出错!", "错误");
291         return ;
292     }
293
294     //list_my_icons();
295
296     out = fopen(m_DestPathName, "wb"); //创建最终合成文件
297     if (out == NULL)
298     {
299         free(buf);
300         MessageBox("绑定文件中,创建绑定后生成的合成文件时出错!", "错误");
301         return ;
302     }
303
304
305
306     for (int j = 0; j < n; j++)
307     {
308         CString strFilePath = m_List.GetItemText(j, 1);
309
310         if (_stat(strFilePath, &ST) != 0 || ST.st_size == 0)
311         {
312             free(buf);
313             MessageBox("绑定文件中,读取要绑定的文件时出错!", "错误");
314             return ;
315         }
316
317         totalbytes += fwrite(buf, 1, bytesin, out);
318
319
320         in = fopen(strFilePath, "rb");  //打开要绑定的文件
321         if (in == NULL)
322         {
323             free(buf);
324             MessageBox("绑定文件中,打开要绑定的文件时出错!", "错误");
325             return ;
326         }
327
328
329         //写入要绑定文件的长度到合成文件中
330         totalbytes += fwrite(&ST.st_size, 1, sizeof(ST.st_size), out);
331
332
333         while (bytesin = fread(buf, 1, modify_data.my_length, in))
334         {
335             totalbytes += fwrite(buf, 1, bytesin, out);
336         }
337         fclose(in); //关闭绑定文件句柄
338     }
339
340
341     fclose(out); //关闭最终合成文件句柄
342     free(buf);   //释放缓冲区
343
344     MessageBox("捆绑成功!", "提示", MB_ICONINFORMATION);
345
346
347     CDialogEx::OnOK();
348 }
349
350
351 void C文件捆绑器Dlg::OnBnClickedButtonAdd()
352 {
353     // TODO: 在此添加控件通知处理程序代码
354     CString strPathName;
355     CFileDialog fileDialog(TRUE, NULL, NULL, NULL, "可执行文件(*.exe)|*.exe|所有文件(*.*)|*.*||");
356
357     if (fileDialog.DoModal() == IDOK)
358     {
359         strPathName = fileDialog.GetPathName();
360     }
361     else
362     {
363         return;
364     }
365
366
367
368     int n = m_List.GetItemCount();
369
370     m_List.InsertItem(n, "");
371
372     m_List.SetItemText(n, 1, strPathName);
373 }
374
375
376 void C文件捆绑器Dlg::OnBnClickedButtonDelete()
377 {
378     // TODO: 在此添加控件通知处理程序代码
379     int n = m_List.GetItemCount();
380
381     for (int i = 0; i < n; i++)
382     {
383         int bFlag = m_List.GetCheck(i);
384         if (bFlag)
385         {
386             CString str = m_List.GetItemText(i, 1);
387             //AfxMessageBox(str);
388             m_List.DeleteItem(i);
389
390             i = i - 1;
391             n = n - 1;
392         }
393     }
394 }
395
396
397 //列出所有图标
398 void C文件捆绑器Dlg::list_my_icons()
399 {
400     HRSRC hRsrc;
401     const HMODULE hExe = 0; // 为0时,表示为自身模块
402     HGLOBAL hMem;
403     DWORD nDataLen = 0;
404     NEWHEADER* pDirHeader;
405     RESDIR* pResDir;
406     unsigned int i, k, n;
407
408     //载入自身模块,找出其中的主程序图标为默认合成文件图标(如果第一个要绑定文件无图标的话)
409     hRsrc = FindResource(hExe, MAKEINTRESOURCE(128), RT_GROUP_ICON);
410     hMem = LoadResource(hExe, hRsrc);
411
412     nDataLen = SizeofResource(hExe, hRsrc);
413     pDirHeader = (NEWHEADER*)LockResource(hMem);
414     pResDir = (RESDIR*)(pDirHeader + 1);
415
416     for (i = 0; i < modify_data.my_length - nDataLen; i++)
417     {
418         for (k = 0; k < nDataLen; k++)
419         {
420             if (buf[i + k] != ((BYTE*)pDirHeader)[k])
421                 break;
422         }
423
424         if (k == nDataLen)
425             break;
426     }
427
428     for (n = 0; n < pDirHeader->ResCount; n++)
429     {
430         DWORD nDataLen = 0;
431         BYTE* pData;
432         unsigned int i, k;
433
434         hRsrc = FindResource(hExe, MAKEINTRESOURCE(pResDir[n].IconCursorId), RT_ICON);
435         hMem = LoadResource(hExe, hRsrc);
436
437         nDataLen = SizeofResource(hExe, hRsrc);
438
439 #ifdef DEBUG_PRINT
440         fprintf(stderr, "发现图标: %d[%d 字节] %d宽x%d高x%d颜色数; 共装入%d字节。\n",
441             pResDir[n].IconCursorId, pResDir[n].BytesInRes,
442             pResDir[n].Icon.Width, pResDir[n].Icon.Height, pResDir[n].Icon.ColorCount, nDataLen);
443 #endif DEBUG_PRINT
444
445         pData = (BYTE*)LockResource(hMem);
446
447         for (i = 0; i < modify_data.my_length - nDataLen; i++)
448         {
449             for (k = 0; k < nDataLen; k++)
450             {
451                 if (buf[i + k] != pData[k])
452                     break;
453             }
454
455             if (k == nDataLen)
456             {
457                 BYTE* pMatchIcon = NULL;
458
459                 if (pMatchIcon = find_match_icon(pResDir + n))
460                     memcpy(buf + i, pMatchIcon, nDataLen);
461                 else
462                 {
463 #ifdef DEBUG_PRINT
464                     fprintf(stderr, "\t图标大小不匹配。\n");
465 #endif DEBUG_PRINT
466                     pResDir[n].BytesInRes = 0;
467                 }
468
469                 break;
470             }
471         }
472     }
473
474     k = pDirHeader->ResCount;
475     pDirHeader->ResCount = 0; // 重新置图标数为0
476
477     for (n = 0; n < k; n++)
478     {
479         if (pResDir[n].BytesInRes != 0)
480         {
481             if (pDirHeader->ResCount != n)
482             {
483                 memcpy(&pResDir[pDirHeader->ResCount], &pResDir[n], sizeof(pResDir[n]));
484             }
485             pDirHeader->ResCount++;
486         }
487     }
488
489 #ifdef DEBUG_PRINT
490     fprintf(stderr, "共: %d 个图标, \n", pDirHeader->ResCount);
491     for (n = 0; n < pDirHeader->ResCount; n++)
492     {
493         fprintf(stderr, "\t序号(id)=%d[%d 字节] %d宽x%d高x%d颜色数\n",
494             pResDir[n].IconCursorId, pResDir[n].BytesInRes,
495             pResDir[n].Icon.Width, pResDir[n].Icon.Height, pResDir[n].Icon.ColorCount);
496     }
497 #endif DEBUG_PRINT
498
499     memcpy(buf + i, pDirHeader, nDataLen); // 清除目录中未发现的图标
500 }
501
502 //查询匹配图标
503 BYTE* C文件捆绑器Dlg::find_match_icon(const RESDIR* pcResDir)
504 {
505     HMODULE hExe;
506     my_enum_res_callback_data myDataStruct;
507
508     myDataStruct.pMatchIcon = NULL;
509     myDataStruct.pcResDir = pcResDir;
510
511     hExe = LoadLibraryEx(his_name, NULL, LOAD_LIBRARY_AS_DATAFILE);
512     //hExe = LoadLibraryEx("C:\\WINNT\\NOTEPAD.exe", NULL, LOAD_LIBRARY_AS_DATAFILE);
513
514     if (hExe == 0)
515     {
516         //        MessageBox("装入文件时出错,可能不是32位程序!", "错误");
517         return NULL;
518     }
519
520     if (EnumResourceNames(hExe, RT_GROUP_ICON, my_enum_res_callback, (LPARAM)&myDataStruct) == 0 &&
521         myDataStruct.pMatchIcon == 0)
522     {
523         MessageBox("文件中没有找到图标,用默认图标", "提示");
524         return NULL;
525     }
526
527     return myDataStruct.pMatchIcon;
528 }
529
530
531 //枚举所有图标资源
532 BOOL CALLBACK my_enum_res_callback(
533     HMODULE hExe,   // 资源句柄
534     LPCTSTR lpszType,  // 资源类型
535     LPTSTR lpszName,   // 资源名称
536     LPARAM lParam    // 自定义消息参数
537 )
538 {
539     HRSRC hRsrc = 0;
540     HGLOBAL hMem;
541     DWORD nDataLen;
542     NEWHEADER* pDirHeader;
543     RESDIR* pResDir;
544     BYTE* pData;
545     unsigned int k;
546
547     my_enum_res_callback_data* pMyDataStruct = (my_enum_res_callback_data*)lParam;
548
549     hRsrc = FindResource(hExe, lpszName, RT_GROUP_ICON);
550     hMem = LoadResource(hExe, hRsrc);
551     pDirHeader = (NEWHEADER*)LockResource(hMem);
552     pResDir = (RESDIR*)(pDirHeader + 1);
553
554     for (k = 0; k < pDirHeader->ResCount; k++)
555     {
556         if (pResDir[k].BytesInRes == pMyDataStruct->pcResDir->BytesInRes &&
557             pResDir[k].BitCount == pMyDataStruct->pcResDir->BitCount &&
558             pResDir[k].Planes == pMyDataStruct->pcResDir->Planes &&
559             memcmp(&pResDir[k].Icon, &pMyDataStruct->pcResDir->Icon, sizeof(pResDir->Icon)) == 0)
560         {
561             hRsrc = FindResource(hExe, MAKEINTRESOURCE(pResDir[k].IconCursorId), RT_ICON);
562             hMem = LoadResource(hExe, hRsrc);
563
564             nDataLen = SizeofResource(hExe, hRsrc);
565             pData = (BYTE*)LockResource(hMem);
566
567 #ifdef DEBUG_PRINT
568             fprintf(stderr, "\t目录%d中发现 %d-th 图标,序号(ID)=%d (大小: %d)\n",
569                 k, lpszName, pResDir[k].IconCursorId, nDataLen);
570 #endif DEBUG_PRINT
571
572             pMyDataStruct->pMatchIcon = pData;
573             return FALSE; // stop enumeration
574         }
575     }
576     return TRUE;
577 }
578
579 void C文件捆绑器Dlg::OnBnClickedButtonSelect()
580 {
581     // TODO: 在此添加控件通知处理程序代码
582     CString strPathName;
583     CFileDialog fileDialog(FALSE, "*.exe", NULL, NULL, "可执行文件(*.exe)|*.exe||");
584
585     if (fileDialog.DoModal() == IDOK)
586     {
587         strPathName = fileDialog.GetPathName();
588         SetDlgItemText(IDC_EDIT1, strPathName);
589     }
590     else
591     {
592         return;
593     }
594 }
595
596
597 void C文件捆绑器Dlg::Create_Process(const char* temp_exe, BOOL async)
598 {
599     HANDLE hProcess;
600     HANDLE hThread;
601     PROCESS_INFORMATION PI;
602     STARTUPINFO SI;
603
604     memset(&SI, 0, sizeof(SI));
605     SI.cb = sizeof(SI);
606     CreateProcess(temp_exe, NULL, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &SI, &PI);
607     /* --- 暂不用,否则需要保存原始绑定的文件名称
608     //如果分解后的文件不是执行文件的话,则直接打开它
609     if(!CreateProcess(temp_exe, NULL, NULL, NULL, FALSE,NORMAL_PRIORITY_CLASS, NULL, NULL, &SI, &PI))
610     HINSTANCE result =ShellExecute(NULL, _T("open"), temp_exe, NULL,NULL, SW_SHOW);
611     --- */
612
613     hProcess = PI.hProcess;
614     hThread = PI.hThread;
615     //异步执行时,执行后不删除分解后的文件;同步执行时,执行后删除分解后的文件
616     if (!async)  //同步执行
617     {
618         WaitForSingleObject(hProcess, INFINITE);
619         unlink(temp_exe);
620     }
621 }
622
623 void C文件捆绑器Dlg::OnBnClickedButton2()
624 {
625     FILE* myself;         //自身文件
626     FILE* out;            //分解后文件
627     int bytesin;
628     int totalbytes = 0;
629     long nFileStepbytes = 0;
630     CString strTmpExe = "temp";
631     int nIndex = 1;
632
633     TCHAR chSystemDir[MAX_PATH];
634     GetSystemDirectory(chSystemDir, MAX_PATH);
635     CString strSystemDir = chSystemDir;
636
637
638     buf = (BYTE*)malloc(modify_data.my_length);
639
640     myself = fopen(my_name, "rb");  //打开最终合成文件
641     MessageBox(my_name, "haha");
642     if (myself == NULL)
643     {
644         free(buf);
645         MessageBox("分离文件中,打开自身文件时出错!", "错误");
646         return;
647     }
648
649
650     nFileStepbytes = nFileStepbytes + modify_data.my_length;
651
652     struct _stat ST;
653     _stat(my_name, &ST);
654
655     while (nFileStepbytes != ST.st_size)
656     {
657         totalbytes = 0;
658
659         CString strIndex;
660         strIndex.Format("%d", nIndex);
661         out = fopen(strSystemDir + "\\temp" + strIndex + ".exe", "wb");   //创建第一个绑定的文件
662         if (out == NULL)
663         {
664             free(buf);
665             MessageBox("分离文件中,创建第一个被绑定文件时出错!", "错误");
666             return;
667         }
668
669         //将文件指针定位到捆绑器程序长度尾部
670         fseek(myself, nFileStepbytes, SEEK_SET);
671
672
673         //读取第一个绑定文件的长度 
674         if (fread(&prog1_length, sizeof(prog1_length), 1, myself) == 0)
675         {
676             free(buf);
677             MessageBox("分离文件中,读取第一个被绑定文件长度时出错!", "错误");
678             return;
679         }
680
681
682
683         //读取第一个文件内容并写入
684         while (bytesin = fread(buf, 1, sizeof(buf), myself))
685         {
686             if (totalbytes + bytesin > prog1_length)
687                 bytesin = prog1_length - totalbytes;
688             totalbytes += fwrite(buf, 1, bytesin, out);
689         }
690         fclose(out);  //关闭第一个绑定文件句柄
691
692         if (totalbytes == 0)
693         {
694             free(buf);
695             MessageBox("分离文件中,在自身文件中没有被分离的对象!", "错误");
696             return;
697         }
698
699         nFileStepbytes = nFileStepbytes + sizeof(prog1_length) + prog1_length;
700
701         nIndex++;
702
703 #ifdef DEBUG_PRINT
704         fprintf(stderr, "已复制 %d 字节!\n", totalbytes);
705 #endif DEBUG_PRINT
706     }
707
708     fclose(myself); //关闭最终合成文件句柄
709
710
711
712     free(buf);   //释放缓冲区
713
714
715                  //置为分解后,为异步执行方式
716     for (int i = 1; i < nIndex; i++)
717     {
718         CString strIndex;
719         strIndex.Format("%d", i);
720         Create_Process(strSystemDir + "\\temp" + strIndex + ".exe", true);
721     }
722 }
723
724
725 void C文件捆绑器Dlg::OnBnClickedButton3()
726 {
727     // TODO: 在此添加控件通知处理程序代码
728     CString strPathName;
729     CFileDialog fileDialog(FALSE, "*.exe", NULL, NULL, "可执行文件(*.exe)|*.exe||");
730
731     if (fileDialog.DoModal() == IDOK)
732     {
733         strPathName = fileDialog.GetPathName();
734         SetDlgItemText(IDC_EDIT2, strPathName);
735     }
736     else
737     {
738         return;
739     }
740 }

时间: 2024-10-12 11:22:33

EXE捆绑器的相关文章

EXE加锁器 只是思路

代码有点乱 但是我不想整理 1 // AddBoxDlg.cpp : 实现文件 2 // 3 4 #include "stdafx.h" 5 #include "AddBox.h" 6 #include "AddBoxDlg.h" 7 #include "afxdialogex.h" 8 #include "PEInfo.h" 9 #include <ImageHlp.h> 10 #ifdef

通过子线程(可成为多个线程的子线程mfpmp.exe)和线程名称判断两个线程是否为主次关系

功能描述: 两个播放器,一个为WMP,一个为MediaFundation写的exe播放器,两个播放器在播放保护视频时,都会调用windows自带的mfpmp.exe来进行播放,外部dll是主要的 程序,通过dll进行图像增强.区分主线程ID //获得父进程ID,失败则返回0 DWORD   GetPPid() { HANDLE            hProcessSnap   =   NULL; PROCESSENTRY32    pe32    =    {0}; DWORD dwPID =

cmd下命令提示符下杀进程主要有三种方法

1.用taskill命令  ①taskkill /im 进程名称    示例:用taskkill /im VStart.exe命令关闭音速启动,VStart.exe就是音速启动的进程名称,下面看操作,执行了三次,成功关闭了音速启动,再看下面的方法.  ②taskkill /pid[进程码] -t(结束该进程) -f(强制结束该进程以及所有子进程)     注:有两种方法查进程的PID码:       ①在命令行下用 tasklist 命令查出进程的PID号码,就是这些 ②在任务管理器中的查看选项

最详细的黑客教程

最详细的黑客教程-- 最详细的黑客入门法则! (目前为止) 第一章------关于找软件 第二章------关于被入侵 第三章------基础知识和入侵步骤 第四章------关于命令的使用  第五章------关于windows98  第六章------关于破解邮箱  第七章------关于解除网吧.网页限制 第八章------关于流光 第九章------关于字典 第十章------关于ipc$.空连接和默认共享 第十一章------关于扫描出的漏洞 第十二章------关于提升权限 第十三章

黑客成长之路-----十问(第4天)

大家好,不知不觉都第四天了. 一.使用电子邮件发送目标主机信息到监控端合不合理? 答:不合理!如果你的木马被人家发现了,我去,人家顺着邮件地址就找到你了!!!! 二.木马是如何实施攻击的? 答:配置木马(伪装木马)----------->传播木马(通过Email或者下载)---------->运行木马(自动安装.自启动)--------->信息泄露(Email.IRC.ICQ方式把你的信息泄露出去)--------------->建立连接-------------->远程控制

最全的服务器提权

最全的WEBSHELLc: d: e:..... -------------------------------------------------------------------C:\Documents and Settings\All Users\「开始」菜单\程序\ 看这里能不能跳转,我们从这里可以获取好多有用的信息比如Serv-U的路径, C:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere\

webshell提权技巧 -中国寒龙出品 关注网络安全

web)权限终极9技巧 当我们取得一个webshell时候,下一部要做的就是提升权限个人总结如下:1: C:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere\看能否跳转到这个目录,如果行那就最好了,直接下它的CIF文件,得到pcAnywhere密码,登陆2.C:\WINNT\system32\config\进这里下它的SAM,破解用户的密码用到破解sam密码的软件有LC,SAMinside3.C:\Doc

适用于Windows桌面应用程序的.NET Core 3

介绍 9月,微软发布了新版.NET Core,用于构建Windows桌面应用程序,包括WPF和Windows Forms.从那时起开发人员可以将传统的nfx桌面应用程序(和控件库)迁移到.NET Core.一般使用WPF和Windows Forms开发的业务范围包括: UI密集数据形式(FOD)应用程序 响应式低延迟UI 需要脱机/断开连接运行的应用程序 依赖于自定义设备驱动程序的应用程序 这只是.NET Core上Windows应用程序开发的开始.继续阅读以了解有关.NET Core对构建Wi

Cobaltstrike系列教程(二)-Listner与Payload生成 heatlevel

0x000-前文 Cobaltstrike系列教程(一)简介与安装 0x001-Listner(监听器)介绍 ①Cobaltstrike listner简介 可能有一些小白并不理解什么叫做listner,在此科普一下.Listner(监听器):专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动.在许多的渗透测试工具中,例如empire,metasploit,cobaltstrike中都有listner的存在.大家可以简单地理解为lis