2015-11-06 2 views
1

Я изучаю, как взламывать игры PS3, где мне нужно редактировать то, что хранится на определенных адресах памяти. Вот пример того, что я вижу, что люди делают, чтобы достичь этого:C++ Запись памяти для PS3

*(char*)0x1786418 = 0x40; 

Эта строка кода включает супер скорость для COD Black Ops II.

Я не уверен на 100%, что здесь происходит. Я знаю, что 0x1786418 - это адрес, а 0x40 устанавливает значение по этому адресу. Но я не уверен, что делает *(char*) и как 0x40 включите супер скорость?

Объяснение этого синтаксически и того, как он включается при сверхскоростной скорости, было бы высоко оценено.

Спасибо!

+0

* как 0x40 включить супер скорость? * Найти кого-то, кто его обратил. Это супер специфично для CoD и, вероятно, для этого конкретного взлома. – chris

+0

Вы действительно погружаетесь в глубокий конец здесь. Это довольно простая строка кода, поэтому, если у вас возникли проблемы с ее пониманием, вы должны проделать свой путь к ней, изучив основы. Чтобы дать вам базовый ответ ... кто-то обратил настроенный адрес памяти некоторой переменной, которая может быть добавлена ​​к позиции игрока на каждом шаге во время движения. Если вы измените значение этой переменной (что делает эта строка), то каждый шаг движения теперь добавит это новое значение в позицию игроков. Аналогичным образом, изменение его до более низкого значения может быть использовано для замедления вашего игрока. –

+0

Не думаю, что ваш вопрос о * (char *) можно объяснить коротким ответом. Просто прочитайте что-нибудь о языке программирования C (возможно, книга?). И о точном значении 0x40, что характерно для игры. – Paul92

ответ

2

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

Я не уверен на 100%, что здесь происходит. Я знаю, что 0x1786418 - это адрес, а 0x40 задает значение по этому адресу.

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

Но я не уверен, что *(char*) делает

Это способ взять адрес и интерпретировать его как указатель на байт (char s в C являются 1 байт память), а затем внешняя сторона * разыскивает указатель, чтобы разрешить значение, на которое ссылается указатель, который должен быть изменен, в этом случае устанавливается значение 0x40.

и как 0x40 включение супер скорость?

Это очень специфично для самой игры. Кто-то, должно быть, выяснил, где данные о скорости передвижения игрока хранятся в памяти (в частности, для PS3) и обновляет ее таким образом.

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

+0

Спасибо, это было очень полезно :) –

0

если кто-то Seing это и хочет знать, как установить prestiges или включить красные коробки или то, что не плохо объяснить, как (MW3 будет мой пример)

так для престижа было бы как *(char*)0x01C1947C = 20; , что бы установите престиж 20, если вы не понимаете за 20, вы можете сделать 20 или 0x14, также будет равным престижу 20 сказать, что вам нужен престиж 12, вы можете сделать 12 или 0xC , если вы не знаете, как просто искать престиж, который вы хотите, то в гексагоне :)

теперь для таких вещей, как красные ящики (при условии, что вы знаете о bools/if заявлениях и пустотах, которые не будут охватывать их только как вы его установили)

Теперь вы бы сделали для красных ящиков (включить) ps. bytesOn можно назвать что-нибудь

char bytesOn[] = { 0x60, 0x00, 0x00, 0x00 }; 
write_process(0x65D14, bytesOn, sizeof(bytesOn)); 
whateverYourBoolIsCalled = true; 

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

плохо добавить еще один пример, если вы хотите установить имя в sprx

char name[] = { "name here" }; write_process(0x01BBBC2C, name, sizeof(name));

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

Смежные вопросы