Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Адрес начала программы


Автор: caliphornia 8.5.2011, 12:00
Как в программе на С++ получить адрес начала этой программы в памяти, то место где располагается первая инструкция кода программы

Автор: volatile 8.5.2011, 12:14
Код

int main ()
{
   printf("%p\n", main);
}

Но это адрес мэйн. До него еще выполняется стартап из CRT.
Если хотите получить адрес вообще первой инструкции, то нужно парсить PE заголовок екзешника.
там есть поле точка входа, или entry point по-русски smile 

только зачем вам это надо?

Автор: caliphornia 8.5.2011, 12:37
а в приложениях Cbuilder какую функцию использовать?

Автор: volatile 8.5.2011, 13:09
Цитата(caliphornia @  8.5.2011,  12:37 Найти цитируемый пост)
 в приложениях Cbuilder какую функцию использовать? 

какую функцию. там вообще нет никаких функций.
main - это и есть указатель на функцию main.
void * p = main;
а уж вывести значение p можете куда угодно.

Автор: 500mhz 8.5.2011, 13:23
#include <imagehlp.h>
и там вообше то все описано

Автор: EvilsInterrupt 8.5.2011, 14:16
caliphornia, 
Тебе следует понять что ты хочешь получить?

1) если адрес main() , то как уже выше писали
2) Если же EntryPoint, т.е. стартового кода, который настраивает с++ программу(rtti, heap, вызов main() и др.), то :
Код

   // Справедливо для Win программ
   IMAGE_DOS_HEADER* pDos = (IMAGE_DOS_HEADER*)(адрес загрузки модуля);
   IMAGE_NT_HEADERS * pNTHeaders = (IMAGE_NT_HEADERS *)pDos->e_lfanew + (адрес загрузки модуля);
   void * pEntryPoint = pNTHeaders->OptionalHeader.AddressOfEntryPoint;


Автор: caliphornia 8.5.2011, 14:42
задача стоит в том чтобы проверять исполняемый код на целостность(контрольная сумма), а для этого надо вначале получить этот самый код.

Автор: YDean 8.5.2011, 17:35
Адрес начала программы совпадает со значением hInstance.
Обычно, равен 0x400000 для exe.

Автор: Artemon 8.5.2011, 21:41
caliphornia,  подозреваю что пытаетесь сделать какую-то защиту от взлома для программы, если так, то ваша задумка провальна уже на этом этапе  smile 

Автор: 500mhz 9.5.2011, 10:10
не проше ли сделать CRC всего ехешника а?

Автор: caliphornia 9.5.2011, 10:19
Цитата(Artemon @ 8.5.2011,  21:41)
caliphornia,  подозреваю что пытаетесь сделать какую-то защиту от взлома для программы, если так, то ваша задумка провальна уже на этом этапе  smile

вообще зачем вы это написали???я же не просил высказать свое мнение по этому поводу, вопрос был четко поставлен, и я ожидал ответы по существу вопроса, мы же не в курилке находимся, что бы обсуждать что провалено а что нет...Если есть что добавить  буду благодарен, а такие сообщения писать не надо , только время тратить.

Автор: volatile 10.5.2011, 00:15
caliphornia, я когда-то у Криса Касперского читал, что-то типа того.
щас поищу..

вот вроде бы нашел:
http://www.xakep.ru/magazine/xs/057/080/3.asp


Автор: Earnest 10.5.2011, 09:25
Цитата(caliphornia @  9.5.2011,  11:19 Найти цитируемый пост)
Если есть что добавить

Если ты намерен проверять образ, загруженный в память, то не забудь о такой мелочи, как фиксапы или базовые поправки. Это когда модуль загружается не по стандартному адресу, что почти всегда бывает с DLL. Фиксапы существенно меняют код, так что контрольная сумма меняется. Тут нужно либо учитывать поправки, что весьма геморройно. Или загружать по фиксированному адресу, что надежно только для exe.
А если проверять образ на диске, то проще посчитать CRC прямо по файлу, как уже было сказано. Но если это для защиты, то способ так себе, от первоклассников. 

Автор: caliphornia 10.5.2011, 19:35
огромное всем спасибо за помощь, теперь разобрался)))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)