суббота, 20 июля 2013 г.

Адресса, сигнатуры или "Как делать трейнера для игр?" часть 1

Работа с анимацией и моделями в последнее время просто нереально напрягает (возникли два вопроса по поводу анимации, ответа на которых никто не может мне дать, поэтому все простаивает). Поэтому я периодически отвлекаюсь на всякие разные мелкие вещи, которые когда то меня интересовали.

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

Сначала я скачал себе OllyDbg но он видимо был создан для конченых программистов, но потом я решил по старинке обойтись CheatEngine. Скажу сразу - про Olly я тоже скажу пару слов. Поехали.

Программа намекает: "ТРАССИРУЙ, ТРАССИРУЙ МЕНЯ ПОЛНОСТЬЮ"
Как догадался ваш внутренний КЭП прогу написал я, и специально ради этого дела.
Код просто огромен, поэтому я его здесь оставлю, чтобы вы утонули в нем:


public partial class Form1 : Form
  {
int carrots = 1564;
string story = "Cool story, my friend, but where i?";
   
private void Form1_Load(object sender, EventArgs e)
{
label2.Text = carrots.ToString();
label4.Text = story;
}

private void button1_Click(object sender, EventArgs e)
{
label2.Text = carrots.ToString();
label4.Text = story;
}
}

Для экспериментаторов: я удалил InitializeComponent();. И не надо спрашивать причем тут морковь.

Олли у меня совсем не хотел работать. Уточняю: он не хотел работать в моих корявых непрограммерских руках :D . В тоже время Cheat Engine смог найти значение морковок (он нашел два адресса, но не суть).

Как работать с программами я не смогу сказать, поскольку Cheat Engine интуитивен, а OllyDbg я и сам толком незнаю :D. Единственное что надо знать: адресса заправляют всем. У каждого значение есть свои адресс, по которому его можно достать и изменить.

А теперь ближе к делу. Первое что меня удивило: я не смог отковырять адресс значения лейбла (т.е. именно то, что отображается в том небольшом окошке программы, а ведь это отдельное значение!). Отладчик смог отловить только адресс оригинального значения. Второе: отладчик не мог найти строковое значение! Не, я серьезно! Он реально не мог найти его, чтобы я не делал. Я воспользовался Memory View.... и очень быстро нашел искомое.
Для танкистов: на адрессе 025EC6B4 записан int carrots, а через 16 байтов уже начинается значение string story. При помощи функции Add Address Manually я добавил адресс и указал что это является юникодовой строкой. Сработало.
Еще один интересный момент. В строке нулевые байты означают конец символа. Я там нечайно один сделал ненулевым - в итоге в том месте у меня отобразился какой-то китайский иероглиф. В принципе логично - их же дофига.
Все что я сказал выше - просто подмена значений прямо в запущенной программе. Но можно сделать так, чтобы программа сама не изменяла значения.... или делал с ним что-то другое.
Однако тут есть еще одна проблема. Дело в том, что некоторые значения в программе появляются не сразу. И каждый раз эти значения могут находится в разных адресах.

Соответственно встает вопрос: "А программным способом найти нужный адрес"?

Для этого нам понадобится создать сигнатуру.

Сигнатура - это уникальная последовательность байтов. Она может служить как однозначным идентификатором файла (обычно пишет её в самом начале), либо с помощью её находить нужные адреса. Что нам и нужно.

Сигнатуру можно создать с помощью отладчика OllyDbg. Но об этом я поговорю во второй части статьи.

Комментариев нет:

Отправить комментарий