GameGuardian 修改器官方教程 Part7
1. Asphalt 8: Airborne - hack upgrades - GameGuardian
意义不大,每辆车都有自己联合搜索的特征码。作者没告诉这些codes怎么来的。
2.Asphalt 8: Airborne - hack tokens cars - GameGuardian
有序联合搜索,这串代码不知道怎么来的。最后实现了解锁新车。
3.Asphalt 8: Airborne - 32 racers - GameGuardian
https://gameguardian.net/forum/topic/14174-asphalt-8-airborne-database/
上面是这个游戏的相关数据库。
赛车手数量。
这些都是数据库里找的。
4.Asphalt 8: Airborne - hack Championship - use fill - GameGuardian
竞标赛的作弊?
打破比赛时间。
等差数列法
5.Asphalt 8: Airborne - use speedhack - GameGuardian
使用speedhack,让游戏以0.4的速度运行。
这个视频是最模糊的。
6.Asphalt 8: Airborne - hack R&D Porsche 911 GT3 RS - GameGuardian
搜到后,转到地址,一顿修改。
7.Search in the background - GameGuardian
后台搜索,还没搜完的时候,点击隐藏即可。这是一个有三国语言的视频,中文出现在了视频里。
8.GameGuardian 8.27.0 Update | New "Hide" Feature!
还是说的隐藏功能,在搜索时间需要很长的情况下,可以进行隐藏后台搜索。
8.27.0的新功能!
相应的图标会有进度百分比显示。
9.How to use GameGuardian
介绍GG的基操:
- 选择游戏进程
- 搜香蕉值 Dword 0
- 通过玩游戏,获得香蕉,进一步改善。
- Auto类型的使用
-
他在这里搜到后进行了修改操作,但是没生效。
-
于是开始搞商店价格,改成负数,也能实现金币作弊
-
介绍了模糊搜索,值如何变化,就如何改善
-
变速工具的使用
-
时间跳跃工具的使用
-
基本的删除,保存,清除等操作
视频演示的是8.5.4版本的GG。
10.Asphalt 8: Airborne - hack Enduro Double Down (EDD) - lua script - GameGuardian
在GG的关于里,能看到开发者和贡献者名单信息。
这个视频首次演示了执行脚本。
2017年7月21号
-- Version: 2.0.0
-- https://gameguardian.net/forum/files/file/6-asphalt-8-airborne-hack-enduro-double-down-edd/
if gg.VERSION_INT < 82900 then
gg.alert('You need more new version of GG for run this script. At least version 8.29.0.')
os.exit()
end
local count = 10000
local choice = gg.choice({'v1.0.0', 'v1.1.0', 'v2.0.0'}, 3)
if choice == nil then
os.exit()
end
-- v2.0.0
if choice == 3 then
gg.clearResults()
gg.searchNumber ('5;7;1;10;30;20;0;8::29', gg.TYPE_DWORD)
gg.searchNumber ('8', gg.TYPE_DWORD)
gg.getResults(count)
print('In infection reduced the number of riders:', gg.getResultCount(), gg.editAll('1', gg.TYPE_DWORD))
-- в заражении уменьшили кол-во гонщиков
gg.clearResults()
gg.searchNumber ('5;1;10;30;20::21', gg.TYPE_DWORD)
gg.getResults(count)
print('Replaced the infection with classics, 0 laps and 1 racer:', gg.getResultCount(), gg.editAll('0', gg.TYPE_DWORD))
-- заменили заражение на классику, 0 кругов и 1 гонщик
gg.clearResults()
gg.searchNumber ('4;7;60~180;5000~20000;5000~20000;5000~20000;100;1::29', gg.TYPE_DWORD)
gg.searchNumber ('60~20000', gg.TYPE_DWORD)
gg.getResults(count)
print(':', gg.getResultCount(), gg.editAll('0', gg.TYPE_DWORD))
--
gg.clearResults()
gg.searchNumber ('4;7;0;0;0;0;0;1::29', gg.TYPE_DWORD)
gg.searchNumber ('4', gg.TYPE_DWORD)
gg.getResults(count)
print('Drift turn into a classic, 0 laps and 1 racer:', gg.getResultCount(), gg.editAll('0', gg.TYPE_DWORD))
-- дрифт превращаем в классику, 0 кругов и 1 гонщик
gg.clearResults()
gg.searchNumber ('2;7;10~25;60~180;0;0;0;2::29', gg.TYPE_DWORD)
gg.searchNumber ('0;2::5', gg.TYPE_DWORD)
gg.searchNumber ('2', gg.TYPE_DWORD)
gg.getResults(count)
print('Number of riders in the knockdown:', gg.getResultCount(), gg.editAll('1', gg.TYPE_DWORD))
-- кол-во гонщиков в нокдауне
gg.clearResults()
gg.searchNumber ('2;7;10~25;60~180;0;0;0;1::29', gg.TYPE_DWORD)
gg.searchNumber ('2;10~25;60~180::13', gg.TYPE_DWORD)
gg.getResults(count)
print('The knockdown mode turns into a classic, 0 laps and 1 racer:', gg.getResultCount(), gg.editAll('0', gg.TYPE_DWORD))
-- режим нокдаун превращается в классику, 0 кругов и 1 гонщик
gg.clearResults()
gg.searchNumber ('1;7;15;13;0;0;0;6~8::29', gg.TYPE_DWORD)
gg.searchNumber ('0;6~8::5', gg.TYPE_DWORD)
gg.searchNumber ('6~8', gg.TYPE_DWORD)
gg.getResults(count)
print('Number of knockout drivers:', gg.getResultCount(), gg.editAll('1', gg.TYPE_DWORD))
-- кол-во гонщиков выбывания
gg.clearResults()
gg.searchNumber ('1;7;15;13;0;0;0;1::29', gg.TYPE_DWORD)
gg.searchNumber ('1;15;13::13', gg.TYPE_DWORD)
gg.getResults(count)
print('Mode knock-out turn into a classic, 0 laps and 1 racer:', gg.getResultCount(), gg.editAll('0', gg.TYPE_DWORD))
-- режим выбывание превращаем в классику, 0 кругов и 1 гонщик
gg.clearResults()
gg.searchNumber ('7;1;0;0;0;0;8::25', gg.TYPE_DWORD)
gg.searchNumber ('8', gg.TYPE_DWORD)
gg.getResults(count)
print('In the classics reduced the number of riders:', gg.getResultCount(), gg.editAll('1', gg.TYPE_DWORD))
-- в классике уменьшили кол-во гонщиков
gg.clearResults()
gg.searchNumber ('7;1;0;0;0;0;1::25', gg.TYPE_DWORD)
gg.searchNumber ('7;1::5', gg.TYPE_DWORD)
gg.searchNumber ('1', gg.TYPE_DWORD)
gg.getResults(count)
print('Number of circles in the classics and the battle with AI change to 0:', gg.getResultCount(), gg.editAll('0', gg.TYPE_DWORD))
-- кол-во кругов в классике и битве с ИИ меняем на 0
print('.')
print('Then you can proceed to the passage of Endura. Do not choose in any case a race with the task of type - to make 2 barrels, 3 reversals, 5 knockdowns, 4 ideal nitro, 100 meters of drift - will be counted failure, you have to race with the task - finish, take 3,2,1 place, beat Race time xx: xx: xxx, no crashes, race mode any - classic, flawless, down with nitro, battle with the ghost.')
-- Далее можно приступать к прохождению Эндуры. Не выбирать ни в коем случае гонки с заданием типа - сделать 2 бочки, 3 разворота, 5 нокдаунов, 4 идеальных нитро, 100 метров дрифта - будет засчитан провал, следует проходить гонки с заданием - финишируйте, займите 3,2,1 место, побейте время гонки хх:хх:ххх, без аварий, режим гонки любой - классика, безупречный, долой нитро, битва с призраком.
end
-- v2.0.0
-- v1.1.0
if choice == 2 then
gg.clearResults()
gg.searchNumber ('7;1;0;0;0;0;8::25', gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1)
gg.searchNumber ('8', gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1)
gg.getResults(count)
print('In the classics reduced the number of riders:', gg.getResultCount(), gg.editAll('1', gg.TYPE_DWORD))
-- в классике уменьшили кол-во гонщиков
gg.clearResults()
gg.searchNumber ('5;7;1;10;30;20;0;8::29', gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1)
gg.searchNumber ('8', gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1)
gg.getResults(count)
print('In infection reduced the number of riders:', gg.getResultCount(), gg.editAll('1', gg.TYPE_DWORD))
-- в заражении уменьшили кол-во гонщиков
gg.clearResults()
gg.searchNumber ('1;10;30;20::13', gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1)
gg.getResults(count)
print('Removed the parameters of infection interfering with the rapid passage:', gg.getResultCount(), gg.editAll('0', gg.TYPE_DWORD))
-- убрали мешающие быстрому прохождению параметры заражения
gg.clearResults()
gg.searchNumber ('4;7;100;1::29', gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1)
gg.searchNumber ('100', gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1)
gg.getResults(count)
print('Drift of one gate - 300 points:', gg.getResultCount(), gg.editAll('300', gg.TYPE_DWORD))
-- дрифт одних ворот - 300 очков
gg.clearResults()
gg.searchNumber ('2;7;15;0;0;0;2::29', gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1)
gg.searchNumber ('0;2::5', gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1)
gg.searchNumber ('2', gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1)
gg.getResults(count)
print('Number of riders in the knockdown:', gg.getResultCount(), gg.editAll('1', gg.TYPE_DWORD))
-- кол-во гонщиков в нокдауне
gg.clearResults()
gg.searchNumber ('2;7;15;0;0;0;1::29', gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1)
gg.searchNumber ('2;15::9', gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1)
gg.getResults(count)
print('Knockdown mode turns into a classic:', gg.getResultCount(), gg.editAll('0', gg.TYPE_DWORD))
-- режим нокдаун превращается в классику
gg.clearResults()
gg.searchNumber ('1;7;15;13;0;0;0;6::29', gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1)
gg.searchNumber ('6', gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1)
gg.getResults(count)
print('Number of knockout drivers:', gg.getResultCount(), gg.editAll('1', gg.TYPE_DWORD))
-- кол-во гонщиков выбывания
gg.clearResults()
gg.searchNumber ('1;7;15;13;0;0;0;8::29', gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1)
gg.searchNumber ('8', gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1)
gg.getResults(count)
print('Number of knockout drivers:', gg.getResultCount(), gg.editAll('1', gg.TYPE_DWORD))
-- кол-во гонщиков выбывания
gg.clearResults()
gg.searchNumber ('1;7;15;13;0;0;0;1::29', gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1)
gg.searchNumber ('1;15;13::13', gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1)
gg.getResults(count)
print('The regime of drop-out is turned into a classic:', gg.getResultCount(), gg.editAll('0', gg.TYPE_DWORD))
-- режим выбывание превращаем в классику
gg.clearResults()
gg.searchNumber ('7;1;0;0;0;1::25', gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1)
gg.searchNumber ('7;1::5', gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1)
gg.searchNumber ('1', gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1)
gg.getResults(count)
print('The number of circles in all modes is changed to 0:', gg.getResultCount(), gg.editAll('0', gg.TYPE_DWORD))
-- кол-во кругов во всех режимах меняем на 0
-- added in v1.1.0
gg.clearResults()
gg.searchNumber ('6;500::5', gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1)
gg.searchNumber ('500', gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1)
gg.getResults(count)
print('In the task "drift 500 m" the number of meters was turned to zero:', gg.getResultCount(), gg.editAll('0', gg.TYPE_DWORD))
-- в задании "дрифт 500 м" число метров превратили в ноль
gg.clearResults()
gg.searchNumber ('6;600::5', gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1)
gg.searchNumber ('600', gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1)
gg.getResults(count)
print('In the task "drift 600 m" the number of meters was turned to zero:', gg.getResultCount(), gg.editAll('0', gg.TYPE_DWORD))
-- в задании "дрифт 600 м" число метров превратили в ноль
gg.clearResults()
gg.searchNumber ('6;800::5', gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1)
gg.searchNumber ('800', gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1)
gg.getResults(count)
print('In the task "drift 800 m" the number of meters was turned to zero:', gg.getResultCount(), gg.editAll('0', gg.TYPE_DWORD))
-- в задании "дрифт 800 м" число метров превратили в ноль
gg.clearResults()
gg.searchNumber ('4;8000::40', gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1)
gg.searchNumber ('8000', gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1)
gg.getResults(count)
print('In the task "dial 8000 points", i.e. Slalom, the number of points was turned to zero:', gg.getResultCount(), gg.editAll('0', gg.TYPE_DWORD))
-- в задании "наберите 8000 очков", т.е. слалом, число очков превратили в ноль
gg.clearResults()
gg.searchNumber ('4;9000::40', gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1)
gg.searchNumber ('9000', gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1)
gg.getResults(count)
print('In the task "dial 9000 points", i.e. Slalom, the number of points was turned to zero:', gg.getResultCount(), gg.editAll('0', gg.TYPE_DWORD))
-- в задании "наберите 9000 очков", т.е. слалом, число очков превратили в ноль
gg.clearResults()
gg.searchNumber ('4;12000::40', gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1)
gg.searchNumber ('12000', gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1)
gg.getResults(count)
print('In the task "dial 12000 points", i.e. Slalom, the number of points was turned to zero:', gg.getResultCount(), gg.editAll('0', gg.TYPE_DWORD))
-- в задании "наберите 12000 очков", т.е. слалом, число очков превратили в ноль
print('.')
print('Then you can proceed to the passage of Endura. Do not choose in any way a race with the task of type - to make 2 barrels, 3 reversals, 15 knockdowns, 4 ideal nitro, 100 meters of drift - will be counted failure, you must pass the race with the task - finish, take 3,2,1 place, beat Race time xx: xx: xxx, without accidents, race mode any - classic, infection, flawless, down with nitro, battle with the ghost. I avoided the slalom mode successfully. Spent 25 blue, when simultaneously fell two failed tasks, a classic with 2 turns and a classic with 3 barrels.')
-- Далее можно приступать к прохождению Эндуры. Не выбирать ни в коем случае гонки с заданием типа - сделать 2 бочки, 3 разворота, 15 нокдаунов, 4 идеальных нитро, 100 метров дрифта - будет засчитан провал, следует проходить гонки с заданием - финишируйте, займите 3,2,1 место, побейте время гонки хх:хх:ххх, без аварий, режим гонки любой - классика, заражение, безупречный, долой нитро, битва с призраком. Режим слалома я избежал удачно. Потрачено 25 синих, когда одновременно попались два провальных задания, классика с 2 разворотами и классика с 3 бочками.
end
-- v1.1.0
-- v1.0.0
if choice == 1 then
gg.clearResults()
gg.searchNumber ('7;1;0;0;0;0;8::25', gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1)
gg.searchNumber ('8', gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1)
gg.getResults(count)
print('In the classics reduced the number of riders:', gg.getResultCount(), gg.editAll('1', gg.TYPE_DWORD))
-- в классике уменьшили кол-во гонщиков
gg.clearResults()
gg.searchNumber ('5;7;1;10;30;20;0;8::29', gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1)
gg.searchNumber ('8', gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1)
gg.getResults(count)
print('In infection reduced the number of riders:', gg.getResultCount(), gg.editAll('1', gg.TYPE_DWORD))
-- в заражении уменьшили кол-во гонщиков
gg.clearResults()
gg.searchNumber ('1;10;30;20::13', gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1)
gg.getResults(count)
print('Removed the parameters of infection interfering with the rapid passage:', gg.getResultCount(), gg.editAll('0', gg.TYPE_DWORD))
-- убрали мешающие быстрому прохождению параметры заражения
gg.clearResults()
gg.searchNumber ('4;7;100;1::29', gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1)
gg.searchNumber ('100', gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1)
gg.getResults(count)
print('Drift of one gate - 300 points:', gg.getResultCount(), gg.editAll('300', gg.TYPE_DWORD))
-- дрифт одних ворот - 300 очков
gg.clearResults()
gg.searchNumber ('2;7;15;0;0;0;2::29', gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1)
gg.searchNumber ('0;2::5', gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1)
gg.searchNumber ('2', gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1)
gg.getResults(count)
print('Number of riders in the knockdown:', gg.getResultCount(), gg.editAll('1', gg.TYPE_DWORD))
-- кол-во гонщиков в нокдауне
gg.clearResults()
gg.searchNumber ('2;7;15;0;0;0;1::29', gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1)
gg.searchNumber ('2;15::9', gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1)
gg.getResults(count)
print('Knockdown mode turns into a classic:', gg.getResultCount(), gg.editAll('0', gg.TYPE_DWORD))
-- режим нокдаун превращается в классику
gg.clearResults()
gg.searchNumber ('1;7;15;13;0;0;0;6::29', gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1)
gg.searchNumber ('6', gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1)
gg.getResults(count)
print('Number of knockout drivers:', gg.getResultCount(), gg.editAll('1', gg.TYPE_DWORD))
-- кол-во гонщиков выбывания
gg.clearResults()
gg.searchNumber ('1;7;15;13;0;0;0;8::29', gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1)
gg.searchNumber ('8', gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1)
gg.getResults(count)
print('Number of knockout drivers:', gg.getResultCount(), gg.editAll('1', gg.TYPE_DWORD))
-- кол-во гонщиков выбывания
gg.clearResults()
gg.searchNumber ('1;7;15;13;0;0;0;1::29', gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1)
gg.searchNumber ('1;15;13::13', gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1)
gg.getResults(count)
print('The regime of drop-out is turned into a classic:', gg.getResultCount(), gg.editAll('0', gg.TYPE_DWORD))
-- режим выбывание превращаем в классику
gg.clearResults()
gg.searchNumber ('7;1;0;0;0;1::25', gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1)
gg.searchNumber ('7;1::5', gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1)
gg.searchNumber ('1', gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1)
gg.getResults(count)
print('The number of circles in all modes is changed to 0:', gg.getResultCount(), gg.editAll('0', gg.TYPE_DWORD))
-- кол-во кругов во всех режимах меняем на 0
print('.')
print('Then you can proceed to the passage of Endura. Do not choose in any way a race with the task of type - to make 2 barrels, 3 reversals, 15 knockdowns, 4 ideal nitro, 100 meters of drift - will be counted failure, you must pass the race with the task - finish, take 3,2,1 place, beat Race time xx: xx: xxx, without accidents, race mode any - classic, infection, flawless, down with nitro, battle with the ghost. I avoided the slalom mode successfully. Spent 25 blue, when simultaneously fell two failed tasks, a classic with 2 turns and a classic with 3 barrels.')
-- Далее можно приступать к прохождению Эндуры. Не выбирать ни в коем случае гонки с заданием типа - сделать 2 бочки, 3 разворота, 15 нокдаунов, 4 идеальных нитро, 100 метров дрифта - будет засчитан провал, следует проходить гонки с заданием - финишируйте, займите 3,2,1 место, побейте время гонки хх:хх:ххх, без аварий, режим гонки любой - классика, заражение, безупречный, долой нитро, битва с призраком. Режим слалома я избежал удачно. Потрачено 25 синих, когда одновременно попались два провальных задания, классика с 2 разворотами и классика с 3 бочками.
end
-- v1.0.0
11.Asphalt 8: Airborne - hack nitro - lua script - GameGuardian
执行脚本-- version 1.0.0
gg.clearResults()
gg.searchNumber('2;8;10;12;15;20;25;30:61', gg.TYPE_FLOAT, false, gg.SIGN_EQUAL, 0, -1)
gg.getResults(100)
print('Replaced: ', gg.editAll('1000', gg.TYPE_FLOAT))
print('Nitro hacked!')
选择脚本文件
脚本代码
-- version 1.0.0
gg.clearResults()
gg.searchNumber('2;8;10;12;15;20;25;30:61', gg.TYPE_FLOAT, false, gg.SIGN_EQUAL, 0, -1)
gg.getResults(100)
print('Replaced: ', gg.editAll('1000', gg.TYPE_FLOAT))
print('Nitro hacked!')
可以看到print的作用
12.XOR search guide - GameGuardian
异或搜索,前提是先找到XOR key。然后才能用这种搜索方式。
这个例子中Key=4。
在编辑7个地址的值时,通过分号分别指定值,同时这种场景下也可以使用XOR运算
编辑单个地址的情况
13.Text (string) search/replace - lua script - GameGuardian
很复杂的一个脚本,
-- Version: 3.3.2
-- https://gameguardian.net/forum/files/file/10-string-searchreplace/
gg.require('8.57.0')
local mode = gg.choice({'__mode_string__: some text', '__hex_input__: 01 AB DE F5', '__mode_mixed__: AB "some text" E6 00'}, nil, '__select_mode__:')
if mode == nil then
os.exit()
end
function tbl2hex(bytes)
local ret = ''
for i, b in ipairs(bytes) do
ret = ret .. string.format('%02X ', b)
end
return ret
end
function tbl2str(bytes)
local ret = ''
for i, b in ipairs(bytes) do
ret = ret .. string.char(b)
end
return ret
end
function tbl2string(bytes, mode)
if mode == 1 then
return tbl2str(bytes)
else
return tbl2hex(bytes)
end
end
function hex2bin(s)
return string.char(tonumber(s, 16))
end
function parse(input, mode, utf16)
local encoding = 'UTF-8'
if utf16 then
encoding = 'UTF-16LE'
end
if mode == 1 then
input = tbl2hex(gg.bytes(input, encoding))
else
function str2hex(s)
return tbl2hex(gg.bytes(s, encoding))
end
input = input:gsub('"(.-)"', str2hex)
end
--print('hex', input)
input = input:gsub(' ', ''):gsub('([A-F0-9a-f][A-F0-9a-f])', hex2bin)
--print('bin', input)
local ret = {input:byte(1, #input)}
--print('ret', ret)
return ret
end
local examples = {'some text', '8A 73 81 EF 00', '8A "some text" EF 00'}
local modes = {'text', 'number', 'text'}
local s = ''
local i
local utf16 = false
local new_search = false
local cfg_file = gg.getFile()..'.cfg'
local chunk = loadfile(cfg_file)
if chunk ~= nil then
local cfg = chunk()
s, utf16 = cfg[1], cfg[2]
end
local lim = 4096
while true do
local p = {string.format('__string_search_prompt__: __s__', 4096, examples[mode]), 'UTF-16'}
if mode == 2 then
p[2] = nil
end
local fields = {s, utf16}
local types = {modes[mode], 'checkbox'}
if gg.getResultCount() > 0 then
p[3] = '__new_search__'
fields[3] = new_search
types[3] = 'checkbox'
end
local d = gg.prompt(p, fields, types)
if d == nil then
break
end
s = d[1]
utf16 = d[2]
new_search = gg.getResultCount() > 0 and d[3]
local bytes = parse(s, mode, utf16)
local len = #bytes
if len == 0 then
gg.alert('__string_empty__')
goto continue_1
end
if new_search then gg.clearResults() end
local used = len
if used > lim then used = lim end
if gg.BUILD >= 15063 then
local search = tbl2hex(bytes)
if used < len then search = search:sub(1, used*3) end
gg.searchNumber('h '..search)
else
local search = tbl2str(bytes)
if used < len then search = search:sub(1, used) end
gg.internal1(search)
end
local found = gg.getResultCount();
if found == 0 then
print(string.format('__string_not_found__', s))
break
end
local results = {}
local count = 0
local checked = 0
while true do
if checked >= found then
break
end
local all = gg.getResults(100000)
local total = #all
local start = checked
if checked + used > total then
break
end
while start < total do
local good = true
local offset = all[1 + start].address - 1
if used < len then
local get = {}
for i = lim + 1, len do
get[i - lim] = {address = offset + i, flags = gg.TYPE_BYTE, value = 0}
end
get = gg.getValues(get)
for i = lim + 1, len do
if get[i - lim].value + 0 ~= bytes[i] then
good = false
break
end
end
end
if good then
count = count + 1
results[count] = offset
checked = checked + used
else
local del = {}
for i = 1, used do
del[i] = all[i + start]
end
gg.removeResults(del)
end
start = start + used
end
end
if count == 0 then
print(string.format('__string_not_found__', s))
break
end
if 1 ~= gg.alert(string.format('__string_found____string_replace__', count, s), '__yes__', '__no__') then
print(string.format('__string_found__', count, s))
break
end
while true do
local p = {string.format('__string_replace_prompt__', s, 1000), 'UTF-16', '__count_replace__'}
if mode == 2 then
p[2] = nil
end
local d = gg.prompt(p, {s, utf16, 100}, {modes[mode], 'checkbox', 'number'})
if d == nil then
break
end
local replace = d[1]
utf16 = d[2]
d[3] = tonumber(d[3])
if d[3] > 0 and count > d[3] then
count = d[3]
end
local bytes = parse(replace, mode, utf16)
local rlen = #bytes
local set = {}
for i = 1, rlen do
set[i] = {address = 0, flags = gg.TYPE_BYTE, value = bytes[i]}
end
for j = 1, count do
for i = 1, rlen do
set[i].address = results[j] + i
end
gg.setValues(set)
end
print(string.format('__string_replaced__', s, replace, count))
break
::continue_2::
end
break
::continue_1::
end
gg.saveVariable({s, utf16}, cfg_file)
这个脚本时交互式的
这个时候,视频右边评论里出现了GG修改器的官方脚本帮助文档
https://gameguardian.net/help/simple_script.html
14.GameGuardian - Crashlands Speed
移速更改,150,Double 似乎是默认值,装上装备后,移速增加了。
所以说这是一个精确搜索(150)和模糊搜索(增加了)结合的一个例子。
15.Asphalt 8: Airborne - new maps in solo/quick race - lua script - GameGuardian
内存区域选的Xa,脚本还是字符串搜索替换脚本。
16.Asphalt 8: Airborne - new maps in quick solo race - lua script - GameGuardian
-- version: 1.5.0
-- https://gameguardian.net/forum/files/file/14-asphalt-8-airborne-new-maps-in-quick-solo-race/
gg.require('8.52.0')
function search(s)
local max_len = 8
local bytes = {s:byte(1, max_len)}
local search = bytes[1]
local len = #bytes
for i = 2, len do
search = search .. ';' .. bytes[i]
end
search = search .. '::' .. #bytes
gg.searchNumber(search, gg.TYPE_BYTE)
return gg.getResultCount() / len
end
function replace(s, replace)
local max_len = 8
local fill = 32
local found = gg.getResultCount();
local len = #s
local count = found / len
local bytes = {replace:byte(1, len)}
local rlen = #bytes
if rlen < len then
for i = #replace + 1, len do
bytes[i] = fill
replace = replace .. string.char(fill)
end
end
local res = gg.getResults(100000)
local j = 1
for i = 1, #res do
res[i].value = bytes[j]
if j < len then
j = j + 1
else
j = 1
end
end
gg.setValues(res)
return #res / len
end
local ranges = gg.getRanges()
local options = gg.prompt({'Laps count (empty = not change) [1;6]', 'Players count (empty = not change) [1;32]'}, nil, {'number', 'number'})
if options ~= nil then
gg.setRanges(bit32.bxor(gg.REGION_C_HEAP, gg.REGION_C_ALLOC, gg.REGION_ANONYMOUS))
if options[1] ~= '' then
gg.clearResults()
gg.searchNumber('1000~1999;0~5;7;1~6::21', gg.TYPE_DWORD)
if gg.getResultCount() > 0 then gg.searchNumber('7;1~6::5', gg.TYPE_DWORD) end
if gg.getResultCount() > 0 then gg.searchNumber('1~6', gg.TYPE_DWORD) end
gg.getResults(100000)
print('Laps count to '..options[1]..':', gg.getResultCount(), gg.editAll(options[1], gg.TYPE_DWORD))
end
if options[2] ~= '' then
gg.clearResults()
gg.searchNumber('1000~1999;0~5;7;1~6;0~30;0~20;0;1~32::41', gg.TYPE_DWORD)
if gg.getResultCount() > 0 then gg.searchNumber('7;1~6;0~30;0~20;0;1~32::25', gg.TYPE_DWORD) end
if gg.getResultCount() > 0 then gg.searchNumber('0;1~32::5', gg.TYPE_DWORD) end
if gg.getResultCount() > 0 then gg.searchNumber('1~32', gg.TYPE_DWORD) end
gg.getResults(100000)
print('Players count to '..options[2]..':', gg.getResultCount(), gg.editAll(options[2], gg.TYPE_DWORD))
end
end
local names = {'Dubai', 'Orbital Loop'}
local choice = gg.choice(names)
if choice ~= nil then
gg.setRanges(gg.REGION_CODE_APP)
gg.clearResults()
local from = {'Def_Dub_', 'Def_Spc_'}
for i = 1, #from do
if i ~= choice then
if search(from[i]) ~= 0 then
break
end
end
end
if gg.getResultCount() == 0 then
if search(from[choice]) ~= 0 then
print('Dubai tracks already replaced to '..names[choice]..' tracks.')
else
print('Nothing found. Something going wrong.')
end
else
if replace(from[1], from[choice]) ~= 0 then
print('All ok. In quick solo race Dubai tracks replaced to '..names[choice]..' tracks.')
else
print('Nothing replaced. Something going wrong.')
end
end
end
gg.setRanges(ranges)
gg.clearResults()
gg.getResults(0)
这个脚本完成了换地图的操作。
17.How to search and replace HEX array (AoB scan) - GameGuardian
针对这种十六进制数组,他使用的是有序联合搜索
脚本下载链接
https://gameguardian.net/forum/files/file/16-asphalt-8-airborne-hack-events-career-tags-f1-mastery-rd-edd-championship-world-tour/
一顿脚本直接Hack完了很多功能。
看来2017年8月份,GG已经进化到了脚本的世界。
19.Bitcoin mining - hack money - GameGuardian
Dword 2 精确值搜索,他把这个出售比特币的界面的值给搞了,然后实现了金钱作弊。
20.Traffic Rider - hack cash, money - group search, fill - GameGuardian
有序联合搜索+等差数列的一个例子
21.Traffic Rider - open last bike - group search - GameGuardian
联合搜索解锁这辆摩托需要的等级和金币
22.Bitcoin mining - hack money - GameGuardian
这回改的这里。
23.How to run in PhoenixOS - GameGuardian
“凤凰系统”(Phoenix OS),简单说就是x86桌面版的安卓。
怎么让GG跑在这个系统下,简单的讲就是让GG有自动运行权限。
24.How to fix the area of dragging a floating icon in PhoenixOS - GameGuardian
说的是GG在PhoenixOS中,图标拖动区域有问题。解决方案是启动GG后,先全屏一次,然后就可以了。
25.Traffic Rider - hack mission params - group search - GameGuardian
联合搜索这些数字。
然后任务参数就可以找到了。