首页
社区
课程
招聘
[原创]Android 应用多开对抗实践
发表于: 2019-10-25 18:29 38558

[原创]Android 应用多开对抗实践

2019-10-25 18:29
38558

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

上传的附件:
收藏
点赞 ・19
打赏
分享
最新回复 (21)
雪    币: 878
活跃值: (496)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2 楼
确实有不少方法可以检测多开, 从业务安全逻辑上允许用户多开才是最好的防范
2019-10-25 18:44
1
雪    币: 12503
活跃值: (3177)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3 楼
rrrfff 确实有不少方法可以检测多开, 从业务安全逻辑上允许用户多开才是最好的防范
公孙策 好难见一次。
2019-10-25 22:18
0
雪    币: 9905
活跃值: (9401)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4 楼
学习到了,感谢楼主
2019-10-26 11:13
0
雪    币: 8659
活跃值: (5436)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
5 楼
看到 “奔放稳定框架” 我会心一笑
2019-10-26 19:04
0
雪    币: 402
活跃值: (48)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6 楼
后记才是本文最大亮点

另外readSymbolicLink可以改linux的readlink读,估计这就是笔者说的ASM大概思路把
2019-10-26 21:00
0
雪    币: 3821
活跃值: (4280)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
7 楼
rrrfff 确实有不少方法可以检测多开, 从业务安全逻辑上允许用户多开才是最好的防范
在理,微信中貌似就有适配多开和xposed框架的代码
2019-10-26 21:18
0
雪    币: 18
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
8 楼
krash 在理,微信中貌似就有适配多开和xposed框架的代码
记得微信不允许多开吧,还是已经改了?
2019-10-27 20:45
0
雪    币: 2
活跃值: (225)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9 楼
多开方案都是对抗性质,真实的场景要复杂的多,这个就是玩具啊
2019-11-8 20:14
0
雪    币: 4
活跃值: (877)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10 楼
暗街之王 后记才是本文最大亮点 另外readSymbolicLink可以改linux的readlink读,估计这就是笔者说的ASM大概思路把
试过linux的readlink不行啊
2020-4-1 14:48
0
雪    币: 1109
活跃值: (3996)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
11 楼
koftnt 试过linux的readlink不行啊
姿势不对,不要使用 C 函数库的 readlink
2020-4-14 16:18
0
雪    币: 1892
活跃值: (1628)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
12 楼
楼主的ASM代码是指C++中的ASM还是Java中的呢?
2020-5-21 15:08
0
雪    币: 4
活跃值: (877)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13 楼
那用什么,命令行?
2020-5-22 19:25
0
雪    币: 182
活跃值: (4005)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
14 楼
其中有一个“A[dataDir的fd] --> B[fd反查真实路径]”这个是什么意思,尤其是怎么得出B的路径的呀,我这边本打算使用C语言来模拟Java来写,但是int fd = open(testPath.c_str(), O_WRONLY | O_CREAT | false ? O_APPEND : O_TRUNC); 返回后的fd为-1;但是Java那边确实是fd不等于-1的,所以特别想问下这个问题,其中的技术原理我应该怎么弄清楚呢,对这块不是很懂。
2021-11-15 19:17
0
雪    币: 5930
活跃值: (4247)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15 楼
感谢分享
2021-11-17 09:20
0
雪    币: 182
活跃值: (4005)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
16 楼
我自己用asm实现了一套简单的io函数,但是还是不对,int fd = __openat(AT_FDCWD, testPath.c_str(), O_WRONLY | O_CREAT | false ? O_APPEND : O_TRUNC, 0);返回后的fd还是为-1,真不知道哪里出了问题,有点怀疑是open函数中的flag的值写的有点问题吧,真不知道哪里有问题了,其次最主要的是那个问题我也没有找到答案。
2021-11-17 11:32
0
雪    币: 182
活跃值: (4005)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
17 楼
好吧,我弄出来了,还是很感谢大佬提供的思路的。上面的问题是我的问题,因为Java中的FileOutputStream在new的时候会对不存在的文件进行新建,所以我那个openat的flag是没啥问题,不过我后来改成了O_RDWR | O_CREAT | O_TRUNC。这样就可以写入了,我之所以写成O_WRONLY | O_CREAT | false ? O_APPEND : O_TRUNC完全是看了FileOutputStream的源码,其中它这个flag就是这么写的,所以我直接照抄。然后起最后的mode,FIleOutputStream中mode为0,我也写成0,但是一直是fd为-1,所以我将mode改成0640,这样fd就不为-1了,后面的流程就正常运行了。
2021-11-17 14:38
1
雪    币: 163
活跃值: (2074)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
18 楼
// --- Java ---
import java.io.File;
boolean isDualApp(String dataDir){
    return new File(dataDir + File.separator + "..").canRead();
}
看了源码,最终也是调用acess()函数,为什么检测结果会不一样呢
2022-12-16 16:39
0
雪    币: 1109
活跃值: (3996)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
19 楼
学编程 // --- Java --- import java.io.File; boolean isDualApp(String dataDir){ return new File(dataD ...
证明这个多开容器的 I/O Hook 不够全
2022-12-19 15:38
0
雪    币: 163
活跃值: (2074)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
20 楼
Amun 证明这个多开容器的 I/O Hook 不够全
我的意思是说,通过查看Android源码,canRead的流程最终是要走到access函数,那方式二的效果应该是等同于方式一的。 不应该会出现文中的结果。

测试代码一

// --- C++ ---
#include <unistd.h>
#include <sys/stat.h>
#include <string>
bool isDualApp(std::string dataDir) {
    return 0 == access((dataDir + "/../").c_str(), R_OK);
}
测试代码二
// --- Java ---
import java.io.File;
boolean isDualApp(String dataDir){
    return new File(dataDir + File.separator + "..").canRead();
}
2022-12-21 14:58
0
雪    币: 273
活跃值: (2389)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21 楼
mark
2023-8-28 23:08
0
雪    币: 184
活跃值: (1379)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22 楼
mark
2026-7-6 16:46
0
游客
登录 | 注册 方可回帖
返回