Защита игр от взлома

         

Боремся с дизассемблером


Лучший из всех дизассемблеров IDA PRO. Это, действительно, очень мощный дизассемблер, который не так-то просто взять на испуг. С классическими защитными приемами (типа прыжка в середину команды) он справляется, даже не замечая, что тут было что-то защитное. Если на пути хакера встретиться стена зашифрованного/упакованного кода, он напишет короткий (длинный) скрипт и расшифрует все, что нужно даже не выходя из дизассемблера! Для p-кода будет написан отдельный плагин типа "докомпилятор".

Самым мощным анти-хакерским средством был и остается косвенный вызов функций по указателю, передаваемому в качестве аргумента. Хакер натыкается на что-то типа call eax и материться в бессильной злобе, пытаясь определить, что содержится в eax на данный момент. Если материнская функция вызывается обычным способом, взломщику достаточно просто перейти по перекрестной ссылке, заботливо сгенерированной IDA и подсмотреть что передается функции, однако, если указатель инициализируется далеко от места вызова, хакеру придется раскрутить всю цепочку вызовов, что нелегко, а если функция, вызывающую косвенную функцию, сама вызывается косвенным путем, то это вообще кратны! Остается только запускать отладчик, устанавливать точку останова на call eax и смотреть ее значение в живую, однако, точкам останова легко противостоять (и мы об этом уже говорили), к тому же в различные моменты времени eax может указывать на разные функции и тогда простое подглядывание eax ничего не даст! Дизассемблер ослепнет и оглохнет!

Рассмотрим следующий пример:

sub_sub_demo(int a, void *p, void *d)

{

       // printf("sub_sub_demo\n");

       if (--a) return ((int(*)(int, void*, void*))p)(a, p, d);

       return 0;

}

sub_demo(int a, void *p, void *d)

{

       // printf("sub_demo\n");

       if (--a) return ((int(*)(int, void*, void*))d)(a, p, d);

       return 0;

}

demo(int a, void *p, void *d)

{

       // printf("demo\n");

       ((int(*)(int, void*, void *))p)(a, p, d);

}

main()

{

       demo(0x69,sub_demo, sub_sub_demo);

}



Содержание раздела