<!-- @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)相关推荐

  1. Android培训班(62)dex文件格式3

    SHA-1签名字段    从dex文件头里,已经看到前面有一个4字节的字段检验码了,那为什么又需要一个SHA-1签名字段呢? 这不是重复了吗?起初始看来,好像是有点重复,可是仔细考虑一下,这样设计,还 ...

  2. Android培训班(12)

    #059 #060      get_hardware_name(); 这段代码是获取当前android系统运行的硬件信息,比如硬件的CPU名称.主要从/proc/cpuinfo里读到相关的信息. # ...

  3. Android培训班 4

    要想Android运行起来,不但要编译内核正确,还需要有正确地安装根文件系统,才可以运行起来.第一步,就是从模拟器里提取data目录的数据.也许你会问,为什么要从模拟器里提取呢?因为这样做是最方便的, ...

  4. Android培训班(45)

    <!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } A:link { so-language: zxx } --> 帧布局(Fra ...

  5. Android培训班(44)

    <!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } --> layout-land和layout-port目录主要用来保存应用程序 ...

  6. Android培训班(1)

    Android是基于Linux内核的软件平台和操作系统,是Google在2007年11月5日公布的手机操作系统平台,早期由Google开发,后期由开放手机联盟(Open Handset Allianc ...

  7. android培训班 多少钱,Android培训班(42) --Make

    Android.mk文件是用来向编译系统描述项目组织和编译方式,实际上是GNUmake文件的一小片段,它会被编译系统解析一次或多次. 这个文件内容如下: LOCAL_PATH := $(call my ...

  8. Android培训班(42)

    <!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } --> Android.mk文件是用来向编译系统描述项目组织和编译方式,实际上 ...

  9. Android培训班(48)

    在android的计算器应用程序里,源程序主要放在目录src目录下面,然后在这个目录根据包的名称进行子目录排列,由于这个程序在XML里包名称如下: package="com.android. ...

最新文章

  1. python中类方法与实例方法的区别-Python中的对象,方法,类,实例,函数用法分析...
  2. 在线生成 CSS3 的工具
  3. 1分钟完美安装最新 CentOS + Nginx + PHP-FPM + MySQL
  4. termux添加php镜像,termux | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror...
  5. oracle instead of update触发器,oracle INSTEAD OF 触发器
  6. OpenCV-计算二维矢量幅值cv::magnitude
  7. Bailian4084 拓扑排序【拓扑排序】
  8. struts2 标签单选框_Struts 2 UI标签–表单,复选框,单选,选择,提交
  9. .NET在后置代码中输入JS提示语句(背景不会变白)
  10. Java可以开发什么项目?
  11. 服装:鲜嫩小衫 缔造甜美新时尚
  12. 在IntelliJ IDEA中使用 JAVAFX 过程记录
  13. 关于Chrome的谷歌翻译和IDEA中的Translation翻译插件无法使用的解决方法
  14. 网站死链接检测查询工具
  15. PHP使用AES加密和解密
  16. 【点宽专栏】研报复现——跨期价差分析与跨期套利研究
  17. filling the g ap s: multivariate time series imputation by graph neural networks
  18. 【数据可视化】数据之美---揭密优雅的数据解决方案背后的故事
  19. ## 错误:ora-01922 解决方案
  20. SWE_Browser编译

热门文章

  1. UGO是啥,俺告诉你
  2. 一百多种民间土方(转帖)
  3. Python+Vue计算机毕业设计电信CRM系统的设计与实现3z7u5(源码+程序+LW+部署)
  4. 时间线展示工具Timeline
  5. 连续邮资问题的回溯法解决办法
  6. C++ istringstream、ostringstream、strstream
  7. MATLAB中find函数详解
  8. 利用python+selenium带上cookies自动登录bilibili
  9. c++小游戏1.2版本2021/4/3
  10. 诺基亚安卓手机_诺粉 | 诺基亚手机可升级安卓 11 机型列表曝光