Windows Ring3层注入——修改PE输入表(导入表)注入(一)

  • PE文件简单介绍
  • PE文件相关名词解释
    • PE文件磁盘与内存映像结构图
  • 输入表介绍
    • 输入表结构
  • 输入表注入原理
  • PE输入表注入的两种方法
    • 静态修改PE文件法:
    • 进程创建期修改PE输入表法:
  • 输入表注入核心代码示例

PE文件简单介绍

PE(Portable Execute)文件是Windows下可执行文件的总称,常见的有DLL,EXE,OCX,SYS等,事实上,一个文件是否是PE文件与其扩展名无关,PE文件可以是任何扩展名
PE文件的结构一般来说如下图所示:从起始位置开始依次是DOS头,PE文件头,块表(节表)以及具体的块(节)

在这里插入图片描述

PE文件相关名词解释

  • 虚拟空间:PE文件被系统加载器映射到内存中,每个程序都有自己的虚拟空间。
  • 虚拟地址(VA):虚拟空间的内存地址
  • 相对虚拟地址(RVA):内存中相对于PE文件载入地址的偏移相对地址(也称偏移量)。
  • 模块(Module):PE文件映射到内存中的版本被称为模块(Module)。(GetModuleHandle)
  • 模块句柄:映射文件的起始地址
  • 基地址(ImageBase):初始内存起始地址,跟模块句柄一样(Windows CE不成立)。
  • 区块间隙:PE文件头中,FileAlignment定义了磁盘区块对齐值。每一个区块从对齐值的倍数的偏移位置开始,而区块的实际代码或数据的大小不一定刚好是这么多,所以不足的地方一般以00h来填充,就会出现区块间隙。(PE文件的典型对齐值为200h)。
  • 内存对齐:PE文件头中,SectionAlignment定义了内存中区块的对齐值。当PE文件被映射到内存中,区块总是从一个页边界处开始。(x86内存页4KB(1000h)排列,x64内存页8KB(2000h)排列)。

File Offset=RVA-△k
File Offset=VA-ImageBase-△k

PE文件磁盘与内存映像结构图

在这里插入图片描述
更多PE文件的介绍可以参照《加密与解密》第11章节。

输入表介绍

输入是可执行程序(EXE)被加载到地址空间后,使用来自于其他 Dll 的代码或数据的动作。
输入表Windows PE文件中的一组数据结构,输入表RVA在上图PE文件结构的PE文件头中的数据目录表中。
输入表就相当于 EXE文件DLL文件 沟通的钥匙,形象的可以比喻成两个城市之间交流的高速公路,所有的导入函数信息都会写入输入表中,在 PE 文件映射到内存后,Windows 将相应的 DLL文件装入,EXE 文件通过**“输入表”找到相应的 DLL 中的导入函数**,从而完成程序的正常运行,这一动态连接的过程都是由**“输入表”**参与的。

输入表结构

输入表是以一个IMAGE_IMPORT_DESCRIPTOR(IID) 数组 开始的,每一个被PE文件隐式的 链接进来的DLL 都有一个 IIDIID数组的最后一个单元用NULL表示。

typedef struct _IMAGE_IMPORT_DESCRIPTOR 
{  _ANONYMOUS_UNION union {            DWORD Characteristics;           //DWORD OriginalFirstThunk;        //指向输入名称表(INT)的RVA(相对虚拟地址),INT是一个IMAGE_THUNCK_DATA结构的数组,数组中的每个元素指向一个IMAGE_IMPORT_BY_NAME结构,INT以元素0结束。} DUMMYUNIONNAME;  DWORD TimeDateStamp;                 //   时间戳,可以忽略DWORD ForwarderChain;                //   如果没有向前引用(Forwarders)的话就是-1DWORD Name;                          //   被导入DLL的名字指针,是一个RVADWORD FirstThunk;                    //   指向输入地址表(IAT)的RVA。IAT是一个IMAGE_THUNK_DATA结构的数组
} IMAGE_IMPORT_DESCRIPTOR,*PIMAGE_IMPORT_DESCRIPTOR; 
  • IMAGE_THUNK_DATA 结构:
typedef struct _IMAGE_THUNK_DATA32 
{  union {  DWORD ForwarderString;  //指向一个转向者字符串的RVA;DWORD Function;         //被输入的函数的内存地址DWORD Ordinal;          //被输入的API的序数值DWORD AddressOfData;    //指向IMAGE_IMPORT_BY_NAME} u1;  
} IMAGE_THUNK_DATA32,*PIMAGE_THUNK_DATA32;
  • MAGE_IMPORT_BY_NAME结构:
struct _IMAGE_IMPORT_BY_NAME {WORD    Hint;             //   指出函数在所在的dll的输出表中的序号 BYTE    Name[1];          //   指出要输入的函数的函数名
} IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;
  • 要两个 IMAGE_THUNK_DATA 数组的原因:
    当程序加载时,IAT 会被PE加载器重写,PE加载器先搜索 INT ,PE加载器迭代搜索 INT数组 中的每个指针,找出 INT 所指向的 IMAGE_IMPORT_BY_NAME 结构中的函数在内存中的真正的地址,并把它替代原来 IAT 中的值。当完成后, INT 就没有用了,程序只需要 IAT 就可以正常运行了。看下面图:

这个是 可执行程序在磁盘中 的时候:
在这里插入图片描述
这个是 当程序被加载 的时候:
在这里插入图片描述

输入表注入原理

首先让我们换一个角度观察一下模块的导入关系。假设有一个可执行程序A.exe,运行之后,其进程空间模块有hid.dll、msvcrt.dll、advapi32.dll,技术模块有ntdll.dll、kernel32.dll,代表其他模块的是other.dll,他们的导入关系如图所示:
在这里插入图片描述

  • 因为一个进程空间对于同一个dll模块只需要加载一个,所以简化一下模块的导入依赖关系可以看到如图所示。

简化后的模块导入依赖关系图看上去比较清晰和简洁,很像一棵树,树枝代表上面输入表逻辑结构中的IMAGE_IMPORT_DESCRIPTIOR结构。Windows的PE加载器就是根据这种依赖关系来加载模块的。
注入是为了让自己的模块可以加载到目标进程空间中,所以根据上述原理,我们可不可以在上面的导入关系中添加一个是我们自己模块的节点,就可以完成注入。
一般情况,输入表的加载都是通过修改进程输入依赖树上某个模块的输入表来实现的(树上增加节点),这个修改动作是在进程加载该模块之前完成的(即修改模块文件的输入表)。等到待注入模块被加载到进程控件后,就可以将被修改的模块文件改回来,防止文件修改操作被发现。

输入表加载的原理就是在原有的IMAGE_IMPORT_DESCRIPTION(IDD)数组中增加一条IID记录,所以我们必须考虑原来存放IID的位置是否有空间容纳这个新的IID。为了避免这种意外发生,有两种方法可以采用:
一是在
所有的节中寻找一块能容纳心IID数组的文件空隙

二是新增一个足够大的节来专门存放新的IID数组

在这里插入图片描述

PE输入表注入的两种方法

静态修改PE文件法:

  • 1.备份原IID结构
  • 2.在原IID区域构造新的OriginalFirstThunk、Name和FirstThunk结构
  • 3.填充新输入表项的IID结构
  • 4.修正PE文件头的信息

进程创建期修改PE输入表法:

  • 1.以挂起方式创建目标进程
  • 2.获取目标进程中的PE结构信息
  • 3.获取原IID大小,增加一项,搜索可用的节空隙
  • 4.构造心的IID及其相关的OriginalFirstThunk、Name和FirstThunk结构
  • 5.修正PE映像头
  • 6.更新目标进程的内存。
  • 7.继续运行主线程

输入表注入核心代码示例

根据上述原理介绍,对代码的流程可以如此梳理:
1.写一个我们自己的输入表IID结构
1.新增一个节(块section)来保存旧的输入表IID结构数组和我们新加的输入表IID结构
2.因为新加了节,我们就需要增加一个节表指向我们新加的节
3.因为新加了节和节表就需要更改PE文件头的信息

//新增输入表
BOOL AddNewImportDescriptor(const char * szPEFilePath,char * szInjectDllName, char *szImportFuncName)
//新增节(块)
BOOL AddNewSection(LPCTSTR lpStrModulePath, DWORD dwNewSectionSize)BOOL AddNewImportDescriptor(const char * szPEFilePath,char * szInjectDllName, char *szImportFuncName)
{BOOL bSuccess = FALSE;LPVOID lpMemModule = NULL;LPBYTE lpData = NULL;DWORD  dwNewSecFileSize, dwNewSecMemSize;HANDLE hFile = INVALID_HANDLE_VALUE, hFileMapping = INVALID_HANDLE_VALUE;PIMAGE_NT_HEADERS pNtHeader = NULL;PIMAGE_IMPORT_DESCRIPTOR pstImportTable = NULL;PIMAGE_SECTION_HEADER    pstSectionHeader = NULL;__try{//pe文件映射到内存hFile = CreateFile(szPEFilePath,GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);if ( INVALID_HANDLE_VALUE == hFile ){OutputDebugString("[-] AddNewImportDescriptor CreateFile fail!\n");goto _EXIT_;}DWORD dwFileSize = GetFileSize(hFile, NULL);hFileMapping = CreateFileMapping(hFile, NULL, PAGE_READWRITE/* | SEC_IMAGE*/, 0, dwFileSize, "WINSUN_MAPPING_FILE");if ( NULL == hFileMapping ){OutputDebugString("[-] AddNewImportDescriptor CreateFileMapping fail!\n");goto _EXIT_;}lpMemModule = MapViewOfFile(hFileMapping, FILE_MAP_ALL_ACCESS, 0, 0, dwFileSize);if ( NULL == lpMemModule ){OutputDebugString("[-] AddNewImportDescriptor MapViewOfFile fail!\n");goto _EXIT_;}lpData = (LPBYTE)lpMemModule;//判断是否是PEif (((PIMAGE_DOS_HEADER)lpData)->e_magic != IMAGE_DOS_SIGNATURE ){OutputDebugString("[-] AddNewImportDescriptor PE Header MZ error!\n");goto _EXIT_;}pNtHeader = (PIMAGE_NT_HEADERS)(lpData + ((PIMAGE_DOS_HEADER)(lpData))->e_lfanew);if ( pNtHeader->Signature != IMAGE_NT_SIGNATURE ){OutputDebugString("[-] AddNewImportDescriptor PE Header PE error!\n");goto _EXIT_;}pstImportTable = (PIMAGE_IMPORT_DESCRIPTOR)(lpData + RVA2Offset(pNtHeader,pNtHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress));BOOL bBoundImport = FALSE;if (pstImportTable->Characteristics == 0 && pstImportTable->FirstThunk != 0){bBoundImport = TRUE;pNtHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].Size = 0;pNtHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].VirtualAddress = 0;}pstSectionHeader = (PIMAGE_SECTION_HEADER)(pNtHeader+1)+pNtHeader->FileHeader.NumberOfSections-1;PBYTE pbNewSection = pstSectionHeader->PointerToRawData + lpData;int i = 0;while(pstImportTable->FirstThunk != 0){memcpy(pbNewSection, pstImportTable, sizeof(IMAGE_IMPORT_DESCRIPTOR));pstImportTable++;pbNewSection += sizeof(IMAGE_IMPORT_DESCRIPTOR);i++;}memcpy(pbNewSection, (pbNewSection-sizeof(IMAGE_IMPORT_DESCRIPTOR)), sizeof(IMAGE_IMPORT_DESCRIPTOR));DWORD dwDelt = pstSectionHeader->VirtualAddress - pstSectionHeader->PointerToRawData;//avoid import not need tablePIMAGE_THUNK_DATA pImgThunkData = (PIMAGE_THUNK_DATA)(pbNewSection + sizeof(IMAGE_IMPORT_DESCRIPTOR)*2);//import dll namePBYTE pszDllNamePosition = (PBYTE)(pImgThunkData + 2);memcpy(pszDllNamePosition, szInjectDllName, strlen(szInjectDllName));pszDllNamePosition[strlen(szInjectDllName)] = 0;//确定IMAGE_IMPORT_BY_NAM的位置PIMAGE_IMPORT_BY_NAME pImgImportByName = (PIMAGE_IMPORT_BY_NAME)(pszDllNamePosition + strlen(szInjectDllName) + 1);//init IMAGE_THUNK_DATApImgThunkData->u1.Ordinal = dwDelt + (DWORD)pImgImportByName - (DWORD)lpData ;//init IMAGE_IMPORT_BY_NAMEpImgImportByName->Hint = 1;memcpy(pImgImportByName->Name, szImportFuncName, strlen(szImportFuncName)); //== dwDelt + (DWORD)pszFuncNamePosition - (DWORD)lpData ;pImgImportByName->Name[strlen(szImportFuncName)] = 0;//init OriginalFirstThunkif (bBoundImport){((PIMAGE_IMPORT_DESCRIPTOR)pbNewSection)->OriginalFirstThunk = 0;}else((PIMAGE_IMPORT_DESCRIPTOR)pbNewSection)->OriginalFirstThunk = dwDelt + (DWORD)pImgThunkData - (DWORD)lpData;//init FirstThunk((PIMAGE_IMPORT_DESCRIPTOR)pbNewSection)->FirstThunk = dwDelt + (DWORD)pImgThunkData - (DWORD)lpData;//init Name((PIMAGE_IMPORT_DESCRIPTOR)pbNewSection)->Name = dwDelt + (DWORD)pszDllNamePosition-(DWORD)lpData;//改变导入表指向顺序pNtHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress =  pstSectionHeader->VirtualAddress; pNtHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size			 =  (i+1)*sizeof(IMAGE_IMPORT_DESCRIPTOR);}__except(EXCEPTION_EXECUTE_HANDLER){OutputDebugString("[-] AddNewImportDescriptor  Exception!\n");return false;}_EXIT_:if ( hFile ){CloseHandle(hFile);}if ( lpMemModule){UnmapViewOfFile(lpMemModule);}if ( hFileMapping ){CloseHandle(hFileMapping);}return true;
}BOOL AddNewSection(LPCTSTR lpStrModulePath, DWORD dwNewSectionSize)
{bool   bSuccess = false;LPVOID lpMemModule = NULL;LPBYTE lpData = NULL;DWORD  dwNewSecFileSize, dwNewSecMemSize;HANDLE hFile = INVALID_HANDLE_VALUE, hFileMapping = INVALID_HANDLE_VALUE;PIMAGE_NT_HEADERS pNtHeader = NULL;PIMAGE_SECTION_HEADER pNewSection = NULL, pLastSection = NULL;OutputDebugString("[!] AddNewSection Enter!\n");//TODO:可能还涉及关闭windows文件保护__try{//pe文件映射到内存hFile = CreateFile(lpStrModulePath,GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);if ( INVALID_HANDLE_VALUE == hFile ){OutputDebugString("[-] AddNewSection CreateFile fail!\n");goto _EXIT_;}DWORD dwFileSize = GetFileSize(hFile, NULL);hFileMapping = CreateFileMapping(hFile, NULL, PAGE_READWRITE/* | SEC_IMAGE*/, 0, dwFileSize, "WINSUN_MAPPING_FILE");if ( NULL == hFileMapping ){OutputDebugString("[-] AddNewSection CreateFileMapping fail!\n");goto _EXIT_;}lpMemModule = MapViewOfFile(hFileMapping, FILE_MAP_ALL_ACCESS, 0, 0, dwFileSize);if ( NULL == lpMemModule ){OutputDebugString("[-] AddNewSection MapViewOfFile fail!\n");goto _EXIT_;}lpData = (LPBYTE)lpMemModule;//判断是否是PE文件if (((PIMAGE_DOS_HEADER)lpData)->e_magic != IMAGE_DOS_SIGNATURE ){OutputDebugString("[-] AddNewSection PE Header MZ error!\n");goto _EXIT_;}pNtHeader = (PIMAGE_NT_HEADERS)(lpData + ((PIMAGE_DOS_HEADER)(lpData))->e_lfanew);if ( pNtHeader->Signature != IMAGE_NT_SIGNATURE ){OutputDebugString("[-] AddNewSection PE Header PE error!\n");goto _EXIT_;}//判断是否可以增加一个新节if ( ((pNtHeader->FileHeader.NumberOfSections + 1) * sizeof(IMAGE_SECTION_HEADER)) > (pNtHeader->OptionalHeader.SizeOfHeaders) ){OutputDebugString("[-] AddNewSection cannot add a new section!\n");goto _EXIT_;}pNewSection  = (PIMAGE_SECTION_HEADER)(pNtHeader+1) + pNtHeader->FileHeader.NumberOfSections;pLastSection = pNewSection - 1;DWORD rsize,vsize,roffset,voffset;//对齐偏移和RVArsize=PEAlign(dwNewSectionSize,pNtHeader->OptionalHeader.FileAlignment);roffset=PEAlign(pLastSection->PointerToRawData+pLastSection->SizeOfRawData,pNtHeader->OptionalHeader.FileAlignment);vsize=PEAlign(dwNewSectionSize,pNtHeader->OptionalHeader.SectionAlignment);voffset=PEAlign(pLastSection->VirtualAddress+pLastSection->Misc.VirtualSize,pNtHeader->OptionalHeader.SectionAlignment);//填充新节表memcpy(pNewSection->Name, "WINSUN", strlen("WINSUN"));pNewSection->VirtualAddress = voffset;pNewSection->PointerToRawData = roffset;pNewSection->Misc.VirtualSize = vsize;pNewSection->SizeOfRawData = rsize;pNewSection->Characteristics = IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE;//修改IMAGE_NT_HEADERS,增加新节表pNtHeader->FileHeader.NumberOfSections++;pNtHeader->OptionalHeader.SizeOfImage += vsize;pNtHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].Size = 0;pNtHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].VirtualAddress = 0;//增加新节到文件尾部DWORD dwWriteBytes;SetFilePointer(hFile,0,0,FILE_END);PBYTE pbNewSectionContent = new BYTE[rsize];ZeroMemory(pbNewSectionContent, rsize);bSuccess = WriteFile(hFile, pbNewSectionContent, rsize, &dwWriteBytes, NULL);if (!bSuccess){MessageBox(NULL,"新增节失败","error",MB_OK);goto _EXIT_;}}__except(EXCEPTION_EXECUTE_HANDLER){OutputDebugString("[-] AddImportTableItem  Exception!\n");return false;}OutputDebugString("[!] AddNewSection Exit!\n");bSuccess = true;
_EXIT_:if ( hFile ){CloseHandle(hFile);}if ( lpMemModule){UnmapViewOfFile(lpMemModule);}if ( hFileMapping ){CloseHandle(hFileMapping);}return true;
}
查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. webpack-开发-使用 source map

    1.环境准备和命令npm init -y npm install --save-dev webpack npm install --save-dev webpack-cli npm install --save lodash npm install --save-dev html-webpack-plugin npm install clean-webpack-plugin --save-dev npm run build2.目录3.代码文件 dist/index.html(这个…...

    2024/4/17 0:07:21
  2. 百度地图添加自定义覆盖物和气泡

    覆盖物百度有专门的API,使用MarkerOptionsMarkerOptions markerOptionsA = new MarkerOptions().position(latLng).yOffset(30).icon(bitmapA).draggable(true);mMarker = (Marker) mBaiduMap.addOverlay(markerOptionsA);// 此方法为给marker添加一个id,用来区分是点击的哪个m…...

    2024/3/29 12:42:42
  3. 接口和抽象类

    基于面向对象四大特性:抽象、封装、继承、多肽而言,定义类的过程就是抽象和封装的过程,而接口与抽象类则是对实体类进行更高层次的抽象,仅定义类的公共行为和特征。接口和抽象类的共同点是都不能被实例化,但可以定义引用变量指向实例对象。 由于java是单继承,因此抽象类在…...

    2024/3/29 12:42:41
  4. Qt Creator 中文乱码问题

    一、 Qt 4 乱码问题 解决方案1. 在Qt 中 快捷菜单选项功能中Edit(编辑) --> Select Encoding...(选择编码)选择载入(显示)编码和储存编码,要解决中文乱码问题,选择 GB2312和UTF-8常用编码方式 就可以 2.在 Qt 快捷菜单选项中依次选择Tools --> Options --> Tex…...

    2024/4/8 17:54:43
  5. WEB测试与APP测试的区别

    WEB测试与APP测试的区别 web测试包含什么 1,功能,业务流程 2,UI,界面风格\大小\字体\页面展示等 3,兼容,常用浏览器IE\谷歌\火狐,win系列,linux 4,网络,wifi环境 5,性能,监测响应时间\CPU等 6,接口,一般开发人员自测 APP测试包含什么 区别于web测试的是,在其基础…...

    2024/3/29 12:42:39
  6. Windows Ring3层注入——远程线程注入(二)

    Windows Ring3层注入——远程线程注入(二)远程线程注入原理远线程注入函数原型及步骤可使用远程线程注入原因:远程线程注入代码示例远程线程注入的优缺点优点:缺点:在Windows操作系统中,各个进程相对独立,一个进程不能轻易地控制其他进程中的线程。从根本上来说,远程线…...

    2024/3/29 12:42:38
  7. Zookeeper安装文档

    1.下载Zookeeper安装包 https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.10/ 2.zookeeper集群规划 主机名称 IP 部署软件 node01 192.168.183.100 zookeeper node02 192.168.183.101 zookeeper node03 192.168.183.102 zookeeper 一共部署三台机器,每台…...

    2024/3/29 12:42:37
  8. Flask 快速上手文档4

    Cookies要访问 cookies ,可以使用 cookies 属性。可以使用响应 对象 的 set_cookie 方法来设置 cookies 。请求对象的 cookies 属性是一个包含了客户端传输的所有 cookies 的字典。在 Flask 中,如果使用 会话 ,那么就不要直接使用 cookies ,因为 会话 比较安全一些。读取 c…...

    2024/3/29 7:42:35
  9. 字符串串池的好处

    面试题:说下你理解的字符串串池的好处,SUN公司为什么设计字符串串池。 String s = “abc”;字符串为什么要少做拼接? 串池的特征: 内部的对象不可变。没有重复对象。字符串类型的变量,直接赋值,在使用串池的对象。串池中如果不存在,则创建对象,存在则直接引用。 串池的…...

    2024/3/29 7:42:36
  10. Mac 如何在文件夹中打开终端

    第一步:访达服务偏好设置第二步:勾选第三步:选中文件夹,右键如图即打开基于改文件夹下的终端窗口:g...

    2024/3/28 21:15:58
  11. git删除远程仓库的文件或文件夹

    dir // 查询跟目录的所有文件和文件夹 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200116165339148.png dir mock // 查询test文件夹下的所有文件和文件夹 git rm -r --cached mock /a.txt // 删除test文件夹下的a.txt文件,加入到删除缓存中 git commit -m ‘删除m…...

    2024/3/29 7:42:32
  12. Windows Ring3层注入——CreateProcess劫持进程创建注入(三)

    Windows Ring3层注入——CreateProcess劫持进程创建注入(三)CreateProcess劫持进程创建注入原理劫持进程创建注入好处CreateProcess劫持进程创建注入函数原型CreateProcess函数原型CreateProcess劫持进程创建注入步骤CreateProcess劫持进程代码示例 CreateProcess劫持进程创建…...

    2024/3/29 12:42:38
  13. 线程池的实现原理

    为什么要使用线程池? 1、降低资源消耗,创建和销毁线程很损耗资源 2、提高响应速度,线程不用创建就能立即执行 3、提高线程的可管理性,可以同一分配、调优和监控线程 java中创建线程池代码演示 public class App{public static void main(String[] args) throws Exception{E…...

    2024/3/29 12:42:35
  14. session,进程组和进程之间的关系

    现在我们从Session和进程组的角度重新来看登录和执行命令的过程。getty或telnetd进程在打开终端设备之前调用setsid函数创建一个新的Session,该进程称为Session Leader,该进程的id也可以看作Session的id,然后该进程打开终端设备作为这个Session中所有进程的控制终端。在创建…...

    2024/3/29 12:42:34
  15. MyBatis的xml中SQL处理小于号与大于号

    这种问题在xml在SQL语句中的where约束中直接写>或<号是会报错 ,这就要求我们来进行特殊处理。 其实很简单,我们只需作如下转义替换即可避免上述的错误:。 < <= > >= &"<<=>>=&amp;&apos;&quot;例如常见的时间比较: 错…...

    2024/3/29 12:42:33
  16. Android Studio Intellij idea使用 gradle 同步失败解决方法

    国内链接google、jcenter的maven仓库,会经常失败,这样解决的问题就是使用阿里云的代理.将gradle的配置文件做如下改动,就可以编译成功了.// Top-level build file where you can add configuration options common to all sub-projects/modules.buildscript {ext.kotlin_versio…...

    2024/4/11 5:24:58
  17. 输入考试分数,判断等级

    #include <iostream> using namespace std; int main() {int n;cout<<"你考了多少分?";cin>>n; cout<<"你的等级是:"; if(n>=90&&n<=100)cout<<"优";else if(n>=80&&n<90)cout<…...

    2024/3/29 12:42:31
  18. 20200110一家面试题

    1、如何对插入mysql数据的原数据进行加密,写出加密函数?加密:INSERT INTO t_pass_info(id,pass_info) VALUES (1,ENCODE(‘dong’,‘bb’)); 解密:SELECT DECODE(ENCODE(‘dong’,‘aa’),‘aa’);2、有数组a[n],用java代码将数组元素顺序颠倒 public static void main(Str…...

    2024/3/29 12:42:30
  19. windows API-1

    Windows API函数大全,从事软件开发的朋友可以参考下 1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一个网络资源的连接 WNetAddConnection3 创建同一个网络资源的连接 WNetCancelConnection 结束一个网络连接 WNetCance…...

    2024/3/29 12:42:29
  20. python爬虫,使用xpath解析器、BeautifulSoup解析器、pyquery css解析器抽取结构化数据,使用正则表达式抽取非结构化数据

    python爬虫,使用xpath解析器、BeautifulSoup解析器、pyquery css解析器抽取结构化数据,使用正则表达式抽取非结构化数据 测试文本:test.html <div class="right-content"> <ul class="news-1" data-sudaclick="news_p"> <li&g…...

    2024/3/29 12:42:28

最新文章

  1. Pytest精通指南(22)钩子函数-重复执行(pytest-repeat)

    文章目录 前言应用场景插件安装参数分析使用方式一&#xff1a;命令行使用方式二&#xff1a;配置文件使用方式三&#xff1a;装饰器 前言 pytest框架中的**重复测试&#xff08;pytest-repeat&#xff09;**插件的用途是允许在运行测试用例时进行多次循环&#xff0c;以更全面…...

    2024/4/20 17:13:25
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. PHP:获取时间戳,时间,以及相关转换

    一、获取当前时间戳 // 获取当前时间的时间戳&#xff08;秒级&#xff0c;11位&#xff09; $currentTimestampInSeconds time(); 二、秒级&#xff08;11位&#xff09;时间戳转换为毫秒级&#xff08;13位&#xff09;时间戳 乘以1000即可 // 转换为毫秒时间戳&#xf…...

    2024/4/12 13:34:45
  4. Vue ts 如何给 props 中的变量指定特定类型,比如 Interface 类的

    Vue ts 如何给 props 中的变量指定特定类型&#xff0c;比如 Interface 类的 我有一个这样的变量值类型 一、在没用 ts 之前的 props 类型指定方式 我们都知道之前在没用 ts 之前的 props 变量值类型指定方式&#xff1a; 如下图&#xff0c;billFood 定义方式是这样的&…...

    2024/4/18 16:27:07
  5. 吴恩达深度学习笔记:浅层神经网络(Shallow neural networks)3.6-3.8

    目录 第一门课&#xff1a;神经网络和深度学习 (Neural Networks and Deep Learning)第三周&#xff1a;浅层神经网络(Shallow neural networks)3.6 激活函数&#xff08;Activation functions&#xff09;3.7 为什么需要非线性激活函数&#xff1f;&#xff08;why need a non…...

    2024/4/20 16:13:42
  6. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/19 14:24:02
  7. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/19 18:20:22
  8. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/19 11:57:31
  9. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/19 11:57:31
  10. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/19 11:57:52
  11. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/19 11:57:53
  12. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/19 11:58:14
  13. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/19 11:58:20
  14. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/20 7:40:48
  15. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/19 11:58:39
  16. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/19 11:58:51
  17. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/20 3:12:02
  18. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/19 11:59:15
  19. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/19 11:59:23
  20. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/19 11:59:44
  21. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/19 11:59:48
  22. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/19 12:00:06
  23. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/19 16:57:22
  24. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/19 12:00:25
  25. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/19 12:00:40
  26. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  27. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  28. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  29. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  30. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  31. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  32. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  33. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  34. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  35. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  36. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  37. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  38. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  39. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  40. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  41. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  42. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  43. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  44. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  45. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57