Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Серьезная штука с памятью


Автор: alex134 4.2.2003, 04:25
Пишу программу, которая читит игры, даже не знаю, как это объяснить. Короче, играю в Starcraft - выставляю себе 10000 минералов, или в Counter-strike 100 жизней, и так почти в любой игре. Схема такая. (1) Играю в тот же старкрафт, смотрю - у меня 8 минералов. Просканировал память старкрафта, и нашел там n адресов со значением 8. Подождал чуть-чуть - стало 16 минералов. В списке найденных адресов ищу те, значение которых изменилось на 16. Теперь я могу изменять содержимое этих ячеек памяти как душе угодно - поставить себе 8000 минералов, или по таймеру в Counter-Strike десять раз в секунду ставить 100 процентов жизни. Естественно, такая штука не только для Starcrafta & Counter-Strike пригодна. Хочу теперь это дело автоматизировать. Т.е., чтобы мой чит работал без вмешательства человека. Запустил чит, указал ему поддерживать уровень хелсов на отметке 100, запустить контру и играть спокойно. Ведь сложновато при каждом запуске игры проделывать схему (1)"подчеркнутая". Как быть, от чего оттолкнуться? Жду Ваших советов знатоки системы.

Автор: [auxx] 4.2.2003, 09:24
Ты схему1 ужо реализовал?

Полностью автоматизировать не вохможно. Надо будет указывать имя ехе-шкика игры =), исходное значение (8 или 16) и т.п. А вот алгоритм не плохой.

Автор: alex134 4.2.2003, 21:50
Да, я схему 1 уже реализовал. Еще разок опишу проблему:
Принцип такой: Играю в тот же старкрафт, смотрю - у меня 8 минералов. Просканировал память старкрафта, и нашел там n адресов со значением 8. Подождал чуть-чуть - стало 16 минералов. В списке найденных адресов ищу те, значение которых изменилось на 16. И так каждый раз при запуске игры sad.gif А теперь представьте себе, как это будет выглядеть в стрелялке? Я бегаю со 100 хелсами, просканировал память, потом в меня начинают стрелять, мне надо как-то скрыться еще живым, и потом опять быстро просканировать память игры. Вот такая фигня, сложновато это и напряжно. Вот я и хочу автоматизировать каким-то хреном свою программу, чтобы получать список адресов другим образом, не требующим такого ручного вмешательства юзера. Думаю, я понятно объяснил задачу.
Цитата
Полностью автоматизировать не вохможно. Надо будет указывать имя ехе-шкика игры =), исходное значение (8 или 16) и т.п. А вот алгоритм не плохой.

Имя exe-шника игры - ессно придется указывать, но это можно сделать не во время игры - вот в чем суть. А вот (8 или 16) - надо придумать другой способ. 1) Ну, например, я запускал некую программу "Х" много раз, и на разных компах, и каждый раз искомые значения содержались по двум адресам : 6738148 и 8140032. Но, к сожалению в последнее время они начали "прыгать" по другим адресам (((( 2) Может можно как-то установить закономерность по такому прыганию? 3) Как-то исследовать саму программу, и узнать куда она пишет искомые значения, и т.д. Вариант 3 мне нравится больше всех. Может есть другие способы?
P.S: догадаетесь ли вы что это за программа "Х"? Если угадаете, сразу поймете мою настырность в этом вопросе... Подсказка- начинается на "Cas.." заканчивается на "..esta".

Автор: Baa 4.2.2003, 22:19
Дело в том, что под переменные память выделяться может динамически, соотв. выделяется из того места, где свободно, а где свободно определить не получится, соотв. и не получится определить закономерность.

Автор: December 4.2.2003, 22:50
Цитата(Baa @ 4.2.2003, 18:19)
Дело в том, что под переменные память выделяться может динамически, соотв. выделяется из того места, где свободно, а где свободно определить не получится, соотв. и не получится определить закономерность.

Разве что если запускать на только что стартанувшей машине с минимумом сервисов - тогда вероятность стабильности адреса повышается.
А если присвоить твоей сканилке хоткей, точнее, два хоткея, и давить на них при хелс=100 и хелс=90 (например), то уже можно пару адресов отыскать.

Автор: Baa 4.2.2003, 23:09
Цитата(December @ 4.2.2003, 22:50)
Разве что если запускать на только что стартанувшей машине с минимумом сервисов - тогда вероятность стабильности адреса повышается.

Ага, а если еще написать свою ОС...
Не, это все игры в Настрадамуса...
з.ы. он там стремную фишку ломает... наерно какую-нить Casino Fiesta %)

Автор: December 5.2.2003, 01:32
Цитата(Baa @ 4.2.2003, 19:09)
Не, это все игры в Настрадамуса...
з.ы. он там стремную фишку ломает... наерно какую-нить Casino Fiesta %)

Зато интересные игры. Каждая партия - перезагрузка, каждый проигрыш - новый адрес... Компьютерная рулетка.

Автор: [auxx] 5.2.2003, 02:23
напиши свой отладчик (довольно просто кстати, по этому делу много статей есть)
пусть ставит breakpoint на том месте, где выделяется память для переменной.
тогда при каждом запуске у тебя будет адрес переменной твоей.
плюс к этому breakpoint можно сделать на запись туды. тогда у тебя автоматически будет поддерживаться значение количества минералов и т.п.

мне кстати тоже такая прога нужна: хочу друга в квейк сделать smile.gif

Автор: dim 5.2.2003, 04:23
Цитата

напиши свой отладчик (довольно просто кстати, по этому делу много статей есть)
пусть ставит breakpoint на том месте, где выделяется память для переменной.
тогда при каждом запуске у тебя будет адрес переменной твоей.

Ну и что это дает? Какой признак того что при следующем запуске память выделилась именно под нужную переменную?

Автор: [auxx] 5.2.2003, 09:46
а очень простой:
Цитата

DWORD a; //kol-vo mineralov
DWORD b; //kol-vo zhiznei
a=VirtualAlloc(...);
//ставиш сюды breakpoint (сразу после вызова VirtualAlloc
b=VirtualAlloc(...);

прога выполняется сама до первого VirtualAlloc. Затем получаешь в EAX адрес кол-ва минералов.
Тогда можно автоматизировать исправление значения.

Как узнать, куды ставить этот брикпоинт? по схеме 1.

Автор: Baa 5.2.2003, 19:28
[auxx]
ну мне кажется, что память там будет выделятся через CRT (new), но эт лана, а ведь там не две переменные... а, скажем, сотня... куда бряк ставить бум? а если они еще в разных последовательностях выделяются (в зависимости от условия например)?
Не, эт все гадание на кофейной гуще.
з.ы. а если значение содержится в динам. массиве? при расширении массива будет перераспределение памяти...

Автор: Step 5.2.2003, 20:50
А ты не пыталя создавать в своей проге алгоритмы, запускаеш прогу, запускаеш игру, и запускаеш алгоритм который по раннее заложенному алгоритму производит поиск и потдержание переменных.
Проблема состоит в том что при таком подходе некоторое время мниуту гдето придется играть по одному и томуже алгоритму...

Автор: alex134 5.2.2003, 22:42
ОК! Вопрос такой: как можно отследить создание всех переменных? Или как узнать, какая часть виртуального адресного пространства отведена для данных?
(Программа называется CashFiesta))))

Автор: dim 6.2.2003, 01:15
[auxx]
Цитата

Как узнать, куды ставить этот брикпоинт? по схеме 1.

Ну ты молодец!!! Так ведь ведь вопрос был в том что схема 1 не подходит. А ты предлагешь еще кроме нее еще дополнительный гемор - так, чтоб жизнь скучной не была smile.gif.

Автор: [auxx] 6.2.2003, 02:14
Дык если схема 1 не подходит, как по-другому? Ну можно всю прогу пошагово в отладчике выполнить, тогда может найдешь.

Автор: dim 6.2.2003, 04:42
[auxx]Ты пойми, если уже известны искомые адреса, то остальные извраты уже нафиг не нужны.
Цитата

ОК! Вопрос такой: как можно отследить создание всех переменных? Или как узнать, какая часть виртуального адресного пространства отведена для данных?

Ну допустим можно узнать расположение кучи и расположение стека, но что дальше ?

Автор: [auxx] 6.2.2003, 08:21
Чето я совсем запутался.

Цитата
Ты пойми, если уже известны искомые адреса, то остальные извраты уже нафиг не нужны.

А если не известны? Вот я и думаю, как их найти. Но если не по схеме 1, то придется прослеживать работу программы, а это сложно.

И еще не ясно: чем схема 1 не подходит?

Автор: [auxx] 6.2.2003, 08:31
Расположение кучи и стека узнать не сложно, а дальше зависит от того, где именно хранится значение.

Оно может быть: в стеке, гдето в статических данных, выделено динамически. (ничего не забыл?)

Если в стеке, то для какогото конкретного места проги адресс будет равет начальный_ESP + какоето_постоянное_значение. (а вот найти это значение сложно)

Если в статических данных, то все просто: смещение от начала данных постоянно, тока его найти надо.

А если оно гдето в динамически выделенной памяти, то хрен его найдещь.

Автор: Unregistered 7.2.2003, 21:03
Как узнать расположение кучи и стека?

Автор: alex134 7.2.2003, 21:08
Цитата

А если не известны? Вот я и думаю, как их найти. Но если не по схеме 1, то придется прослеживать работу программы, а это сложно.
И еще не ясно: чем схема 1 не подходит?

Прослеживать работу программы это отлаживать? И как можно узнать расположение кучи и стека?

Автор: [auxx] 7.2.2003, 23:46
Стека - SS:ESP
Кучи - не помню. Это не сложно и пока не столь важно.
Цитата
Прослеживать работу программы это отлаживать?

Ну типа того.

Автор: Unregistered 9.2.2003, 01:12
А если программа не отлаживается? В чем причина?

Автор: [auxx] 9.2.2003, 03:27
Цитата
А если программа не отлаживается?

Это как? Все отлаживается.

Автор: setq 11.2.2003, 01:12
Цитата(alex134 @ 3.2.2003, 20:25)
Пишу программу, которая читит игры, даже не знаю, как это объяснить. Короче, играю в Starcraft - выставляю себе 10000 минералов, или в Counter-strike 100 жизней, и так почти в любой игре...

эх в жизни бы так...

Автор: CaNIBaLchik 8.2.2006, 15:17
Чуваки, как напишите киньте ссылку, а то меня на этаже в старик рвут как котенка, надоело

Автор: SoWa 8.2.2006, 16:36
Цитата(CaNIBaLchik @ 8.2.2006, 15:17 Найти цитируемый пост)

Чуваки, как напишите киньте ссылку, а то меня на этаже в старик рвут как котенка, надоело

smile
В сетевой игре не поможет.

По вопросу. Не вижу ничего сложного, запускаешь свою прогу при старте игрухи и делаешь все, что делал до этого.

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