compressdlg.cpp

来自「一些初级的网络编程」· C++ 代码 · 共 1,352 行 · 第 1/3 页

CPP
1,352
字号
// CompressDlg.cpp : implementation file
//

#include "stdafx.h"
#include "bambam.h"
#include "CompressDlg.h"
#include "OptionsDlg.h"

#include "perealign.h"
#include "peutils.h"

#include "..\aPLib-0.42\lib\mscoff\aplib.h"
#include "..\stub\gev.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define VERSION 0.02

DWORD dwNewResourceSize = 0;
GLOBAL_EXTERNAL_VARS gev = { 0 };

/////////////////////////////////////////////////////////////////////////////
// CCompressDlg dialog


CCompressDlg::CCompressDlg(CWnd* pParent /*=NULL*/)
	: CTexturedDlg(CCompressDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CCompressDlg)
	m_SourceFile = _T("");
	m_CompressionProgress = _T("");
	m_FileSize = _T("");
	//}}AFX_DATA_INIT
}


void CCompressDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CCompressDlg)
	DDX_Control(pDX, IDC_COMP_SIZE, m_ctrlCompessedSize);
	DDX_Control(pDX, IDC_COMP_PROGRESS, m_ctrlCompressionProgress);
	DDX_Text(pDX, IDC_SOURCE_FILE, m_SourceFile);
	DDX_Text(pDX, IDC_COMP_PROG, m_CompressionProgress);
	DDX_Text(pDX, IDC_FILE_SIZE, m_FileSize);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CCompressDlg, CDialog)
	//{{AFX_MSG_MAP(CCompressDlg)
	ON_BN_CLICKED(IDC_BROWSE, OnBrowse)
	ON_BN_CLICKED(IDC_EXIT, OnExit)
	ON_BN_CLICKED(IDC_COMPRESS, OnCompress)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CCompressDlg message handlers

void CCompressDlg::OnBrowse() 
{
	OPENFILENAME ofn;
	char szFile[_MAX_PATH] = {0};

	// Initialize OPENFILENAME
	ZeroMemory(&ofn, sizeof(ofn));
	ofn.lStructSize = sizeof(ofn);
	ofn.hwndOwner = this->GetSafeHwnd();
	ofn.lpstrFile = szFile;


	ofn.lpstrFile[0] = '\0';
	ofn.nMaxFile = _MAX_PATH;
	ofn.lpstrFilter = "All\0*.*\0Executables\0*.EXE\0";
	ofn.nFilterIndex = 1;
	ofn.lpstrFileTitle = NULL;
	ofn.nMaxFileTitle = 0;
	ofn.lpstrInitialDir = NULL;
	ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;

	// open file dialog
	if(GetOpenFileName(&ofn))
	{
		m_CompressionProgress = "";
		m_ctrlCompressionProgress.SetPos(0);
		
		m_FileSize = "";
		m_ctrlCompessedSize.SetPos(0);

		m_SourceFile = ofn.lpstrFile;
	}

	UpdateData(FALSE);
}

void CCompressDlg::OnExit() 
{
	ExitProcess(0);
}

int CCompressDlg::Encrypt(char* szFile)
{
	HANDLE hFile;
	HANDLE hMapping;
	LPVOID lpMapping;

	HANDLE hBackupFile;
	HANDLE hBackupMapping;
	LPVOID lpBackupMapping;

	DWORD dwOldOEP = 0;
	DWORD dwFullOnKey = 0;
	DWORD dwRetSec = 0;
	DWORD dwAlignment = 0;

	DWORD dwOrigSize = 0;
	DWORD dwNewSize = 0;

	char szInput[_MAX_PATH] = {0};
	char szBackup[_MAX_PATH] = {0};

	if(m_pOptionsDlg->m_Backup == TRUE)
	{
		strcpy(szInput, szFile);
		sprintf(szBackup, "%s.bak", szInput);
		CopyFile(szFile, szBackup, FALSE);
	}

	// create temp backup
	char szTempPath[_MAX_PATH] = {0};
	char szTempFile[_MAX_PATH] = {0};

	GetTempPath(_MAX_PATH, szTempPath);
	GetTempFileName(szTempPath, "bam", 0, szTempFile);

	CopyFile(szFile, szTempFile, FALSE);

	// open target
	hFile = CreateFile(szFile, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0);
	
	if(hFile == INVALID_HANDLE_VALUE)
	{
		MessageBox("Invalid file handle", 0, MB_OK | MB_ICONERROR);
		return 1;
	}
	
	DWORD dwSizeToMap = GetFileSize(hFile, 0);
	dwOrigSize = dwSizeToMap;
	dwSizeToMap = dwSizeToMap * 2;

	hMapping = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, dwSizeToMap, 0);
	
	if(hMapping == NULL)
	{
		MessageBox("Invalid handle for file mapping", 0, MB_OK | MB_ICONERROR);
		return 1;
	}

	lpMapping = MapViewOfFile(hMapping, FILE_MAP_ALL_ACCESS, 0, 0, dwSizeToMap);


	if(lpMapping == NULL)
	{
		MessageBox("Invalid pointer for mapping", 0, MB_OK | MB_ICONERROR);
		return 1;
	}

	// open backup
	hBackupFile = CreateFile(szTempFile, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0);
	
	if(hBackupFile == INVALID_HANDLE_VALUE)
	{
		MessageBox("Invalid backup file handle", 0, MB_OK | MB_ICONERROR);
		return 1;
	}
	
	hBackupMapping = CreateFileMapping(hBackupFile, NULL, PAGE_READWRITE, 0, 0, 0);
	
	if(hBackupMapping == NULL)
	{
		MessageBox("Invalid handle for backup file mapping", 0, MB_OK | MB_ICONERROR);
		return 1;
	}
	
	lpBackupMapping = MapViewOfFile(hBackupMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0);
	
	if(lpBackupMapping == NULL)
	{
		MessageBox("Invalid pointer for backup mapping", 0, MB_OK | MB_ICONERROR);
		return 1;
	}
	
	if(m_pOptionsDlg->m_Realign == TRUE)
	{
		dwNewSize = RealignPE(lpMapping, dwOrigSize);
		
		// realign backup also, so sections match
		RealignPE(lpBackupMapping, dwOrigSize);
	}

	if(m_pOptionsDlg->m_StripReloc == TRUE)
	{
		dwNewSize = StripReloc(lpMapping);
	}

	// open stub from resource
	DWORD dwWritten;
	LPVOID lpBuf;
	LPVOID lpStubMapping;
	HRSRC hRes = 0;
	HGLOBAL hResLoad = 0;
	hRes = FindResource(0, MAKEINTRESOURCE(IDR_STUB), "BINARY"); 
	hResLoad = LoadResource(0, hRes);
	lpStubMapping = LockResource(hResLoad);
	
	// Compress target sections
	try
	{
		CompressSections(lpMapping, lpBackupMapping);
	}
	catch(...)
	{
		MessageBox("Fatal error during compression", 0, MB_OK | MB_ICONERROR);

		// unmap backup
		UnmapViewOfFile(lpBackupMapping);
		CloseHandle(hBackupMapping);	
		CloseHandle(hBackupFile);
		DeleteFile(szTempFile);

		// unmap target
		UnmapViewOfFile(lpMapping);
		CloseHandle(hMapping);	
		CloseHandle(hFile);

		if(m_pOptionsDlg->m_Backup == TRUE)
		{
			DeleteFile(szFile);
			MoveFile(szBackup, szFile);
		}

		return -1;
	}
	
	DWORD dwKatSup;
	DWORD dwSecStart;
	WORD wNumSections;
	WORD wSizeO;
	LONG lJmp;

	PIMAGE_DOS_HEADER pStubDosHdr;
	PIMAGE_NT_HEADERS pStubNtHdr;
	PIMAGE_SECTION_HEADER pStubSecHdr;

	DWORD dwStubEntryPoint = 0;
	DWORD dwPointerToStubRawData = 0;
	DWORD dwStubSecStart = 0;

	pStubDosHdr = (PIMAGE_DOS_HEADER) lpStubMapping;
	
	lJmp = pStubDosHdr->e_lfanew; // oh yeh and we already checked sig shit so fuck off.

	dwKatSup = (DWORD) lpStubMapping;
	
	dwKatSup += lJmp;

	pStubNtHdr = (PIMAGE_NT_HEADERS) dwKatSup;

	dwStubEntryPoint = pStubNtHdr->OptionalHeader.AddressOfEntryPoint - pStubNtHdr->OptionalHeader.BaseOfCode;

	wNumSections = pStubNtHdr->FileHeader.NumberOfSections;
	wSizeO = pStubNtHdr->FileHeader.SizeOfOptionalHeader;
	
	dwStubSecStart = (DWORD) pStubNtHdr;
	dwStubSecStart += 24;
	dwStubSecStart += wSizeO;
	
	pStubSecHdr = (PIMAGE_SECTION_HEADER)dwStubSecStart;
	
	DWORD dwStubSize = SizeofResource(0, hRes);
	
	lpBuf = malloc(dwStubSize);
	memset(lpBuf, 0, dwStubSize);
	// copy stub data
	memcpy(lpBuf, lpStubMapping, dwStubSize);
	
	PIMAGE_DOS_HEADER pDosHdr;
	PIMAGE_NT_HEADERS pNtHdr;
	PIMAGE_SECTION_HEADER pSecHdr;
	IMAGE_SECTION_HEADER SecHdr;
	int i = 0;
	
	pDosHdr = (PIMAGE_DOS_HEADER) lpMapping;
	
	lJmp = pDosHdr->e_lfanew; // oh yeh and we already checked sig shit so fuck off.
	
	dwKatSup = (DWORD) lpMapping;
	
	dwKatSup += lJmp;
	
	pNtHdr = (PIMAGE_NT_HEADERS) dwKatSup;
	
	dwOldOEP = pNtHdr->OptionalHeader.AddressOfEntryPoint;
	
	wNumSections = pNtHdr->FileHeader.NumberOfSections;
	wSizeO = pNtHdr->FileHeader.SizeOfOptionalHeader;

	dwSecStart = (DWORD) pNtHdr;
	dwSecStart += 24;
	dwSecStart += wSizeO;
	
	dwSecStart += (wNumSections * 0x28);
	dwSecStart -= 0x28;
	
	pSecHdr = (PIMAGE_SECTION_HEADER) dwSecStart;
	
	DWORD dwRvaStart;
	DWORD dwPointerStar;
	DWORD dwSizeOfRawz;
	DWORD dwPointerNew;
	char szSecName[9] = {0};
	DWORD dwVirtSizeNew;

	strcpy(szSecName, m_pOptionsDlg->m_SectionName);

	dwVirtSizeNew = CalcStubSize(pStubDosHdr);
	
	dwRvaStart = pSecHdr->VirtualAddress + pSecHdr->Misc.VirtualSize;
		
	dwPointerStar = pSecHdr->PointerToRawData;
	dwSizeOfRawz = pSecHdr->SizeOfRawData;
	
	dwPointerNew = dwPointerStar + dwSizeOfRawz; // a place to inject
	
	DWORD dwStubRvaStart = dwRvaStart;
	
	lstrcpyn( (LPSTR) &SecHdr.Name, (LPSTR) &szSecName, sizeof(szSecName));
	
	pSecHdr = (PIMAGE_SECTION_HEADER) &SecHdr;
	
	SecHdr.Misc.VirtualSize = ValidAlignment(dwVirtSizeNew, 0x1000);

	SecHdr.VirtualAddress = dwRvaStart;
	SecHdr.PointerToRawData = dwPointerNew;
	SecHdr.SizeOfRawData = ValidAlignment(dwVirtSizeNew, 0x200);
	SecHdr.Characteristics = 0xC0000040;
	
	dwSecStart += 0x28;
	
	memcpy( (void *) dwSecStart, &SecHdr, 0x28);
	
	pNtHdr->OptionalHeader.AddressOfEntryPoint = dwRvaStart + dwStubEntryPoint;
	pNtHdr->OptionalHeader.SizeOfImage = SecHdr.VirtualAddress + ValidAlignment(SecHdr.Misc.VirtualSize, pNtHdr->OptionalHeader.SectionAlignment);;
	pNtHdr->FileHeader.NumberOfSections += 1;
	
	// update some values in lpBuf
	// stub section info
	DWORD dwNumberOfStubSections = 0;
	DWORD dwSectionCount = 0;
	dwNumberOfStubSections = pStubNtHdr->FileHeader.NumberOfSections;

	BOOL fGevFound = FALSE;
	BOOL fCodeFound = FALSE;
	BOOL fImportsFound = FALSE;

	pStubSecHdr = (PIMAGE_SECTION_HEADER)dwStubSecStart;

	// fix code addresses
	for(dwSectionCount = 0; dwSectionCount < dwNumberOfStubSections; dwSectionCount++)
	{
		if(strcmp((char*)pStubSecHdr->Name, ".text") != 0)
		{
			pStubSecHdr++;
		}
		else
		{
			fCodeFound = TRUE;
			break;
		}
	}	

	dwPointerToStubRawData = pStubSecHdr->PointerToRawData;

	if(fCodeFound)
	{
		PIMAGE_SECTION_HEADER pSectionTemp;

		pSectionTemp = pStubSecHdr;

		PerformStubRelocations(lpBuf, dwStubRvaStart + pNtHdr->OptionalHeader.ImageBase);
	}

	// find stub imports
	pStubSecHdr = (PIMAGE_SECTION_HEADER)dwStubSecStart;

	// fix thunks in stub
	for(dwSectionCount = 0; dwSectionCount < dwNumberOfStubSections; dwSectionCount++)
	{
		if(strcmp((char*)pStubSecHdr->Name, ".rdata") != 0)
		//if(strcmp((char*)pStubSecHdr->Name, ".a") != 0)
		{
			pStubSecHdr++;
		}
		else
		{
			fImportsFound = TRUE;
			break;
		}
	}	

	if(fImportsFound)
	{
		// temp
		IMAGE_IMPORT_DESCRIPTOR* pIID = 0;
		IMAGE_THUNK_DATA* pThunk = 0;

		// translate thunk values
		TranslateAddresses((BYTE*)((DWORD)lpBuf + pStubSecHdr->PointerToRawData),
							pStubSecHdr->SizeOfRawData,
							pStubSecHdr->VirtualAddress,
							dwStubRvaStart + (pStubSecHdr->PointerToRawData - dwPointerToStubRawData),	//dwPointerToStubRawData
							pStubSecHdr->VirtualAddress);
	}

	// point PE header at stub IAT
	DWORD dwOriginalIAT = pNtHdr->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;
	DWORD dwTemp = (pStubNtHdr->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress & 0x000000ff);
	pNtHdr->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress = dwStubRvaStart + (pStubSecHdr->PointerToRawData - dwPointerToStubRawData) + dwTemp;	//dwPointerToStubRawData
	pNtHdr->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size = pStubNtHdr->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size;

	// wipe IAT
	pNtHdr->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IAT].VirtualAddress = 0;
	pNtHdr->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IAT].Size = 0;


	// end find stub iat

	// find global external vars
	pStubSecHdr = (PIMAGE_SECTION_HEADER)dwStubSecStart;

	GlobalExternalVars* pgev;

	for(dwSectionCount = 0; dwSectionCount < dwNumberOfStubSections; dwSectionCount++)
	{
		if(strcmp((char*)pStubSecHdr->Name, ".a") != 0)
		{

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?