Консультация № 186010
12.05.2012, 12:38
95.44 руб.
0 4 1
Здравствуйте, уважаемые эксперты! У меня возникли сложности с таким вопросом:
Трeбуeтся нaписaть прoгрaмму нa C#, кoтoрaя oргaнизуeт прoвeрку нeсaнкциoнирoвaннoй мoдификaции exe-фaйлa слeдующим oбрaзoм: считывaeт чeтырeхбaйтoвoe слoвo в кoнцe фaйлa, сoдeржaщee сумму всeх бaйтoв этoгo фaйлa пo mоd 232 и срaвнивaeт eгo сoдeржимoe с рeaльнoй суммoй.

Обсуждение

Неизвестный
12.05.2012, 22:10
общий
это ответ
Здравствуйте, Alex12!
Программа. Без проверки корректности структуры самого .exe файла.
Код:
using System;
using System.IO;
using System.Reflection;

namespace Application
{
class MainClass
{
public static void Main (string[] args)
{
// Имя файла для проверки передается в качестве аргумента коммандной строки
// Если ничего не передано - вывести информацию об использовании
if (args.Length == 0) {
usage ();
} else {
// Перебор аргументов коммандной строки
foreach (string file in args) {
try {
// Проверка файла
checkFile (file);
} catch (Exception ex) {
Console.WriteLine ("При проверке файла({0}) возникло исключение: {1}", file, ex.Message);
}
}
}
}

// Имя исполняемого файла сборки
private static readonly string programFile = Path.GetFileName (Assembly.GetEntryAssembly ().Location);

// Выводит информацию об использовании
private static void usage ()
{
Console.WriteLine ("Использовать: {0} [имя файла] [имя файла] ...", programFile);
}

private const short sumLength = 4;

// Проверка файла
private static void checkFile (string path)
{
// Открытие потока в режиме чтения двоичных данных
using (Stream stream = new FileStream (path, FileMode.Open, FileAccess.Read))
using (BinaryReader binaryReader = new BinaryReader (stream)) {
long length = stream.Length;
if (length < 4) {
throw new Exception (string.Format ("Длина файла менее {0}х байт", sumLength));
}
// Установим указатель на контрольную сумму
stream.Seek (-sumLength, SeekOrigin.End);
// Читаем контрольную сумму
UInt32 orig = binaryReader.ReadUInt32 ();
Console.WriteLine ("Сохраненная сумма(последние {1} байта файла): 0x{0:X8}", orig, sumLength);
// Установим указатель на начало
stream.Seek (0, SeekOrigin.Begin);
// Сумма
UInt32 sum = 0;
Console.WriteLine ("Длина файла:{0}", length);
try {
while (length-- > sumLength) {
// Читаем и суммируем
sum += binaryReader.ReadByte ();
}
} catch (EndOfStreamException) {
}
Console.WriteLine ("Посчитана сумма: 0x{0:X8} (суммы {1}совпадают)", sum, sum == orig ? "" : "не ");
}
}
}
}

Имя проверяемого .exe файла должно передаваться программе в виде параметра коммандной строки.
Пример работы:
Код:
>186010.exe C:\Windows\System32\csrss.exe 
Сохраненная сумма(последние 4 байта файла): 0x00000000
Длина файла:7680
Посчитана сумма: 0x0005CC66 (суммы не совпадают)
5
Неизвестный
13.05.2012, 12:29
общий
Большое спасибо, Micren!
А где можно найти exе-файлы, у которых эти суммы сoвпaдaют?
Неизвестный
13.05.2012, 13:02
общий
По условию задачи они как бы уже должны быть.
Неизвестный
13.05.2012, 14:20
общий
А, ясно, задание сделать такие файлы присутствует в методичке, только у другого варианта. Спасибо.
Форма ответа