the error is coming from private static void SDG.Unturned.receiveClient(CSteamID steamID, byte[] packet, int offset, int size, int channel) the server sends an ESteamRejection in the packet and then it brings you back to the menu with that error. the server also handles it in the same .cs private static void receiveServer(CSteamID steamID, byte[] packet, int offset, int size, int channel). I'm not too knowledgeable with hash checks but hopefully this helps, just search for WRONG_HASH and you will find it
---Update---
here is some data I found
byte[20] objects[4-6] are hashes
hash_0_1(4) = hash of server password -- not gonna be this there is no password
hash_0_2(5) = Level.dat file in Maps -- we are not changing map so not this one
h(6) = one of 7 hashes in appout.log sent in byte objects[7] which is always 1 so its the second hash (20 bytes, so from 0x16 to 0x29) -- hash of the assembly csharp.dll. found it! :D
so, to bypass you will need to either change in Provider.onLevelLoaded where it sends the hash using Provider.send, or change ReadWrite.appOut where it creates the hash in the first place
Just made a post on it https://www.mpgh.net/forum/showthread.php?t=1068320 its pretty fucking simple.