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

Xposed框架开发

文章目录

  • xpose插件开发步骤
    • 清单文件
    • 新建一个类(插件入口点)
    • 设置入口点
  • Hook第一个实例zhuceji.apk
  • 一些常用的HOOK
    • HookH5Plugin
    • HookProxyPlugin
    • HookSystem
  • 资料
    • Xposed原理初探

xpose插件开发步骤

magisk安装与配置
Xpose Framework API
LSPosed
magisk 一键集成环境,再也不用每次刷完机繁琐得配置环境了!
Xposed 插件开发之一: Xposed入门
Xposed模块开发

清单文件

在这里插入图片描述
在这里插入图片描述

新建一个类(插件入口点)

在这里插入图片描述## 引入模块
在这里插入图片描述
在这里插入图片描述

设置入口点

在这里插入图片描述

Hook第一个实例zhuceji.apk

package com.kika.testxposed;import android.widget.EditText;import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.security.MessageDigest;public class HookZhuCeJi implements IHook {final String packageName = "com.qianyu.zhuceji";@Overridepublic boolean isThisPackageName(XC_LoadPackage.LoadPackageParam lpparam) {return packageName.equals(lpparam.packageName);}@Overridepublic void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {XposedBridge.log("编写Xposed插件模板, 开启Hook之路!");XposedBridge.log("找到我们要hook的应用程序");XposedHelpers.findAndHookMethod("com.qianyu.zhuceji.MainActivity",lpparam.classLoader, // 类加载器"checkSN", // 方法名String.class, String.class, // 参数列表new XC_MethodHook() {// HOOK之前,打印参数信息,修改参数@Overrideprotected void beforeHookedMethod(MethodHookParam param) throws Throwable {super.beforeHookedMethod(param);// 打印参数信息XposedBridge.log("username=" + param.args[0]);XposedBridge.log("sn=" + param.args[1]);// 打印方法调用堆栈信息StackTraceElement[] wodelogs = new Throwable("wodelog").getStackTrace();for (StackTraceElement wodelog : wodelogs) {XposedBridge.log("查看堆栈:" + wodelog.toString());}}/***     private Button btn;*     private EditText edit_sn;*     private EditText edit_username;* @param param param* @throws Throwable Throwable*/@Overrideprotected void afterHookedMethod(MethodHookParam param) throws Throwable {super.afterHookedMethod(param);// 打印返回值信息XposedBridge.log("返回值:" + param.getResult());// 修改返回值// param.setResult(true);Class<?> clazz = param.thisObject.getClass();XposedBridge.log("参数:" + clazz);// 获取用户名字段Field edit_username = clazz.getDeclaredField("edit_username");// 设置可以访问edit_username.setAccessible(true);// 获取组件EditText et_user = (EditText) edit_username.get(param.thisObject);// 获取内容String name = et_user.getText().toString().trim();// 获取注册码字段Field edit_sn = clazz.getDeclaredField("edit_sn");edit_sn.setAccessible(true);EditText et_sn = (EditText) edit_sn.get(param.thisObject);String sn = et_sn.getText().toString().trim();XposedBridge.log("用户名:" + name);XposedBridge.log("注册码:" + name);// 指定算法MD5MessageDigest digest = MessageDigest.getInstance("MD5");// 初始化digest.reset();// 更新digest.update("3192850648@qq.com".getBytes());// 获取方法String methodName = "toHexString";Class<?>[] parameterTypes = new Class[]{byte[].class, String.class};Method method = clazz.getDeclaredMethod(methodName, parameterTypes);// 设置可见method.setAccessible(true);// 主动调用方法String hexstr = (String)method.invoke(param.thisObject, new Object[]{digest.digest(), sn});// 字符串拼接StringBuilder sb = new StringBuilder();for (int i = 0; i < hexstr.length(); i++) {sb.append(hexstr.charAt(i));}// 设置编辑框的值et_user.setText("3192850648@qq.com");et_sn.setText(sb.toString());}});}
}

一些常用的HOOK

HookH5Plugin

package com.kika.testxposed;import android.util.Log;
import android.webkit.WebView;import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XC_MethodReplacement;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage;public class HookH5Plugin implements IHook{@Overridepublic boolean isThisPackageName(XC_LoadPackage.LoadPackageParam lpparam) {return true;}@Overridepublic void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {// 强制H5调试插件开发XposedBridge.hookAllConstructors(WebView.class,new XC_MethodHook() {@Overrideprotected void beforeHookedMethod(MethodHookParam param) throws Throwable {super.beforeHookedMethod(param);// 主动调用静态方法call 第一参数传的是类final Object[] params = {true};XposedHelpers.callStaticMethod(WebView.class, "setWebContentsDebuggingEnabled", params);Log.d(HookH5Plugin.class.getSimpleName(), "package:" + lpparam.packageName);}});// 方法重载XposedBridge.hookAllMethods(WebView.class,"setWebContentsDebuggingEnabled",new XC_MethodHook() {@Overrideprotected void beforeHookedMethod(MethodHookParam param) throws Throwable {super.beforeHookedMethod(param);param.args[0] = true;Log.d(HookH5Plugin.class.getSimpleName(), "package:" + lpparam.packageName);}});// 拦截替换直接方法逻辑XposedHelpers.findAndHookMethod("io.dcloud.common.adapter.ui.WebViewImpl",lpparam.classLoader,"setWebViewData",new XC_MethodReplacement() {@Overrideprotected Object replaceHookedMethod(MethodHookParam methodHookParam) throws Throwable {Log.d(HookH5Plugin.class.getSimpleName(), "setWebViewData is replace");return null;}});}
}

HookProxyPlugin

package com.kika.testxposed;import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.URL;public class HookProxyPlugin implements IHook{@Overridepublic boolean isThisPackageName(XC_LoadPackage.LoadPackageParam lpparam) {return true;}@Overridepublic void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {XposedHelpers.findAndHookMethod(System.class,"getProperty",String.class,new XC_MethodHook() {@Overrideprotected void afterHookedMethod(MethodHookParam param) throws Throwable {super.afterHookedMethod(param);XposedBridge.log("绕过代理检测");String str = (String) param.args[0];if (str.equals("https.proxyHost") || str.equals("http.proxyHost")|| str.equals("https.proxyPort") || str.equals("http.proxyPort")) {param.setResult(null);}}});XposedHelpers.findAndHookMethod(URL.class,"openConnection",new XC_MethodHook() {@Overrideprotected void beforeHookedMethod(MethodHookParam param) throws Throwable {super.beforeHookedMethod(param);XposedBridge.log("强制代理");param.args[0] = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("192.168.99.13", 8888));}});}
}

HookSystem

package com.kika.testxposed;import android.net.wifi.WifiInfo;import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage;
import java.net.InetAddress;/*** Hook 系统的一些方法*/
public class HookSystem implements IHook {public static long isToLong(String strIp) {long[] ip = new long[4];int position1 = strIp.indexOf(".");int position2 = strIp.indexOf(".", position1 + 1);int position3 = strIp.indexOf(".", position2 + 1);// 将每个.之间的字符串转换成整形ip[0] = Long.parseLong(strIp.substring(0, position1));ip[1] = Long.parseLong(strIp.substring(position1 + 1, position2));ip[2] = Long.parseLong(strIp.substring(position2 + 1, position3));ip[3] = Long.parseLong(strIp.substring(position3 + 1));return (ip[0] << 24) + (ip[1] << 16) + (ip[2] >> 8) + ip[3];}@Overridepublic boolean isThisPackageName(XC_LoadPackage.LoadPackageParam lpparam) {return true;}@Overridepublic void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {// 拦截系统方法,篡改IMEI设备号XposedHelpers.findAndHookMethod("android.telephony.TelephonyManager",lpparam.classLoader,"getDeviceId",new XC_MethodHook() {@Overrideprotected void afterHookedMethod(MethodHookParam param) throws Throwable {//param.setResult(HookSystem.isToLong(param.getResult().toString()));XposedBridge.log("imei:" + param.getResult());}});// HOOK构造方法,拦截IP地址XposedHelpers.findAndHookConstructor("java.net.InetSocketAddress",lpparam.classLoader,String.class,int.class,new XC_MethodHook() {@Overrideprotected void beforeHookedMethod(MethodHookParam param) throws Throwable {super.beforeHookedMethod(param);XposedBridge.log("IP地址:" + param.args[0]);}@Overrideprotected void afterHookedMethod(MethodHookParam param) throws Throwable {super.afterHookedMethod(param);}});// 拦截流量上网IP地址XposedHelpers.findAndHookMethod(InetAddress.class,"getHostAddress",new XC_MethodHook() {@Overrideprotected void beforeHookedMethod(MethodHookParam param) throws Throwable {super.beforeHookedMethod(param);}@Overrideprotected void afterHookedMethod(MethodHookParam param) throws Throwable {super.afterHookedMethod(param);XposedBridge.log("IP地址:" + param.getResult());}});// 拦截WIFI上网IP地址XposedHelpers.findAndHookMethod(WifiInfo.class,"getIpAddress",new XC_MethodHook() {@Overrideprotected void beforeHookedMethod(MethodHookParam param) throws Throwable {super.beforeHookedMethod(param);}@Overrideprotected void afterHookedMethod(MethodHookParam param) throws Throwable {super.afterHookedMethod(param);XposedBridge.log("IP地址:" + param.getResult());// 分割字符串String[] str = "192.168.1.99".split("\\.");// 定义一个字符串,用来存储反转后的IP地址String ipAddress = "";// for循环控制IP地址反转for (int i = 3; i >= 0; i--) {ipAddress = ipAddress + str[i] + ".";}// 去除最后一位的"."ipAddress = ipAddress.substring(0, ipAddress.length() - 1);// 返回新的整形IP地址param.setResult((int) isToLong(ipAddress));}});}
}

资料

Xposed原理初探

一、Xposed 框架实现 Hook 的原理介绍
Zygote是Android的核心,每运行一个app,Zygote就会fork一个虚拟机实例来运行app,
Xposed Framework深入到了Android核心机制中,通过改造Zygote来实现一些很牛逼的
功能。Zygote的启动配置在init.rc 脚本中,由系统启动的时候开启此进程,对应的
执行文件是/system/bin/app_process,这个文件完成类库加载及一些函数调用的工作。
当系统中安装了Xposed Framework之后,会对app_process进行扩展,也就是说,Xposed
Framework 会拿自己实现的app_process覆盖掉Android原生提供的app_process文件,
当系统启动的时候,就会加载由 Xposed Framework 替换过的进程文件,并且,Xposed
Framework 还定义了一个 jar 包,系统启动的时候,也会加载这个包:
/data/data/de.robv.android.xposed.installer/bin/XposedBridge.jar

二、Xposed框架运行的条件
1.Rooted Device / Emulator (已root的手机或者模拟器)
2.Xposed Installer (Xposed安装程序下载)
3.Hooking Android App (要被Hook的目标 App)

Xposed Framework就是一个apk包也就是上面下载的Xposed安装程序,下载后用下面
的命令安装到手机上或者模拟器:
adb install de.robv.android.xposed.installer_v32_de4f0d.apk

app
framework
C++
linux内核

linux内核 --> init --> app_process --> Zygote

Zygote进程在启动过程中,除了创建一个Dalvik虚拟机实例之外,还会将Java运行时库
加载到进程中来,同时还会注册一些Android核心类的JNI方法到前面创建的Dalvik虚拟
机实例中去。

一个应用程序被孵化出来的时候,其不仅会获得Zygote进程中的Dalvik虚拟机实例,还
会与Zygote一起共享Java运行时库,这也是可以将XposedBridge.jar这个jar包加载到
每一个Android应用中的原因。

Xposed_zygote进程启动后会初始化一些so文件(/system/lib、/system/lib64),然后
进入XposedBridge.jar中的XposedBridge.main中加载模块,初始化jar包完成对一些关键
Android系统函数的hook。

Hook则是利用修改过的虚拟机将函数注册为native函数。
然后再返回zygote中完成原本zygote需要做的工作。

META-INF/ 里面有文件配置脚本 flash-script.sh 配置各个文件安装位置。
system/bin/ 替换zygote进程等文件
system/framework/XposedBridge.jar jar包位置
system/lib system/lib64 一些so文件所在位置
xposed.prop xposed版本说明文件

Android
https://developer.android.google.cn/

SDK刷机包下载
x86:https://dl-xda.xposed.info/framework/
x86_64:https://github.com/youling257/XposedTools/files/1931996/xposed-x86_64.zip

VirtualApp
https://github.com/asLody/VirtualApp

Android Hook技术防范漫谈
https://tech.meituan.com/android_anti_hooking.html

XPOSED魔改一
https://bbs.pediy.com/thread-258639.htm

企业壳反调试及hook检测分析
https://mp.weixin.qq.com/s/StnqWtZMFCu09snIEGi1RQ

破解某支付软件防Xposed等框架Hook功能检测机制
https://mp.weixin.qq.com/s/Je1kRksxHTTYb4l9x3bTmQ

阿里系产品Xposed Hook检测机制原理分析
https://bbs.pediy.com/thread-218848.htm

抖音短视频检测 Xposed 分析(一)
https://www.52pojie.cn/thread-684757-1-1.html

抖音短视频检测 Xposed 分析(二)
https://www.52pojie.cn/thread-691584-1-1.html

相关文章:

Xposed框架开发

文章目录 xpose插件开发步骤清单文件新建一个类&#xff08;插件入口点&#xff09;设置入口点 Hook第一个实例zhuceji.apk一些常用的HOOKHookH5PluginHookProxyPluginHookSystem 资料Xposed原理初探 xpose插件开发步骤 magisk安装与配置 Xpose Framework API LSPosed magisk …...

2.13 Android ebpf非网络相关帮助函数API汇总(十二 本章完)

1.long bpf_user_ringbuf_drain(struct bpf_map *map, void *callback_fn, void *ctx, u64 flags) 描述:从指定的用户环形缓冲区中排出样本,并为每个此类样本调用提供的回调: long (*callback_fn)(struct bpf_dynptr *dynptr, void *ctx); 如果callback_fn返回0,帮助函数…...

关于游戏的笔记

关于搭建秦时明月2一键端&#xff0c;并且开启秘境神秘商人东海寻仙幻化 1.该游戏下主要的目录 gm端 服务框架 服务端 2.修改对应的文件 C:\qs\Q2Server\server\conf_common\ManagerAddress.xmlC:\qs\Q2Server\server\conf_manager\GateServer.xml修改ip 3.启动gm startup…...

vue diff 前后缀+最长递增子序列算法

文章目录 查找相同前后缀通过前后缀位置信息新增节点通过前后缀位置信息删除节点 中间部份 diff判断节点是否需要移动删除节点删除未查找到的节点删除多余节点 移动和新增节点最长递增子序列 求解最长递增子序列位置信息 查找相同前后缀 如上图所示&#xff0c;新旧 children 拥…...

【Python】Locust持续优化:InfluxDB与Grafana实现数据持久化与可视化分析

目录 前言 influxDB 安装运行InfluxDB 用Python 上报数据到influxdb ocust 数据写入到 influx Locust的生命周期 上报数据 优化升级 配置Grafana 总结 资料获取方法 前言 在进行性能测试时&#xff0c;我们需要对测试结果进行监控和分析&#xff0c;以便于及时发现问…...

数组模拟循环链表

5073. 空闲块 - AcWing题库 数组模拟循环链表 /*从当前位置开始遍历空闲块链表&#xff08;初始是从地址最小的第一个空闲块开始&#xff09;&#xff0c;寻找满足条件的最小块 &#xff08;即&#xff1a;大于等于请求空间的最小空闲块&#xff0c;如果有多个大小相同的最小空…...

第三章 图论 No.5最小生成树之虚拟源点,完全图与次小生成树

文章目录 虚拟源点&#xff1a;1146. 新的开始贪心或kruskal性质&#xff1a;1145. 北极通讯网络最小生成树与完全图&#xff1a;346. 走廊泼水节次小生成树&#xff1a;1148. 秘密的牛奶运输 虚拟源点&#xff1a;1146. 新的开始 1146. 新的开始 - AcWing题库 与一般的最小…...

RESTful API的讲解以及用PHP实现RESTful API

RESTful API是什么 RESTful是一种设计风格&#xff0c;是一种用于构建Web服务的架构。RESTful API是一种基于REST&#xff08;Representational State Transfer&#xff09;架构风格的Web服务接口设计规范。它强调使用HTTP协议中的请求方法&#xff08;例如GET、POST、PUT、DEL…...

Spring中@Component和@Bean的区别

1. 用途不同 Component用于标识普通类 Bean是在配置类中声明和配置Bean对象 2. 使用方式不同 Component是一个类级别的注解,Spring通过ComponentScan注解扫描并注册为Bean. Bean是一个方法级别的注解,在配置类中手动声明和配置Bean 3. 控制权不同 Component注解修饰的类使…...

【问题解决】mysql 数据库字符串分割之后多行输出方法

背景&#xff1a; 项目需要从一张表查询出来数据插入到另一张表&#xff0c;其中有一个字段是用逗号分隔的字符串&#xff0c;需要多行输入到另一张表&#xff0c;那么这个如何实现呢 方案&#xff1a; 下面先粘贴下sql语句&#xff1a; select SUBSTRING_INDEX(SUBSTRING_…...

flutter开发实战-时间显示刚刚几分钟前几小时前

flutter开发实战-时间显示刚刚几分钟前几小时前 在开发中经常遇到从服务端获取的时间戳&#xff0c;需要转换显示刚刚、几分钟前、几小时前、几天前、年月日等格式。 一、代码实现 static String timeFormatterChatTimeStamp(int seconds) {try {int nowDateSeconds (DateTi…...

导出LLaMA等LLM模型为onnx

通过onnx模型可以在支持onnx推理的推理引擎上进行推理&#xff0c;从而可以将LLM部署在更加广泛的平台上面。此外还可以具有避免pytorch依赖&#xff0c;获得更好的性能等优势。 这篇博客&#xff08;大模型LLaMa及周边项目&#xff08;二&#xff09; - 知乎&#xff09;进行…...

回顾 OWASP 机器学习十大风险

日复一日&#xff0c;越来越多的机器学习 (ML) 模型正在开发中。机器学习模型用于查找训练数据中的模式&#xff0c;可以产生令人印象深刻的检测和分类能力。机器学习已经为人工智能的许多领域提供了动力&#xff0c;包括情感分析、图像分类、面部检测、威胁情报等。 数十亿美…...

ENSP软件的基本使用命令(第三十一课)

ENSP软件的基本使用命令(第三十一课) 下面的图片是今天操作的核心基础操作 1 命令行页面 交换机 路由器 PC机 分别展示一下 页面的样子 2 基本命令结构...

五、FreeRTOS数据类型和编程规范

1、数据类型 (1)每个移植的版本都含有自己的portmacro.h头文件&#xff0c;里面定义了2个数据类型。 (2)TickType_t FreeRTOS配置了一个周期性的时钟中断&#xff1a;Tick Interrup每发生一次中断&#xff0c;中断次数累加&#xff0c;这被称为tick counttick count这个变量…...

码出高效_第二章 | 面向对象_上

目录 一. OOP理念1. 概念辨析2. 四大特性1. 抽象2. 封装3. 继承4. 多态 二. 初识Java1. JDKJDK 5-11的重要类、特性及重大改变 2. JRE关于JVM 三. 类1. 概述2. 接口和抽象类1. 概念及相同点2. 不同点3. 总结 3. 内部类4. 访问权限控制1. 由来2. public/private/无/private3. 推…...

大学生课设实训|基于springboot的在线拍卖系统

目录 项目描述 主要技术栈 功能效果 数据库设计 开发顺序 业务功能 大家好&#xff01;我是龍弟-idea&#xff01;需要源码资料信息可私聊我【HWL__666666】&#xff01; 项目描述 本系统是一个网上商品竞拍系统&#xff0c;为拍卖者和竞买者提供一个在线交流平台。本项…...

论文阅读 - Social bot detection in the age of ChatGPT: Challenges and opportunities

论文链接&#xff1a;https://www.researchgate.net/publication/371661341_Social_bot_detection_in_the_age_of_ChatGPT_Challenges_and_opportunities 目录 摘要&#xff1a; 引言 1.1. Background on social bots and their role in society 1.2. The rise of AI-gene…...

FPGA优质开源项目 - UDP RGMII千兆以太网

本文介绍一个FPGA开源项目&#xff1a;UDP RGMII千兆以太网通信。该项目在我之前的工作中主要是用于FPGA和电脑端之间进行图像数据传输。本文简要介绍一下该项目的千兆以太网通信方案、以太网IP核的使用以及Vivado工程源代码结构。 Vivado 的 Tri Mode Ethernet MAC IP核需要付…...

学C的第三十二天【动态内存管理】

相关代码gitee自取&#xff1a;C语言学习日记: 加油努力 (gitee.com) 接上期&#xff1a; 学C的第三十一天【通讯录的实现】_高高的胖子的博客-CSDN博客 1 . 为什么存在动态内存分配 学到现在认识的内存开辟方式有两种&#xff1a; 创建变量&#xff1a; int val …...

从零开始!DeepSeek-R1-Distill-Qwen-1.5B完整部署流程详解

从零开始&#xff01;DeepSeek-R1-Distill-Qwen-1.5B完整部署流程详解 1. 模型简介与核心优势 1.1 什么是DeepSeek-R1-Distill-Qwen-1.5B&#xff1f; DeepSeek-R1-Distill-Qwen-1.5B是一款经过知识蒸馏优化的轻量级语言模型&#xff0c;由DeepSeek团队基于Qwen-1.5B架构开发…...

OpenCode应用案例:搭建企业内部代码审查助手,提升开发效率

OpenCode应用案例&#xff1a;搭建企业内部代码审查助手&#xff0c;提升开发效率 1. 项目背景与痛点分析 在软件开发团队中&#xff0c;代码审查是保证代码质量的关键环节。然而传统人工审查方式面临诸多挑战&#xff1a; 时间成本高&#xff1a;资深工程师需要花费大量时间…...

ComfyUI-FramePackWrapper功能选择指南:如何根据资源控制与使用便捷性选择最优方案

ComfyUI-FramePackWrapper功能选择指南&#xff1a;如何根据资源控制与使用便捷性选择最优方案 【免费下载链接】ComfyUI-FramePackWrapper 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-FramePackWrapper ComfyUI-FramePackWrapper作为一款高效的AI视频生成插…...

内网渗透实战:利用SSH密钥实现Linux主机间横向移动

1. SSH密钥横向移动的核心原理 当你第一次接触内网渗透时&#xff0c;可能会被各种复杂的技术术语吓到。其实SSH密钥横向移动的原理非常简单&#xff1a;就像用钥匙开锁一样&#xff0c;只要拿到目标主机的SSH私钥&#xff0c;就能像合法用户一样登录系统。我在实际渗透测试中发…...

突破性AMD Ryzen硬件调试方案:SMUDebugTool深度解析与实战指南

突破性AMD Ryzen硬件调试方案&#xff1a;SMUDebugTool深度解析与实战指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: ht…...

RTX 3090环境下的BEVFusion实战部署:从源码编译到多模态训练调优

1. RTX 3090环境准备与BEVFusion适配 在RTX 3090上部署BEVFusion最大的挑战就是硬件与软件版本的兼容性问题。官方推荐的环境是CUDA 9.2和PyTorch 1.3.1&#xff0c;但这对于RTX 3090来说完全不适用——30系显卡需要CUDA 11才能发挥全部性能。我刚开始尝试直接按照官方文档安装…...

5分钟搞定:Mac用户制作Windows启动盘的终极指南

5分钟搞定&#xff1a;Mac用户制作Windows启动盘的终极指南 【免费下载链接】windiskwriter &#x1f5a5; A macOS app that creates bootable USB drives for Windows. &#x1f6e0; Patches Windows 11 to bypass TPM and Secure Boot requirements. 项目地址: https://g…...

Face Analysis WebUI在金融领域的应用:远程开户身份核验

Face Analysis WebUI在金融领域的应用&#xff1a;远程开户身份核验 1. 引言 想象一下这样的场景&#xff1a;一位偏远地区的客户想要开设银行账户&#xff0c;但最近的银行网点在100公里外。传统方式下&#xff0c;他需要亲自前往网点&#xff0c;排队等待&#xff0c;提交各…...

AI读脸术多国面孔适配:跨种族识别优化部署实战

AI读脸术多国面孔适配&#xff1a;跨种族识别优化部署实战 1. 引言 你有没有遇到过这样的情况&#xff1a;一个在亚洲人脸识别上表现不错的AI模型&#xff0c;拿到一张欧洲人或非洲人的照片时&#xff0c;识别结果就开始"犯迷糊"了&#xff1f;性别判断出错&#x…...

百度地图API实战:5分钟搞定JS坐标系转换(wgs84转bd09ll避坑指南)

百度地图坐标系转换实战&#xff1a;从原理到避坑的全方位指南 第一次在项目里集成百度地图时&#xff0c;我盯着屏幕上偏移了500多米的标记点愣了半天——明明从GPS设备获取的经纬度坐标完全正确&#xff0c;为什么在地图上显示的位置却差之千里&#xff1f;这个困扰无数开发者…...