首页
社区
课程
招聘
app逆向|frida绕过|文件再生
发表于: 2024-11-6 13:49 2548

app逆向|frida绕过|文件再生

2024-11-6 13:49
2548

逆向的app算是一个大型app

1
2
仅供交流学习,严谨非法使用
这里只讲思路

起因我朋友今天又甩给我一个app

1
2
3
4
5
他让我完成搜索商品的功能 某大型app
1. 尝试某大型app的话个人的经验就是先找低版本!! 尽量找23年以前的包括23年  因为不知道什么原因24年后防逆向手段喷井式增长!
2. 一定要有一个最高Android10版本的手机 我这里用的是Pixel XL
3. 逆向任何app可以钻牛角尖 但是一定不要撞死南墙 就在这死研究! 一定要抱着运气感觉自己再重复造轮!
4. 最后的忠告!接单之前先搜索一下目标app在各种平台是否有破译好的售卖 如果有的话还有兜底 要不然接单的保证金不够交的

1.尝试抓包

1
2
3
4
下面是抓包工具
    approxy是开源的 GitHub上面有
    Charles 这个也是现成的
    

vpn工具
在这里插入图片描述

1
下面是抓包内容出于保密 我隐藏了大部分信息

在这里插入图片描述

1
2
开始进行改包测试
    最近我发现了个特好用的方法 那么就是用AI将代码转换成Python请求 Copy cURL Request 让他转换成C代码

在这里插入图片描述

1
转换就如下面的一样

在这里插入图片描述

1
改成这样改包就简单多了 !

开始进行 frida测试

1
2
3
4
5
6
刚开始进行注入的时候失败了  看起来有frida检测 关于frida 我见过大多的有三种 咱们一种一种尝试
    1.1 so文件 (不包含业务的)  直接删除就好
    1.2 so文件 (包含业务的)  需要更复杂的线程杀
    2 ptrace 占坑
    3 特征值检测
这个app我在测试的时候 就是1.1 所以下面代码可提供 通用的
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import frida
import sys
 
rdev = frida.get_remote_device()
pid = rdev.spawn(["xxxx"])
session = rdev.attach(pid)
 
scr = """
Java.perform(function () {
 
    var dlopen = Module.findExportByName(null, "dlopen");
    var android_dlopen_ext = Module.findExportByName(null, "android_dlopen_ext");
 
    Interceptor.attach(dlopen, {
        onEnter: function (args) {
            var path_ptr = args[0];
            var path = ptr(path_ptr).readCString();
            console.log("[dlopen:]", path);
        },
        onLeave: function (retval) {
 
        }
    });
 
    Interceptor.attach(android_dlopen_ext, {
        onEnter: function (args) {
            var path_ptr = args[0];
            var path = ptr(path_ptr).readCString();
            console.log("[dlopen_ext:]", path);
        },
        onLeave: function (retval) {
 
        }
    });
 
 
});
"""
script = session.create_script(scr)
 
 
def on_message(message, data):
    print(message, data)
 
 
script.on("message", on_message)
script.load()
rdev.resume(pid)
sys.stdin.read()
1
下面是执行结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[dlopen_ext:] /data/app/xxxx/lib/arm64/xxx.so
[dlopen_ext:] /data/app/xxxx/lib/arm64/xxx.so
[dlopen_ext:] /data/app/xxxx/lib/arm64/xxx.so
[dlopen_ext:] /data/app/xxxx/lib/arm64/xxx.so
[dlopen_ext:] /data/app/xxxx/lib/arm64/xxx.so
[dlopen_ext:] /data/app/xxxx/lib/arm64/xxx.so
[dlopen_ext:] /data/app/xxxx/lib/arm64/xxx.so
[dlopen_ext:] /data/app/xxxx/lib/arm64/xxx.so
[dlopen_ext:] /data/app/xxxx/lib/arm64/xxx.so
[dlopen:] libc.so
[dlopen_ext:] /data/app/xxxx/lib/arm64/xxx.so
[dlopen_ext:] /data/app/xxxx/lib/arm64/xxx-spy.so
[dlopen_ext:] /data/app/xxxx/lib/arm64/xxxx.so
[dlopen_ext:] /data/dalvik-cache/arm64/system@product@app@TrichromeLibrary@TrichromeLibrary.apk@classes.dex
[dlopen_ext:] /data/dalvik-cache/arm64/system@product@app@WebViewGoogle@WebViewGoogle.apk@classes.dex
[dlopen_ext:] libmonochrome.so
[dlopen_ext:] /vendor/lib64/hw/gralloc.msm8996.so
[dlopen:] libadreno_utils.so
[dlopen:] libEGL_adreno.so
[dlopen:] libGLESv2_adreno.so
[dlopen:] libGLESv1_CM_adreno.so
[dlopen_ext:] /vendor/lib64/hw/android.hardware.graphics.mapper@2.0-impl-2.1.so
[dlopen_ext:] /vendor/lib64/hw/gralloc.xxx.so
[dlopen_ext:] /data/app/xxxx/lib/arm64/libxxxxx.so
1
2
3
4
多运行几次可以看出
/data/app/xxxx/lib/arm64/libxxxxx.so 进行了终止
那么就删除掉这个文件
进入系统 然后提权杀死这个文件 让他彻底消失

进一步hook受阻

1
2
3
4
5
6
7
8
9
10
11
这个时候我已经删除了那个文件
但是我在启动frida的时候 还是被终止进程!! 邪门...
 
再次排查 还是调用那个代码 结果发现这个文件 在他安装目录删除之后会在用户空间目录生成! 很好很好
生成到了这里
    /data/user/0/xxx/app_lib/libxxx.so
思路1 是不是通过网络请求在生的
思路2 是不是代码内部生成的
我按照 12 排查的时候 突然想到 我又不是研究他的代码 咱们做的是对抗而不是研究。。。
换个思路
1.动态删除这个文件
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
Java.perform(function() {
    // 删除文件的路径
    var filePath = "/data/user/0/com.hupu.shihuo/app_lib/libmsaoaidsec.so";
 
    // 获取 Java IO 文件类
    var File = Java.use("java.io.File");
 
    // 创建文件对象
    var file = File.$new(filePath);
 
    // 检查文件是否存在
    if (file.exists()) {
        console.log("File exists, attempting to delete...");
        var deleted = file.delete();
        if (deleted) {
            console.log("File deleted successfully.");
        } else {
            console.log("Failed to delete the file.");
        }
    } else {
        console.log("File does not exist.");
    }
 
    console.log("继续hook");
});
1
2
3
4
5
6
7
8
9
这个思路刚开始的时候是可以的!
一直到hook几个接口之后就突然就不能用了
 
那我继续换个思路
1 禁止向这个文件写入数据!
2 写个程序定时检测如果是写入 那个防hook的so文件不让写入
 
我这里暂时用的1
chmod -w /data/user/0/xxx/app_lib/

跳过hook完结

1
这已经跳出了hook并且之后也不会出问题了 测试了好几遍

持续更新一直到能够完成整个单 先记录到这里 后期修改


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2024-11-6 14:02 被mb_vcrwlkem编辑 ,原因:
收藏
免费 2
支持
分享
最新回复 (2)
雪    币: 619
活跃值: (3094)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
感谢分享
2024-11-6 21:51
0
雪    币: 856
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
3
也想拥有一个你这样的大佬朋友
2024-11-15 16:50
0
游客
登录 | 注册 方可回帖
返回
//