68 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C++
		
	
	
	
		
		
			
		
	
	
			68 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C++
		
	
	
	
|  | //////////////////////////////////////////////////////////////////////////////
 | ||
|  | //
 | ||
|  | //  Unit Test Image Corruptor (corruptor.cpp of unittests.exe)
 | ||
|  | //
 | ||
|  | //  Microsoft Research Detours Package
 | ||
|  | //
 | ||
|  | //  Copyright (c) Microsoft Corporation.  All rights reserved.
 | ||
|  | //
 | ||
|  | #include "windows.h"
 | ||
|  | #include "corruptor.h"
 | ||
|  | 
 | ||
|  | ImageCorruptor::ImageCorruptor(PIMAGE_DOS_HEADER Header) | ||
|  | { | ||
|  |     m_TargetDosHeader = Header; | ||
|  |     m_OriginalDosHeader = *Header; | ||
|  |     m_OriginalDosProtection = 0; | ||
|  |     m_TargetNtHeaders = (PIMAGE_NT_HEADERS)((PBYTE)Header + Header->e_lfanew); | ||
|  |     m_OriginalNtHeaders = *m_TargetNtHeaders; | ||
|  |     m_OriginalNtProtection = 0; | ||
|  | 
 | ||
|  |     VirtualProtect( | ||
|  |             m_TargetDosHeader, | ||
|  |             sizeof(*m_TargetDosHeader), | ||
|  |             PAGE_READWRITE, | ||
|  |             &m_OriginalDosProtection); | ||
|  | 
 | ||
|  |     VirtualProtect( | ||
|  |             m_TargetNtHeaders, | ||
|  |             sizeof(*m_TargetNtHeaders), | ||
|  |             PAGE_READWRITE, | ||
|  |             &m_OriginalNtProtection); | ||
|  | } | ||
|  | 
 | ||
|  | ImageCorruptor::~ImageCorruptor() | ||
|  | { | ||
|  |     // Restore original header contents.
 | ||
|  |     //
 | ||
|  |     *m_TargetDosHeader = m_OriginalDosHeader; | ||
|  |     *m_TargetNtHeaders = m_OriginalNtHeaders; | ||
|  | 
 | ||
|  |     // Restore original protection of DOS header.
 | ||
|  |     //
 | ||
|  |     DWORD OldProtection {}; | ||
|  |     VirtualProtect( | ||
|  |             m_TargetDosHeader, | ||
|  |             sizeof(*m_TargetDosHeader), | ||
|  |             m_OriginalDosProtection, | ||
|  |             &OldProtection); | ||
|  | 
 | ||
|  |     // Restore original protection of NT headers.
 | ||
|  |     //
 | ||
|  |     VirtualProtect( | ||
|  |             m_TargetNtHeaders, | ||
|  |             sizeof(*m_TargetNtHeaders), | ||
|  |             m_OriginalNtProtection, | ||
|  |             &OldProtection); | ||
|  | } | ||
|  | 
 | ||
|  | void ImageCorruptor::ModifyDosMagic(WORD Value) | ||
|  | { | ||
|  |     m_TargetDosHeader->e_magic = Value; | ||
|  | } | ||
|  | 
 | ||
|  | void ImageCorruptor::ModifyNtSignature(ULONG Value) | ||
|  | { | ||
|  |     m_TargetNtHeaders->Signature = Value; | ||
|  | } |