Search Unity

  1. Megacity Metro Demo now available. Download now.
    Dismiss Notice
  2. Unity support for visionOS is now available. Learn more in our blog post.
    Dismiss Notice

Anti-Cheat Toolkit: stop cheaters easily!

Discussion in 'Assets and Asset Store' started by codestage, Aug 20, 2013.

  1. stonstad

    stonstad

    Joined:
    Jan 19, 2018
    Posts:
    658
    How is performance for creating, retrieving, and updating obscured primitives? i.e. reading within the update loop.
     
    codestage likes this.
  2. codestage

    codestage

    Joined:
    Jul 27, 2012
    Posts:
    1,931
    Obscuration does adds a bit of the overhead which is expected but it shouldn't be a problem or produce bottleneck unless you're operating hundreds of obscured values in for loops.

    Please let me know if you'll see the opposite in your player profiler.
     
  3. Deochi

    Deochi

    Joined:
    Jun 20, 2014
    Posts:
    1
    Is there any concrete example of verifying hash values from within android without using a server?

    The hash value is calculated after the apk is built, so it would be difficult to embed it in the apk.
     
  4. codestage

    codestage

    Joined:
    Jul 27, 2012
    Posts:
    1,931
    This is actually non-trivial task and could be tricky depending on your setup thus I'm not providing concrete example at this moment.

    Easiest option here is to store hashes file externally (either on own remote server or at the Unity's cloud).

    I believe it's also possible to inject file with hashes into resulting build (and use apksigner to re-sign apk or jarsigner to re-sign aab) but I did not researched nor tried this myself so far thus there could be some pitfalls I'm not aware of yet on this path.
    Please let me know if you'll find this path working for you, it could help implementing automated hashes injection into the resulting build.
     
  5. Deleted User

    Deleted User

    Guest

    Hi,

    How can I convert this code to use Obscured File?



    Code (CSharp):
    1.             await Task.Run(() =>
    2.             {
    3.                 using (FileStream dataStream = File.Open(fileName, FileMode.Create, FileAccess.ReadWrite))
    4.                 {
    5.                     BinaryFormatter converter = new BinaryFormatter();
    6.                     converter.Serialize(dataStream, mBaseData);
    7.                 }
    8.             });
    Would be this?


    Code (CSharp):
    1. await Task.Run(() =>
    2.             {
    3.                 ObscuredFile safeFile = new ObscuredFile(fileName);
    4.                 BinaryFormatter converter = new BinaryFormatter();
    5.                 using (MemoryStream ms = new MemoryStream())
    6.                 {
    7.                     converter.Serialize(ms, mBaseData);
    8.                     safeFile.WriteAllBytes(ms.ToArray());
    9.                 }
    10.             });
     
    Last edited by a moderator: Oct 20, 2021
  6. codestage

    codestage

    Joined:
    Jul 27, 2012
    Posts:
    1,931
    Hi, yes it should work!

    Also, please note it will place specified file at the PersistentData folder, but you can override this behavior using ObscuredFileLocation.Custom:
    Code (CSharp):
    1. ObscuredFile safeFile = new ObscuredFile(fileName, new ObscuredFileSettings(ObscuredFileLocation.Custom)); // to use fileName as full or relative file path
     
    Deleted User likes this.
  7. thiagolrosa

    thiagolrosa

    Joined:
    Feb 22, 2017
    Posts:
    60
    Hi @codestage !

    I use ObscuredPrefs and all the Obscured types throughout my game, there isn't anywhere using ints, floats, strings etc and I thought I was safe from memory editors.

    Today some people started to cheat on my game and I found out they were using an Android application to easily modify obscured values (not saying the name here). I tried it by myself and in just a few minutes I was able to filter out and get to the correct address (number of coins). This app has an option to "search for encrypted values".

    Is it possible to do anything else to prevent this? If you need more info please let me know or send me a PM!

    Look the number of coins below, it is obscured but I was able to change it:
    upload_2021-10-20_17-40-14.png
     
  8. codestage

    codestage

    Joined:
    Jul 27, 2012
    Posts:
    1,931
    Hi!

    Thank you for getting in touch with this question.

    In order to make unknown (or encrypted) values search harder, please use the RandomizeCryptoKey API in an unexpected time intervals to change internal encrypted value when cheater doesn't expect it to change.

    To make it even more backed up, feel free to use ObscuredCheatingDetector in order to detect any obscured variables tampering attempts.

    Please let me know if you'll have any additional questions!
     
  9. thiagolrosa

    thiagolrosa

    Joined:
    Feb 22, 2017
    Posts:
    60
    Thank you, I will try it!

    One more question, I just noticed that I'm on a very old deprecated version (Version 1.6.7 - August 14, 2019), if I purchase the new version will I get more protection? What are the benefits?
     
  10. codestage

    codestage

    Joined:
    Jul 27, 2012
    Posts:
    1,931
    Newer version has new features such as CodeHashGenerator, ObscuredFile and ObscuredFilePrefs along with numerous stability improvements, fixes and closed vulnerabilities in obscured types and other tools, so I'd recommend updating for any new projects.

    For existing projects, I'd suggest checking out the full change log before updating to help you decide depending on features you're using and possibly backward compatibility issues (major upgrades has API refactorings and core changes though in most cases it does migrate automatically and doesn't break your project or lose your data).
     
  11. Kapteeni-Studios

    Kapteeni-Studios

    Joined:
    Apr 5, 2014
    Posts:
    39
    Hi Codestage,

    I'm updating to Anti Cheat Toolkit 2021 from older version of ACTK. I get this error and I'm not sure why.

    Code (CSharp):
    1. if (ObscuredPrefs.GetInt("MyVariable") > 0)
    error CS0103: The name 'ObscuredPrefs' does not exist in the current context

    I also need to make sure my current players don't lose data when they update. The game's previous updates uses the older version of ACTK.
     
  12. codestage

    codestage

    Joined:
    Jul 27, 2012
    Posts:
    1,931
    Hey @Harha-Studios ,

    Please make sure you've added the CodeStage.AntiCheat.Storage to the usings at the beginning of your script:
    Code (CSharp):
    1. using CodeStage.AntiCheat.Storage;
    And please make sure you've referenced the ACTk.Runtime asmdef if you're using Assembly Definitions.

    Looking at your code, I'd also suggest switching to the new generic APIs, i.e. call it like this:
    Code (CSharp):
    1. ObscuredPrefs.Get<int>("MyVariable")
    to avoid obsolete API usage warnings.

    ObscuredPrefs should migrate from v2 data version format seamlessly, but just in case, please make sure to test it works fine for you before releasing the update to all your user base and let me know if you'll encounter any problems.
    Also, you can migrate ACTk v1 data using ObscuredPrefs.MigrateFromACTkV1() API.
     
    Kapteeni-Studios likes this.
  13. Kapteeni-Studios

    Kapteeni-Studios

    Joined:
    Apr 5, 2014
    Posts:
    39
    Hi Codestage,

    In the tutorial video example says:


    Code (CSharp):
    1.     void Start()
    2.     {
    3.         ObscuredCheatingDetector.StartDetection(OnCheaterDetected);
    4.         ObscuredPrefs.OnAlterationDetected = OnCheaterDetected;
    5.     }
    I get an error:

    The event 'ObscuredPrefs.OnAlterationDetected' can only appear on the left hand side of += or -=

    Shoud I use?

    ObscuredPrefs.OnAlterationDetected += OnCheaterDetected;
     
  14. codestage

    codestage

    Joined:
    Jul 27, 2012
    Posts:
    1,931
    Hey @Kapteeni-Studios

    Yes, that video is a bit outdated and that callback is a C# event which you need to subscribe / unsubscribe using += and -= operators.

    Also, that event was refactored into the NotGenuineDataDetected at the latest version, thus I'd suggest using that instead to avoid deprecated API usage warnings:

    Code (CSharp):
    1. ObscuredPrefs.NotGenuineDataDetected += OnCheaterDetected;
     
    Kapteeni-Studios likes this.
  15. HolyFireGames

    HolyFireGames

    Joined:
    Apr 23, 2014
    Posts:
    134
    I'm running into a random issue where I'm getting this error:

    Empty key can't be used for string encryption or decryption!

    Any idea what would cause this? The variable that it is referencing is an ObscuredString, and it has a value set to it.

    It's not happing 100% of the time with the prefab the script is on, only randomly.

    It also happens a ton in-editor when I hover over a script with an ObscuredString variable in it even if it has a value.

    Thanks
     
  16. codestage

    codestage

    Joined:
    Jul 27, 2012
    Posts:
    1,931
    Hey @HolyFireGames ,
    Thank you for reporting this problem.

    Could you please let me know if you're seeing this with latest ACTk 2021.0.7 version?
     
  17. HolyFireGames

    HolyFireGames

    Joined:
    Apr 23, 2014
    Posts:
    134
    Hi, I wasn't on v2021 yet (I was on v2) so I went ahead and bought the upgrade but I'm getting the same issue with the latest version in the asset store.

    Not sure if this image helps or not: https://gyazo.com/8410e4e5271100b799bd1a36086478eb

    The EnemyController is my script with a few ObscuredString variables but I made sure to put values in each of them. The right is the console spam of the error not in play mode that happens when I move my mouse around the inspector.

    One more not that I'm not sure if it helps or not, but I am using Odin Inspectors.

    It also happens in-game as enemies are spawned but only randomly.

    Thanks
     
    Last edited: Nov 21, 2021
  18. codestage

    codestage

    Joined:
    Jul 27, 2012
    Posts:
    1,931
    Thank you for providing additional data, but I'm still unsure what could cause this to happen.

    I've sent few questions in PM on your case in order to proceed further and avoid bumping this thread with back and forth communication =)
     
  19. SomehowLuke

    SomehowLuke

    Joined:
    Nov 11, 2015
    Posts:
    34
    Hi there,
    will I have to pay for every year release or is this asset been updated?
    thanks and best,
    Luke
     
  20. codestage

    codestage

    Joined:
    Jul 27, 2012
    Posts:
    1,931
    Hey, it's not deiced yet when the next paid major upgrade will kick in, but it's highly likely it will have a ~360 days grace period to satisfy a ~1 year of free upgrades for existing customers with a small fee for those who weren't gotten into the grace period.

    I'm going to release new features and improvements until next major upgrade with free updates as well (it's expected current 2021 version will get more features through the next year).
     
    SomehowLuke likes this.
  21. SomehowLuke

    SomehowLuke

    Joined:
    Nov 11, 2015
    Posts:
    34
    Hi, thanks for clarification! sounds reasonable! Would be if you could serve older major releases still with bugfixes, so even you you have 2022 or 2023 with new features, 2021 will be still in support for minor fixes that might come. thanks and great job on the asset!
    Best
    Luke
     
    codestage likes this.
  22. samvilm

    samvilm

    Joined:
    Jan 17, 2021
    Posts:
    43
    Hi. If I use playfab do I still need your plugin to stop cheating?
     
  23. codestage

    codestage

    Joined:
    Jul 27, 2012
    Posts:
    1,931
    Hi, I don't know much about Playfab and what features it has, still I believe most ACTk features will play nicely with it.
    Please let me know if you'll have any compatibility issues or questions, I'll be glad to help.
     
  24. samvilm

    samvilm

    Joined:
    Jan 17, 2021
    Posts:
    43
    they have an option to post player statistics that comes with this warning:

    Allow client to post player statistics. NOTE: In general, this option should not be used in a live game, as it gives the client authority over values submitted. This is only valid for cases where there is no concern that players may cheat their statistics. If statistics need to be secure, they should only be updated via a server authoritative operation, such as a Cloud Script or custom game server.

    If I enable this option would anti-cheat toolkit still prevent cheating?
     
  25. codestage

    codestage

    Joined:
    Jul 27, 2012
    Posts:
    1,931
    ACTk has nothing to do with this option, make sure to use authoritative server where possible. If you can't use it, make sure to pass all data using secure channels and encrypt \ hash all data you pass from the client side. This is out from the ACTk scope in general and depends on your app architecture.

    Still, you can use any ACTk features just fine depending on your requirements.
     
  26. UnityHexagon

    UnityHexagon

    Joined:
    Jan 2, 2022
    Posts:
    1
    The ObscuredTypes seem kinda useless to me, you store the cryptokey for that value, the encrypted value and the fakevalue in the same struct.. so if you find the fakevalue (whitch is even easier since you can cancel out all values that dont have the xored value stored right 4 bytes below it) you can just set it to whatever you want.. you just have to be careful to set the value -4 bytes to the value ^ the value -8 bytes in the OscuredInt example.
    For the other detectors you even have a handy bool that you can just set to 0 in memory and all checks are disabled...
     
  27. codestage

    codestage

    Joined:
    Jul 27, 2012
    Posts:
    1,931
    @UnityHexagon Glad you've shared your thought, but I'm not sure what's the point of posting this here as your first post on forums. It's not something new and already discussed multiple times here and on the discord: with ACTk, I'm providing a solution against massive casual cheaters and source code basis to build your own system if you would like to.

    It doesn't protect your builds from the reverse-engineering at the moment, and never was advertised to. Make sure to use it in conjunction with native protectors to resist RE and in-memory code patching. Please take a look at the "Code obfuscation and overall code protection notes" readme section for more advice and details on the matter.

    I'm constantly working on new features and improvements, and there are some changes to the obscured types pending as well which going to make it a bit harder to find stuff, still, it's not going to resist pro hackers.

    Feel free to take a look for more costly and powerful solutions if you need something more robust and your game is already popular enough to attract professional cheaters which make profit from it, since at that point you should be able to afford such solutions. Although, I should warn even with ring-0 drivers and such you still will have pro hackers around which will be able to hack in and do whatever they want with your clients.
     
  28. FergJoe

    FergJoe

    Joined:
    Dec 28, 2016
    Posts:
    19
    This is late, but congrats on making the move to full-time dev work! That's my dream, as well. I use ACTc and Maintainer and love them both!

    With the move to an annual paid upgrade, do you have any plans to offer a "loyalty discount" to owners of the previous version? I think you would encourage more users to stay current if you offered a 10-20% discount that's always active - and only for folks 1 version behind. Might create a steadier revenue stream, as well? I'd be glad to "subscribe" to updates in this manner and support this tool!

    I'd bet a lot of users don't come to the forums unless they have an issue, and probably missed your release announcement (and discount). I was creating a new project today, saw "deprecated" next to v2 and panicked! :eek:
     
    codestage likes this.
  29. codestage

    codestage

    Joined:
    Jul 27, 2012
    Posts:
    1,931
    Thanks for your kind words!

    I do plan to keep offering 80% off for the paid upgrades to all existing customers, does it sound like what you're asking for?

    No worries as I'm usually available to support you with any deprecated version issues and try to unblock if it's not too old. For example, I'm ready to help ACTk v2 customers with any blocking problems in Unity up to 2021.2.

    But you're right, there is not much we (publishers) can do to signalize to our customers as we don't have any direct communication channels provided by the Asset Store, thus I'm using these forums, Twitter and Discord to post any important announcements at the moment ^^
     
  30. kk3hi3123

    kk3hi3123

    Joined:
    Aug 17, 2016
    Posts:
    31
    Hello, I have read that Obscured Type can be used to prevent memory hacking. But my data is loading in JSON format and then deserialize into UserData. Could Obscured Type also support serialize and deserialize?
     
  31. codestage

    codestage

    Joined:
    Jul 27, 2012
    Posts:
    1,931
    kk3hi3123 likes this.
  32. modernator24

    modernator24

    Joined:
    Apr 7, 2017
    Posts:
    186
    After using ACTK with Bee byte's Obfuscator(bought it right after bought ACTK, from your asset store page), there are hundreds of people facing the data loss that is only used in obscured values. Only the obscured values reset to zero, and people lost whole their progress and in-game money. It was a few months ago, but it was a very serious situation.

    I'm not using Newtonsoft's JSON utility, I'm using Unity's built-in JSON class, you probably remember me. I had no choice and had to delete the whole ACTK and Obfuscator and the issue was gone.

    I was kind of just gave up using ACTK, but after launching the multiplayer support in my game, the cheaters increased dramatically, so I need a way to stop them.

    I couldn't find any similar issue with me, but this issue exists. Any ideas?
     
  33. codestage

    codestage

    Joined:
    Jul 27, 2012
    Posts:
    1,931
    Hi @modernator24,

    Thanks for letting me know about this problem, and I'm sorry you had such an experience with ACTk and Obfuscator.
    I'd be glad to help you resolve this issue to avoid any possible data loss but have not enough information to get started with reproduction.

    Please check your PM to proceed further.
     
  34. baontp_unity

    baontp_unity

    Joined:
    Jan 24, 2019
    Posts:
    1
    Hi, can ACTK prevent speed hack from x8 sandbox?
     
  35. codestage

    codestage

    Joined:
    Jul 27, 2012
    Posts:
    1,931
    Hi @baontp_unity

    This is under research and so far no reliable offline solution found for this yet due to the full sandbox nature where I just can't reach any unaffected timer (similar to the Chromium browsers isolated sandbox).

    As a workaround, TimeCheatingDetector can be used instead as it still can get reliable time from the server.

    For example: get online time (using TimeCheatingDetector APIs) and offline time (using regular methods), save difference, get online and offline time again after very short period of time (less than 1 minute) and compare difference with previous one, or something similar.

    Also slow internet connection may lead to the false positives, so I'd suggest taking care of that as well.

    I'm considering wrapping something like this into the usable option for the SpeedHackDetector if I'll not find any other reliable timers which can be used with the sandboxes (have few ideas to try).
     
    baontp_unity likes this.
  36. GiantGentleman

    GiantGentleman

    Joined:
    Apr 3, 2021
    Posts:
    1
    Hi!
    I am using your tool. I wonder if a cheater searches for the real value by changing and not changing the value, and modifies it, can the detector detect it?
    I've seen using RandomizeCryptoKey to increase the difficulty of searching, does it add a lot of performance overhead? For example I call this function every 3 seconds for 20 values.
    Thank you.
    (Google Translate)
     
    Last edited: Mar 15, 2022
  37. codestage

    codestage

    Joined:
    Jul 27, 2012
    Posts:
    1,931
    Yes it should detect the modification of the real value. Please let me know if it's not a case for you.

    It shouldn't introduce noticeable overhead unless you're calling it thousands of times per frame. Again, please let me know if you'll see any overhead in your usage scenario.
     
    GiantGentleman likes this.
  38. murat303

    murat303

    Joined:
    May 22, 2014
    Posts:
    38
    On some android devices, especially in new versions, we can cheat by moving the time forward 1 year. During the time check, Google gives an ssl error, so cheating can be done. I prevented this by changing the code of anticheat toolkit, but can you find a permanent solution to this?
     
  39. codestage

    codestage

    Joined:
    Jul 27, 2012
    Posts:
    1,931
    Hi @murat303 ,

    That's interesting, thank you for reporting this problem.
    Could you please PM your changes to the ACTk which fixed that for you?
    Also, did you try using another non-ssl server to get the time?

    I have few ideas on how to fix this permanently but will need some additional research, adding it to the task tracker.
     
  40. pistoleta

    pistoleta

    Joined:
    Sep 14, 2017
    Posts:
    539
    Hi there! we started beta testing and we are getting some exception reports from Sentry SDK like the two below:
    They all happen after applicationpause(false) and that point is where I check the correct UTC date using the time cheating detector...
    Specifically I call:
    Code (CSharp):
    1. /// <summary>
    2.         /// Receives UTC seconds from url. Runs asynchronously.
    3.         /// </summary>
    4.         /// Automatically switches to the current domain when running in WebGL to avoid CORS limitation.
    5.         /// <param name="url">Absolute url to receive time from.
    6.         /// Make sure this server has proper Date values in the response headers
    7.         /// (almost all popular web sites are suitable).</param>
    8.         /// <param name="method">Method to use for url request. Use Head method if possible and fall back to get if server does not reply or block head requests.</param>
    9.         /// <returns>OnlineTimeResult with UTC seconds or error.</returns>
    10.         public static async Task<OnlineTimeResult> GetOnlineTimeTask(string url, RequestMethod method = RequestMethod.Head)
    11.         {
    12.             var uri = UrlToUri(url);
    13.             return await GetOnlineTimeTask(uri, method);
    14.         }
    (line 509 in TimeCheatingDetector.cs)

    Do you think this exception logs we are getting might have something to do with this tasks im using to get the real UTC time? If so, how could we avoid this ? We are using v2.1.2


    Thanks a lot!

    Here the first stack:

    System.Net.WebException: The request was canceled
    Module "System.Runtime.ExceptionServices.ExceptionDispatchInfo", in Throw
    Module "System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1+ConfiguredTaskAwaiter", in GetResult
    Module "System.Net.WebOperation", in WaitForCompletion
    Module "System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1", in Start
    Module "System.Net.WebOperation", in WaitForCompletion
    Module "System.Net.ServicePointScheduler", in StartScheduler
    Module "System.Threading.ContextCallback", in Invoke
    Module "System.Threading.ExecutionContext", in RunInternal
    Module "System.Runtime.CompilerServices.AsyncMethodBuilderCore+MoveNextRunner", in Run
    Module "System.Action", in Invoke
    Module "System.Threading.Tasks.AwaitTaskContinuation", in RunOrScheduleAction
    Module "System.Threading.Tasks.Task", in FinishContinuations
    Module "System.Threading.Tasks.Task`1", in TrySetResult
    Module "System.Threading.Tasks.TaskFactory+CompleteOnInvokePromise", in Invoke
    Module "System.Threading.Tasks.Task", in FinishContinuations
    Module "System.Threading.Tasks.Task`1", in TrySetResult
    Module "System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1", in SetResult
    Module "System.Net.WebOperation", in WaitForCompletion
    Module "System.Threading.ContextCallback", in Invoke
    Module "System.Threading.ExecutionContext", in RunInternal
    Module "System.Runtime.CompilerServices.AsyncMethodBuilderCore+MoveNextRunner", in Run
    Module "System.Action", in Invoke
    Module "System.Threading.Tasks.AwaitTaskContinuation", in RunOrScheduleAction
    Module "System.Threading.Tasks.Task", in FinishContinuations
    Module "System.Threading.Tasks.Task`1", in TrySetException
    Module "System.Threading.Tasks.TaskCompletionSource`1", in TrySetException
    Module "System.Net.WebOperation", in FinishReading
    Module "System.Threading.ContextCallback", in Invoke
    Module "System.Threading.ExecutionContext", in RunInternal
    Module "System.Runtime.CompilerServices.AsyncMethodBuilderCore+MoveNextRunner", in Run
    Module "System.Action", in Invoke
    Module "System.Threading.Tasks.AwaitTaskContinuation", in RunOrScheduleAction
    Module "System.Threading.Tasks.Task", in FinishContinuations
    Module "System.Threading.Tasks.Task`1", in TrySetException
    Module "System.Threading.Tasks.TaskCompletionSource`1", in TrySetException
    Module "System.Net.WebOperation", in Run
    Module "System.Threading.ContextCallback", in Invoke
    Module "System.Threading.ExecutionContext", in RunInternal
    Module "System.Runtime.CompilerServices.AsyncMethodBuilderCore+MoveNextRunner", in Run
    Module "System.Action", in Invoke
    Module "System.Threading.Tasks.AwaitTaskContinuation", in RunOrScheduleAction
    Module "System.Threading.Tasks.Task", in FinishContinuations
    Module "System.Threading.Tasks.Task`1", in TrySetException
    Module "System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1", in SetException
    Module "System.Net.WebConnection", in InitConnection
    Module "System.Threading.ContextCallback", in Invoke
    Module "System.Threading.ExecutionContext", in RunInternal
    Module "System.Runtime.CompilerServices.AsyncMethodBuilderCore+MoveNextRunner", in Run
    Module "System.Action", in Invoke
    Module "System.Threading.Tasks.AwaitTaskContinuation", in RunOrScheduleAction
    Module "System.Threading.Tasks.Task", in FinishContinuations
    Module "System.Threading.Tasks.Task`1", in TrySetException
    Module "System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1", in SetException
    Module "System.Net.WebConnection", in Connect
    Module "System.Threading.ContextCallback", in Invoke
    Module "System.Threading.ExecutionContext", in RunInternal
    Module "System.Runtime.CompilerServices.AsyncMethodBuilderCore+MoveNextRunner", in Run
    Module "System.Action", in Invoke
    Module "System.Threading.Tasks.AwaitTaskContinuation", in RunOrScheduleAction
    Module "System.Threading.Tasks.Task", in FinishContinuations
    Module "System.Threading.Tasks.Task`1", in TrySetException
    Module "System.Threading.Tasks.TaskFactory`1", in FromAsyncCoreLogic
    Module "System.AsyncCallback", in Invoke
    Module "System.Threading.WaitCallback", in Invoke
    Module "System.Threading.ThreadPoolWorkQueue", in Dispatch


    Here the second stack:

    System.Net.WebException: The request was canceled
    Module "System.Runtime.ExceptionServices.ExceptionDispatchInfo", in Throw
    Module "System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1+ConfiguredTaskAwaiter", in GetResult
    Module "System.Net.WebOperation", in WaitForCompletion
    Module "System.Threading.ContextCallback", in Invoke
    Module "System.Threading.ExecutionContext", in RunInternal
    Module "System.Runtime.CompilerServices.AsyncMethodBuilderCore+MoveNextRunner", in Run
    Module "System.Action", in Invoke
    Module "System.Threading.Tasks.AwaitTaskContinuation", in RunOrScheduleAction
    Module "System.Threading.Tasks.Task", in FinishContinuations
    Module "System.Threading.Tasks.Task`1", in TrySetException
    Module "System.Threading.Tasks.TaskCompletionSource`1", in TrySetException
    Module "System.Net.WebOperation", in FinishReading
    Module "System.Threading.ContextCallback", in Invoke
    Module "System.Threading.ExecutionContext", in RunInternal
    Module "System.Runtime.CompilerServices.AsyncMethodBuilderCore+MoveNextRunner", in Run
    Module "System.Action", in Invoke
    Module "System.Threading.Tasks.AwaitTaskContinuation", in RunOrScheduleAction
    Module "System.Threading.Tasks.Task", in FinishContinuations
    Module "System.Threading.Tasks.Task`1", in TrySetException
    Module "System.Threading.Tasks.TaskCompletionSource`1", in TrySetException
    Module "System.Net.WebOperation", in Run
    Module "System.Threading.ContextCallback", in Invoke
    Module "System.Threading.ExecutionContext", in RunInternal
    Module "System.Runtime.CompilerServices.AsyncMethodBuilderCore+MoveNextRunner", in Run
    Module "System.Action", in Invoke
    Module "System.Threading.Tasks.AwaitTaskContinuation", in RunOrScheduleAction
    Module "System.Threading.Tasks.Task", in FinishContinuations
    Module "System.Threading.Tasks.Task`1", in TrySetException
    Module "System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1", in SetException
    Module "System.Net.WebConnection", in InitConnection
    Module "System.Threading.ContextCallback", in Invoke
    Module "System.Threading.ExecutionContext", in RunInternal
    Module "System.Runtime.CompilerServices.AsyncMethodBuilderCore+MoveNextRunner", in Run
    Module "System.Action", in Invoke
    Module "System.Threading.Tasks.AwaitTaskContinuation", in RunOrScheduleAction
    Module "System.Threading.Tasks.Task", in FinishContinuations
    Module "System.Threading.Tasks.Task`1", in TrySetException
    Module "System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1", in SetException
    Module "System.Net.WebConnection", in Connect
    Module "System.Threading.ContextCallback", in Invoke
    Module "System.Threading.ExecutionContext", in RunInternal
    Module "System.Runtime.CompilerServices.AsyncMethodBuilderCore+MoveNextRunner", in Run
    Module "System.Action", in Invoke
    Module "System.Threading.Tasks.AwaitTaskContinuation", in RunOrScheduleAction
    Module "System.Threading.Tasks.Task", in FinishContinuations
    Module "System.Threading.Tasks.Task`1", in TrySetException
    Module "System.Threading.Tasks.TaskFactory`1", in FromAsyncCoreLogic
    Module "System.AsyncCallback", in Invoke
    Module "System.Threading.WaitCallback", in Invoke
    Module "System.Threading.ThreadPoolWorkQueue", in Dispatch
     
  41. codestage

    codestage

    Joined:
    Jul 27, 2012
    Posts:
    1,931
    Hey,

    It looks like your request was timed out or something like that.
    Does it reproduce every time, or it's kind of occasional?
    I'd suggest trying a different URL. Default time out is 10 seconds, not sure if it's worth changing it out as it should be more than enough.

    It also may occur from time to time due to the poor connection or when the device was disconnected from the network.

    I've sent a PM with additional questions, will be happy to help as much as I can.
     
    Last edited: Apr 11, 2022
  42. codestage

    codestage

    Joined:
    Jul 27, 2012
    Posts:
    1,931
    Some good news, everyone!

    2021.1.0 Update

    Anti-Cheat Toolkit 2021.1.0 just landed!

    This update brings some love to the ObscuredFilePrefs feature:
    - prevent unsaved data loss with new Auto Save on mobiles
    - add AutoSave property to let you disable it on your own if you need full control
    - improve stability when using with disabled Reload Domain
    - prevent possible state corruption when accidentally using from different threads simultaneously

    There are some other important fixes and improvements included too, see the full changelog below:
    [2021.1.0] - 2022-04-11

    Added
    • Add ObscuredFilePrefs Auto Save on mobile platforms (enabled by default)
      • Automatically saves unsaved changes on app loose focus / pause
    • Add API to disable ObscuredFilePrefs Auto Save (disables Auto Save on both mobile and non-mobile platforms)
    • Introduce IObscuredFileSettings to improve API usage experience

    Changed
    • Add locks to the ObscuredFilePrefs sync operations to improve stability when accessing it from different threads
    • Move ObscuredFilePrefs Save-On-Quit code to the Auto Save feature entity so it's disableable now

    Fixed
    • Prevent ObscuredFilePrefs Save-On-Quit while not initialized
    • Fix ObscuredFilePrefs behavior with disabled Reload Domain
    • Fix compilation error at Unity 2018 Android
    • Fix compilation warnings for WebGL platform

    Flash Deal Alert

    Anti-Cheat Toolkit Flash Deal is coming in just a few hours!
    - save stunning 80% on first 50 copies
    - rest of the limited 650 copies will be available with 70% OFF
    - starts 4/11/2022 21:00 UTC

    Seems to be a good time to get a copy if you still didn't :rolleyes:
     
    knxrb likes this.
  43. Freak-Boi

    Freak-Boi

    Joined:
    Feb 1, 2022
    Posts:
    3
    hey sir can anyone use this tool on webgl build
     
  44. codestage

    codestage

    Joined:
    Jul 27, 2012
    Posts:
    1,931
    Hey @Freak-Boi ,

    It does works on WebGL with few exceptions.

    Please take a look at the Compatibility description at the asset Technical Details section on the asset store.
     
  45. AndresOrtiz

    AndresOrtiz

    Joined:
    Apr 30, 2019
    Posts:
    3
    Hello, the assets are excellent but I would like some help to use the hash system, I use it for windows and android (in .apk and apk + obb format). But to use it in aab(app bundle) format it tells me that the hash differs by device type and returns the individual hashes, how can I check the individual hashes without checking the Summary hash
     
  46. codestage

    codestage

    Joined:
    Jul 27, 2012
    Posts:
    1,931
    Hey @AndresOrtiz ,

    I see you've asked this question on Discord support channel as well, and I've already replied there, so let's keep the discussion over there ^^
     
  47. SolFy

    SolFy

    Joined:
    Jul 3, 2018
    Posts:
    3
    Working on BigInteger ambiguities that were previously added to the TODO list?

    We are waiting for ObscuredBigInteger.
     
  48. codestage

    codestage

    Joined:
    Jul 27, 2012
    Posts:
    1,931
    Hey @SolFy

    Yes actually it's already implemented and going to appear on the store in a few days.
    Would you like to try it out before it will be available in the store? I'll send you a package in the PM then.
     
  49. SolFy

    SolFy

    Joined:
    Jul 3, 2018
    Posts:
    3

    Wow, it's already been implemented!!

    It's a really great gift for us. thank you.

    Could you please send it to me if possible?
     
  50. codestage

    codestage

    Joined:
    Jul 27, 2012
    Posts:
    1,931
    Sure, just sent it to your PM.