digyth 发表于 2020-7-10 21:23

新奇,会封号的单机游戏--逆向破解教程

本帖最后由 digyth 于 2020-7-17 12:48 编辑


# 破解目标
游戏:萌萌塔
各大应用商店均有此单机游戏,可以自行下载,小改怡情大改伤身,虽说是单机却是会封号的哦{:1_890:}

## 所需工具
1、IDA
2、apktool或MT管理器
3、AndroidStudio

## 一、拆包
使用MT管理器工具,将apk安装包反编译,可以得到一系列的资源文件,保险起见,我先用MT把签名校验去掉了



## 二、IDA反汇编so
打开lib文件夹,找到下面的so文件,可以看到有一堆的so文件,但是游戏的主so文件一般都会异常地大,因此我们可以快速锁定



ida打开so之后,搜索encrypt(英文释义:加密)可以找到数值加密函数Encrypt(之前用GG修改器搜索不到任何数值,所以直接可以判定加密了),不过要加密函数没什么用,我们还可以找到解密函数Decrypt,然后通过hook它来返回我们想要的数值,屏蔽游戏的返回值,实现修改游戏数值



## 三、HOOK解密函数
接下来我们使用InlineHook方法来hook解密方法,使其返回我们想要的数值
#### NDK开发编写注入程序
使用AndroidStudio创建一个NDK项目,包名类名与原Activity相同,将libMyGame.so读取,dlsym得到原Decrypt函数的地址,使用inlineHook将解密函数hook掉,重定向至自己定义的函数,在返回的时候把自己想要的数值传回去
``` c
void*handle=dlopen("libMyGame.so",RTLD_LAZY);
void* (*func_decrypt)(int,int const*,char*,int)=NULL;
int new_decrypt(int a1,int const* a2, int* a3, int a4){
    if(isNumberHook&&*a3==numberHookValue){
      *a3=numberHookValue;
    }else{
      return func_decrypt(a1,a2,a3,a4);
    }
    return a1;
}

int main(){
hook((uint32_t)dlsym(handle,"_ZN6Encode7decryptEPKvPvi"),(uint32_t)new_decrypt,(uint32_t**)&func_decrypt);
return 0;
}
```
之后build项目生成inject.so文件,放入lib目录下面

#### 修改smali代码
通过Manifest.xml找到程序入口Activity为org.cocos2dx.cpp.AppActivity,然后用DEX++编辑器,在这个Acitivty的onCreate方法开头插入smali代码加载用来注入的so
```smali
const-string v0,"inject"
invoke-static {v0}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V
```
在开头声明native的main方法并在loadLibrary之后调用

#### 打包运行
接下来我们继续使用MT管理器将apk打包回去并签名,安装好之后运行

## 四、修复解密函数
然而当我势在必得打开游戏的时候,游戏崩了。。。
之后我尝试了各种方法,就快要放弃的时候。。。
突发奇想(′⊙ω⊙`)!直接F5伪代码,按照解密逻辑一波抄下来,不再去调用原来的解密函数,还真可以用了,挺无语的( ̄o ̄)....
```c
int new_decrypt(int a1,int const* a2, int* a3, int a4){
    int i;
    for(i=0;i<a4;i++)*((byte*)a3+i)=*(byte*)(*((byte*)a2+i)+a1+256);
    if(isNumberHook&&*a3==numberHookValue){
      print("decrypt %d",*a3);
      *a3=numberHookValue;
    }
    return a1;
}
```

## 五、重大的发现
但是由于某种原因我并不想结束,并且单单是数值修改限制很多,比如不能实现物品的无中生有,于是我想找到添加物品的方法
在我翻了一圈函数表之后,发现了某个特殊的添加物品函数,参数类型中带有lua,于是我怀疑这是个由lua编写逻辑的游戏



翻了安装包的资源文件,还真找到了各种lua文件,还有游戏物品的数值定义,居然还都没加密!



在这些lua之中我发现了一个特殊的lua脚本,里面写有各种游戏控制方法的详细说明



## 六、执行lua命令
看到没加密,我就觉得不对,这直接放明文岂不是谁都能改?果然我猜对了,当我在某个事件触发时的执行命令中插入了添加物品命令之后,打包运行,又崩了( ̄o ̄)....
从崩溃报告中可以看出,lua文件加载之前会经过完整性校验,当校验失败之后会产生未捕获的错误导致崩溃。。
这么说我也没法加载自己的lua文件了,肯定找不到对应的校验码,只能继续看看哪里有突破点了
SO文件里面找了下文件校验部分,发现函数都被去符号了,全部都是sub_xxx的形式,万念俱灰的时候,抱着死马当活马医的心态,把lua都翻了一遍,在其中一个lua里面发现了一段供C层动态执行lua代码的接口,哇救星啊



在SO文件中也找到了这个接口函数



但是光有函数不行,我们还得得到对象,于是继续找引用,然后发现了需要ScriptExecutor



再往上找,发现来源是ScriptMgr的单例模式,于是至此可以得到一个获取luaState思路



> 通过ScriptMgr::singleton()得到ScriptMgr对象,偏移10即可得到luaState对象
在NDK开发中dlsym得到ScriptMgr::singleton函数地址并直接调用,偏移获取luaState并执行函数,成功实现使用lua命令调用游戏内置的API进行各种操作!
ps:不会lua的我也没办法了╮(╯▽╰)╭

## 七、游戏内广播利用
但是这样还是得慢慢地一层一层打上去,有没有方法能够跳层呢?
继续翻lua文件,发现一个lua内定义了各种各样的广播id,其中有个到下一层,于是我想到可以利用这个消息id跳层



在so中发现了发送广播的函数,用之前的方法溯源到一个sington函数得到对象,然后调用发送广播的函数发送"到下一层"广播,成功跳层!



## 八、破解结束
**至此破解结束,如有疑问请留言**
这是我所实现的功能样例图,可以参考修改破解的方向,无敌功能过于强大就留给大家自行发挥了!



### 结束语
至于我为什么要破解这个单机游戏,吃相过于难看
提供存档上传下载,等清理垃圾的时候误清存档清了之后,云端存档就无法下载了,客服找回需要提供一串游戏中小小的数字
这就与合同之中拿隐形墨水写了个坑人条款有什么区别,谁会特意去记那玩意?
本来我觉得游戏还行氪金支持了一下,结果告诉我说吞就吞了
既然找不回来了,那就自己动手丰衣足食咯(╯‵□′)╯︵┻━┻

### 强调
**仅提供破解思路,不提供任何成品代码!**
文章目的是记录破解思路,仅会破解这个单机游戏没什么意义,要会具体的破解流程*


小白第一次发帖,若有不足请指教,写文不易希望给个好评( ̄▽ ̄)

digyth 发表于 2020-7-12 16:53

因为初次接触吾爱论坛,对发帖工具操作不熟悉,所以会出现排版错乱的现象,但是每次都需要等1天审核完之后才能修改,我也很无奈,这篇帖子我会逐渐修缮,也希望知道能如何在审核时重新编辑方法的能告诉我{:1_906:}

digyth 发表于 2020-7-17 18:52

wwwgaoxi 发表于 2020-7-17 18:20
有一个打鱼的游戏app 挺小众的,我想玩单机的,大哥 能不能帮我看看可否改成单机的?蛮喜欢玩的,可以有偿~

本质上是单机游戏就行,但是那种几乎完全依赖联网的就不行了,而且我也不一定能成功绕过登录,毕竟我还算新手

digyth 发表于 2020-7-15 11:43

Hmily 发表于 2020-7-14 18:22
抱歉,目前新手发帖需要先审核,现在通过了,可以边界了。

这一段标题打上之后一直会重复显示,其它的标题不会出问题,不知道是不是md显示的bug{:1_924:}
## 二、IDA反汇编so

一米宽的信仰 发表于 2020-7-11 12:46

大佬,游戏呢 {:1_918:}

digyth 发表于 2020-7-11 13:29

第一次发帖子,图片没处理好,已重新编辑,请等待审核完

Hmily 发表于 2020-7-14 18:22

digyth 发表于 2020-7-12 16:53
因为初次接触吾爱论坛,对发帖工具操作不熟悉,所以会出现排版错乱的现象,但是每次都需要等1天审核完之后 ...

抱歉,目前新手发帖需要先审核,现在通过了,可以边界了。

Hmily 发表于 2020-7-15 11:46

digyth 发表于 2020-7-15 11:43
这一段标题打上之后一直会重复显示,其它的标题不会出问题,不知道是不是md显示的bug
## 二、I ...

对,是bug,不要管这个了。

奇奇小霸王龙 发表于 2020-7-17 11:31

应该很牛逼 但是看不懂

0119 发表于 2020-7-17 17:46

看起来就很高级

wwwgaoxi 发表于 2020-7-17 18:20

有一个打鱼的游戏app 挺小众的,我想玩单机的,大哥 能不能帮我看看可否改成单机的?蛮喜欢玩的,可以有偿~
页: [1] 2 3 4
查看完整版本: 新奇,会封号的单机游戏--逆向破解教程