-
-
Notifications
You must be signed in to change notification settings - Fork 13
GSC Decompiler
The GSC decompiler is here to decompile the compiled GSC scripts from a dump. It supports different kind of game version.
To get the full list of options you can use:
acts gscd -hThe most important options are:
-
-gProduce GSC: Decompile the scripts -
-aProduce ASM: Disassemble the scripts -
-t [type]Set type: Tell to the decompiler the platform to use,pc,ps4orpc_alpha(by default PC) -
-o [directory]Set output dir: Tell the decompiler the output directory
For all the dev options you need to enable the debug logger:
acts -l d gscd -hThe most important options are:
-
-lor-LWrite relative location: Write the relative locations inside the scripts (-L) or inside the function (-l) -
--rawhashAdd raw hashes to export dump: Add raw hash to decompiled header -
--hashmap [f]Write hash map: Write all the extracted hashes into f -
--dumpstrings [f]Write strings: Write all the extracted strings into f
Assuming you have a dump in the directory gsc_dump, you might want to decompile all of them into gsc_dump_decomp. The base command to do that is:
acts gscd gsc_dump -o gsc_dump_decomp -gIf the dump is from a PS4 game, only -t ps4 should be added
acts gscd gsc_dump -o gsc_dump_decomp -g -t ps4If the decompiler for the VM you are using isn't public or fully public, you might have InvalidOpCode lines in the decompilation, for example
// Namespace emp_debuff
// Params 0, eflags: 0x2 linked
// Offset: 0x53b
// Size: 0x50
function function_3a7131767e718c6f() {
if (vehicle::is_killstreak()) {
InvalidOpCode(0x61);
// Unknown operator (0x61, t10_6, PC)
}
return true;
}It means that the code cannot be properly decompiled.
All the VMs after BO4 are encrypted (except the scripts from the MWIII vm before June), for BO4 the decryption function is available inside acts, but for the other VMs, you need first to decrypt the scripts.
If the script isn't decrypted first, the strings won't be available, giving results like:
// Namespace emp_debuff
// Params 0, eflags: 0x2 linked
// Offset: 0x98c
// Size: 0x29
function function_3e4ae1cf64f66600() {
level utility::waittill_any_3("7_+\242\247Qp\233\2078", "\306\340\363M\371\257\311\30<)\375\314u'.\253\35\311", "\222\303@:\3\220\367\267\237\353\270Zn\320I\317");
self.victim notify("]\355\213083\260\220\330J\337\365@\242\\323\233x\264x");
}To decrypt the scripts, you need first to get a dump of the game.
The global option --decrypt-mod [exe] can be used to decrypt the strings while decompiling.
The command to use the exe to decrypt is
acts --decrypt-mod BlackOpsColdWar.exe gscd gsc_dump -o gsc_dump_decomp -g
By decompiling again, you will have all the strings decrypted:
// Namespace emp_debuff
// Params 0, eflags: 0x2 linked
// Offset: 0x98c
// Size: 0x29
function function_3e4ae1cf64f66600() {
level utility::waittill_any_3("game_ended", "round_end_finished", "start_game_ended");
self.victim notify("buttonComboEarlyExit");
}The tool scripts_decrypt can be used to decrypt a dump before using the decompiler.
For example to decrypt the directory gsc_dump into gsc_dump_dec for Black Ops Cold War(cw) using the dumped exe BlackOpsColdWar.exe, you can use this command
acts scripts_decrypt BlackOpsColdWar.exe cw gsc_dump gsc_dump_dec
By decompiling again, you will have all the strings decrypted.
- AtianTools
- Atian Tools UI
- Game Script Code (GSC)
- Fast Files (FF)
- File Structure
- Other Utilities
- Developer