当前位置: 首页 > news >正文

【iOS逆向与安全】越狱检测与过检测附ida伪代码

首先在网上查找一些检测代码

放入项目运行,用 ida 打开后 F5 得到下面的

__int64 __usercall sub_10001B3F0@<X0>(__int64 a1, __int64 a2, __int64 a3, __int64 a4, __int64 a5, __int64 a6, __int64 a7, __int64 a8, __int64 a9, __int64 a10, __int64 a11, __int64 a12, ...)
{__int64 v12; // x0__int64 v13; // x21int v14; // w20__int64 v15; // x0__int64 v16; // x21int v17; // w22BOOL v18; // w23BOOL v19; // w24BOOL v20; // w25int v21; // w22char *v22; // x21__int64 v23; // x0__int64 v24; // x20__int64 result; // x0__int64 v26; // x0__int64 v27; // x21__int64 v28; // x0__int64 v29; // x22__int64 v30; // x0__int64 v31; // x20__int64 v32; // x0__int64 v33; // x20const char *v34; // [xsp+1C0h] [xbp+70h]va_list va; // [xsp+1C0h] [xbp+70h]__int64 v36; // [xsp+1C8h] [xbp+78h]__int64 v37; // [xsp+1D0h] [xbp+80h]__int64 v38; // [xsp+1D8h] [xbp+88h]va_list va1; // [xsp+1E0h] [xbp+90h]va_start(va1, a12);va_start(va, a12);v34 = va_arg(va1, const char *);v36 = va_arg(va1, _QWORD);v37 = va_arg(va1, _QWORD);v38 = va_arg(va1, _QWORD);v12 = ((__int64 (__fastcall *)(void *))sub_104BFCC20)(&OBJC_CLASS___NSFileManager);v13 = ((__int64 (__fastcall *)(__int64))objc_retainAutoreleasedReturnValue)(v12);v14 = sub_104C07D60();((void (__fastcall *)(__int64))objc_release)(v13);v15 = ((__int64 (__fastcall *)(void *))sub_104BFCC20)(&OBJC_CLASS___NSFileManager);v16 = ((__int64 (__fastcall *)(__int64))objc_retainAutoreleasedReturnValue)(v15);v17 = sub_104C07D60();((void (__fastcall *)(__int64))objc_release)(v16);v18 = stat("/Library/MobileSubstrate/MobileSubstrate.dylib", (struct stat *)va1) == 0;v19 = stat("/Applications/Cydia.app", (struct stat *)va1) == 0;v20 = stat("/var/lib/cydia/", (struct stat *)va1) == 0;v21 = (stat("/var/cache/apt", (struct stat *)va1) == 0 || v20 || v19 || v18) | v17 | v14;if ( dladdr(&_stat, (Dl_info *)va) )v21 |= strcmp(v34, "/usr/lib/system/libsystem_kernel.dylib") != 0;v22 = getenv("DYLD_INSERT_LIBRARIES");v23 = ((__int64 (__fastcall *)(void *))sub_104C831E0)(&unk_1063357B0);v24 = ((__int64 (__fastcall *)(__int64))objc_retainAutoreleasedReturnValue)(v23);if ( v22 || v21 ){sub_104C65B80();((void (__fastcall *)(__int64))objc_release)(v24);v26 = ((__int64 (__fastcall *)(void *))sub_104C2B780)(&unk_1063457C8);v27 = ((__int64 (__fastcall *)(__int64))objc_retainAutoreleasedReturnValue)(v26);v28 = sub_104C031E0();v29 = ((__int64 (__fastcall *)(__int64))objc_retainAutoreleasedReturnValue)(v28);v30 = ((__int64 (__fastcall *)(void *))sub_104C8B4A0)(&OBJC_CLASS___NSString);v31 = ((__int64 (__fastcall *)(__int64))objc_retainAutoreleasedReturnValue)(v30);((void (__fastcall *)(void *))sub_104C96DA0)(&unk_106361810);((void (__fastcall *)(__int64))objc_release)(v31);((void (__fastcall *)(__int64))objc_release)(v29);((void (__fastcall *)(__int64))objc_release)(v27);v32 = ((__int64 (__fastcall *)(void *))sub_104BDFEA0)(&unk_10633F200);v33 = ((__int64 (__fastcall *)(__int64))objc_retainAutoreleasedReturnValue)(v32);((void (__fastcall *)(void *))sub_104C86300)(&unk_10633F250);result = ((__int64 (__fastcall *)(__int64))objc_release)(v33);}else{sub_104C05A80();((void (__fastcall *)(__int64))objc_release)(v24);result = ((__int64 (__fastcall *)(void *))sub_104BE4C00)(&OBJC_CLASS___UIView);}return result;
}

用 frida hook


frida-trace -UF -i "stat" -f xxx
frida-trace -UF -i "dladdr" -f xxxxlog(Thread.backtrace(this.context, Backtracer.ACCURATE).map(DebugSymbol.fromAddress).join('\n') + '\n');

hook stat

/** Auto-generated by Frida. Please modify to match the signature of stat.* This stub is currently auto-generated from manpages when available.** For full API reference, see: https://frida.re/docs/javascript-api/*/{/*** Called synchronously when about to call stat.** @this {object} - Object allowing you to store state for use in onLeave.* @param {function} log - Call this function with a string to be presented to the user.* @param {array} args - Function arguments represented as an array of NativePointer objects.* For example use args[0].readUtf8String() if the first argument is a pointer to a C string encoded as UTF-8.* It is also possible to modify arguments by assigning a NativePointer object to an element of this array.* @param {object} state - Object allowing you to keep state across function calls.* Only one JavaScript function will execute at a time, so do not worry about race-conditions.* However, do not use this to store function arguments across onEnter/onLeave, but instead* use "this" which is an object for keeping state local to an invocation.*/onEnter(log, args, state) {log(`stat(fildes=${args[0]}, buf=${args[1]})`);log(`stat(fildes=${(args[0].readUtf8String())}]`);this.args0 = args[0]; // 入参this.args2 = args[1]; // 返回值指针},/*** Called synchronously when about to return from stat.** See onEnter for details.** @this {object} - Object allowing you to access state stored in onEnter.* @param {function} log - Call this function with a string to be presented to the user.* @param {NativePointer} retval - Return value represented as a NativePointer object.* @param {object} state - Object allowing you to keep state across function calls.*/onLeave(log, retval, state) {log(`before:=${retval}`);var newstr = this.args0 .readUtf8String();//oldNSStr.toString();if(newstr.search("Cydia")>0
||  newstr.search("MobileSubstrate")>0
||  newstr.search("private---")>0
||  newstr.search("cydia")>0
||  newstr.search("Applications")>0
||  newstr.search("apt")>0){log("=========checkJB=hook===========" );//var str = ObjC.classes.NSString.stringWithString_('{"ret":0,"msg":null,"data":{"c":3,"t":6,"w":60,"fc":1}}');  // 对应的oc语法:NSString *str = [NSString stringWithString:@"hi with!"];//args[2] = str;retval.replace(0xf1)  // 修改返回值 0xfffffffffffffffflog(`before:=${retval}`);log(Thread.backtrace(this.context, Backtracer.ACCURATE).map(DebugSymbol.fromAddress).join('\n') + '\n');}}
}

hook md5

frida-trace -UF -i "CC_MD5" -f xxxxxxx.xxx.xxxx

/** Auto-generated by Frida. Please modify to match the signature of CC_MD5.* This stub is currently auto-generated from manpages when available.** For full API reference, see: https://frida.re/docs/javascript-api/*/{/*** Called synchronously when about to call CC_MD5.** @this {object} - Object allowing you to store state for use in onLeave.* @param {function} log - Call this function with a string to be presented to the user.* @param {array} args - Function arguments represented as an array of NativePointer objects.* For example use args[0].readUtf8String() if the first argument is a pointer to a C string encoded as UTF-8.* It is also possible to modify arguments by assigning a NativePointer object to an element of this array.* @param {object} state - Object allowing you to keep state across function calls.* Only one JavaScript function will execute at a time, so do not worry about race-conditions.* However, do not use this to store function arguments across onEnter/onLeave, but instead* use "this" which is an object for keeping state local to an invocation.*/onEnter(log, args, state) {log('CC_MD5()');this.args0 = args[0]; // 入参this.args2 = args[2]; // 返回值指针},/*** Called synchronously when about to return from CC_MD5.** See onEnter for details.** @this {object} - Object allowing you to access state stored in onEnter.* @param {function} log - Call this function with a string to be presented to the user.* @param {NativePointer} retval - Return value represented as a NativePointer object.* @param {object} state - Object allowing you to keep state across function calls.*/onLeave(log, retval, state) {var ByteArray = Memory.readByteArray(this.args2, 16);var uint8Array = new Uint8Array(ByteArray);var str = "";for(var i = 0; i < uint8Array.length; i++) {var hextemp = (uint8Array[i].toString(16))if(hextemp.length == 1){hextemp = "0" + hextemp}str += hextemp;}log(`CC_MD5(${this.args0.readUtf8String()})`);    // 入参log(`CC_MD5()=${str}=`);  }
}

fishhook

rebind_symbols((struct rebinding[1]){{"stat", my_stat, (void *)&orig_stat}}, 1);rebind_symbols((struct rebinding[1]){{"strcmp", my_strcmp, (void *)&orig_strcmp}}, 1);
//***********************abort********************************
//void     abort(void) __dead2;void abort_hook(void) {
}
static void (*abort_old)(void);//int     stat(const char *, struct stat *) __DARWIN_INODE64(stat);
static int     (*orig_stat)(const char *age1, struct stat * age2) ;
static int my_stat(const char *age1, struct stat *age2){//NSLog(@"[orig_stat =================]");printf("[orig_stat =hook================]\n my_stat  age1=%s ,Cydia=%s\n ",age1,strstr(age1, "Cydia"));int isfind = 0;if(strstr(age1, "Cydia") != NULL){isfind = 1;}else if (strstr(age1, "cydia") != NULL){isfind = 1;}else if (strstr(age1, "MobileSubstrate") != NULL){isfind = 1;}else if (strstr(age1, "Applications") != NULL){isfind = 1;}else if (strstr(age1, "apt") != NULL){isfind = 1;}if(isfind == 1){NSLog(@" ========hook=stat===%s\n ",age1);return 1;//返回不存在}return orig_stat(age1,age2);
}//strcmp
//如果返回值 < 0,则表示 str1 小于 str2。
//如果返回值 > 0,则表示 str2 小于 str1。
//如果返回值 = 0,则表示 str1 等于 str2。
//int     strcmp(const char *__s1, const char *__s2);
static int (*orig_strcmp)(const char *__s1, const char *__s2);
static int my_strcmp(const char *__s1, const char *__s2){if(strstr(__s2, "libsystem_kernel") != NULL){NSLog(@" ========hook=strcmp===%s %s\n ",__s1,__s2);return 0;//返回相等}return orig_strcmp(__s1,__s2);
}

下面是网上找的源码


//这里都是一些越狱后的手机带的一些框架和工具,未越狱的手机是装不上的。
- (void)isOk0 {NSString *cydiaPath = @"/Applications/Cydia.app";NSString *aptPath = @"/private/var/lib/apt/";NSString *applications = @"/User/Applications/";NSString *Mobile = @"/Library/MobileSubstrate/MobileSubstrate.dylib";NSString *bash = @"/bin/bash";NSString *sshd =@"/usr/sbin/sshd";NSString *sd = @"/etc/apt";if ([[NSFileManager defaultManager] fileExistsAtPath:cydiaPath]) {exit(0);}if ([[NSFileManager defaultManager] fileExistsAtPath:aptPath]) {exit(0);}if([[NSFileManager defaultManager] fileExistsAtPath:cydiaPath]) {exit(0);}if([[NSFileManager defaultManager] fileExistsAtPath:aptPath]) {exit(0);}if ([[NSFileManager defaultManager] fileExistsAtPath:applications]){exit(0);}if ([[NSFileManager defaultManager] fileExistsAtPath:Mobile]){exit(0);}if ([[NSFileManager defaultManager] fileExistsAtPath:bash]){exit(0);}if ([[NSFileManager defaultManager] fileExistsAtPath:sshd]){exit(0);}if ([[NSFileManager defaultManager] fileExistsAtPath:sd]){exit(0);}
}

- (void)isOK1 {//可能存在hook了NSFileManager方法,此处用底层C stat去检测// /Library/MobileSubstrate/MobileSubstrate.dylib 最重要的越狱文件,几乎所有的越狱机都会安装MobileSubstrate// /Applications/Cydia.app/ /var/lib/cydia/绝大多数越狱机都会安装struct stat stat_info;if (0 == stat("/Library/MobileSubstrate/MobileSubstrate.dylib", &stat_info)) {exit(0);}if (0 == stat("/Applications/Cydia.app", &stat_info)) {exit(0);}if (0 == stat("/var/lib/cydia/", &stat_info)) {exit(0);}if (0 == stat("/var/cache/apt", &stat_info)) {exit(0);}if (0 == stat("/var/lib/apt", &stat_info)) {exit(0);}if (0 == stat("/etc/apt", &stat_info)) {exit(0);}if (0 == stat("/bin/bash", &stat_info)) {exit(0);}if (0 == stat("/bin/sh", &stat_info)) {exit(0);}if (0 == stat("/usr/sbin/sshd", &stat_info)) {exit(0);}if (0 == stat("/usr/libexec/ssh-keysign", &stat_info)) {exit(0);}if (0 == stat("/etc/ssh/sshd_config", &stat_info)) {exit(0);}
}
//strcmp
//如果返回值 < 0,则表示 str1 小于 str2。
//如果返回值 > 0,则表示 str2 小于 str1。
//如果返回值 = 0,则表示 str1 等于 str2。
- (void)isOK2 {//可能存在stat也被hook了,可以看stat是不是出自系统库,有没有被攻击者换掉//这种情况出现的可能性很小int ret;Dl_info dylib_info;int (*func_stat)(const char *,struct stat *) = stat;if ((ret = dladdr(&func_stat, &dylib_info))) {NSLog(@"lib:%s",dylib_info.dli_fname);      //如果不是系统库,肯定被攻击了if (strcmp(dylib_info.dli_fname, "/usr/lib/system/libsystem_kernel.dylib")) {    //不相等,肯定被攻击了,相等为0exit(0);}}
}
- (void)isOK3 {//列出所有已链接的动态库://通常情况下,会包含越狱机的输出结果会包含字符串: Library/MobileSubstrate/MobileSubstrate.dylib 。uint32_t count = _dyld_image_count();for (uint32_t i = 0 ; i < count; ++i) {NSString *name = [[NSString alloc]initWithUTF8String:_dyld_get_image_name(i)];if ([name containsString:@"Library/MobileSubstrate/MobileSubstrate.dylib"]) {exit(0);}}
}
- (void)isOK4 {//如果攻击者给MobileSubstrate改名,但是原理都是通过DYLD_INSERT_LIBRARIES注入动态库//那么可以,检测当前程序运行的环境变量char *env = getenv("DYLD_INSERT_LIBRARIES");if (env != NULL) {exit(0);}
}
//对于这些函数,不建议单独写方法,容易被hook掉,所以最好是写在不能被hook的函数里,比如application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions。。。
//谁TM会hook程序的初始化函数。。

相关文章:

【iOS逆向与安全】越狱检测与过检测附ida伪代码

首先在网上查找一些检测代码 放入项目运行&#xff0c;用 ida 打开后 F5 得到下面的 __int64 __usercall sub_10001B3F0<X0>(__int64 a1, __int64 a2, __int64 a3, __int64 a4, __int64 a5, __int64 a6, __int64 a7, __int64 a8, __int64 a9, __int64 a10, __int64 a11…...

Android Studio gradle手动下载配置

项目同步时&#xff0c;有时候会遇到Android Studio第一步下载gradle就是连接失败的问题。 这种情况&#xff0c;我们可以手动去gradle官网下载好gradle文件&#xff0c;放置在Android Studio的缓存目录下&#xff0c;这样AS在同步代码时就会自动解压下载好的文件。 步骤如下&…...

ChatGPT Prompting开发实战(十三)

一&#xff0e; 如何评估prompts是否包含有害内容 用户在与ChatGPT交互时提供的prompts可能会包括有害内容&#xff0c;这时可以通过调用OpenAI提供的API来进行判断&#xff0c;接下来给出示例&#xff0c;通过调用模型“gpt-3.5-turbo”来演示这个过程。 prompt示例如下&…...

银河麒麟 ARM 架构 离线安装Docker

1. 下载对应的安装包 进入此地址下载对应的docker 离线安装包 下载地址 将文件上传到服务器 解压此文件 tar zxf docker-18.09.1.tgz将 docker 相关命令拷贝到 /usr/bin&#xff0c;方便直接运行命令 cp docker/* /usr/bin/启动Docker守护程序 dockerd &验证是否安装成…...

虹科科技 | 探索CAN通信世界:PCAN-Explorer 6软件的功能与应用

CAN&#xff08;Controller Area Network&#xff09;总线是一种广泛应用于汽车和工业领域的通信协议&#xff0c;用于实时数据传输和设备之间的通信。而虹科的PCAN-Explorer 6软件是一款功能强大的CAN总线分析工具&#xff0c;为开发人员提供了丰富的功能和灵活性。本文将重点…...

SELECT COUNT(*)会不会导致全表扫描引起慢查询

SELECT COUNT(*)会不会导致全表扫描引起慢查询呢&#xff1f; SELECT COUNT(*) FROM SomeTable 网上有一种说法&#xff0c;针对无 where_clause 的 COUNT(*)&#xff0c;MySQL 是有优化的&#xff0c;优化器会选择成本最小的辅助索引查询计数&#xff0c;其实反而性能最高&…...

英国物联网初创公司【FourJaw】完成180万英镑融资

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经获悉&#xff0c;总部位于英国谢菲尔德的物联网初创公司【FourJaw】今日宣布已完成180万英镑融资。 本轮融资完成后&#xff0c;FourJaw的总融资金额已达400万英镑&#xff0c;本轮融资的投资机构包括&#xff1a;…...

许战海战略文库|无增长则衰亡:中小型制造企业增长困境

竞争环境不是匀速变化&#xff0c;而是加速变化。企业的衰退与进化、兴衰更迭在不断发生&#xff0c;这成为一种不可避免的现实。事实上&#xff0c;在产业链竞争中增长困境不分企业大小&#xff0c;而是一种普遍存在的问题&#xff0c;许多收入在1亿至10亿美元间的制造企业也同…...

广州华锐互动:候车室智能数字孪生系统实现交通信息可视化

随着科技的不断发展&#xff0c;数字化技术在各个领域得到了广泛的应用。智慧车站作为一种新型的交通服务模式&#xff0c;通过运用先进的数字化技术&#xff0c;为乘客提供了更加便捷、舒适的出行体验。 将智慧车站与数字孪生大屏结合&#xff0c;可以将实际现实世界的实体车站…...

智慧工地:助力数字建造、智慧建造、安全建造、绿色建造

智慧工地管理系统融合计算机技术、物联网、视频处理、大数据、云计算等&#xff0c;为工程项目管理提供先进的技术手段&#xff0c;构建施工现场智能监控系统&#xff0c;有效弥补传统监理中的缺陷&#xff0c;对人、机、料、法、环境的管理由原来的被动监督变成全方位的主动管…...

增强基于Cortex-M3的MCU以处理480 Mbps高速USB

通用串行总线&#xff08;USB&#xff09;完全取代了PC上的UART&#xff0c;PS2和IEEE-1284并行接口&#xff0c;现在已在嵌入式开发应用程序中得到广泛认可。嵌入式开发系统使用的大多数I / O设备&#xff08;键盘&#xff0c;扫描仪&#xff0c;鼠标&#xff09;都是基于USB的…...

山海鲸汽车需求调研系统:智慧决策的关键一步

随着社会的发展和科技的进步&#xff0c;汽车行业也迎来了新的挑战和机遇。如何更好地满足用户需求、提高产品竞争力成为了汽车制造商们关注的焦点。在这个背景下&#xff0c;山海鲸汽车需求调研互动系统应运而生&#xff0c;为汽车行业赋予了智慧决策的力量。 智慧决策的核心&…...

视频缩放的概念整理-步长数组

最近在读ffmpeg的代码时候&#xff0c;这个接口不是很能看懂int sws_scale(struct SwsContext *c, const uint8_t *const srcSlice[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t *const dst[], const int dstStride[]); 多方请教后&#xff0c;记录结果如…...

TensorFlow入门(二十一、softmax算法与损失函数)

在实际使用softmax计算loss时,有一些关键地方与具体用法需要注意: 交叉熵是十分常用的,且在TensorFlow中被封装成了多个版本。多版本中,有的公式里直接带了交叉熵,有的需要自己单独手写公式求出。如果区分不清楚,在构建模型时,一旦出现问题将很难分析是模型的问题还是交叉熵的使…...

UDP通信:快速入门

UDP协议通信模型演示 UDP API DatagramPacket&#xff1a;数据包对象&#xff08;韭菜盘子&#xff09; public DatagramPacket(byte[] buf, int length, InetAddress address, int port)创建发送端数据包对象 buf&#xff1a;要发送的内容&#xff0c;字节数组 length&…...

修炼k8s+flink+hdfs+dlink(四:k8s(一)概念)

一&#xff1a;概念 1. 概述 1.1 kubernetes对象. k8s对象包含俩个嵌套对象字段。 spec&#xff08;规约&#xff09;&#xff1a;期望状态 status&#xff08;状态&#xff09;&#xff1a;当前状态 当创建对象的时候&#xff0c;会按照spec的状态进行创建&#xff0c;如果…...

redis与 缓存击穿、缓存穿透、缓存雪崩

什么是缓存击穿、缓存穿透、缓存雪崩 缓存击穿、缓存穿透和缓存雪崩是与缓存相关的三种常见问题&#xff0c;它们可以在高并发的应用中导致性能问题。以下是它们的解释&#xff1a; 缓存击穿&#xff08;Cache Miss&#xff09; 缓存击穿指的是在高并发情况下&#xff0c;有大…...

印度网络安全:威胁与应对

随着今年过半&#xff0c;我们需要评估并了解不断崛起的网络威胁复杂性&#xff0c;这些威胁正在改变我们的数字景观。 从破坏性的网络钓鱼攻击到利用人工智能的威胁&#xff0c;印度的网络犯罪正在升级。然而&#xff0c;在高调的数据泄露事件风暴中&#xff0c;我们看到了政…...

AR动态贴纸SDK,让创作更加生动有趣

在当今的社交媒体时代&#xff0c;视频已经成为了人们表达自我、分享生活的重要方式。然而&#xff0c;如何让你的视频在众多的信息中脱颖而出&#xff0c;吸引更多的关注和点赞呢&#xff1f;答案可能就在你的手中——美摄AR动态贴纸SDK。 美摄AR动态贴纸SDK是一款专为视频编辑…...

MySQL常用命令01

今天开始&#xff0c;每天总结一点MySQL相关的命令&#xff0c;方便大家后期熟悉。 1.命令行登录数据库 mysql -H IP地址 -P 端口号 -u 用户名 -p 密码 数据库名称 -h 主机IP地址 登录本机 localhost或127.0.0.1 -P 数据库端口号 Mysql默认是3306 -u 用户名 -p 密码 …...

Java synchronized 关键字

synchronized 是什么&#xff1f; synchronized 是 Java 中的一个关键字&#xff0c;翻译成中文就是 同步 的意思&#xff0c;主要解决的是多个线程之间访问资源的同步性&#xff0c;可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行。 如何使用 synchronized?…...

滑动窗口算法(C语言描述)

第一种类型&#xff1a;不固定长窗口 问题1&#xff1a;*** C代码1&#xff1a; #include<stdio.h> #include<string.h> #define N 5int min_len(int len1,int len2) {return (len1 < len2 ? len1:len2); }int main() {int target 0;int num[N];scanf("…...

【已修复】vcruntime140.dll有什么用,vcruntime140.dll缺失如何修复

我是网友&#xff0c;今天非常荣幸能够在这里和大家分享关于电脑找不到vcruntime140.dll无法继续执行代码的解决方法。我相信&#xff0c;在座的许多朋友都曾遇到过这个问题&#xff0c;而今天我将为大家介绍五种有效的解决方法。 首先&#xff0c;让我们来了解一下vcruntime1…...

10月12日,每日信息差

今天是2023年10月12日&#xff0c;以下是为您准备的13条信息差 第一、欧盟投资4.5亿欧元在法国建设电池超级工厂。欧洲投资银行是欧盟的贷款机构&#xff0c;也是世界上最大的跨国银行之一 第二、北京银行推出数字人民币智能合约平台 数字人民币预付资金管理产品在商超场景首…...

网络安全技术(黑客学习)——自学方法

如果你想自学网络安全&#xff0c;首先你必须了解什么是网络安全&#xff01;&#xff0c;什么是黑客&#xff01;&#xff01; 1.无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防两面性&#xff0c;例如 Web 安全技术&#xff0c;既有 Web 渗透2.也有 Web 防…...

引领创新浪潮:“Polygon探寻新技术、新治理、新代币的未来之路!“

熊市是用来建设的&#xff0c;Polygon Labs一直在利用这漫长的几个月来做到这一点。 Polygon 是最常用的区块链之一&#xff0c;每周约有 150 万用户&#xff0c;每天超过 230 万笔交易&#xff0c;以及数千个 DApp&#xff0c;Polygon 最近面临着日益激烈的竞争。虽然从交易数…...

Android 13.0 添加自定义服务,并生成jar给第三方app调用

1.概述 在13.0系统产品定制化开发中,由于需要新增加自定义的功能,所以要增加自定义服务,而app上层通过调用自定义服务,来调用相应的功能,所以系统需要先生成jar,然后生成jar 给上层app调用,接下来就来分析实现的步骤,然后来实现相关的功能 从而来实现所需要的功能 2. …...

PG14归档失败解决办法archiver failed on wal_lsn

问题描述 昨晚RepmgrPG14主备主库因wal日志撑爆磁盘&#xff0c;删除主库过期wal文件重做备库后上午进行主备状态巡查&#xff0c;主库向备库发送wal文件正常&#xff0c;但是查主库状态时发现显示有1条归档失败的记录。 postgres: archiver failed on 000000010000006F000000…...

YB4014是可以对单节磷酸铁锂电池进行恒流/恒压充电管理的集成电路。

概述&#xff1a; YB4014是可以对单节磷酸铁锂电池进行恒流/恒 压充电管理的集成电路。该器件内部包括功率晶 体管&#xff0c;不需要外部的电流检测电阻和阻流二极管 YB4014只需要极少的外围元器件&#xff0c;非常适合于 便携式应用的领域。热调制电路可以在器件的功 耗比较大…...

STL——查找算法及实例

一 前言 STL算法部分主要由头文件<algorithm>,<numeric>,<functional>组成。要使用 STL中的算法函数必须包含头文件<algorithm>&#xff0c;对于数值算法须包含<numeric>&#xff0c;<functional>中则定义了一些模板类&#xff0c;用来声明…...