我已经蓝屏 发表于 2021-7-15 16:03

【开罗游戏】闪耀滑雪场物语 去广告+修改金币+修改代币 下载+教程

本帖最后由 我已经蓝屏 于 2021-7-17 11:06 编辑

开罗的游戏最近广告也不少了
不过人家做游戏也不容易
所以大家能支持的还是支持下
所以本篇仅供交流,成品请到[博客](https://kdajv.com/2021/07/15/%e3%80%90%e5%bc%80%e7%bd%97%e6%b8%b8%e6%88%8f%e3%80%91%e9%97%aa%e8%80%80%e6%bb%91%e9%9b%aa%e5%9c%ba%e7%89%a9%e8%af%ad-%e5%8e%bb%e5%b9%bf%e5%91%8a%e4%bf%ae%e6%94%b9%e9%87%91%e5%b8%81%e4%bf%ae-2/)里找

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
由于写的是复现过程,所以可能会比较啰嗦,请谅解

# 准备

- (https://down.52pojie.cn/Tools/Android_Tools/AndroidKiller_v1.3.1.zip)(或别的用的来的拆包打包工具)
   
- (https://github.com/dnSpy/dnSpy/releases)(Unity制作,需要解IL)
   
- (https://github.com/skylot/jadx/releases/)(看dex用)
   
- 手机或安卓模拟器(方便调试)
   

# 修改权限

1.用AndroidKiller打开,如果解包解到一半卡住了就直接退了重进即可,源码可以直接使用jadx查看
2.下图是权限表,那些粉色的条目都是隐私条目,可以删除
   
    删除方法:先点击`工程管理器`,在结构的最后几项里有个叫`AndroidManifest.xml`的文件,双击编辑。找`uses-permission`元素,属性名为那些粉色的条目,将其删除即可
3.点左上角的编译测试一下
4.如果编译的时候遇到`No resource identifier found for attribute 'compileSdkVersion' in package 'android'`,可以在`AndroidManifest.xml`中,把`android:compileSdkVersion`和`android:compileSdkVersionCodename`这两个属性删除即可
5.发现会弹出toast,还会跳出提示,接下来得改源码了
   
6.打开jadx,左上角打开文件,选择程序的dex(位置在`程序根目录\projects\包名\ProjectSrc`)
7.打开入口的源代码,入口在工程信息处可以看到
   
8.可以看出,程序强制需要手机状态和写入存储,我们只需要把都手机状态改掉就行了
9.回到AndroidKiller,点击工程信息里的入口可以跳到对应的文件,找到所有的`READ_PHONE_STATE`将他替换成`WRITE_EXTERNAL_STORAGE`即可,现在把toast改好了,下面来改弹框
10. 在jadx中,按下`Ctrl+Shift+F`,搜索弹框里的关键字,比如搜索`去设置`,可能会出来两个结果,先对其中一个进行操作,然后对另一个也同样操作
11. 看一下这两个脚本,可以看出里面有三个地方检查了权限,下面我们可以跟着第8步的操作,把这三个地方还有另个脚本的权限检查替换掉,方法如下
12. 打开AndroidKiller,在工程管理器中找到这个文件,找到其他权限,将其替换成`WRITE_EXTERNAL_STORAGE`
13. 点左上角的编译测试一下
14. OK,权限问题解决

# 去广告

1.用AndroidKiller打开,如果解包解到一半卡住了就直接退了重进即可,源码可以直接使用jadx查看
   
2.东西还不少,可以把不是开罗的Activity都删掉,如果不放心可以删完之后去模拟器上测测
   
    具体操作方法可以先点击`工程管理器`,在结构的最后几项里有个叫`AndroidManifest.xml`的文件,双击编辑。然后找里面的Activity元素,看他的`android:name`属性,属性值里没有`kairogame`的都可以删除。(如果要删除的Activity里有子元素也得删除)
   
3.其他的Receiver和Service也都可以删除,方法和删Activity一样(非必要)
   
4.这是删完多余Activity和Receiver和Service后的样子(还有权限)
   
   
5.可以测试一下,发现进入游戏之后下面的框没有消失,看来有可能在Unity里控制
   
6.打开dnspy,用他打开Unity库(位置在`程序根目录\projects\包名\Project\assets\bin\Data\Managed`)
   
7.可以看到有个库叫`kairo.unity.ad`,有可能是控制广告用的,打开看看,里面有个`GetAdHeight`函数
   
    指向了`GameDefines.GetAdHeight`函数,我们追踪进去看看
   
    这里又指向了一个叫做`ADMOBHEIGHT`的静态变量,其内容为`Screen.height / 12`,即为屏幕的1/12,可以看到这个函数的上面有个叫`ADMOB_ENABLE`的变量,其值为`true`,有可能是控制广告开关的地方。
   
   
8.我们这里把`ADMOB_ENABLE`改成false,操作方法如下:
    对`ADMOB_ENABLE`右键,选择`编辑方法`,在`修改代码`窗口中找到`GameDefines.ADMOB_ENABLE = true;`,将其改为`GameDefines.ADMOB_ENABLE = false;`,点击右下角的`编译`,回到主窗口,点击左上角的`文件`,选择`保存模块`,再点击`确定`即可
   
9.回到AndroidKiller,编译看一下下面的广告栏有没有消失
   
10. OK解决
   

# 修改金币

1.用AndroidKiller打开,如果解包解到一半卡住了就直接退了重进即可,源码可以直接使用jadx查看
2.打开dnspy,用他打开Unity库(位置在`程序根目录\projects\包名\Project\assets\bin\Data\Managed`)
3.先打开游戏看看,我们的初始金币是20000
   
    回到dnspy,先点击我们的`Assembly-CSharp`模块(点不点都可以),然后点击`编辑`->`搜索程序集`(Ctrl+Shift+K),输入`20000`,搜索类型选择最下面的`数字\字符串`,搜索范围选择`所有文件`
   
    可以看到第一项是`game.Player`类的构造函数,我们双击点进去看看
   
    大概率来说,这个20000就是初始金钱了

## 修改初始金币

1.对`money_`进行右键,点击`编辑方法`,找到20000,修改成想要的数字,然后点编译即可(如果编辑方法下面报错的话可以先关闭编辑方法,还是右键,选择`编辑IL指令`,找里面的`0x4E20`(这里是16进制,你直接写10进制进去不影响),改成你想要的数字,比如`999999`,然后点确定即可),修改完点`文件`->`保存模块`->`确定`,即可
2.回到AndroidKiller,编译看一下新存档进去有没有999999的钱
3.OK解决
   

## 减变加

1.对`money_`进行右键,点击`分析`,查看他的`赋值于`
   
    可以看出第一条大概率是用钱或加钱的时候使用的函数
    第二条应该是读存档的时候用的函数
    第三条就是我们刚刚的新存档的函数
2.我们进入`game.Player.AddMoney`这个函数
   
    可以看到前半段是算钱的,后半段大概率是算成就之类还有反作弊之类的(防内存修改。吧)所以我们还是老套路,把这个`val`的值绝对值一下即可
3.对函数内容右键,选择`编辑方法`,在方法的第一行加上`val = JMath.Abs(val);`(这里的`JMath.Abs`在函数后面用到了,我们直接拿来用就行)点击编译,修改完点`文件`->`保存模块`->`确定`,即可
4.回到AndroidKiller,编译看一下用钱之后的变化
   
    这里我用钱反而钱变多了,OK

# 修改代币

1.用AndroidKiller打开,如果解包解到一半卡住了就直接退了重进即可,源码可以直接使用jadx查看
2.打开dnspy,用他打开Unity库(位置在`程序根目录\projects\包名\Project\assets\bin\Data\Managed`)
3.再进游戏,选择`菜单`->`运营`->`歪罗商店`,点击`观看视频`,会弹出`接收奖励`的对话框,然后会给你几个到几十个不等的歪罗点数,如果我们还想看会有CD,我们需要把CD去掉,然后把奖励的点数调高就可以随时随地的获得代币了,我们先从`接收奖励`入手
   
    我们去dnspy搜索这个接收奖励,先点击我们的`Assembly-CSharp`模块(点不点都可以),然后点击`编辑`->`搜索程序集`(Ctrl+Shift+K),输入`接收奖励`,搜索类型选择最下面的`数字\字符串`,搜索范围选择`所有文件`
   
    可以看出这个`ProExShop`比较像一点,我们点击进入这个函数
   
    伪代码:

```
if(玩家数据中没有Key的名称为Skitime){
if(玩家没联网){
          提示("检查网络状态");
}else{
          玩家数据.设置Key为Skitime的项,值为当前时间;
          显示广告;
          提示("正在接收奖励");
          给奖励();
}
}else{
上次记录的时间=玩家数据中的Skitime的值;
差值=上次记录的时间-现在时间;
if(差值<300){
          提示("CD300秒");
}else{
          玩家数据.设置Key为Skitime的项,值为当前时间;
          显示广告;
          提示("正在接收奖励");
          给奖励();
}
}
```

我们需要做的事:把差值的阈值改小,修改给奖励的地方
4\. 右键,编辑方法,将`if (timeSpan.TotalSeconds < 300.0)`处的`300`改小即可,改成1啊2啊啥的都行,编译,OK
5\. 双击`need1back()`,进入函数,可以看出这里做了一个概率系统,阶梯型的给代币,这里我们在概率系统执行完之后将我们想要的值赋给`num2`就可以替换掉概率系统,而达到每次看视频都是一样的效果了
6\. 右键,编辑方法,在概率系统结束后的第一行,也就是`MyFormBase.apdat_.sysSave_.ints++;`的前一行加上`num2 = 想要的数;`即可,例:

这样每次就会给我加500点了,点击编译,点`文件`->`保存模块`->`确定`,即可
7\. 回到AndroidKiller,编译看一下点查看广告后还有没有cd,有没有一次给500

OK,~~两秒1000发~~

# 原软件下载地址

## 百度云盘
链接:https://pan.baidu.com/s/14rTJWx9Pt62g9GLT4O3u-g
提取码:690d

yyyyy654 发表于 2021-11-4 10:37

大佬你好,看了你的贴子,想自己试试把一些反加钱的游戏改回正常版自己玩
按照大佬您提供的方法和滑雪场原包,进行的挺顺利的,但是自己开始尝试改的时候出现了以下问题
在进行“打开dnspy,用他打开Unity库(位置在程序根目录\projects\包名\Project\assets\bin\Data\Managed)”这一步时
在冒险迷宫村2 里面,此路径下面是三个文件夹,并且文件夹内没有任何dll后缀的文件,看起来像是被加密了
不知道这种情况下是怎么样的修方法呢,
谢谢了~

我已经蓝屏 发表于 2021-7-15 16:17

ArrayList· 发表于 2021-7-15 16:13
很强,没试呢,这东西跟八门那种修改数值有啥子 区别么。

八门是内存修改
这个是程序性质的修改,对于结果来说区别确实不大

ArrayList· 发表于 2021-7-15 16:13

很强,没试呢,这东西跟八门那种修改数值有啥子 区别么。

ArrayList· 发表于 2021-7-15 16:20

我已经蓝屏 发表于 2021-7-15 16:17
八门是内存修改
这个是程序性质的修改,对于结果来说区别确实不大

{:1_1:},可以兄弟,做的很可以。有空研究一下

嘿嘿嘿001 发表于 2021-7-15 16:23

一直很喜欢玩开罗游戏,感谢分享

阿桂哥 发表于 2021-7-15 16:33

qq934679515 发表于 2021-7-15 16:34

那游戏本体从哪里得到呢

yingsummery 发表于 2021-7-15 16:37

多谢楼主,好人啊

芽衣 发表于 2021-7-15 16:45

直装修改还是很方便的,就是逆向麻烦点。{:301_1001:}

板鸭Es 发表于 2021-7-15 16:51

ArrayList· 发表于 2021-7-15 16:13
很强,没试呢,这东西跟八门那种修改数值有啥子 区别么。

比八门看起来牛B克拉斯
页: [1] 2 3 4 5 6
查看完整版本: 【开罗游戏】闪耀滑雪场物语 去广告+修改金币+修改代币 下载+教程