吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 6172|回复: 65
收起左侧

[Web逆向] 某h5游戏分析

  [复制链接]
少年持剑 发表于 2023-11-26 00:28
本帖最后由 少年持剑 于 2023-11-26 00:29 编辑

最近在学习js逆向,网上找了一h5游戏来练手
网站:aHR0cHM6Ly93d3cuNDM5OS5jb20vZmxhc2gvMjM3NzM1XzMuaHRt
游戏主逻辑代码在index.js里,js里面有些简单的混淆不影响分析,不过我这里先去混淆后在分析
js去混淆


字符串去混淆

游戏中js字符串混淆,将字符串用unicode编码形式进行显示,比如:
[JavaScript] 纯文本查看 复制代码
n.modules().uiControlModule.showDialogBox("\u6e29\u99a8\u63d0\u793a", "\u544a\u8bc9\u4f60\u4e00\u4e2a\u6d88\u606f", !1, null, null, "\u6211\u77e5\u9053\u4e86")

字符串ast

字符串ast

而在AST中可以看到value和rawValue的值是正常,只有raw是编码形式显示,在babel中通常处理方法如下:
[JavaScript] 纯文本查看 复制代码
path.node.extra.raw = '"' + path.node.extra.rawValue + '"'
path.node.extra.raw = '"' + path.node.value + '"'
delete path.node.extra
delete path.node.extra.raw


前两种情况通常用在字符串中没有转义符和”,’的情况,因为path.node.extra.rawpath.node.value前者会在后者的基础上在进行一次转义如 a = "你好\"!"  这条语句:

字符串

字符串



如果直接替换就会出现 a = "你好"!"  ,语法错误。而后两种delete 的情况,使用的时候发现没有效果,最后发现要在
[JavaScript] 纯文本查看 复制代码
generate(ast,opts = {jsescOption:{"minimal":true}})

中加入opts = {jsescOption:{"minimal":true}才行。
逗号表达式混淆


逗号表达式混淆是将多条语句用, 合并成一条语句 如下:
[JavaScript] 纯文本查看 复制代码
            onUpdate(e) {
                this.isActive && !this.isBreak && (this.cdNum += e,
                this.cdNum >= this.maxCd && (this.cdNum = 0,
                this.bornBoom()))
            }


babel中只需要将SequenceExpression 节点替换成多个子节点就行,不过要注意SequenceExpression位于if 之类节点内的情况,这时直接替换就会导致出错
[JavaScript] 纯文本查看 复制代码
    SequenceExpression(path) {
        if (path.parent && !t.isExpressionStatement(path.parent)) {
            return;
        }

        path.parentPath.replaceWithMultiple(path.node.expressions.map(e => t.expressionStatement(e)));
    }


Void+数值 和 !+数值混淆


游戏中会将undefined  使用void + 数值   语句来代替, true和false 也使用 ! + 数值来代替。这种情况直接遍历UnaryExpression表达式判断操作符和操作对象类型就行。
[JavaScript] 纯文本查看 复制代码
    UnaryExpression(path) {
        if (path.node.operator === 'void' && path.node.argument.type === 'NumericLiteral') {
            path.replaceWith(t.identifier("undefined"));
        }

        if (path.node.operator === '!' && path.node.argument.type === 'NumericLiteral') {
            if (path.node.argument.value === 0) {
                path.replaceWith(t.booleanLiteral(true));
            } else {
                path.replaceWith(t.booleanLiteral(false));
            }
        }
    }

声明变量合并


声明变量合并和逗号表达式混淆类似,不过是将多个变量声明合并成一条语句,babel中处理和逗号表达式类似:
[JavaScript] 纯文本查看 复制代码
    VariableDeclaration(path) {
        if (path.node.declarations.length > 1) {
            path.replaceWithMultiple(path.node.declarations.map(d => t.variableDeclaration(path.node.kind, [d])));
        }
    }


逻辑表达式和三目运算混淆


混淆利用逻辑运算短路性质将if else 语句转为逻辑表达式形式如:
[JavaScript] 纯文本查看 复制代码
            Init() {
                console.log("Init   start"),
                this.m_gameRecorderManager = a.getGameRecorder(),
                null === this.m_gameRecorderManager && console.log("\u5f53\u524d\u7248\u672c App \u4e0d\u652f\u6301\u5f55\u5c4f"),
                console.log("Init   over")
            }
对于 && 运算来说,如果前面语句结果为真 则会执行 && 右侧语句,为假则不会直接(和if语句等效),使用babel去混淆后:
[JavaScript] 纯文本查看 复制代码
      Init() {
        console.log("Init   start");
        this.m_gameRecorderManager = a.getGameRecorder();
        if (null === this.m_gameRecorderManager) {
          console.log("当前版本 App 不支持录屏");
        }
        console.log("Init   over");
      }

对这种形式需要构建if 节点:
[JavaScript] 纯文本查看 复制代码
    LogicalExpression(path) {
        if (!t.isExpressionStatement(path.parent)) {
            return;
        }

        path.parentPath.replaceWith(t.ifStatement(path.node.left, t.blockStatement([t.expressionStatement(path.node.right)]), null));

    }

三目运算语句的形式跟if else 一样,不过带返回值,所以对它处理也是构建if 节点替换,不过需要注意父节点是赋值语句和return 的情况 ,替换为if语句就不能赋值了。
[JavaScript] 纯文本查看 复制代码
    ConditionalExpression(path) {
        if (t.isAssignmentExpression(path.parent) || t.isReturnStatement(path.parent)) {
            return;
        }

        if(!t.isExpressionStatement(path.parent)) {
            return;
        }
        path.parentPath.replaceWith(t.ifStatement(path.node.test, t.blockStatement([t.expressionStatement(path.node.consequent)]), t.blockStatement([t.expressionStatement(path.node.alternate)])));
        path.parentPath.skip();
    }

对游戏做简单修改

Local storage


游戏刷新网页后仍保存体力和宝石的数据,js中有很多storage的字眼,所以很可能是将数据存在了Local storage中。在去混淆的js中搜索localStorage  找到这个
[JavaScript] 纯文本查看 复制代码
a.default.getServices().localStorageSrv.setStorage(this.m_VERSION_NOTICE_KEY, this.m_versionNotice);


这里应该就是设置本地存储数据,在根据localStorageSrv.setStorage搜索可以找到其它值。最后可以找到体力和宝石对应字符串值。

storage

storage


打开浏览器开发者工具对Local storage进行修改,在刷新网页

com

com

jelw

jelw


字符串定位修改游戏内树苗


游戏内观看广告可以获取树苗,在js搜索树苗,可以定位到下面位置:

strSearch

strSearch
以看到每次执行完后会调用t()  ,这里应该就是真实获取树苗的位置,在这里下个断点。

t

t


断下后控制台执行this. getGold();       树苗从100变成6100

tree

tree

xTree

xTree


数值搜索修改游戏内树苗

使用js 内存漫游,可以通过搜索数值来定位树苗存放位置。js内存漫游网址根据树苗数量在控制台搜索:

valueS

valueS

result

result

r2

r2

搜索出的结果可以看到变量值设置位置和类信息,js中跟进这个updatePlayerResource里面看看

r3

r3


update

update


可以看出这里是界面增加树苗时ui变动的代码,而这里
[JavaScript] 纯文本查看 复制代码
d.mainManger().fightModule.getResourceNumByType(l.EResourceType.GOLD)

可能就是真实树苗数量。对这里下断点,然后控制台输出d.mainManger().fightModule.getResourceNumByType(l.EResourceType.GOLD) 看看

r4

r4

trees

trees


可以看到两个值恰好相等,在输出d.mainManger().fightModule看看类的具体信息。

r5

r5


这里就可以很方便修改其他数值。

免费评分

参与人数 18威望 +1 吾爱币 +38 热心值 +16 收起 理由
笙若 + 1 + 1 谢谢@Thanks!
riluoxingchen + 1 谢谢@Thanks!
xins666 + 1 + 1 谢谢@Thanks!
kkkfew + 1 谢谢@Thanks!
wapj721 + 1 + 1 我很赞同!
fengbolee + 2 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
心渊魔角 + 1 + 1 热心回复!
sysmu + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
LZC13807614037 + 1 + 1 谢谢@Thanks!
leommm + 1 + 1 我很赞同!
涛之雨 + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
SaoHao + 1 + 1 热心回复!
janken + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
ekobe1796 + 1 谢谢@Thanks!
wang380006 + 1 热心回复!
yan3881859 + 1 + 1 我很赞同!
豆虫 + 1 + 1 希望多一些这类文章!
朱朱你堕落了 + 3 + 1 你真是个全能型人才。

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

xixicoco 发表于 2023-11-26 00:41
游戏的不错,分析也很到位
jjjj24251 发表于 2023-11-26 01:49
9nyzce 发表于 2023-11-26 02:49
穆塔muta 发表于 2023-11-26 07:12
一脸懵逼地进来,一脸懵逼地出去。
FruitBaby 发表于 2023-11-26 07:50
解释的很到位,谢谢分享
jjw131421 发表于 2023-11-26 08:17
很详细,学习了,收藏下来
JonathanQ 发表于 2023-11-26 08:48
懂了!原来怎么简单!谢谢分享!
zxzxx 发表于 2023-11-26 08:59
学习了学习了
wuai4444 发表于 2023-11-26 09:27

学习了学习了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 12:16

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表