现在市面上改机的软件很多,大部分都是通过Hook的方式去修改Java层的一些参数和变量,或者直接反射的方式去set成伪造数据。
如果通过正常的获取设备信息的API去获取的时候就很容易是假的
这时候我们可以通过读取文件的方式去获取设备信息,还需要加CRC对底层函数进行判断,很是麻烦
因为底层的IO函数一旦被Hook,比如openat函数,就算读取文件的方式去可能获取的设备也可能是被mock的。
通过syscall 直接调用svc指令的方式让Linux切换到内核态,执行完毕以后去直接拿返回结果即可
(systcall是Linux内核的入口,切换到内核态以后,无法被Hook)
实现也很简单,提供两种方式:
方式1:
直接调用syscall
方式2
通过内联汇编的方式调用Svc
重点看一下raw_syscall
内联汇编代码主要分32和64
cmake里添加
编译即可
比如获取网卡设备信息
<br/>
<br/>
<br/>
答案是否定的
目前主流的两种方法
<br>
<br>
帖子根据个人经验梳理,如有不足,及时告知。
std::string FileUtils::getFileText(char
*
path,
int
BuffSize) {
char
buffer
[BuffSize];
memset(
buffer
,
0
, BuffSize);
std::string
str
;
/
/
int
fd
=
open
(path, O_RDONLY);
long
fd
=
syscall(__NR_open, path, O_RDONLY);
/
/
失败
-
1
;成功:>
0
读出的字节数
=
0
文件读完了
while
(syscall(__NR_read,fd,
buffer
,
1
) !
=
0
) {
/
/
LOG(ERROR) <<
"读取文件内容 "
<<
buffer
;
str
.append(
buffer
);
}
syscall(__NR_close,fd);
return
str
;
}
std::string FileUtils::getFileText(char
*
path,
int
BuffSize) {
char
buffer
[BuffSize];
memset(
buffer
,
0
, BuffSize);
std::string
str
;
/
/
int
fd
=
open
(path, O_RDONLY);
long
fd
=
syscall(__NR_open, path, O_RDONLY);
/
/
失败
-
1
;成功:>
0
读出的字节数
=
0
文件读完了
while
(syscall(__NR_read,fd,
buffer
,
1
) !
=
0
) {
/
/
LOG(ERROR) <<
"读取文件内容 "
<<
buffer
;
str
.append(
buffer
);
}
syscall(__NR_close,fd);
return
str
;
}
std::string FileUtils::getRawFileText(char
*
path,
int
BuffSize) {
char
buffer
[BuffSize];
memset(
buffer
,
0
, BuffSize);
std::string
str
;
/
/
int
fd
=
open
(path, O_RDONLY);
long
fd
=
raw_syscall(__NR_open, path, O_RDONLY);
/
/
失败
-
1
;成功:>
0
读出的字节数
=
0
文件读完了
while
(read(fd,
buffer
,
1
) !
=
0
) {
/
/
LOG(ERROR) <<
"读取文件内容 "
<<
buffer
;
str
.append(
buffer
);
}
syscall(__NR_close,fd);
return
str
;
}
std::string FileUtils::getRawFileText(char
*
path,
int
BuffSize) {
char
buffer
[BuffSize];
memset(
buffer
,
0
, BuffSize);
std::string
str
;
/
/
int
fd
=
open
(path, O_RDONLY);
long
fd
=
raw_syscall(__NR_open, path, O_RDONLY);
/
/
失败
-
1
;成功:>
0
读出的字节数
=
0
文件读完了
while
(read(fd,
buffer
,
1
) !
=
0
) {
/
/
LOG(ERROR) <<
"读取文件内容 "
<<
buffer
;
str
.append(
buffer
);
}
syscall(__NR_close,fd);
return
str
;
}
.text
.
global
raw_syscall
.
type
raw_syscall,
%
function
raw_syscall:
MOV R12, SP
STMFD SP!, {R4
-
R7}
MOV R7, R0
MOV R0, R1
MOV R1, R2
MOV R2, R3
LDMIA R12, {R3
-
R6}
SVC
0
LDMFD SP!, {R4
-
R7}
mov pc, lr
.text
.
global
raw_syscall
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2020-12-25 23:05
被珍惜Any编辑
,原因: 格式修改