Сохранение адреса в коде хакерской игры C++?

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


person H4cKL0rD    schedule 22.04.2009    source источник


Ответы (6)


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

person Simon Broadhead    schedule 22.04.2009
comment
Все, о чем я могу думать, это то, что если данные персонажа хранятся в хэше (например, у каждого игрока есть назначенный во время выполнения GUID в качестве хеш-ключа), вам будет много веселья, определяя, какое ведро пойти на. :-П - person Chris Jester-Young; 22.04.2009
comment
Если данные, которые вы ищете, основаны на структуре/классе, который создается локально в какой-то момент, но никогда не является глобальной или статической переменной, вы не найдете статический указатель. Вам нужно будет найти некоторый код, который обращается к нужным вам данным в то время, когда они вам нужны, и перехватывать этот код, перенаправляя его на ваш собственный введенный код, выделенный в каком-то месте в куче. Это не всегда возможно, потому что усиленная операционная система не позволяет вводить новый код. Если вы обнаружите много статических указателей, это может указывать на то, что программа была написана плохо :) - person L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o&#x; 17.11.2009

Сопоставление подписи для содержимого записи в куче. Возможно, используя расстояние редактирования для определенного известного контента.

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

person paxos1977    schedule 22.04.2009
comment
Жестко, но верно. - person ojrac; 22.04.2009

Лучший способ — искать шаблоны в памяти и обрабатывать их с помощью смещений. Это будет непросто просто потому, что разработчики игр хотят положить этому конец.

Таким образом, у них не будет красивой текстовой строки, говорящей: «Боеприпасы хранятся за 27 байт до начала этой строки».

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

Затем вы делаете то же самое. Я знаю, звучит просто, и это так. Но, основываясь на ваших прошлых вопросах, я не уверен, что «H4cKL0rD» — подходящее прозвище :-), по крайней мере, в этом случае.

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

person paxdiablo    schedule 22.04.2009

Вы либо сдаетесь, либо очень хорошо разбираетесь в дизассемблере.

person Ben Collins    schedule 22.04.2009
comment
Почему нет способа просто найти адрес в игре, скажем, снайпера, и возиться со значением адреса, в котором хранятся боеприпасы? - person H4cKL0rD; 22.04.2009
comment
Дизассемблер (или более специализированный инструмент, такой как сканер памяти - посмотрите ответ на другой ваш вопрос) является тем, как вы просто находите адрес. Одна вещь, которая может сделать это проще, заключается в том, что игра, вероятно, всегда будет иметь одни и те же смещения (хотя у них могут быть некоторые алгоритмы защиты от читов, которые перемещают вещи, но я был бы удивлен). Если вы сможете найти базовый адрес игрового процесса, значит все готово. - person Ben Collins; 22.04.2009
comment
Не забывайте, что разные последовательности операций могут закончиться выделением разных вещей в разное время и разным количеством выделенных вещей, так что из-за этого адреса могут различаться. Если в игре есть какая-либо рандомизация, это тоже может быть фактором — и это до того, как вы приступите к преднамеренной рандомизации адресов загрузки для общих библиотек (предоставленных операционными системами). - person Jonathan Leffler; 22.04.2009
comment
конечно. хорошая точка зрения. Здесь также пригодится дизассемблер — если вы можете понять, как выделяется искомая память, вы можете отслеживать ссылки на нее. - person Ben Collins; 22.04.2009

Если вы просто хотите выполнить работу и не заботитесь о том, чтобы написать код самостоятельно, вы можете использовать программу, разработанную специально для этой задачи, например, T-Search.

person Jeremy Salwen    schedule 22.04.2009
comment
я в порядке с теми, просто не знаю, что я ищу, у меня есть чит-движок, вы знаете, как найти ядро ​​​​с этим? - person H4cKL0rD; 22.04.2009
comment
По сути, вы можете использовать их для поиска значения, а затем изменить это значение, выполнив какие-либо действия в игре, сузив область поиска и т. д., пока в памяти не останется только одно возможное место, а затем вы сможете изменить его. - person Jeremy Salwen; 22.04.2009
comment
нет я знаю как это сделать но адрес меняется с каждым компьютером иногда при каждом запуске игры - person H4cKL0rD; 22.04.2009

Я бы сказал, предварительно загрузите какой-нибудь пользовательский распределитель памяти и попробуйте найти размер malloc(), который вы ищете.

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

typedef struct {
   int ammo;
   int damage;
   int fire_distance;
} Sniper_AWP_T;

void *my_custom_malloc( int size ){
   void *ret = malloc(size);
   if( size == sizeof( Sniper_AWP_T ) ){
       hack_address = ret;
   }
   return ret;
}

// later on 

hack_address->ammo = 999;
person Gui13    schedule 03.07.2013