All pastes #114058 Raw Edit

Miscellany

public text v1 · immutable
·published 2006-08-03 21:50 UTC
rendered paste body
#include <iostream>
#include <windows.h>
#include <fstream>
using namespace std;

int main()
{
	cout << "=== Analyzing ArrayScramble.exe ===" << endl;
	fstream inFile;
	ofstream oFile;

	// Hold DOS header
	IMAGE_DOS_HEADER img_dos_header;
	// Hold File header
	IMAGE_FILE_HEADER img_file_header;
	// "Optional" header
	IMAGE_OPTIONAL_HEADER img_opt_header;

	inFile.open("ArrayScramble.exe", ios::binary | ios::ate | ios::in | ios::out);
	if (!inFile.is_open())
	{
		cout << "Failed to open executable." << endl;
		goto quit;
	}

	inFile.seekg(0, ios::beg);
	inFile.read(reinterpret_cast<char *>(&img_dos_header), sizeof(IMAGE_DOS_HEADER));
	if (img_dos_header.e_magic != IMAGE_DOS_SIGNATURE)
	{
		cout << "PE format not recognized." << endl;
		goto quit;
	}

	inFile.seekg(img_dos_header.e_lfanew, ios::beg);
	long type;
	inFile.read(reinterpret_cast<char *>(&type), 4);
	if (type != IMAGE_NT_SIGNATURE)
	{
		cout << "PE Signature not recognized." << endl;
		goto quit;
	}

	inFile.read(reinterpret_cast<char *>(&img_file_header), sizeof(IMAGE_FILE_HEADER));

	cout << "Target CPU: ";
	if (img_file_header.Machine == IMAGE_FILE_MACHINE_I386)
		cout << "I386";
	else if (img_file_header.Machine == IMAGE_FILE_MACHINE_IA64)
		cout << "IA64";
	else
		cout << "Unknown";
	cout << endl;

	cout << "Type: ";
	if (img_file_header.Characteristics & IMAGE_FILE_DLL)
		cout << "DLL";
	else if (img_file_header.Characteristics & IMAGE_FILE_EXECUTABLE_IMAGE)
		cout << "EXE";
	else
		cout << "Unknown";
	cout << endl;

	inFile.read(reinterpret_cast<char *>(&img_opt_header), sizeof(IMAGE_OPTIONAL_HEADER));
	cout << "Subsystem: ";
	switch (img_opt_header.Subsystem)
	{
		case IMAGE_SUBSYSTEM_WINDOWS_GUI:
			cout << "Windows";
			break;
		case IMAGE_SUBSYSTEM_WINDOWS_CUI:
			cout << "Console";
			break;
		case IMAGE_SUBSYSTEM_NATIVE:
			cout << "Native";
			break;
	}
	cout << endl;

	int img_section_start = static_cast<int>(inFile.tellg());
	// Read in sections ^_^
	IMAGE_SECTION_HEADER *img_section_hdrs = new IMAGE_SECTION_HEADER[img_file_header.NumberOfSections];
	for (int i = 0; i < img_file_header.NumberOfSections; i++)
	{
		inFile.read(reinterpret_cast<char *>(&img_section_hdrs[i]), sizeof(IMAGE_SECTION_HEADER));
	}

	char *codeData;

	cout << "Sections: " << endl;
	for (int i = 0; i < img_file_header.NumberOfSections; i++)
	{
		cout << "\t" << img_section_hdrs[i].Name << endl;
		if (img_section_hdrs[i].Characteristics & IMAGE_SCN_CNT_CODE)
		{
			cout << "\t\t" << "CODE SECTION! Length: " << img_section_hdrs[i].SizeOfRawData << endl;

			codeData = new char[img_section_hdrs[i].SizeOfRawData];
			inFile.seekg(img_section_hdrs[i].PointerToRawData, ios::beg);
			inFile.read(codeData, img_section_hdrs[i].SizeOfRawData);

			oFile.open("test.txt", ios::binary | ios::out | ios::trunc);
			oFile.write(codeData, img_section_hdrs[i].SizeOfRawData);
			oFile.close();
		}
	}

	delete[] img_section_hdrs;
	delete[] codeData;

	inFile.close();

quit:
	system("pause");
	return 0;
}