Anti-Cheat Toolkit: stop cheaters easily!

Hi @codestage , I met the issue when building game with IL2CPP, but if select Script Backend is Mono, it’s working. I using the latest anti cheat toolkit version. The issue detail:

Exception: Failed running C:\Program Files\Unity\Hub\Editor\2020.3.47f1\Editor\Data\il2cpp\build/deploy/netcoreapp3.1/UnityLinker.exe @D:/Projects/WoodPlusBlock/Temp/StagingArea/assets/bin/Data/Managed/response.rsp

stdout:
ERROR: Failed to resolve base type [[ ]][ ][ ][ ]][[ ][ ]]]]]]][[[ ]]]][[ ][ ]][[[[[ ][ ]][ ]] for type [[[ ][[[ ]][[[[[ ][ ][ ][[ ][[ ]]]]][[ ]][ ][[ ]]][[ ][[ ]] in assembly ACTk.Runtime.dll when linking against the UnityAot profile
Fatal error in Unity CIL Linker
Unity.Linker.StrippingResolutionBaseTypeException: ERROR: Failed to resolve base type [[ ]][ ][ ][ ]][[ ][ ]]]]]]][[[ ]]]][[ ][ ]][[[[[ ][ ]][ ]] for type [[[ ][[[ ]][[[[[ ][ ][ ][[ ][[ ]]]]][[ ]][ ][[ ]]][[ ][[ ]] in assembly ACTk.Runtime.dll when linking against the UnityAot profile
at Unity.Linker.MonoBehaviorUtilities.DerivesFrom(UnityLinkContext context, TypeDefinition type, String[ ] possibleBaseNames)
at Unity.Linker.MonoBehaviorUtilities.IsOrDerivesFrom(UnityLinkContext context, TypeDefinition type, String[ ] possibleBaseNames)
at Unity.Linker.MonoBehaviorUtilities.IsMonoBehaviourOrScriptableObject(UnityLinkContext context, TypeDefinition type)
at Unity.Linker.Steps.Rooting.ResolveFromMonoBehaviours.b__6_0(TypeDefinition t)
at System.Linq.Enumerable.WhereEnumerableIterator`1.MoveNext()
at Unity.Linker.Steps.Rooting.ResolveFromMonoBehaviours.Process(LinkContext context)
at Mono.Linker.Pipeline.ProcessStep(LinkContext context, IStep step)
at Unity.Linker.UnityPipeline.ProcessStep(LinkContext context, IStep step)
at Mono.Linker.Pipeline.Process(LinkContext context)
at Unity.Linker.UnityDriver.UnityRun(ILogger customLogger)
at Unity.Linker.UnityDriver.RunDriverWithoutErrorHandling(ILogger customLogger)
at Unity.Linker.UnityDriver.RunDriver()
stderr:

UnityEditorInternal.Runner.RunProgram (UnityEditor.Utils.Program p, System.String exe, System.String args, System.String workingDirectory, UnityEditor.Scripting.Compilers.CompilerOutputParserBase parser) (at <3e401efa0ce4422582abd640a807e261>:0)
UnityEditorInternal.Runner.RunNetCoreProgram (System.String exe, System.String args, System.String workingDirectory, UnityEditor.Scripting.Compilers.CompilerOutputParserBase parser, System.Action1[T] setupStartInfo) (at <3e401efa0ce4422582abd640a807e261>:0) UnityEditorInternal.AssemblyStripper.RunAssemblyLinker (System.Collections.Generic.IEnumerable1[T] args, System.String& out, System.String& err, System.String linkerPath, System.String workingDirectory) (at <3e401efa0ce4422582abd640a807e261>:0)
UnityEditorInternal.AssemblyStripper.StripAssembliesTo (System.String outputFolder, System.String& output, System.String& error, System.Collections.Generic.IEnumerable1[T] linkXmlFiles, UnityEditorInternal.UnityLinkerRunInformation runInformation) (at <3e401efa0ce4422582abd640a807e261>:0) UnityEditorInternal.AssemblyStripper.RunAssemblyStripper (UnityEditorInternal.UnityLinkerRunInformation runInformation) (at <3e401efa0ce4422582abd640a807e261>:0) UnityEditorInternal.AssemblyStripper.StripAssemblies (System.String managedAssemblyFolderPath, UnityEditorInternal.BaseUnityLinkerPlatformProvider unityLinkerPlatformProvider, UnityEditorInternal.IIl2CppPlatformProvider il2cppPlatformProvider, UnityEditor.RuntimeClassRegistry rcr, UnityEditor.ManagedStrippingLevel managedStrippingLevel) (at <3e401efa0ce4422582abd640a807e261>:0) UnityEditorInternal.IL2CPPBuilder.Run () (at <3e401efa0ce4422582abd640a807e261>:0) UnityEditorInternal.IL2CPPUtils.RunIl2Cpp (System.String tempFolder, System.String stagingAreaData, UnityEditorInternal.IIl2CppPlatformProvider platformProvider, System.Action1[T] modifyOutputBeforeCompile, UnityEditor.RuntimeClassRegistry runtimeClassRegistry) (at <3e401efa0ce4422582abd640a807e261>:0)
UnityEditor.Android.PostProcessor.Tasks.RunIl2Cpp.Execute (UnityEditor.Android.PostProcessor.PostProcessorContext context) (at <22b0bbbaead14b9cb1b4d2a9a9cd4275>:0)
UnityEditor.Android.PostProcessor.PostProcessRunner.RunAllTasks (UnityEditor.Android.PostProcessor.PostProcessorContext context) (at <22b0bbbaead14b9cb1b4d2a9a9cd4275>:0)
UnityEditor.Android.PostProcessAndroidPlayer.PostProcess (UnityEditor.BuildTarget target, System.String stagingAreaData, System.String stagingArea, System.String playerPackage, System.String installPath, System.String companyName, System.String productName, UnityEditor.BuildOptions options, UnityEditor.RuntimeClassRegistry usedClassRegistry, UnityEditor.Build.Reporting.BuildReport report) (at <22b0bbbaead14b9cb1b4d2a9a9cd4275>:0)
UnityEditor.Android.AndroidBuildPostprocessor.PostProcess (UnityEditor.Modules.BuildPostProcessArgs args, UnityEditor.BuildProperties& outProperties) (at <22b0bbbaead14b9cb1b4d2a9a9cd4275>:0)
UnityEditor.PostprocessBuildPlayer.Postprocess (UnityEditor.BuildTargetGroup targetGroup, UnityEditor.BuildTarget target, System.String installPath, System.String companyName, System.String productName, System.Int32 width, System.Int32 height, UnityEditor.BuildOptions options, UnityEditor.RuntimeClassRegistry usedClassRegistry, UnityEditor.Build.Reporting.BuildReport report) (at <3e401efa0ce4422582abd640a807e261>:0)
UnityEngine.GUIUtility:processEvent(Int32, IntPtr, Boolean&)

Greetings, looking weird!

Could you please let me know your Unity version and target platform?
Does it also reproduce in a new empty project for you?
And do you use obfuscation of any sort?

I use Unity 2020.3.47f1 and build to Android platform.
I upgrade project with Anti cheat toolkit ver 2021 to new version. I was deleting toolkit 2021 before importing new version of anti-cheat toolkit.
My project use Obfuscation of Beebyte.

Thanks for all the details!

I tried making a demo scene build in a new project from 2020.3.47 and couldn’t reproduce the problem so far.

Could you try disabling obfuscation and check if the problem still persists? If so, will it have a different error message?

Also still wonder if it reproduce in a new empty project for you

Hi,
So I am publishing my game and I am using Anti cheat toolkit latest version 2023. I am publishing on IOS. I am using it in combination with Simple IAP asset by Flobuk.

My question is regarding export regulation I have checked the checkbox for the compliant with US Export regulation in Easy anti cheat settings. But what remains here is the French regulations for export.

In Apple App Store Connect if the encryption used by anti cheat toolkit when Us Export regulations compliance is check which is 56 bit RC2 after I checked the documentation of ACTK

App Encryption Documentation 2 of 3
Select which encryption algorithms does your app implement:

1- Encryption algorithms that are proprietary or not accepted as standard by international standard bodies (IEEE, IETF, ITU etc.)

2- Standard encryption algorithms instead of, or in addition to, using or accessing the encryption within Apple’s operating system

Does ACTK fall under the previous two ?

If it falls under the second one it asks me to submit French Declaration form.

Does using 56bit RC2 via ACTK result in me being exempt from French Declaration form too ? Or do I have to fill it and submit it ?

@codestage I also use the following sdks. Admob ads, Unity Ads, Unity Analytics, Unity IAP, Unity Notifications

I also use IL2CCP build

I also found this but I don’t know when using ACTK 56bit RC2 which category my game will fall under:

Encryption algorithm in use Required documentation
1-Your app uses encryption limited to that within the Apple operating system: No documentation required in App Store Connect.

2- Your app uses an industry standard algorithm, not provided within the Apple operating system Upload your French encryption declaration in App Store Connect.

3- Your app uses proprietary encryption algorithms not accepted by international standard bodies (such as IEEE, IETF, or ITU) Upload your U.S. Commodity Classification Automated Tracking System (CCATS) and/or French encryption declaration in App Store Connect

Hey, using 56-bit long keys does not fall under the “encryption” term in US Export regulations but can’t be sure about it’s a case for the France export regulations. I’d suggest confirming this in French export regulation laws.

General feel it should be safe to assume you’re exempt from the French Declaration form as well, but can’t confirm this for 100%.

It would be great to know if you’ll find out any additional details on this!

:man_detective: ACTk 2024.2 is live now…
…and available with 50% off until the December, 1 :tada:

A few highlights:

  • New ObscuredCheatingDetector Honeypot option
    • Detection is now possible with honeypot disabled
  • Fixed multiple vulnerabilities and bugs
  • Improved obscured types migration and validation
  • Half the price! :sweat_smile:
Full changelog since 2024.0

[2024.2.1] - 2024-11-18

Fixed

  • Fix default ObscuredBool was rendered as True in Inspector (thx sol3breaker)

[2024.2.0] - 2024-11-17

Added

  • Add Project View context menus to validate or migrate specified assets

Changed

  • Improve RAM usage while validating or migrating assets
  • Improve asset validation and migration API for more flexibility

Fixed

  • Fix possible exceptions while iterating scripting objects
  • Fix non-initialized obscured variables were marked as invalid

[2024.1.0] - 2024-11-04

Added

  • Add Honeypot option to the ObscuredCheatingDetector

Changed

  • Improve Obscured types cheating resistance
  • Improve ObscuredTypesNewtonsoftConverter performance
  • Improve ObscuredVector2Int API compatibility
  • Improve ObscuredVector3Int API compatibility

Deprecated

  • Deprecate ACTK_OBSCURED_AUTO_MIGRATION flag with auto-migration from legacy versions

Fixed

  • Fix AndroidScreenRecordingBlocker example
  • Fix rare ObscuredBigInteger data corruption
  • Fix ObscuredUInt inspector couldn’t be set to values more than 2147483647

Greetings everyone,

One of my customers recently asked how much Anti-Cheat Toolkit (ACTk) impacts WebGL build size. This inspired a research project that I’d like to share with you all. Along the way, I also explored how various WebGL settings affect build sizes in Unity 6 (6000.0.29f1) LTS, using the FPS Microgame template.

The results are insightful and reassuring: ACTk adds just 287 KB (1.76%) to the smallest optimized build, while providing robust anti-cheat protection. Here’s a breakdown:

Key Findings

  1. Largest Build Size: 70.59 MB (default settings).
  2. Smallest Build Size: 16.33 MB (fully optimized).
  3. ACTk’s Impact: Adds only 287 KB (1.76%) to the smallest build size.

Default Build Settings

  • API Compatibility level: .NET Framework
  • IL2CPP Code Generation: Faster runtime
  • C++ Compiler Configuration: Release
  • Strip Engine Code: Off
  • Managed Stripping Level: Minimal
  • Compression: Disabled
  • Code Optimization: Shorter Build Time
  • Target WebAssembly 2023: Off

Optimization Breakdown

Change Build Size (MB) Reduction (%)
Default Build 70.59 0.0
IL2CPP Faster (smaller) Builds 56.87 19.44
Strip Engine Code + High Stripping 45.14 36.05
Disk Size LTO + WebAssembly 2023 39.70 43.75
Brotli Compression 16.33 76.87
Add ACTk 16.61 75.11
  • Switching API Compatibility level from .NET Framework to .NET Standard saved only 43 bytes and was omitted from tests results.
  • Switching C++ Compiler Configuration from Release to Master with Disk Size LTO saved only 4 bytes, so it was omitted too.

Here is a chart for easier read:

Takeaways

  • For the best build size reductions, use:
    • Brotli compression
    • High stripping levels
    • Target WebAssembly 2023
    • Disk Size LTO optimization
  • Adding ACTk makes a negligible impact on build size for safeguarding your game from cheaters.
  • For further build size reduction, consider keeping your project clean of unused assets and leveraging Asset Bundles or Addressables for on-demand content delivery.

Why It Matters

WebGL build size directly affects loading times, memory, and storage usage - critical for player retention, especially on mobile platforms. With ACTk, you secure your game against cheaters without bloating your builds.

I’d love to hear your thoughts or answer any questions about these findings - let’s discuss!

1 Like