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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 31.12.2010, 21:49   #1
epileptick
 
Регистрация: 03.10.2010
Сообщений: 6
По умолчанию Данные из памяти сторонней программы

Итак, мне нужно написать программу, которая получает данные из ячейки памяти сторонней программы
пишу в rad studio

Код:
HWND wnd = FindWindow(NULL, "window name");
	if (wnd){
		DWORD processid;
		GetWindowThreadProcessId(wnd,&processid);
		HANDLE hdl = OpenProcess(PROCESS_ALL_ACCESS,0,processid);
		if (hdl){
			UnicodeString preAddr = Edit1->Text;
			UnicodeString poAddr = "0x"+preAddr+"D1D4";
			DWORD adress=poAddr.ToInt();
			DWORD b;
			ReadProcessMemory(hdl,(LPVOID)adress,&b,4,0);
			Edit1->Text=b;
			CloseHandle(hdl);
		}
	}
Всё дело в том, что младшие биты(D1D4) не изменяются, а вот старшие каждый раз разные(при перезапуске сторонней программы).
Эти старшие биты я записал в Edit1 и, соответственно, в переменную preAddr. Их я нахожу через артмани.
Мне же нужно, чтобы моя программа сама определяла эти биты, возможно, как-то через хэндл окна или что-то этому подобное. Прошу знающих людей помочь.
epileptick вне форума Ответить с цитированием
Старый 31.12.2010, 22:03   #2
UltimaBeaR
Форумчанин
 
Аватар для UltimaBeaR
 
Регистрация: 21.12.2010
Сообщений: 199
По умолчанию

Не совсем понял че тебе надо, но если у тебя найденные через артмани адреса меняются после перезапуска значит это адреса из динамической памяти и тебе надо найти цепочку указателей первый из которых будет сидет ьв статической памяти тогда переходя на каждый следующий указатель ты узнаешь нужное значение из динамической памяти.. если же тебе нужен функционал артмани для поиска изменяемых переменных в памяти то на сайте артмани есть библиотека для этого дела юзаешь ее и ищешь в своей проге
UltimaBeaR вне форума Ответить с цитированием
Старый 31.12.2010, 22:14   #3
epileptick
 
Регистрация: 03.10.2010
Сообщений: 6
По умолчанию

билиотеки не нашёл на сайте
можно подробнее про цепочку указателей?

мне нужно просто получить данные из памяти программы и закинуть их в едитбокс
epileptick вне форума Ответить с цитированием
Старый 01.01.2011, 11:15   #4
UltimaBeaR
Форумчанин
 
Аватар для UltimaBeaR
 
Регистрация: 21.12.2010
Сообщений: 199
По умолчанию

А ну значит я чето либо перепутал либо приснилось мне
Библиотеки наверно приснились а вот сорсы подобной проги есть - называется CheatEngine. вот сайтик там несколько подобных прог есть wpepro.net

а цепочка адресов ну например есть какаянить программа вида:

Код:
class B
{
  int *mas;
  int masLength;
};

class A
{
  B *b;
};

A g_a;
если считать что твое значение это 3ий элемент в массиве B::mas, объект класса B сидит в классе A как указатель а объект A глобальная переменная то адрес этого значения будет каждый раз разный. Чтобы найти цепочку над опримерно следующее сделать - найти собственно адрес переменной, затем найти адрес 1го элемента массива, потом найти адрес начала данных в объекте класса B, потом найти (зная этот адрес) статический адрес A::b в котором это туказатель будет сидеть - а статический он будет потому что переменная с объектом глобальная и всегда сидит в 1ом и том же месте. Зная адреса ты в обратном порядке в своей проге по ним проходишь и находишь свою переменную. Сложность вся в том что ты незнаешь как устроенны все эти данные в программе, ты можешь только предполагать как они там могут быть пробуя по разному их искать. если там очень сложная цепочка далеко не факт что ты ее найдешь, а бывает что это тупо глобальная переменная но выделенная динамически а глобально на нее просто указатель сидит
ЗЫ: узнать статический адрес или нет можно вроде как по самому адресу там у всех статических адресов какой-то определенный диапазон кажись в памяти будет
ЗЗЫ: А чтоб получше разобратся какие адреса за что отвечают можно попробовать вскрыть прогу в ассемблере и смотрет ькуда там она читает/пишет по каким адресам в частности можно открыть ее под дебаггером найти адрес через артмани и не закрывая прогу поставить брейкпоинт на нужный адрес памяти таким образом при следующем к нему обращении видно будет как сама программа работает с этим значением откуда берет значение адреса

Последний раз редактировалось UltimaBeaR; 01.01.2011 в 11:36.
UltimaBeaR вне форума Ответить с цитированием
Старый 01.01.2011, 14:29   #5
epileptick
 
Регистрация: 03.10.2010
Сообщений: 6
По умолчанию

Я где-то читал про стеки и кучи и как переменные из них хранятся в памяти.
Первый абзац я прочитал, но не совсем понял, слишком много одинаковых обозначений(а, B, b, A) , но вроде бы сказано как раз про это.

Ладно уж, раскрою все карты.
Программа - игра Counter-strike 1.6.
Пишу программу, для мониторинга, которая отслеживает здоровье, броню, и патроны.
Адреса переменных жизней, брони и патронов я находил, так вот старшие биты у них всегда разные(динамические), а младшие - всегда одинаковые.
Я и хотел узнать, как же мне найти эти первые 4 бита, которые я записываю в переменную preAddr

ps программа - не чит, а отдельное окно
на сайте артмани есть таблицы для кс, но они старые и вообще не работают

вот допустим: UnicodeString poAddr = "0x"+preAddr+"D1D4"; - в D1D4 хранятся патроны за пазухой
epileptick вне форума Ответить с цитированием
Старый 01.01.2011, 16:19   #6
UltimaBeaR
Форумчанин
 
Аватар для UltimaBeaR
 
Регистрация: 21.12.2010
Сообщений: 199
По умолчанию

Может и не чит но засчет того что ты читаешь память из ее процесса, античиты будут ее успешно палить как чит)
куча - это и есть динамическая память. стек - это память где хранятся локальные переменные, а также параметры функций и адреса возвратов из этих функций. + есть еще некоторая статическая память там как раз все глобальные переменные и сидят (и статические поля классов) - вот эта статическая память тебе и нужна там адреса всегда одни и те же, адреса в стеке будут зависеть от того какие функции когда вызывались - то есть тоже разные адреса, адреса в динамической памяти получаются при ее выделении - это уже вообще нельзя просчитать, зависит от того какая память свободна и еще от чего-то. А то что я написал - это пример данных и то как их в этом случае надо считывать сторонней прогой. насчет битов не знаю - можно предположить что это из-за выравнивания в памяти такие значения. Оружие броня и патроны текущего игрока - похоже на глобальные данные - скорее всего там что-то типа класса расположенного в динамической памяти на адрес которого ссылается одна из глобальных переменных или статических полей.
ЗЫ: еще проверь например если не выходишь из игры а выходишь из боя (в меню) а потом создаешь новую игру сохраняются ли адреса патронов и тд, которые ты нашел - вобще побольше экспериментов - это позволит неверные предположения отсеять

Последний раз редактировалось UltimaBeaR; 01.01.2011 в 16:27.
UltimaBeaR вне форума Ответить с цитированием
Старый 01.01.2011, 17:31   #7
epileptick
 
Регистрация: 03.10.2010
Сообщений: 6
По умолчанию

античит не потребуется для её использования, тут уже всё продумано

я уже испробовал все варианты - значения патронов, жизней и брони всегда хранятся по определенным адресам(младшие биты всегда одинаковые, я привел пример с патронами, где их адрес всегда D1D4)
Цитата:
не выходишь из игры а выходишь из боя (в меню) а потом создаешь новую игру
это я всё естественно сразу опробовал - адрес вообще не изменяется, а при перезапуске игры изменяются только старшие биты, поэтому я думал, что эти старшие биты можно определить как-нибудь через хэндл окна или же идентификационный номер(если такое существует)
epileptick вне форума Ответить с цитированием
Старый 01.01.2011, 18:16   #8
UltimaBeaR
Форумчанин
 
Аватар для UltimaBeaR
 
Регистрация: 21.12.2010
Сообщений: 199
По умолчанию

То что адреса сохраняются говорит о том что скорее всего это глобальные переменные, насчет байтов как я уже говорил - черт его знает - минимальная разница между старшими 4мя байтами будет 64килобайта(если я не ошибаюсь) а это не так уж много - вполне возможно что для более удобного доступа к структуре(в одной из полей которой прописаны твои патроны) идет выравнивание адресов какраз по 64 килобайта а младшие байты такие потому что адрес переменной относительно начала структуры всегда 1 и тот же. Насчет хэндла окна я че-то вообще не понял причем тут оно?
ЗЫ: попробуй найти начало структуры там есть вроде функция такая - искать адрес начала блока данных
UltimaBeaR вне форума Ответить с цитированием
Старый 01.01.2011, 19:19   #9
epileptick
 
Регистрация: 03.10.2010
Сообщений: 6
По умолчанию

Цитата:
ЗЫ: попробуй найти начало структуры
абсолютно не представляю, как это сделать
epileptick вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запуск программы из памяти jone Общие вопросы Delphi 7 12.03.2010 18:03
Доступ к памяти другой программы BaronTreep Win Api 10 31.05.2009 07:16
Запуск программы из оперативной памяти? G&R Win Api 2 22.12.2008 21:26
Определение завершения сторонней программы Хамяг Общие вопросы Delphi 3 26.11.2008 18:12
Как определить момент запуска сторонней программы? NioTo Win Api 2 17.12.2007 16:40