Jump to content
We are investigating issues where accounts became locked on login attempt #1. Lock feature disabled for now. ×


  • Posts

  • Joined

  • Last visited

  • Days Won


CmP last won the day on August 26

CmP had the most liked content!

Recent Profile Visitors

12,643 profile views

CmP's Achievements


Proficient (10/14)

  • Dedicated Rare
  • Week One Done
  • One Month Later
  • One Year In
  • Reacting Well Rare

Recent Badges



  1. The code is for determining whether chosen process is 32-bit or 64-bit, not the device. There can be 32-bit processes on 64-bit devices.
  2. Then you need sub-tables, for example: local Hack = {} Hack[1] = {} Hack[1].Name = "A" Hack[1].X_1 = 111 Hack[1].X_2 = 112 Hack[1].X_3 = 113 Hack[2] = {Name = "B", X_1 = 114, X_2 = 115, X_3 = 116} item = "/storage/emulated/0/Download/abc1.lua" gg.saveVariable(Hack, item)
  3. Don't use "table.insert" when you need to add elements with specific keys, just do it directly instead: local Hack = {} Hack.Name = "A" -- same as Hack["Name"] = "A" Hack.X_1 = 111 Hack.X_2 = 112 Hack.X_3 = 113 item = "/storage/emulated/0/Download/abc1.lua" gg.saveVariable(Hack, item)
  4. Yes, use string concatenation. For example: local str1 = "Value " .. "123" -- "Value 123" local str2 = 456 .. " value" -- "456 value" print(str1 .. str2) -- "Value 123456 value"
  5. Alright, here is an example of function with parameter: -- Function to do a new search for dword value passed to the function through parameter "value" function search(value) gg.clearResults() gg.searchNumber(value, gg.TYPE_DWORD) end -- Example of function usages search("123") search("500600") Same way your "ModAPet" function can accept that id as parameter.
  6. Try this option first. If it works, you don't necessarily need to change the code further.
  7. The problem is because you use global variable without previously assigning a value to it. By default global variables have value "nil", a special value that means absence of value. So when nil is passed to "refineNumber" function, it raises an error, because it expected first argument to be string. A simple way of fixing the problem (with minimal changes to the code) may be to assign needed value to global variable "IDAP" before "ModAPet" function is called: if choice ~= nil then IDAP = menuID[choice] menuFunctions[choice]() end A better option may be to refactor the code to make "ModAPet" function accept parameter of search string to use for the call to "refineNumber".
  8. Only as long as you keep GG running. To freeze values from script there is "addListItems" function. Set "freeze" field of tables to "true" for them to be frozen after the call to the function. For example: local results = gg.getResults(10) local values = {} for i, v in ipairs(results) do values[i] = {address = v.address + 0x1234, flags = gg.TYPE_DWORD, value = "4321", freeze = true} -- value will be frozen to 4321 end gg.addListItems(values)
  9. Don't call "setValues" function in loop. The code above from @HEROGAMEOfficial's post illustrates the approach that should be used instead: construct table with all desired values and pass it to "setValues" function. Something like this: gg.searchNumber("2219816;6::25", gg.TYPE_DWORD) gg.refineNumber("2219816", gg.TYPE_DWORD) local count = gg.getResultsCount() local results = gg.getResults(count) local values = {} for i, v in ipairs(results) do local index = (i - 1) * 4 local addr = v.address values[index + 1] = {address = addr + 64, flags = gg.TYPE_DWORD, value = "7"} values[index + 2] = {address = addr + 80, flags = gg.TYPE_DWORD, value = "8"} values[index + 3] = {address = addr + 96, flags = gg.TYPE_DWORD, value = "9"} values[index + 4] = {address = addr + 112, flags = gg.TYPE_DWORD, value = "10"} end gg.setValues(values)
  10. In your rebuilt code you have a mistake of calling "getResults" function 3 times when in original code it is called only once and returned value is used. Applying fix to your code: function slot1() gg.getRangesList("/data/data/example") gg.clearResults() gg.searchNumber("98,784,247,822", gg.TYPE_QWORD, false, gg.SIGN_EQUAL, 0, -1, 0) local results = gg.getResults(100) for i, j in ipairs(results) do if j.flags == gg.TYPE_QWORD then j.value = "98,784,247,817" j.freeze = true end end gg.toast("ENABLED") gg.setValues(results) end Also worth to mention that both original code and your rebuilt version ignore the value returned by "getRangesList" function, so that it doesn't influence anything and can be removed without any difference in code execution result.
  11. CmP

    Require module

    In your main script try the following code: package.path = package.path .. ";" .. gg.getFile():gsub("[^/]+$", "?.lua") local func = require "function" func.sayHello() The first line adds script directory to list of paths in which modules are searched.
  12. Regarding the needed details about "IsMatchHash" function in the variant of the library for arm64-v8a. The function is located at offset 0x18E078 from the start of the library. Here is the result of decompilation of function's code: The assignment on line 23 can be modified to achieve desired result (for function to always return 1). The assignment is performed by this instruction at offset 0x18E0EC from library start ("this" is a label for x0/w0 register): Modification of this instruction to MOV W0, #1 (hex bytes: 20 00 80 52) will cause the function to return 1 even when computed hash doesn't match stored hash. This modification of function's behavior is sufficient for bypassing in-memory data integrity check.
  13. CmP


    The solution above from MonkeySAN is correct, but has some minor issues and redundancies. Slightly modified version of it: gg.clearResults() gg.searchNumber("131842", gg.TYPE_DWORD) local t = gg.getResults(50000) for i, v in ipairs(t) do v.flags = gg.TYPE_QWORD -- referencing the constant by it's name instead of substituting it with it's value v.value = "288515153958273024" -- using value of type expected by the function instead of relying on implicit conversion of number to string end gg.setValues(t) gg.clearResults()
  14. You missed one important detail: The offset from library start to instructions of the function and new values for them that were mentioned are only applicable for library of the game for x86. On your device library for arm64-v8a is expected to be used, so the offset to the function and which instructions to modify in it need to be located exactly in this variant of library.
  15. From the documentation to "gg.prompt" function: https://gameguardian.net/help/classgg.html#afe6c5b86ba0ae295899fd259232aac2b
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.