Как проверить изменения кода программы во время ее запуска - PullRequest
3 голосов
/ 26 августа 2011

Здравствуйте, коллеги-разработчики,

предположим, что у меня была программа, для которой требовалась авторизация, предоставленная ему сервером через сеть. Очевидно, что в какой-то момент в моем коде будет что-то вроде:

if (serverResponse == expectedResponse){
    //Continue as the authorized user
}

Эта система имеет очень, очень маловероятную слабость. Если бы кто-нибудь на самом деле изменил исполняемый файл и изменил код этого if (который я предполагаю, что-то вроде инструкции ветвления) на код, который всегда переходил к истинному регистру. Есть ли способ обнаружить такую ​​модификацию в моей программе?

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

Полагаю, может быть очень уместно, что эта моя программа написана на C ++ и скомпилирована с помощью компилятора GCC.

Ответы [ 2 ]

3 голосов
/ 26 августа 2011

Хитрость здесь не в том, чтобы полагаться на простое утверждение if. Как вы говорите, это легко обойти тем, кто сможет перестроить ваш код. Вместо этого вы должны использовать значение, возвращаемое с сервера, для какой-то важной функции вашей программы. Например, ответ от сервера может быть использован в качестве ключа для расшифровки некоторых важных данных на клиенте. Обучить реверс-инженера будет намного сложнее.

3 голосов
/ 26 августа 2011

Один из подходов состоит в том, чтобы взять адрес функции и получить CRC памяти по этому адресу.Однако это не очень гибко, потому что вам нужно либо вычислять размер функции каждый раз, когда вы ее модифицируете, либо использовать библиотеку дизассемблера, такую ​​как великолепный и бесплатный BEAEngine , для ее динамического вычисления.Но тогда есть возможность обратного инженера изменить ваш код CRC.Или контрольная сумма, с которой он проверяет.Они также могут изменить ответ сервера до того, как ваша программа его получит, и изменить его на expectedResponse.Таким образом, вы действительно не можете победить.

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

Однако, если у кого-то достаточно времени и навыков, вы действительно ничего не сможете сделать.Как мы привыкли говорить, клиент всегда побеждает;все, что вы можете сделать, это сделать игру сложнее.

...