Skip to content

Releases: JealousCat/GGMod

GameGuardian_MOD_96_and_101

14 Aug 08:30
abe8577

Choose a tag to compare

apk包说明:
1.96DM[luajava].4.6.0.2.apk,添加了最新luajava的96.0版本C.apk,它仅作为更新GameGuardian MOD最前沿的新内容(更新日志见附件中.lua拓展名的文件),成品可见96.0_MOD和101.1_MOD

2.GameGuardian.96.0_MOD.1.7.0.apk,添加了较新luajava、优化了部分GameGuardian原有的函数、添加了较全面的第三方函数库的96.0版本的GameGuardian.apk,属于"酔月”(QQ 1409330588)制作

3.GameGuardian.101.1_MOD.1.7.0.apk,添加了较新luajava、优化了部分GameGuardian原有的函数、添加了较全面的第三方函数库的101.0版本的GameGuardian.apk,属于"酔月”(QQ 1409330588)制作

4.以上三种apk均未对apk的UI进行重新设计与美化,需要美化的可看相关视频平台上的教程。另外本TAG中提供了另外两个优秀的GameGuardian MOD

5.BLGG_96.0_MOD_1.7.0.apk,基于GameGuardian.96.0_MOD.1.7.0.apk做了UI美化设计的修改器,界面是简洁舒适的灰色调,属于“于晏”(QQ 860419985)制作

6.AGG_3.4.4.zip,该ZIP内包含一个AGG.3.4.4.apk和该版本MOD修改器的测试脚本,其基于GameGuardian 96.0逆向所得源码进行二次开发,采用了M3主题,拥有全新的UI设计和支持众多的自定义弹窗函数,目前仍处于开发中。属于“Apocalypse”(QQ 758864998)制作,

DM[luajava].4.5.9.8版修改器.apk

03 Jul 01:15
ff45af8

Choose a tag to compare

4.5.9.8-alpha
--[[
 ☆1. 修复dex 039 导致的 VMOS、光速等虚拟机内无法使用该GG的问题
 ☆2. 自动判断用UID还是 root,无需手动设置
    即:修复了UID导致root环境下不可用问题,sharedUserId 与 Root现在兼容,非root环境优先UID,root环境则依旧使用root权限
]]
4.5.9.7-alpha
--[[
 ☆1. 修复LuaUserdata永远为真的问题,改为当userdata为java中null时,其真假值为false
 ☆2. 修复luajava.createProxy和其他方式的接口代理的代理对象无法使用print打印的问题
 ☆3. 去除了一些无root提示,并设置sharedUserId(要使用时改xml即可,其他的已经改好),可用于无root跨进程修改
local runnable = luajava.createProxy("java.lang.Runnable",{
  run = function()
    print(3147359496)
  end
})

print(runnable)

import "java.lang.Thread"

thread = Thread(runnable)
print(thread)

thread.start()
thread.join() --让脚本线程等待子线程

--gg.sleep(1000)
]]
4.5.9.6-alpha
--[[
 ☆1. 修复一个在线程内 string 元表为空问题
 ☆2. 引入类的字段访问运算符 -> ,并将原来的 . 形式设置为java方法优先
      用于解决当方法名与字段名相同时,想调用方法却调用了字段的问题
 ☆3. 修复一个路径选择时PathSelector$Impl类的报错
]]
4.5.9.5-alpha
--修复如下情况报错问题
--[[
local t = {1, 2, 4}
print(#t ^ 2) --未修复前会报错说一个table类型不能进行__pow运算
--修复后正常
]]
4.5.9.4-alpha
--[[
☆1. 在文件选择页面 左上角的带 + 号的文件图标处
   新增加了新文件的创建(GG原来的仅创建文件夹),创建后为0B大小的空文件
   该功能方便 gg.prompt 中使用 "file" 时能够选择或新建一个合适文件路径
   
☆2. 在文件选择页面 zip文件使用棕色标亮 
   方便选择zip文件进行直接运行

☆3. 在文件选择页面 长按某个文件或者文件夹时
   可弹出 删除或者拷贝文件 的弹窗
   "复制到下面路径:" 被勾选后显示一个输入框,可输入目标路径
   "删除"和"复制到下面路径:"功能同时勾选,点击"确定"按钮后
   将先进行文件复制,再进行文件删除,如果文件复制失败,原文件不会被删除
   
☆4. gg.prompt 函数中,新增 "text2" 进行纯文本显示

local content="纯文本\n测试\n\n\n\n\n\n\n\n测试\n\n\n\n测试"
gg.prompt({content, "复选框", "拖动条[1.0;10.0]","输入内容"},{},{"text2","checkbox","number","text"})

☆5. 新增 gg.changeChoice 的兼容名 gg.searchChoice
]]

4.5.9.3-alpha
--[[
☆1. gg.prompt 中支持带小数的拖动条
   (原版)支持整数的拖动条[int1;int2]格式
   当";"前后都为整数时,默认为整数的拖动条

local u =gg.prompt({"拖动条[1;888]"},{"22"},{"number"})
print(u)
   (修改后)支持小数的拖动条
   当";"前后存在小数时,默认为小数的拖动条,且小数精度由小数位数最多的决定
   如 [1.000;4.4] 拖动精度为3位小数
   如 [1.000;404] 拖动精度为3位小数
   如 [1.000;4.462726] 拖动精度为6位小数
   如 [1.0;4.4] 拖动精度为1位小数
   如 [1;4.4] 拖动精度为1位小数
   如 [8;110] 拖动精度为0位小数,即整数

local u =gg.prompt({"拖动条[1;88.8]"},{"22"},{"number"})
print(u)
]]

4.5.9.2-alpha
--[[
☆1. 更新table.hasK(t, k, k1, k2, k3, ...)函数  
   判断表t内是否存在以k为键的元素(后面可传入多个k)
   没有找到结果时返回false,找到则返回true(传入多个k时,返回一个boolean值表)

☆2. 更新table.hasV(t, v, v1, v2, v3, ...)函数  
   判断表t内是否存在以v为值的元素(后面可传入多个v)
   没有找到结果时返回false,找到则返回true(传入多个v时,返回一个boolean值表)

☆3. 更新table.swapKV(t)函数
   将表t内的键和值交换(key<=>value),原来的键作为值,原来的值作为新值的键,得到一个新表
   
☆4. 更新table.vgetK(t, v)函数
   根据值v,从表t中查找值为v的所有元素,并返回这些元素所对应的键。
   注意参数中只能传入一个表和一个值,不能传入多个值
   
 以下为上述函数的使用方法  
local t = {
  "a",
  "b",
  "c",
  "c",
  "b",
  u=233,
  m=666,
}

print(table.hasK(t, 2)) --判断有没有key为2的元素
print(table.hasK(t, 2, "u", "j")) --判断有没有key为2或u或m的元素
local r1, r2 = table.hasK(t, 2, "u", "p") --只获取前两个查询结果用赋值即可
print(r1, r2) --没有找到结果时返回false,找到则返回true

print(table.hasV(t, "a")) --判断是否存在value为"a"的元素
print(table.hasV(t, "a","c","j")) --多个value判断
--没有找到结果时返回false,找到则返回true

--交换table的key和value
print(table.swapKV(t)) 
--当value有重复时,由于table的key唯一,相同value中将会只保留最后一个对应的key作为新value

print(table.swapKV({
  a=1,
  b=2,
  c=3
}))

--通过value获取对应key
print(table.vgetK(t, "a")) --value不重复时返回一个key
print(table.vgetK(t, "c")) --value重复时返回多个key
--没有找到结果时返回nil
]]

4.5.9.1-alpha
--[[
☆1. 新增 com.util.ArrayTools 类
   用于解决在使用 int{1, 2, 3} 或 local b = byte[44] 或 Inteher{1, 2, 3, 4}等形式创建基础数据类型数组时
   无法正常传递给java方法使用的情况
   使用import函数来访问该类
   
   该类中有一维和二维数组创建的方法

   ☆1.1 将一个java封装类型的数组转为基本数据类型一维数组
       或将一个lua的表转为目标类型的一维数组
       参数一,传入表长度,参数二传入lua表或者封装类型数组
       ArrayTools.floatOf(int length, Float[] f) --Float为基本数据类型float的封装类
       ArrayTools.floatOf(int length, LuaTable t) --LuaTable的表示可以直接传一个lua层的表
       ArrayTools.doubleOf(int length, Double[] f) --Double为基本数据类型double的封装类, 这里传的是Double的一维数组
       ArrayTools.doubleOf(int length, LuaTable t)
       ArrayTools.byteOf(int length, Byte[] f) --Byte为byte基本数据类型的封装类
       ArrayTools.byteOf(int length, LuaTable t)
       ArrayTools.charOf(int length, Character[] f) --Character为基本数据类型char的封装类
       ArrayTools.charOf(int length, LuaTable t)
       ArrayTools.intOf(int length, Integer[] f) --Integer为基本数据类型int的封装类
       ArrayTools.intOf(int length, LuaTable t)
       ArrayTools.longOf(int length, Long[] f) --Long为基本数据类型long的封装类
       ArrayTools.longOf(int length, LuaTable t)
       ArrayTools.booleanOf(int length, Boolean[] f) --Boolean为基本数据类型boolean的封装类
       ArrayTools.booleanOf(int length, LuaTable t)
       ArrayTools.stringOf(int length, LuaTable t)
       ArrayTools.classOf(int length, LuaTable t)
       ArrayTools.objectOf(int length, LuaTable t)
       ArrayTools.shortOf(int length, Short[] f) --Short为基本数据类型short的封装类
       ArrayTools.shortOf(int length, LuaTable t)
       
   ☆1.2 将一个java封装类型的数组转为基本数据类型二维数组
       或将一个lua的表转为目标类型的二维数组
       参数一,传入二维数组的长,参数二传入二维数组的宽,参数三传入lua表或者封装类型数组
       ArrayTools.floatOf(int length, int childlen, Float[][] f)
       ArrayTools.floatOf(int length, int childlen, LuaTable t)
       ArrayTools.doubleOf(int length, int childlen, Double[][] f)
       ArrayTools.doubleOf(int length, int childlen, LuaTable t)
       ArrayTools.byteOf(int length, int childlen, Byte[][] f)
       ArrayTools.byteOf(int length, int childlen, LuaTable t)
       ArrayTools.charOf(int length, int childlen, Character[][] f)
       ArrayTools.charOf(int length, int childlen, LuaTable t)
       ArrayTools.intOf(int length, int childlen, Integer[][] f)
       ArrayTools.intOf(int length, int childlen, LuaTable t)
       ArrayTools.longOf(int length, int childlen, Long[][] f)
       ArrayTools.longOf(int length, int childlen, LuaTable t)
       ArrayTools.booleanOf(int length, int childlen, Boolean[][] f)
       ArrayTools.booleanOf(int length, int childlen, LuaTable t)
       ArrayTools.stringOf(int length, int childlen, LuaTable t)
       ArrayTools.classOf(int length, int childlen, LuaTable t)
       ArrayTools.objectOf(int length, int childlen, LuaTable t)
       ArrayTools.shortOf(int length, int childlen, Short[][] f)
       ArrayTools.shortOf(int length, int childlen, LuaTable t)

以下是部分使用方法,其他的同理
import "com.util.ArrayTools"
local k = {1.0, 8.8, 55}
k = ArrayTools.doubleOf(3, k)
print("double[]:",k)
print("double[0]:",k[1])

local b = {68, 77}
b = ArrayTools.byteOf(2, b)
print("byte[]:",b)
print("byte[0]:",b[1])
import "java.lang.String"
print("byte[]转String:",String(b))

local cc = {
  {1,2,3},
  {4,5,6},
  {7,8,9},
}
cc = ArrayTools.intOf(3,3,cc)
print("int[][]:",cc)
print("int[1][]:",cc[2])
print("int[1][2]:",cc[2][3])

]]

4.5.9.0-alpha
--[[
☆1. 新增加LuaBigNumber类,用于超大数计算
   LuaNil、LuaValue、Varargs类中增加对LuaBigNumber的调用支持,optbignumber,optbignum,bignumberof,checkbignumber,checkbignum,isbignumber等方法
   修改LoadState中loadConstants,将超大数按字符串dump,type标记为LIGHTUSERDATA
   修改DumpState中dumpConstants,将标记为LIGHTUSERDATA的字符串加载还原为bignumber

以下为测试
Q=9307576363854856192
print("数据:", Q)
print("LuaValue类型:", type(Q), "\n\n")
gg.searchNumber(Q, gg.TYPE_QWORD)

print("取负 -9307576363854856192 \n结果:", -Q, "\n")
print("加法 9307576363854856192 + 0.3687542285329 \n结果:", Q + 0.3687542285329, "\n")
print("减法 9307576363854856192 - 3687542285329 \n结果:", Q - 3687542285329, "\n")
print("乘法 9307576363854856192 * 3687542285329 \n结果:", Q * 3687542285329, "\n")
print("非整除除法 9307576363854856192 / 3687542285329 \n结果:", Q / 3687542285329, "\n")
print("整除除法 9307576363854856192 // 3687542285329 \n结果:", Q // 3687542285329, "\n")
print("指数 9307576363854856192 ^ 2 \n结果:", Q ^ 2, "\n")
print("取余 9307576363854856192 % 3687542285329 \n结果:", Q % 3687542285329, "\n")
print("左移 9307576363854856192 << 2 \n结果:", Q << 2, "\n")
print("右移 9307576363854856192 >> 2 \n结果:", Q >> 2, "\n")
print("大于 9307576363854856192 > 111 \n结果:", Q > 111, "\n")
print("大于等于 9307576363854856192 >= 111 \n结果:", Q >= 111, "\n")
print("等于 9307576363854856192 == 111 \n结果:", Q == 111, "\n")
print("小于 9307576363854856192 < 9999307576363854856192 \n结果:", Q < 9999307576363854856192, "\n")
print("小于等于 9307576363854856192 < 999 \n结果:", Q <= 999, "\n")
print("取反 ~9307576363854856192 \n结果:", ~Q, "\n")
print("按位与 9307576363854856192 & 999 \n结果:", Q & 999, "\n")
print("按位或 9307576363854856192 | 999 \n结果:", Q | 999, "\n")
print("异或 9307576363854856192 ~ 999 \n结果:", Q ~ 999, "\n")
]]

4.5.8.9-alpha
--[[
☆1. 修复使用中文变量名时,没法使用形如_ENV["妒猫"]格式访问对应变量的BUG
   原4.5.8.8以前中文变量名实际存储char[],转字符串后为乱码,导致无法使用_ENV,_G等表key的形式访问
   如变量名:"你是个好人",在全局环境中乱码为 "ä½ æ�¯ä¸ªå¥½äºº"

   修复后可正常访问,脚本编译时也正常访问
   
   妒猫 = 1
   print(妒猫)
   print(_ENV["妒猫"]) --出BUG的地方,修复后可正常使用

☆2. 拓展中文变量名支持 1~6字节表示的字符(包括特殊字符), 较旧版本luajava的中文/特殊字符只支持到5个字节
]]

4.5.8.8-alpha
--[==[
☆1. 修复4.5.8.5复合赋值运算符带来的 not/and/or 等逻辑优先级的BUG
   有BUG情况如下:
	k="src"
	v="uggv"
	--该语句取自loadlayout函数中
	--正常逻辑语句
	print((not k:find("^On")) and (not k:find("^Tag")) and (type(v)=="table"))
	--输出false
	--不用()表明优先级时如下,会错误输出true
	print( not k:find("^On") and not k:find("^Tag") and type(v)=="table")
	--在4.5.8.5到4.5.8.7版本都会错误的输出true,实际应该与前面加括号的那句一样是false
	
	4.5.8.8修复了该BUG,可正常运算

☆2. 更新zipstr库,用于对ZIP文件文本内容的解压,常用于网络zip解压
	zipstr,zip数据流解压库支持解压到本地和  免 解压到本地的方式直接读取文件
	该库最大作用是直接读取云端zip内文件并运行
	该库包含 zipstr.unCache、zipstr.unNames、zipstr.unNamesCache、zipstr.unZip 函数
	
☆3. 修改了loadbitmap、loadvector等函数,用于支持传入数据流来加载图片。
   如zipstr.unCache免解压读取到的图片数据流
   
   
	具体用法如下:

--云端ZIP链接
zip_url = "https://dm.lightstar.top/解压测试文件.zip"
--获得云端zip包数据流
local zip_content = gg.makeRequest(zip_url).content

--免解压全部读取
--local content = zipstr.unCache(zip_content)
--print(content)
--返回为一个表,格式如下:
--[[
{
  ["文件在ZIP内的路径"]="文件内容"
}  ]]

--免解压读取指定的多个文件
--zipstr.unNamesCache(zip_content, {"Download/Browser/test.lua", "main.lua"})
--解压zip内文件夹中的文件时,输入的是文件在zip内的路径

--免解压读取单一文件
--zipstr.unNamesCache(zip_content, "Download/Browser/test.lua")




--进行本地解压
--local localDir = "/storage/emulated/0/Notes/"

--全部解压到本地
--zipstr.unZip(zip_content,localDir)

--解压指定的多个文件到本地
--zipstr.unNames(zip_content, {"Download/Browser...
Read more

一个加了luajava的好用的修改器

07 Nov 12:21
f29b9f1

Choose a tag to compare

--require导包说明
--使用false,默认从方前脚本或者/data/data/.../files/导入import.lua
--也可以通过package.path来配置搜索路径
require(false)
--使用true
--除去可从上述路径加载import外,还将从云端检验与/data/data/缓存文件是否一致,或者是否有import文件
--如果不一致或没文件将进行下载更新
require(true)
--使用普通字符串
--不影响require的正常使用
require("import")
--或者 require "import" 只有字符串的可省略括号

--加载完毕后就可以import了
import "loadlayout"--import一个文件,loadlayout可以是本地的,也可以是云端的,该文件默认进行云端检验,可在import.lua内删除检验部分
import "java.lang.String" --import一个类
import "Image" --import一个dex并编译,也可以写为import "Image.dex"
--Image.dex为云端dex,导入时默认会检验
import "androidx.a.ImagesUtils" --导入Image中的类

脚本实例

require "import"
import "android.app.*"
import "android.os.*"
import "android.widget.*"
import "android.view.*"
import "android.content.*"
import "android.graphics.drawable.*"
import "android.*"
import "android.ext.BaseActivity"
import "android.content.DialogInterface$OnClickListener"
import "android.widget.ImageView"
import "loadlayout"
compile "Lock"
import "android.ext.LockFunction"

--别在线程里执行gg.searchNumber等函数,否则卡死
--LockFunction中有
--LockUi和unLockUi,用于对Ui线程执行的代码加锁
--LockUi有两个参数,可传可不传
--LockUi(LuaFunction,LuaValue),第一个参数如果不传任何值,那第二个参数默认不传
--第一个参数传函数,第二个参数可传可不传,当需要传递一个或多个参数时用{}把参数包起来
--LockUi有返回值,为传入的参数的执行结果
--unLockUi同理,不过unLockUi是用来释放锁后,执行传入的函数,相当于回调callback
--来自runOnUiThread

--LockMain和unLockMain,用于主线程加锁
--用法同理
--runOnMainThread

--LockWrite和unLockWrite,用于读写线程加锁
--用法同理
--runOnWriteThread

--LockLog和unLockLog,用于带android.ext.Log的程加锁
--用法同理
--runOnLogThread

T={
  LinearLayout;
  layout_height="fill";
  orientation="vertical";
  layout_width="fill";
  {
    Button;
    text="刷新日志";
    id="alert_button";
    background="#7499c9e4";
    layout_width="fill";
  };
  {
    ScrollView;
    layout_width="match_parent";
    id="scorl";
    {
      TextView;
      textIsSelectable="true";
      id="logtext";
      enabled="true";
      focusable="true";
      text=[==[日志:
]==];
      longClickable="true";
    };
  };
};

count=0

function alert()
  dialog = AlertDialog.Builder(activity,4)--可以设置弹窗样式 1-5 这里设置4
  lay = loadlayout(T)

  alert_button.setOnClickListener({onClick=function()
      count = count + 1
      logtext.Text = logtext.getText().toString().."测试"..count.."\n"
    end})

  dialog.setView(lay)
  dialog.setCancelable(false)
  dialog.setPositiveButton("确定",{
    onClick=function(v,i)
      gg.toast("你好")
       dialog.create().dismiss()
      LockFunction.unLockUi() --释放锁
    end})

  dialog.setNegativeButton("取消",{
    onClick=function(v,i)
      gg.toast("取消")
       dialog.create().dismiss()
      LockFunction.unLockUi()
    end})

  dialog.setNeutralButton("退出", {
    onClick=function(v,i)
      gg.toast("退出")
      dialog.create().dismiss()
      LockFunction.unLockUi()
    end})

  create = dialog.create()

  if (Build.VERSION.SDK_INT >= 26) then
    create.getWindow().setType(2038)
   else
    create.getWindow().setType(2003)
  end
  dialogView = create.getWindow()
  drawable = GradientDrawable()
  drawable.setColor(0xCF30A9DE)
  drawable.setCornerRadius(30)
  dialogView.setBackgroundDrawable(drawable)
  create.show()
end

--加锁执行

LockFunction.LockUi(alert)