Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.11.2010, 23:27   #1
Napkin
Пользователь
 
Аватар для Napkin
 
Регистрация: 09.12.2009
Сообщений: 25
По умолчанию Подсчет контрольной суммы кода между метками

Необходимо определить контрольную сумму кода между двумя метками.
Код:
int __declspec(naked) ReadAddrNext(void)
{
	__asm
	{
		mov EAX, [ESP]
		RET
	};
};

int __declspec(naked) ReadAddrPrev(void)
{
	__asm
	{
		mov EAX, [ESP]
		sub EAX, 5
		RET
	};
};

int _tmain(int argc, _TCHAR* argv[])
{
	int a, b, c;
	void *Addr1;
	void *Addr2;

	Addr1 = (void*)ReadAddrNext();
Label1:
	a = 200;
	b = 100;
	c = a - b;
Label2:
	Addr2 = (void*)ReadAddrPrev();

        printf("%d - %d = %d\n", a, b, c);

	fflush(stdin);
	getchar();
	return 0;
}

несложно подсчитать разность между адресами меток (1А hex). является ли это контрольной суммой??
Изображения
Тип файла: jpg prt.jpg (267.1 Кб, 131 просмотров)
Удел сильных - уделывать слабых

Последний раз редактировалось Napkin; 10.11.2010 в 23:29. Причина: изображение
Napkin вне форума Ответить с цитированием
Старый 11.11.2010, 07:29   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
является ли это контрольной суммой??
Может стоит начать с определения понятия КС? Потом подумать отличаются ли понятия: расстояние между двумя камешками и состав почвы между ними...
p51x вне форума Ответить с цитированием
Старый 11.11.2010, 10:03   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
является ли это контрольной суммой??
Нет. Для рассчета контрольной суммы используется функция CheckSumMappedFile.
Чти про нее в MSDN.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.11.2010, 18:54   #4
Napkin
Пользователь
 
Аватар для Napkin
 
Регистрация: 09.12.2009
Сообщений: 25
По умолчанию

и каким образом можно кхм.. спроецировать в память участок кода между метками, чтобы передать его в качестве первого параметра в CheckSumMappedFile??
или же правильным вариантом будет открыть PE файл, как-то определить необходимое смещение и потом уже.. не понимаю :[

Код:
char fileName[MAX_PATH];
HANDLE hFile;

GetModuleFileName(NULL,fileName,MAX_PATH);
hFile = CreateFile(fileName, GENERIC_READ, FILE_SHARE_READ,
                         NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL |
                         FILE_FLAG_SEQUENTIAL_SCAN, NULL);
SetFilePointer(hFile, ??????????, NULL, FILE_BEGIN);
что здесь можно сделать? если бы контрольную сумму всего файла надо было определить, проблем не возникло бы.. но вот между метками.. мм
Удел сильных - уделывать слабых

Последний раз редактировалось Stilet; 14.11.2010 в 20:38.
Napkin вне форума Ответить с цитированием
Старый 14.11.2010, 20:47   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я не знаю как его в Си использовать, я просто знаю что эта функция позволяет определить контрольную сумму участка памяти - в ее парамерт BaseAddress передается адрес на этот участок. Я ее использовал для рассчета контрольной суммы строки в Делфи

т.е. в Си должно быть что-то в этом роде:
Код:
// fsdf.cpp: определяет точку входа для консольного приложения.
//

#include "stdafx.h"
#include <ImageHlp.h>

int _tmain(int argc, _TCHAR* argv[])
{
	int a, b, c;
	void *Addr1;
	void *Addr2;

Label1:
	a = 200;
	b = 100;
	c = a - b;
Label2:
  int hs,cs;

  CeckSumMappedFile(Label1,Label2-Label1,&hs,&cs);
        printf("%d - %d = %d\n", a, b, c);

	fflush(stdin);
	getchar();

	return 0;
}
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.11.2010, 18:54   #6
guz
Пользователь
 
Регистрация: 29.10.2010
Сообщений: 29
По умолчанию

Мне кажется, что метки нельзя использовать там же, где и адреса.
Надо сперва получить значения их адресов.
Например в gcc это делается унарным оператором &&:

Код:
#include <gcrypt.h>

char digest[16];

Label1:
	a = 200;
	b = 100;
	c = a - b;
Label2:

gcry_md_hash_buffer (GCRY_MD_MD5, digest, &&Label1, &&Label2 - &&Lable1);
guz вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Интересный пример для расчёта контрольной суммы. ATAMAN200 Общие вопросы C/C++ 0 05.10.2010 19:17
Нужно вычислить алгоритм подсчета контрольной суммы строки Walter Reed Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 30.01.2010 19:53
Помогите с алгоритмом для расчёта контрольной суммы Andrej_Svininykh Общие вопросы по Java, Java SE, Kotlin 0 17.10.2008 21:17
Алгоритм вычисления контрольной суммы файлов young_W Общие вопросы Delphi 2 11.09.2007 22:22