Android培训班(40)
<!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } -->
在init.rc文件里,可以看到加载下面的服务:
service keystore /system/bin/keystore /data/misc/keystore
user keystore
group keystore
socket keystore stream 666
keystore服务的代码在目录:
Android-2.0/frameworks/base/cmds/keystore
keystore服务是加解密储存键值的服务。它主要作用就是验证应用程序与签名文件是否一致。
它的主要入口函数代码如下:
int main(int argc, char **argv)
{
获取加密服务的SOCKET。
int control_socket = android_get_control_socket("keystore");
if (argc < 2) {
LOGE("A directory must be specified!");
return 1;
}
if (chdir(argv[1]) == -1) {
LOGE("chdir: %s: %s", argv[1], strerror(errno));
return 1;
}
if ((the_entropy = open(RANDOM_DEVICE, O_RDONLY)) == -1) {
LOGE("open: %s: %s", RANDOM_DEVICE, strerror(errno));
return 1;
}
监听这个服务。
if (listen(control_socket, 3) == -1) {
LOGE("listen: %s", strerror(errno));
return 1;
}
signal(SIGPIPE, SIG_IGN);
if (access(MASTER_KEY_FILE, R_OK) == 0) {
state = LOCKED;
}
接收到连接。
while ((the_socket = accept(control_socket, NULL, 0)) != -1) {
struct timeval tv = {.tv_sec = 3};
struct ucred cred;
socklen_t size = sizeof(cred);
int8_t request;
setsockopt(the_socket, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));
setsockopt(the_socket, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(tv));
if (getsockopt(the_socket, SOL_SOCKET, SO_PEERCRED, &cred, &size)) {
LOGW("getsockopt: %s", strerror(errno));
} else if (recv_code(&request)) {
接收到请求后,就开始进行加密验证处理。
int8_t old_state = state;
int8_t response;
uid = cred.uid;
if ((response = process(request)) > 0) {
send_code(response);
response = -response;
}
LOGI("uid: %d action: %c -> %d state: %d -> %d retry: %d",
cred.uid, request, -response, old_state, state, retry);
}
close(the_socket);
}
LOGE("accept: %s", strerror(errno));
return 1;
}
Android培训班(40)相关推荐
- Android培训班(62)dex文件格式3
SHA-1签名字段 从dex文件头里,已经看到前面有一个4字节的字段检验码了,那为什么又需要一个SHA-1签名字段呢? 这不是重复了吗?起初始看来,好像是有点重复,可是仔细考虑一下,这样设计,还 ...
- Android培训班(12)
#059 #060 get_hardware_name(); 这段代码是获取当前android系统运行的硬件信息,比如硬件的CPU名称.主要从/proc/cpuinfo里读到相关的信息. # ...
- Android培训班 4
要想Android运行起来,不但要编译内核正确,还需要有正确地安装根文件系统,才可以运行起来.第一步,就是从模拟器里提取data目录的数据.也许你会问,为什么要从模拟器里提取呢?因为这样做是最方便的, ...
- Android培训班(45)
<!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } A:link { so-language: zxx } --> 帧布局(Fra ...
- Android培训班(44)
<!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } --> layout-land和layout-port目录主要用来保存应用程序 ...
- Android培训班(1)
Android是基于Linux内核的软件平台和操作系统,是Google在2007年11月5日公布的手机操作系统平台,早期由Google开发,后期由开放手机联盟(Open Handset Allianc ...
- android培训班 多少钱,Android培训班(42) --Make
Android.mk文件是用来向编译系统描述项目组织和编译方式,实际上是GNUmake文件的一小片段,它会被编译系统解析一次或多次. 这个文件内容如下: LOCAL_PATH := $(call my ...
- Android培训班(42)
<!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } --> Android.mk文件是用来向编译系统描述项目组织和编译方式,实际上 ...
- Android培训班(48)
在android的计算器应用程序里,源程序主要放在目录src目录下面,然后在这个目录根据包的名称进行子目录排列,由于这个程序在XML里包名称如下: package="com.android. ...
最新文章
- python中类方法与实例方法的区别-Python中的对象,方法,类,实例,函数用法分析...
- 在线生成 CSS3 的工具
- 1分钟完美安装最新 CentOS + Nginx + PHP-FPM + MySQL
- termux添加php镜像,termux | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror...
- oracle instead of update触发器,oracle INSTEAD OF 触发器
- OpenCV-计算二维矢量幅值cv::magnitude
- Bailian4084 拓扑排序【拓扑排序】
- struts2 标签单选框_Struts 2 UI标签–表单,复选框,单选,选择,提交
- .NET在后置代码中输入JS提示语句(背景不会变白)
- Java可以开发什么项目?
- 服装:鲜嫩小衫 缔造甜美新时尚
- 在IntelliJ IDEA中使用 JAVAFX 过程记录
- 关于Chrome的谷歌翻译和IDEA中的Translation翻译插件无法使用的解决方法
- 网站死链接检测查询工具
- PHP使用AES加密和解密
- 【点宽专栏】研报复现——跨期价差分析与跨期套利研究
- filling the g ap s: multivariate time series imputation by graph neural networks
- 【数据可视化】数据之美---揭密优雅的数据解决方案背后的故事
- ## 错误:ora-01922 解决方案
- SWE_Browser编译
热门文章
- UGO是啥,俺告诉你
- 一百多种民间土方(转帖)
- Python+Vue计算机毕业设计电信CRM系统的设计与实现3z7u5(源码+程序+LW+部署)
- 时间线展示工具Timeline
- 连续邮资问题的回溯法解决办法
- C++ istringstream、ostringstream、strstream
- MATLAB中find函数详解
- 利用python+selenium带上cookies自动登录bilibili
- c++小游戏1.2版本2021/4/3
- 诺基亚安卓手机_诺粉 | 诺基亚手机可升级安卓 11 机型列表曝光