script_title = "Survivor.io Free Script Made by Crazy Gamer" scriptFunctions = { -- table(ee5c969) [1] = { -- table(b6aefee) ['edits'] = { -- table(1b6dc8f) [1] = { -- table(2aa82f6) ['active'] = true, ['arm7_edits'] = { -- table(6c4e6f7) [1] = '~A MOV R0, #1', [2] = '~A BX LR', }, ['arm8_edits'] = { -- table(a3fc964) [1] = '~A8 MOV W0, #1', [2] = '~A8 RET', }, ['class_name'] = 'MonthCardManager', ['edit_name'] = 'IsExemptAD', ['method_name'] = 'IsExemptAD', }, }, ['menu_name'] = 'No ADS', }, [2] = { -- table(7a9ab1c) ['edits'] = { -- table(9089325) [1] = { -- table(3dd67cd) ['active'] = false, ['arm7_edits'] = { -- table(73d882) [1] = '~A MOVW R0, #0', [2] = '100A00EEr', [3] = 'C00AB8EEr', [4] = '100A10EEr', [5] = '1EFF2FE1r', }, ['arm8_edits'] = { -- table(3d6fb93) [1] = '~A8 MOV W0, WZR', [2] = '0000271Er', [3] = '00D8215Er', [4] = '0000261Er', [5] = 'C0035FD6r', }, ['class_name'] = 'WeaponClip', ['edit_name'] = 'GetReloadTime', ['method_name'] = 'GetReloadTime', }, }, ['menu_name'] = 'No CD Skill & Weapon', }, [3] = { -- table(91a1cfa) ['edits'] = { -- table(84eb2ab) [1] = { -- table(debbdef) ['active'] = false, ['arm7_edits'] = { -- table(718e0fc) [1] = '~A MOVW R0, #10', [2] = '100A00EEr', [3] = 'C00AB8EEr', [4] = '100A10EEr', [5] = '1EFF2FE1r', }, ['arm8_edits'] = { -- table(90cc385) [1] = '~A8 MOV W0, #10', [2] = '0000271Er', [3] = '00D8215Er', [4] = '0000261Er', [5] = 'C0035FD6r', }, ['class_name'] = 'StatsGroup', ['edit_name'] = 'GetExpRate', ['method_name'] = 'GetExpRate', }, }, ['menu_name'] = 'Experience Rate 10%', }, [4] = { -- table(f345d08) ['edits'] = { -- table(9d43ca1) [1] = { -- table(9e217d0) ['active'] = false, ['arm7_edits'] = { -- table(365b3c9) [1] = '~A MOVW R0, #3125', [2] = '~A MOVW R1, #3199', [3] = '900100E0r', [4] = '~A MOVW R1, #3125', [5] = '010080E0r', [6] = '100A00EEr', [7] = 'C00AB8EEr', [8] = '100A10EEr', [9] = '1EFF2FE1r', }, ['arm8_edits'] = { -- table(58aface) [1] = '~A8 MOV W0, #3125', [2] = '~A8 MOV W1, #3199', [3] = '007C011Br', [4] = '~A8 MOV W1, #3125', [5] = '0000010Br', [6] = '0000271Er', [7] = '00D8215Er', [8] = '0000261Er', [9] = 'C0035FD6r', }, ['class_name'] = 'StatsGroup', ['edit_name'] = 'GetHitHighHpPercentApRateAddition', ['method_name'] = 'GetHitHighHpPercentApRateAddition', }, }, ['menu_name'] = 'High Damage', }, [5] = { -- table(f5d0ec6) ['edits'] = { -- table(843ce87) [1] = { -- table(e96a5eb) ['active'] = false, ['arm7_edits'] = { -- table(b746f48) [1] = '~A MOV R0, #1', [2] = '~A BX LR', }, ['arm8_edits'] = { -- table(42b81e1) [1] = '~A8 MOV W0, #1', [2] = '~A8 RET', }, ['class_name'] = 'InGameEnemy', ['edit_name'] = 'get_IsAllEnemyFreezingActive', ['method_name'] = 'get_IsAllEnemyFreezingActive', }, }, ['menu_name'] = 'Disable Move & Attack Enemy', }, } translateTable = nil Il2Cpp = {} Il2Cpp.Il2cppApi = { -- table(13641b4) ['ClassApiCountFields'] = { -- table(6411c4d) ['ARM7'] = 168, ['ARM8'] = 288, }, ['ClassApiCountMethods'] = { -- table(b576777) ['ARM7'] = 164, ['ARM8'] = 284, }, ['ClassApiFieldsLink'] = { -- table(eb3b8aa) ['ARM7'] = 64, ['ARM8'] = 128, }, ['ClassApiFieldsStep'] = { -- table(cbc134c) ['ARM7'] = 20, ['ARM8'] = 32, }, ['ClassApiMethodsLink'] = { -- table(8ecb576) ['ARM7'] = 76, ['ARM8'] = 152, }, ['ClassApiMethodsStep'] = { -- table(e6b302) ['ARM7'] = 2, ['ARM8'] = 3, }, ['ClassApiNameOffset'] = { -- table(7cfc520) ['ARM7'] = 8, ['ARM8'] = 16, }, ['ClassApiNameSpaceOffset'] = { -- table(28b5152) ['ARM7'] = 12, ['ARM8'] = 24, }, ['ClassApiParentOffset'] = { -- table(83d1838) ['ARM7'] = 44, ['ARM8'] = 88, }, ['ClassApiStaticFieldDataOffset'] = { -- table(2e9309e) ['ARM7'] = 92, ['ARM8'] = 184, }, ['FieldApiClassOffset'] = { -- table(24e077f) ['ARM7'] = 8, ['ARM8'] = 16, }, ['FieldApiOffset'] = { -- table(2459c9b) ['ARM7'] = 12, ['ARM8'] = 24, }, ['FieldApiType'] = { -- table(f84cc23) ['ARM7'] = 4, ['ARM8'] = 8, }, ['MethodsApiClassOffset'] = { -- table(2bd8f95) ['ARM7'] = 12, ['ARM8'] = 24, }, ['MethodsApiNameOffset'] = { -- table(846ded9) ['ARM7'] = 8, ['ARM8'] = 16, }, ['MethodsApiParamCount'] = { -- table(2c77fe4) ['ARM7'] = 42, ['ARM8'] = 74, }, ['MethodsApiReturnType'] = { -- table(2b49011) ['ARM7'] = 16, ['ARM8'] = 32, }, ['TypeApiType'] = { -- table(15701dd) ['ARM7'] = 6, ['ARM8'] = 10, }, ['stringOffset'] = 24, ['typeDefinitionsOffset'] = 160, ['typeDefinitionsSize'] = 88, } editByOffset = {} editByOffset.originalValues = {} emojis = {} revert_table = {} setFields = {} arch = gg.getTargetInfo() needToConfigure = false for i, v in pairs(scriptFunctions) do emojis[i] = "šŸ”˜" end if arch.x64 then flag_type = gg.TYPE_QWORD Il2Cpp.ARM = "ARM8" else flag_type = gg.TYPE_DWORD Il2Cpp.ARM = "ARM7" end if Il2Cpp.Il2cppApi ~= nil then Il2Cpp.FieldApiOffset = Il2Cpp.Il2cppApi.FieldApiOffset[Il2Cpp.ARM] Il2Cpp.FieldApiType = Il2Cpp.Il2cppApi.FieldApiType[Il2Cpp.ARM] Il2Cpp.FieldApiClassOffset = Il2Cpp.Il2cppApi.FieldApiClassOffset[Il2Cpp.ARM] Il2Cpp.ClassApiNameOffset = Il2Cpp.Il2cppApi.ClassApiNameOffset[Il2Cpp.ARM] Il2Cpp.ClassApiMethodsStep = Il2Cpp.Il2cppApi.ClassApiMethodsStep[Il2Cpp.ARM] Il2Cpp.ClassApiCountMethods = Il2Cpp.Il2cppApi.ClassApiCountMethods[Il2Cpp.ARM] Il2Cpp.ClassApiMethodsLink = Il2Cpp.Il2cppApi.ClassApiMethodsLink[Il2Cpp.ARM] Il2Cpp.ClassApiFieldsLink = Il2Cpp.Il2cppApi.ClassApiFieldsLink[Il2Cpp.ARM] Il2Cpp.ClassApiFieldsStep = Il2Cpp.Il2cppApi.ClassApiFieldsStep[Il2Cpp.ARM] Il2Cpp.ClassApiCountFields = Il2Cpp.Il2cppApi.ClassApiCountFields[Il2Cpp.ARM] Il2Cpp.ClassApiParentOffset = Il2Cpp.Il2cppApi.ClassApiParentOffset[Il2Cpp.ARM] Il2Cpp.ClassApiNameSpaceOffset = Il2Cpp.Il2cppApi.ClassApiNameSpaceOffset[Il2Cpp.ARM] Il2Cpp.ClassApiStaticFieldDataOffset = Il2Cpp.Il2cppApi.ClassApiStaticFieldDataOffset[Il2Cpp.ARM] Il2Cpp.MethodsApiClassOffset = Il2Cpp.Il2cppApi.MethodsApiClassOffset[Il2Cpp.ARM] Il2Cpp.MethodsApiNameOffset = Il2Cpp.Il2cppApi.MethodsApiNameOffset[Il2Cpp.ARM] Il2Cpp.MethodsApiParamCount = Il2Cpp.Il2cppApi.MethodsApiParamCount[Il2Cpp.ARM] Il2Cpp.MethodsApiReturnType = Il2Cpp.Il2cppApi.MethodsApiReturnType[Il2Cpp.ARM] Il2Cpp.typeDefinitionsSize = Il2Cpp.Il2cppApi.typeDefinitionsSize Il2Cpp.typeDefinitionsOffset = Il2Cpp.Il2cppApi.typeDefinitionsOffset Il2Cpp.stringOffset = Il2Cpp.Il2cppApi.stringOffset Il2Cpp.TypeApiType = Il2Cpp.Il2cppApi.TypeApiType[Il2Cpp.ARM] end function getRange() local stringsStart = ":" .. string.char(0) .. "mscorlib.dll" .. string.char(0) local stringsEnd = "00h;00h;0~~0;0~~0;0~~0;00h;0~~0;00h;0~~0;00h;FFh;FFh::12" gg.setRanges(gg.REGION_OTHER) gg.setVisible(false) gg.toast(script_title .. "\n\nā„¹ļø Configuring Script ā„¹ļø") gg.clearResults() ::try_ca:: gg.searchNumber(stringsStart, gg.TYPE_BYTE, false, gg.SIGN_EQUAL, nil, nil, 1) if gg.getResultsCount() == 0 then gg.setRanges(gg.REGION_C_ALLOC) goto try_ca end local start_search = gg.getResults(1) gg.clearResults() range_start = start_search[1].address for i, v in pairs(gg.getRangesList()) do if v["start"] < range_start and v["end"] > range_start then metadata_end = v["end"] break end end gg.searchNumber(stringsEnd, gg.TYPE_BYTE, false, gg.SIGN_EQUAL, range_start, nil, 1) local end_search = gg.getResults(1) range_end = end_search[1].address gg.clearResults() end function hex_o(n) return "0x" .. string.upper(string.format("%x", n)) end function createHookCall(editTable, function_index, editIndex) if scriptFunctions[function_index].edits[editIndex].enabled == true then gg.setValues(scriptFunctions[function_index].edits[editIndex].orignal_values) scriptFunctions[function_index].edits[editIndex].enabled = false else local hookedMethod = editTable.method_name local hookedClass = editTable.class_name local hookedAddress = findMethod(hookedMethod, hookedClass)[1] local calledMethod = editTable.called.method_name local calledClass = editTable.called.class_name local calledAddress = findMethod(calledMethod, calledClass)[1] local call_offset if tonumber(hookedAddress) > tonumber(calledAddress) then local check_offset = tonumber(hookedAddress) - tonumber(calledAddress) call_offset = "-" .. hex_o(check_offset) else local check_offset = tonumber(calledAddress) - tonumber(hookedAddress) if arch.x64 then call_offset = hex_o(check_offset) else call_offset = "+" .. hex_o(check_offset) end end scriptFunctions[function_index].edits[editIndex].edits = {{"~A B " .. call_offset}, {"~A8 B [PC,#" .. call_offset .. "]"}} local editHook = {{ address = hookedAddress, flags = gg.TYPE_DWORD }} if not scriptFunctions[function_index].edits[editIndex].orignal_values then gg.loadResults(editHook) scriptFunctions[function_index].edits[editIndex].orignal_values = gg.getResults(gg.getResultsCount()) end if arch.x64 then editHook[1].value = scriptFunctions[function_index].edits[editIndex].edits[2][1] else editHook[1].value = scriptFunctions[function_index].edits[editIndex].edits[1][1] end gg.setValues(editHook) scriptFunctions[function_index].edits[editIndex].enabled = true end end function setMethodValues(function_index, edit_index) if arch.x64 then edits_arch = "arm8_edits" else edits_arch = "arm7_edits" end local edits = scriptFunctions[function_index].edits[edit_index][edits_arch] if scriptFunctions[function_index].edits[edit_index].enabled == true then gg.setValues(scriptFunctions[function_index].edits[edit_index].orignal_values) scriptFunctions[function_index].edits[edit_index].enabled = false else if not scriptFunctions[function_index].edits[edit_index].orignal_values then local addresses = findMethod(scriptFunctions[function_index].edits[edit_index].method_name, scriptFunctions[function_index].edits[edit_index].class_name) local tempTable = {} for i, v in ipairs(edits) do tempTable[i] = { address = addresses[1], flags = gg.TYPE_DWORD } addresses[1] = addresses[1] + 4 end gg.loadResults(tempTable) local results = gg.getResults(gg.getResultsCount()) scriptFunctions[function_index].edits[edit_index].addresses = gg.getResults(gg.getResultsCount()) scriptFunctions[function_index].edits[edit_index].orignal_values = gg.getResults(gg.getResultsCount()) end for i, v in ipairs(edits) do scriptFunctions[function_index].edits[edit_index].addresses[i].value = v end gg.setValues(scriptFunctions[function_index].edits[edit_index].addresses) scriptFunctions[function_index].edits[edit_index].enabled = true end end function home() local menuNames = {} for i, v in pairs(scriptFunctions) do menuNames[i] = emojis[i] .. " " .. v.menu_name end if translateTable ~= nil then menuNames[#menuNames + 1] = "🌐 Change Language" end menuNames[#menuNames + 1] = "āŒ Exit" local menu = gg.choice(menuNames, nil, script_title) if menu ~= nil then if menu == #menuNames then os.exit() elseif translateTable ~= nil and menu == #menuNames - 1 then changeLang() else setValues(menu) end end end function changeLang() local languages = {} for i, v in ipairs(translateTable) do languages[i] = v.language end local menu = gg.choice(languages, nil, "Select language") if menu ~= nil then for i, v in ipairs(scriptFunctions) do scriptFunctions[i].menu_name = translateTable[menu].text[i] end end home() end function setValues(function_index) local status if emojis[function_index] == "šŸ”˜" then emojis[function_index] = "āœ…" status = "Enabled" else emojis[function_index] = "šŸ”˜" status = "Disabled" end for i, v in pairs(scriptFunctions[function_index].edits) do if v.method_name and v.hook then createHookCall(v, function_index, i) elseif v.method_name then setMethodValues(function_index, i) elseif v.field_name then if status == "Enabled" then setFieldValues(v, function_index, i) end elseif v.editName then setLibOffsetValues(v, function_index, i) else setSVFValues(v, function_index, i) end end gg.toast(emojis[function_index] .. " " .. scriptFunctions[function_index].menu_name .. " " .. status .. " " .. emojis[function_index]) end function fix(class_name, passed_class_name, index) return "Result " .. index .. " Checked" end function findMethod(method_name, passed_class_name) if arch.x64 then p_offset = 16 p_offset2 = 8 else p_offset = 8 p_offset2 = 4 end method_name_address = searchMetaData(method_name) gg.clearResults() gg.setRanges(gg.REGION_OTHER | gg.REGION_C_ALLOC) gg.searchNumber(method_name_address, flag_type) local results = gg.getResults(gg.getResultsCount()) local methods_found = {} local il2cpp_addresses = {} for i, v in pairs(results) do local classPointer = {} classPointer[1] = {} classPointer[1].address = v.address + p_offset2 classPointer[1].flags = flag_type classPointer = gg.getValues(classPointer) classPointer[1].address = classPointer[1].value + Il2Cpp.ClassApiNameOffset classPointer = gg.getValues(classPointer) local class_name = getIl2CppString(classPointer[1].value) if class_name == passed_class_name then local get_il2cpp_address = {} get_il2cpp_address[1] = {} get_il2cpp_address[1].address = v.address - p_offset get_il2cpp_address[1].flags = flag_type get_il2cpp_address = gg.getValues(get_il2cpp_address) il2cpp_addresses[#il2cpp_addresses + 1] = get_il2cpp_address[1].value end end return il2cpp_addresses end function searchMetaData(search_string) gg.setRanges(gg.REGION_OTHER | gg.REGION_C_ALLOC) if search_string then gg.clearResults() gg.searchNumber(createSearch(search_string), gg.TYPE_BYTE, false, gg.SIGN_EQUAL, range_start, range_end) local results = gg.getResults(1, 1) return results[1].address end end function createSearch(search_string) local textSearch = ":" .. string.char(0) .. search_string .. string.char(0) return textSearch end function setFieldValues(saved_edit_table, function_index, edit_index) if scriptFunctions[function_index].edits[edit_index].enabled == true then gg.setValues(scriptFunctions[function_index].edits[edit_index].orignal_values) scriptFunctions[function_index].edits[edit_index].orignal_values = nil scriptFunctions[function_index].edits[edit_index].enabled = false else local header_offset if arch.x64 then header_offset = 16 else header_offset = 8 end gg.clearList() local class_name = saved_edit_table.class_name local field_name = saved_edit_table.field_name local namespace_name = saved_edit_table.edit_namespace gg.setRanges(gg.REGION_OTHER) gg.clearResults() gg.searchNumber(createSearch(class_name), gg.TYPE_BYTE, false, gg.SIGN_EQUAL, range_start, range_end) local class_string = gg.getResults(1, 1) local namespace_string if namespace_name ~= "" then gg.clearResults() gg.searchNumber(createSearch(namespace_name), gg.TYPE_BYTE, false, gg.SIGN_EQUAL, range_start, range_end) namespace_string = gg.getResults(1, 1) namespace_string = ggHex(namespace_string[1].address, false) else namespace_string = ggHex(range_start - 19, false) end gg.clearResults() gg.setRanges(gg.REGION_OTHER | gg.REGION_C_ALLOC) gg.searchNumber(ggHex(class_string[1].address, false) .. ";" .. namespace_string .. "::9", flag_type) local results = gg.getResults(1) local class_header = results[1].address - header_offset local field_count = {{ address = class_header + Il2Cpp.ClassApiCountFields, flags = gg.TYPE_DWORD }} field_count = gg.getValues(field_count) field_count = field_count[1].value local field_pointer = {{ address = class_header + Il2Cpp.ClassApiFieldsLink, flags = flag_type }} field_pointer = gg.getValues(field_pointer) field_pointer = ggHex(field_pointer[1].value) local correct_field for i = 1, field_count do local checkString = {{ address = field_pointer, flags = flag_type }} checkString = gg.getValues(checkString) checkString = getIl2CppString(checkString[1].value) if field_name == checkString then correct_field = field_pointer break end field_pointer = field_pointer + Il2Cpp.ClassApiFieldsStep end local field_offset = {{ address = correct_field + Il2Cpp.FieldApiOffset, flags = gg.TYPE_DWORD }} field_offset = gg.getValues(field_offset) field_offset = field_offset[1].value gg.clearResults() gg.setRanges(gg.REGION_ANONYMOUS) gg.searchNumber(class_header, flag_type) local results = gg.getResults(gg.getResultsCount()) load_field_values = {} local value_type = saved_edit_table.value_type for i, v in pairs(results) do load_field_values[i] = v load_field_values[i].address = v.address + field_offset load_field_values[i].flags = value_type end if not scriptFunctions[function_index].edits[edit_index].orignal_values then gg.loadResults(load_field_values) scriptFunctions[function_index].edits[edit_index].orignal_values = gg.getResults(gg.getResultsCount()) end gg.addListItems(load_field_values) if saved_edit_table.edit_type == "edit_all_x4" then local save_list_all = gg.getListItems() for i, v in pairs(save_list_all) do save_list_all[i].address = save_list_all[i].address + 4 if tonumber(saved_edit_table.edit_value) == 0 then save_list_all[i].value = save_list_all[i].value else save_list_all[i].value = saved_edit_table.edit_value .. "X4" end save_list_all[i].freeze = saved_edit_table.freeze end gg.setValues(save_list_all) gg.addListItems(save_list_all) end if saved_edit_table.edit_type == "edit_all_x8" then local save_list_all = gg.getListItems() for i, v in pairs(save_list_all) do save_list_all[i].address = save_list_all[i].address + 8 if tonumber(saved_edit_table.edit_value) == 0 then save_list_all[i].value = save_list_all[i].value else save_list_all[i].value = saved_edit_table.edit_value .. "X8" end save_list_all[i].freeze = saved_edit_table.freeze end gg.setValues(save_list_all) gg.addListItems(save_list_all) end if saved_edit_table.edit_type == "edit_indexes" then local save_list_all = gg.getListItems() for i, v in pairs(saved_edit_table.edit_indexes) do save_list_all[v].value = saved_edit_table.edit_value save_list_all[v].freeze = saved_edit_table.freeze end gg.setValues(save_list_all) gg.addListItems(save_list_all) end if saved_edit_table.edit_type == "edit_all_that_equal" then local save_list_all = gg.getListItems() for i, v in pairs(save_list_all) do if v.value == saved_edit_table.must_equal then save_list_all[i].value = saved_edit_table.edit_value save_list_all[i].freeze = saved_edit_table.freeze end end gg.setValues(save_list_all) gg.addListItems(save_list_all) end if saved_edit_table.edit_type == "edit_all" then local save_list_all = gg.getListItems() for i, v in pairs(save_list_all) do save_list_all[i].value = saved_edit_table.edit_value save_list_all[i].freeze = saved_edit_table.freeze end gg.setValues(save_list_all) gg.addListItems(save_list_all) end if saved_edit_table.edit_type == "edit_all_that_do_not_equal" then local save_list_all = gg.getListItems() for i, v in pairs(save_list_all) do if save_list_all[i].value ~= saved_edit_table.must_equal then save_list_all[i].value = saved_edit_table.edit_value save_list_all[i].freeze = saved_edit_table.freeze end end gg.setValues(save_list_all) gg.addListItems(save_list_all) end if saved_edit_table.edit_type == "edit_all_less_equal" then local save_list_all = gg.getListItems() for i, v in pairs(save_list_all) do if save_list_all[i].value <= saved_edit_table.must_equal then save_list_all[i].value = saved_edit_table.edit_value save_list_all[i].freeze = saved_edit_table.freeze end end gg.setValues(save_list_all) gg.addListItems(save_list_all) end if saved_edit_table.edit_type == "edit_all_greater_equal" then local save_list_all = gg.getListItems() for i, v in pairs(save_list_all) do if save_list_all[i].value >= saved_edit_table.must_equal then save_list_all[i].value = saved_edit_table.edit_value save_list_all[i].freeze = saved_edit_table.freeze end end gg.setValues(save_list_all) gg.addListItems(save_list_all) end if saved_edit_table.edit_type == "edit_all_in_range" then local save_list_all = gg.getListItems() local minValue = saved_edit_table.must_equal:gsub("(.+)~.+", "%1") minValue = tonumber(minValue) local maxValue = saved_edit_table.must_equal:gsub(".+~(.+)", "%1") maxValue = tonumber(maxValue) for i, v in pairs(save_list_all) do if save_list_all[i].value >= minValue and save_list_all[i].value <= maxValue then save_list_all[i].value = saved_edit_table.edit_value save_list_all[i].freeze = saved_edit_table.freeze end end gg.setValues(save_list_all) gg.addListItems(save_list_all) end if saved_edit_table.edit_type == "edit_all_not_in_range" then local save_list_all = gg.getListItems() local minValue = saved_edit_table.must_equal:gsub("(.+)~.+", "%1") minValue = tonumber(minValue) local maxValue = saved_edit_table.must_equal:gsub(".+~(.+)", "%1") maxValue = tonumber(maxValue) for i, v in pairs(save_list_all) do if save_list_all[i].value < minValue or save_list_all[i].value > maxValue then save_list_all[i].value = saved_edit_table.edit_value save_list_all[i].freeze = saved_edit_table.freeze end end gg.setValues(save_list_all) gg.addListItems(save_list_all) scriptFunctions[function_index].edits[edit_index].enabled = true end end fields = {} end function ggHex(n, zero) if type(n) ~= "table" then local dwordValueToHex = string.format("%x", n) if #dwordValueToHex == 8 or #dwordValueToHex == 10 or #dwordValueToHex == 12 then if zero == false then return dwordValueToHex .. "h" else return "0x" .. dwordValueToHex end else local sub = #dwordValueToHex / 2 sub = tonumber("-" .. sub) dwordValueToHex = dwordValueToHex:sub(sub) if zero == false then return dwordValueToHex .. "h" else return "0x" .. dwordValueToHex end end else return nil end end function getIl2CppString(address) local tempString = "" repeat local character = {{ address = address, flags = gg.TYPE_BYTE }} character = gg.getValues(character) if character[1].value ~= 0 then tempString = tempString .. string.char(character[1].value) end address = address + 1 until (character[1].value == 0) return tempString end function setSVFValues(edit_table, function_index, edit_index) if scriptFunctions[function_index].edits[edit_index].enabled == true then gg.setValues(scriptFunctions[function_index].edits[edit_index].orignal_values) scriptFunctions[function_index].edits[edit_index].enabled = false else local search_table = edit_table.search_table local range_table = edit_table.range_table local searchFlag = edit_table.flags local searchRange = edit_table.search_range local offset = edit_table.offset local edit_to = edit_table.edit local edit_to_flags = edit_table.edit_flags local edit_name = edit_table.edit_name local edit_type = edit_table.edit_type local edit_type_variable = edit_table.edit_type_variable local freeze = edit_table.freeze local searchString = "" for i, v in ipairs(search_table) do if i < 65 then searchString = searchString .. v .. ";" end end searchString = searchString .. "::" .. searchRange local gg_flags = { ["double"] = gg.TYPE_DOUBLE, ["dword"] = gg.TYPE_DWORD, ["float"] = gg.TYPE_FLOAT, ["qword"] = gg.TYPE_QWORD, ["xor"] = gg.TYPE_XOR } local searchFlag = gg_flags[first_match_type] gg.setRanges(gg.getRanges()) gg.clearResults() gg.searchNumber(searchString, searchFlag) for i = 1, #search_table - 2 do local refineString = "" for index = 1, #search_table - i do refineString = refineString .. search_table[index] refineString = refineString .. ";" end refineString = refineString .. "::" .. range_table[#range_table - i] + 5 if refineString ~= "" then gg.refineNumber(refineString, searchFlag) end end local sorted_results = {} ::next:: local results = gg.getResults(gg.getResultsCount()) for i, v in pairs(results) do if i == 1 then table.insert(sorted_results, results[1]) end if i > 1 and results[i].address - results[i].address < searchRange then results[i] = nil else results[1] = nil gg.loadResults(results) goto next end end results = sorted_results for i, v in pairs(results) do results[i].address = results[i].address + offset results[i].flags = edit_to_flags end results = gg.getValues(results) local edit_type_checks = { edit_all = function() return true end, edit_all_x4 = function() return true end, edit_all_x8 = function() return true end, edit_all_that_equal = function(resultValue) if resultValue == tonumber(edit_type_variable) then return true end end, edit_all_that_do_not_equal = function(resultValue) if resultValue ~= tonumber(edit_type_variable) then return true end end, edit_all_less_equal = function(resultValue) if resultValue <= tonumber(edit_type_variable) then return true end end, edit_all_greater_equal = function(resultValue) if resultValue >= tonumber(edit_type_variable) then return true end end, edit_all_in_range = function(resultValue) local minValue = edit_type_variable:gsub("(.+)~.+", "%1") minValue = tonumber(minValue) local maxValue = edit_type_variable:gsub(".+~(.+)", "%1") maxValue = tonumber(maxValue) if resultValue >= minValue and resultValue <= maxValue then return true end end, edit_all_not_in_range = function(resultValue) local minValue = edit_type_variable:gsub("(.+)~.+", "%1") minValue = tonumber(minValue) local maxValue = edit_type_variable:gsub(".+~(.+)", "%1") maxValue = tonumber(maxValue) if resultValue < minValue or resultValue > maxValue then return true end end } gg.loadResults(results) if not scriptFunctions[function_index].edits[edit_index].orignal_values then scriptFunctions[function_index].edits[edit_index].orignal_values = gg.getResults(gg.getResultsCount()) end for i, v in ipairs(results) do if edit_type_checks[edit_type](v.value) == true then v.value = edit_to v.freeze = freeze end end if freeze == true then gg.addListItems(results) else gg.setValues(results) end scriptFunctions[function_index].edits[edit_index].enabled = true gg.toast("āœ… " .. edit_name .. " āœ…") end end function getLib(libName) lib_size = 0 lib_index = "" if #gg.getRangesList(libName) == 0 then if libName:find(".so") then if arch.x64 then libName = "split_config.arm64_v8a.apk" else libName = "split_config.armeabi_v7a.apk" end elseif libName:find(".apk") then libname = "libil2cpp.so" end end for i, v in pairs(gg.getRangesList(libName)) do if v["end"] - v["start"] > lib_size and v["state"] == "Xa" then lib_size = v["end"] - v["start"] lib_index = i end end BASEADDR = gg.getRangesList(libName)[lib_index].start end function setLibOffsetValues(edit_table, function_index, edit_index) if not BASEADDR then getLib(scriptFunctions[function_index].edits[edit_index].libName) end local edits local editOffset if arch.x64 then edits = scriptFunctions[function_index].edits[edit_index].editsARM8 editOffset = scriptFunctions[function_index].edits[edit_index].editOffsetARM8 else edits = scriptFunctions[function_index].edits[edit_index].editsARM7 editOffset = scriptFunctions[function_index].edits[edit_index].editOffsetARM7 end if scriptFunctions[function_index].edits[edit_index].enabled == true then gg.setValues(scriptFunctions[function_index].edits[edit_index].orignal_values) scriptFunctions[function_index].edits[edit_index].enabled = false else local editAddress = ggHex(BASEADDR + editOffset) local tempTable = {} for i, v in ipairs(edits) do tempTable[i] = { address = editAddress, flags = gg.TYPE_DWORD } editAddress = ggHex(editAddress + 4) end gg.loadResults(tempTable) local results = gg.getResults(gg.getResultsCount()) if not scriptFunctions[function_index].edits[edit_index].orignal_values then scriptFunctions[function_index].edits[edit_index].orignal_values = gg.getResults(gg.getResultsCount()) end for i, v in ipairs(results) do results[i].value = edits[i] end scriptFunctions[function_index].edits[edit_index].enabled = true gg.setValues(results) end end for i, v in pairs(scriptFunctions) do for index, value in pairs(v.edits) do if value.method_name or value.field_name then needToConfigure = true end end end if needToConfigure == true then getRange() end home() while true do if gg.isVisible() then gg.setVisible(false) home() end gg.sleep(100) end