首页
社区
课程
招聘
[原创] SEC2025 安卓初赛
发表于: 2025-4-30 16:29 1829

[原创] SEC2025 安卓初赛

2025-4-30 16:29
1829

打完好久了。记录一下自己打的情况罢

好看的排版是没有的

年年都不一样,去年是开桂,今年是修复。

寻找GWorld等

和去年一样,搜索相关字符串

GWorld:0xAFAC398

GName:0xADF07C0

GUObject:0xAE34A98

1
./ue4dumper64 --newue+ --objs --gname 0xADF07C0 --gworld 0xAFAC398 --guobj 0xAE34A98 --package com.ACE2025.Game --output /data/local/tmp/

dump下sdk。

问题

移速过快

搜索SDK中,发现有个叫MaxWalkSpeed的

读内存偏移发现PlayerController中的AcknowledgedPawn的CharacterMovement里面的MaxWalkSpeed设置为了1000000000

改掉就好了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function hookMaxWalkSpeed(actorsAddr){
    for(var name in actorsAddr){
        if(name.includes("PlayerController")){
            var pcer = actorsAddr[name]
            // console.log(pcer)
            var pawn = pcer.add(0x2a0).readPointer()
            // console.log(pawn)
            var CharacterMovementComponent = pawn.add(0x288).readPointer()
            // console.log(CharacterMovementComponent)
            var maxWalkSpeedAddr = CharacterMovementComponent.add(0x18c)
            console.log("MaxWalkSpeed:",Memory.readFloat(maxWalkSpeedAddr))
            Memory.writeFloat(maxWalkSpeedAddr, 1000.0)
        }
    }
}

开火视角锁定一个方块

位置大法定位到是Cube8

通过对Cube8的坐标设置访问断点,找到:

从这里往下一路找能找(*(**(a1 + 75) + 0x698LL))(*(a1 + 75), &v82);

唉,虚函数,调一下就知道这个函数是SetControlRotation,把跳转删掉就行了。

小球乱飞

按照一般的惯性,生成小球应该也是在刚刚改视角的函数里面,而且是先锁再出小球,开始一个一个向下搜查。

看到了熟悉的偏移:

这个是Actor中的RootComponent偏移到Position的偏移,进行hook,然后不出意外获得了许多不一样但是正常的float的数据:

在官方文档中得到一些信息:

1
2
// 在枪口位置生成发射物。
AFPSProjectile* Projectile = World->SpawnActor<AFPSProjectile>(ProjectileClass, MuzzleLocation, MuzzleRotation, SpawnParams);

参数对上了几个,猜测最后一个是偏移之类的

hook发现数据相近:

往上分析可以得知,在函数的一开始存在rand()对后面的数据产生影响:

尝试修改为POV的数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
function hookProjectileSpawn(){
    var funcAddr = moduleBase.add(0x8D2ED80)
    Interceptor.attach(funcAddr, {
        onEnter: function(args){
            console.log("[+!!+]function sub_8D2ED80 has been called")
            console.log("args0:\t"+ args[0])
            console.log("args1:\t"+ args[1])
            console.log("args2:\t"+ args[2].readFloat(), args[2].add(0x4).readFloat(), args[2].add(0x8).readFloat())
            console.log("args3:\t"+ args[3].readFloat(), args[3].add(0x4).readFloat(), args[3].add(0x8).readFloat())
            console.log("args4:\t"+ args[4].readFloat(), args[4].add(0x4).readFloat(), args[4].add(0x8).readFloat())
            var actorsAddr = getActorsAddr();
            var playerLocation = actorsAddr["PlayerController"].add(0x130).readPointer().add(0x1d0);
            // console.log("playerLocation: X: "+playerLocation.readFloat()+"\tY: "+playerLocation.add(0x4).readFloat()+"\tZ: "+playerLocation.add(0x8).readFloat())
            // var playerRotation = actorsAddr["PlayerController"].add(0x2cc);
            // console.log("playerRotation: P: "+playerRotation.readFloat()+"\tY: "+playerRotation.add(0x4).readFloat()+"\tR: "+playerRotation.add(0x8).readFloat())
            var PlayerCameraManager = actorsAddr["PlayerCameraManager"]
            var CameraCachePrivate = PlayerCameraManager.add(0x1ae0)
            var POV = CameraCachePrivate.add(0x10)
            console.log("POV: Location: X: " + POV.readFloat() + "\tY:" + POV.add(0x4).readFloat()+ "\tZ:" + POV.add(0x8).readFloat())
            console.log("POV: Rotation: P: " + POV.add(0xc).readFloat() + "\tY:" + POV.add(0xc+0x4).readFloat()+ "\tR:" + POV.add(0xc+0x8).readFloat())
            Memory.writeFloat(POV.add(0x8), POV.add(0x8).readFloat() + 100.0)
            args[2] = POV
            args[3] = POV.add(0xc)
            // args[2] = playerLocation;
 
        },
        onLeave: function(retval){
        }
    })
}

发射的小球能稳定打到准星指向的地方了,但是修的不是很对,还有不少问题,比赛的时候就能这样就过掉了。

小球会对玩家产生碰撞

这个被我定为问题主要是因为UE4提供的示例里面是不会触发这个的,而且要求也不说清什么是问题,那就我觉得是就是(

SDK中搜索onHit,发现只有一个函数,ida查看函数

感觉和官方教学的OnHit函数有点相像。

试着记录了一下和那些Actor会碰撞

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function hookOnHit(){
     
    var funcAddr = moduleBase.add(0x6711D34);
    Interceptor.attach(funcAddr, {
        onEnter: function(args){
             var actorsAddr = getActorsAddr();
             for(var name in actorsAddr){
                 if (name.includes("Floor") || name.includes("Wall")){
                     continue
                 }
                 if (args[2].toString() == actorsAddr[name].toString()){
                     console.log("[!!]\targ2:",name,actorsAddr[name])
                 }
             }   
        },
        onLeave: function(retval){
 
        }
    })
     
}

发现和玩家碰撞时产生冲击肘飞玩家的时候,碰撞相关的Actor是FirstPersonCharacter_C

那就简单,直接打玩家后的onHit直接返回就行,简单粗暴

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
function hookOnHit(){
     
    var funcAddr = moduleBase.add(0x6711D34);
    Interceptor.attach(funcAddr, {
        onEnter: function(args){
            // var actorsAddr = getActorsAddr();
            // for(var name in actorsAddr){
            //     if (name.includes("Floor") || name.includes("Wall")){
            //         continue
            //     }
            //     if (args[2].toString() == actorsAddr[name].toString()){
            //         console.log("[!!]\targ2:",name,actorsAddr[name])
            //     }
            // }   
            if(args[2].toString() == actorsAddr["FirstPersonCharacter_C"].toString()){
                return;
            }
            // console.log("[+!!+]function sub_6711D34\nargs:")
            // console.log(args[0],args[1],args[2],args[3],args[4],args[5])
        },
        onLeave: function(retval){
 
        }
    })
    console.log("[:)]Successfully patched fix Ball Hit(MAN!What Can I Say?Manba OUT!)")
}

人物模型发红

最后一天全在搞这个了,有说是渲染层的问题有说是别的问题,但总之就是到最后都没有实现修复。。。。。。

赛后也没看见真正修成功的文章。。


[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 2
支持
分享
最新回复 (2)
雪    币: 23
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2
大佬题目是啥没看懂可以贴下链接或者说明下吗
2025-4-30 20:27
0
雪    币: 225
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
3
yazigegeda 大佬题目是啥没看懂可以贴下链接或者说明下吗
题目就是腾讯游戏安全2025的安卓赛道的初赛题目
2025-5-5 17:22
0
游客
登录 | 注册 方可回帖
返回