Brak kontroli nad liczbami w RAM.
Ostatnio zmodyfikowano 2015-11-14 15:40
Gibas11 Temat założony przez niniejszego użytkownika |
Brak kontroli nad liczbami w RAM. » 2015-11-14 14:59:39 Hej, pracowałem ostatnio nad prostym szyfrowaniem liczb by w pamięci znajdowały się w formie zakodowanej (plan był taki by uniemożliwić działanie CheatEngine na moim programie), więc napisałem do tego prostą klasę, problem pojawia się w tych 2 funkcjach: void operator =( sf::Uint32 num ) { key++; if( key == 27 ) key = 7 - random() % 5; ( * var ) = num + triangleNumber( key ); }
sf::Uint32 operator ()() { return( * var ) - triangleNumber( key ); }
Niestety kompilator upraszcza to do takiej formy: void operator =( sf::Uint32 num ) { key++; if( key == 27 ) key = 7 - random() % 5; ( * var ) = num; }
sf::Uint32 operator ()() { return( * var ); }
Da się temu jakoś zaradzić? Pozdro. EDIT: Zaznaczam, że nie wiem jak dokładnie postępował kompilator, ale liczby w pamięci nie są zaszyfrowane i drogą dedukcji (+ kilku testów), doszedłem do wniosku, że w kodzie dzieje się to co opisałem. |
|
pekfos |
» 2015-11-14 15:22:52 Dodaj volatile do definicji var. |
|
Gibas11 Temat założony przez niniejszego użytkownika |
» 2015-11-14 15:32:20 W pamięci wartości są niby dobre (wyświetlałem samo (*var)), niestety cheat engine dalej potrafi się do nich dogrzebać i z powodzeniem modyfikować. :/ Jak mógłbym to uniemożliwić? Zarzucę całym kodem, może pomoże: #include <SFML/System.hpp>
#include <iostream>
using namespace std;
namespace safeNumbers { sf::Uint32 triangleNumber( sf::Uint8 key ) { return key *( key + 1 ) / 2; } class Uint32s { private: volatile sf::Uint32 * var; sf::Uint8 key; public: Uint32s() { var = new sf::Uint32; key =( random() % 13 ) + 7; }; void operator =( sf::Uint32 num ) { key++; if( key == 27 ) key = 7 - random() % 5; ( * var ) = num + triangleNumber( key ); } sf::Uint32 operator ()() { return( * var ) - triangleNumber( key ); } sf::Uint32 raw() { return( * var ); } }; }
int main() { char c; safeNumbers::Uint32s liczba; for( sf::Uint32 i = 12;; i++ ) { liczba = i; cin >> c; cout << liczba() << " -> " << liczba.raw() << endl; } return 0; }
EDIT: Ups, źle przeczytałem i dodałem volatite do deklaracji zamiast do definicji, poprawiony i sprawny kod: #include <SFML/System.hpp> #include <iostream>
using namespace std;
namespace safeNumbers { sf::Uint32 triangleNumber( sf::Uint8 key ) { return key *( key + 1 ) / 2; } class Uint32s { private: volatile sf::Uint32 * var; sf::Uint8 key; public: Uint32s() { var = new volatile sf::Uint32; key =( random() % 13 ) + 7; }; void operator =( sf::Uint32 num ) { key++; if( key == 27 ) key = 7 - random() % 5; ( * var ) = num + triangleNumber( key ); } sf::Uint32 operator ()() { return( * var ) - triangleNumber( key ); } sf::Uint32 raw() { return( * var ); } }; }
int main() { char c; safeNumbers::Uint32s liczba; for( sf::Uint32 i = 12;; i++ ) { liczba = i; cin >> c; cout << liczba() << " -> " << liczba.raw() << endl; } return 0; }
|
|
pekfos |
» 2015-11-14 15:40:25 niestety cheat engine dalej potrafi się do nich dogrzebać i z powodzeniem modyfikować. :/ Jak mógłbym to uniemożliwić? |
Nie da się. Możesz tylko utrudniać. |
|
« 1 » |