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

初步了解安卓逆向

初步了解安卓逆向目的了解so层和java层然后了解安卓逆向题目so文件它相当于Windows下的.dll动态链接库一种共享库文件包含了程序所需的代码和数据它的优势是使得程序的内存占用更小同时也方便了程序的更新和维护native原生层作为C/C 编译后的二进制文件那么就可以拖到ida里面进行分析在这个so文件下在ctf里面是经常会夹杂一些安全性手段的比如加密加壳反调试JAVA层可读性高进行交互的层而它是裸露的会加杂安全手段但是一般ctf不会为难而到真实的小程序或者软件就会有混淆等先从例题入手复习一下[HZNUCTF 2023 preliminary]easyAPK还是拖入jadx按照常规操作进行分析锁定了在这两个函数点击在example.easyapk.llooggiinnlogin其实就是登录那么这个就是入口得到了具体的加密逻辑packagecom.example.easyapk;importandroid.content.Intent;importandroid.os.Bundle;importandroid.view.View;importandroid.widget.Button;importandroid.widget.EditText;importandroid.widget.Toast;importandroidx.appcompat.app.AppCompatActivity;importjava.security.InvalidAlgorithmParameterException;importjava.security.InvalidKeyException;importjava.security.NoSuchAlgorithmException;importjava.util.Base64;importjavax.crypto.BadPaddingException;importjavax.crypto.Cipher;importjavax.crypto.IllegalBlockSizeException;importjavax.crypto.NoSuchPaddingException;importjavax.crypto.spec.IvParameterSpec;importjavax.crypto.spec.SecretKeySpec;/* loaded from: classes3.dex */publicclassllooggiinnextendsAppCompatActivity{staticStringstr1admin;staticStringstr2;ButtonloginBtn;EditTextpasswdEt;ButtonsignBtn;EditTextuserEt;Override// androidx.fragment.app.FragmentActivity, androidx.activity.ComponentActivity, androidx.core.app.ComponentActivity, android.app.ActivityprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_login);this.userEt(EditText)findViewById(R.id.user);this.passwdEt(EditText)findViewById(R.id.passwd);this.loginBtn(Button)findViewById(R.id.loginBtn);this.signBtn(Button)findViewById(R.id.signBtn);try{StringkeygetString(R.string.keyishere);byte[]ciphertextBase64.getDecoder().decode(Lz49p2OjPZzUMXakynHQuw);byte[]plaintextdecrypt(ciphertext,key.getBytes(),iviviviviviviviv.getBytes());str2newString(plaintext);}catch(InvalidAlgorithmParameterException|InvalidKeyException|NoSuchAlgorithmException|BadPaddingException|IllegalBlockSizeException|NoSuchPaddingExceptione){e.printStackTrace();}this.loginBtn.setOnClickListener(newView.OnClickListener(){// from class: com.example.easyapk.llooggiinn.1Override// android.view.View.OnClickListenerpublicvoidonClick(Viewview){Stringusernamellooggiinn.this.userEt.getText().toString();Stringpasswdllooggiinn.this.passwdEt.getText().toString();if(passwd.equals()|username.equals()){Toast.makeText(llooggiinn.this,想空手套白狼没门,0).show();return;}if(!username.equals(llooggiinn.str1)||!passwd.equals(llooggiinn.str2)){Toast.makeText(llooggiinn.this,用户名或密码不正确,0).show();return;}IntentintentnewIntent(llooggiinn.this,(Class?)ffuucc.class);llooggiinn.this.startActivity(intent);Toast.makeText(llooggiinn.this,恭喜你离成功又进一步,0).show();}});this.signBtn.setOnClickListener(newView.OnClickListener(){// from class: com.example.easyapk.llooggiinn.2Override// android.view.View.OnClickListenerpublicvoidonClick(Viewview){Toast.makeText(llooggiinn.this,不支持注册喵\n快去找登录名和密码,0).show();}});}Override// androidx.appcompat.app.AppCompatActivity, androidx.fragment.app.FragmentActivity, android.app.ActivityprotectedvoidonStart(){super.onStart();}publicstaticbyte[]decrypt(byte[]data,byte[]key,byte[]iv)throwsBadPaddingException,NoSuchPaddingException,IllegalBlockSizeException,NoSuchAlgorithmException,InvalidKeyException,InvalidAlgorithmParameterException{CiphercipherCipher.getInstance(AES/CBC/PKCS5Padding);cipher.init(2,newSecretKeySpec(key,AES),newIvParameterSpec(iv));byte[]resultcipher.doFinal(data);returnresult;}}明文先经过base64加密给到key(要点击keyishere前期我犯了错误忘记了key应该是16位所以进行搜索得到了正解key然后key经过AES加密得到新的key而密文又经过了一轮AES/CBC/PKCS5Pading这里需要回顾一下AES加密总结一下思路线索1.AES-CBC模式keykkkeyyy4044044刚好16位2.base64加密明文Lz49p2OjPZzUMXakynHQuw3.偏移值iviviviviviviviviv(也是刚好16位)fromCrypto.CipherimportAESimportbase64 keybkkkeyyy404404404ivbivivivivivivivivct_b64Lz49p2OjPZzUMXakynHQuwctbase64.b64decode(ct_b64)cipherAES.new(key,AES.MODE_CBC,iv)ptcipher.decrypt(ct)# 先打印原始结果方便判断print(解密原始数据:,pt)# 尝试不同的去除填充方式try:fromCrypto.Util.Paddingimportunpad pt_pkcs7unpad(pt,AES.block_size)print(PKCS7去除填充成功:,pt_pkcs7.decode(utf-8))except:print(PKCS7去除填充失败尝试ZeroPadding...)pt_zeropt.rstrip(b\x00)print(ZeroPadding去除后:,pt_zero.decode(utf-8,errorsignore))根据这个脚本我们得到了卡了因为我得到的并不知道该怎么用回到题目本身打开它这里用到雷电模拟器打开它用户名这里得到admin加上上面得到的密钥得到这一串得到flagezandroid.pro又重新刷上了moectf的题目害还是不牢固啊啊啊啊啊打开可以看到是一个flag验证的程序然后拖入jadx去找主入口packagecom.example.ezandroidpro;importandroid.os.Bundle;importandroid.view.View;importandroid.widget.Button;importandroid.widget.EditText;importandroid.widget.TextView;importandroidx.appcompat.app.AppCompatActivity;/* loaded from: classes.dex */publicclassMainActivityextendsAppCompatActivity{privateEditTextinputEditText;privateTextViewresultTextView;publicnativebooleancheck(Stringstr);static{System.loadLibrary(ezandroidpro);}Override// androidx.fragment.app.FragmentActivity, androidx.activity.ComponentActivity, androidx.core.app.ComponentActivity, android.app.ActivityprotectedvoidonCreate(Bundlebundle){super.onCreate(bundle);setContentView(R.layout.activity_main);this.inputEditText(EditText)findViewById(R.id.inputEditText);this.resultTextView(TextView)findViewById(R.id.resultTextView);((Button)findViewById(R.id.checkButton)).setOnClickListener(newView.OnClickListener(){// from class: com.example.ezandroidpro.MainActivity.1Override// android.view.View.OnClickListenerpublicvoidonClick(Viewview){StringstrTrimMainActivity.this.inputEditText.getText().toString().trim();if(strTrim.length()!32){MainActivity.this.resultTextView.setText(flag长度不对,请重新输入);MainActivity.this.resultTextView.setTextColor(MainActivity.this.getResources().getColor(android.R.color.holo_red_dark));}elseif(MainActivity.this.check(strTrim)){MainActivity.this.resultTextView.setText(Congratulations!);MainActivity.this.resultTextView.setTextColor(MainActivity.this.getResources().getColor(android.R.color.holo_green_dark));}else{MainActivity.this.resultTextView.setText(Incorrect);MainActivity.this.resultTextView.setTextColor(MainActivity.this.getResources().getColor(android.R.color.holo_red_dark));}}});}}只有对程序运行结果的评判以及flag的长度为32没有看到什么加密逻辑或者明文什么的这时候就要去研究so文件bool __fastcallJava_com_example_ezandroidpro_MainActivity_check(inta1,inta2,inta3){_BOOL4 v5;// r5constchar*s;// r0constchar*src;// r4size_t n0xB;// r0size_t n;// r5char*dest;// r9unsignedintv11;// r10char*_4EEB1EEF2914D79BFA8C5006332097ED2EF06C4A59CAE31C827A08D45CC649C;// r4intn96;// r2intv14;// r0unsigned __int8*v15;// r2intv16;// r1char*_4EEB1EEF2914D79BFA8C5006332097ED2EF06C4A59CAE31C827A08D45CC649;// r3void*s1_1;// r6unsigned __int8 v20;// [sp4h] [bp-44h] BYREF_BYTE v21[7];// [sp5h] [bp-43h] BYREFvoid*s1;// [spCh] [bp-3Ch]_DWORD v23[2];// [sp10h] [bp-38h] BYREFvoid*moectf2025______;// [sp18h] [bp-30h]_DWORD v25[2];// [sp1Ch] [bp-2Ch] BYREFvoid*dest_1;// [sp24h] [bp-24h]v50;s(constchar*)(*(int(__fastcall**)(int,int,_DWORD))(*(_DWORD*)a1676))(a1,a3,0);if(!s)returnv5;srcs;n0xBstrlen(s);if(n0xB0xFFFFFFF0)std::__basic_string_commontrue::__throw_length_error(v25);nn0xB;if(n0xB0xB){v11(n0xB16)0xFFFFFFF0;dest(char*)operatornew(v11);v25[1]n;dest_1dest;v25[0]v111;gotoLABEL_7;}LOBYTE(v25[0])2*n0xB;dest(char*)v251;if(n0xB)LABEL_7:j_memcpy(dest,src,n);dest[n]0;(*(void(__fastcall**)(int,int,constchar*))(*(_DWORD*)a1680))(a1,a3,src);moectf2025______(void*)operatornew(0x20u);strcpy((char*)moectf2025______,moectf2025!!!!!!);v23[1]16;v23[0]33;_4EEB1EEF2914D79BFA8C5006332097ED2EF06C4A59CAE31C827A08D45CC649C(char*)operatornew(0x70u);strcpy(_4EEB1EEF2914D79BFA8C5006332097ED2EF06C4A59CAE31C827A08D45CC649C,4EEB1EEF2914D79BFA8C5006332097ED2EF06C4A59CAE31C827A08D45CC649C0B971BF2EFBCB160E531A646DF7A6AC0B);sm4Encrypt(v20,v25,v23);n96*(_DWORD*)v21[3];v14v201;if(!v14)n96v201;if(n9696){if(v14){s1_1s1;v5memcmp(s1,_4EEB1EEF2914D79BFA8C5006332097ED2EF06C4A59CAE31C827A08D45CC649C,0x60u)0;gotoLABEL_20;}v15v21;v16v201;_4EEB1EEF2914D79BFA8C5006332097ED2EF06C4A59CAE31C827A08D45CC649_4EEB1EEF2914D79BFA8C5006332097ED2EF06C4A59CAE31C827A08D45CC649C;do{v5*v15(unsigned __int8)*_4EEB1EEF2914D79BFA8C5006332097ED2EF06C4A59CAE31C827A08D45CC649;if(*v15!(unsigned __int8)*_4EEB1EEF2914D79BFA8C5006332097ED2EF06C4A59CAE31C827A08D45CC649)break;_4EEB1EEF2914D79BFA8C5006332097ED2EF06C4A59CAE31C827A08D45CC649;v15;--v16;}while(v16);}else{v50;}if(v14){s1_1s1;LABEL_20:operatordelete(s1_1);}operatordelete(_4EEB1EEF2914D79BFA8C5006332097ED2EF06C4A59CAE31C827A08D45CC649C);if(LOBYTE(v23[0])31)operatordelete(moectf2025______);if(LOBYTE(v25[0])31)operatordelete(dest_1);returnv5;}好的上面就是隐含了加密以及密钥然后会看可以发现是check函数下的伪代码也就是以后在java层看不到就去看核心的调用函数再从ida分析出来的so文件去定位密钥moectf2025!!!16位加密方式是SM4-ECB模式这里又已知了一个加密手段已知密文4EEB1EEF2914D79BFA8C5006332097ED2EF06C4A59CAE31C827A08D45CC649C0B971BF2EFBCB160E531A646DF7A6AC0Bexp# SM4-ECB-PKCS7 解密脚本 - 适配你逆向的代码fromcryptography.hazmat.primitives.ciphersimportCipher,algorithms,modesfromcryptography.hazmat.backendsimportdefault_backenddefsm4_ecb_decrypt(key:bytes,cipher_hex:str)-str:# 1. 密钥处理必须16字节keykey.encode(utf-8)iflen(key)!16:raiseValueError(密钥必须是16字节)# 2. 密文十六进制 → 二进制ciphertextbytes.fromhex(cipher_hex)# 3. SM4-ECB 解密cipherCipher(algorithms.SM4(key),modes.ECB(),backenddefault_backend())decryptorcipher.decryptor()padded_plaindecryptor.update(ciphertext)decryptor.finalize()# 4. PKCS7 去填充你逆向代码的填充方式pad_lenpadded_plain[-1]plainpadded_plain[:-pad_len]try:returnplain.decode(utf-8)except:returnplain.hex()# 你的题目数据 KEYmoectf2025!!!!!!# 题目给的16字节密钥CIPHER_TEXT4EEB1EEF2914D79BFA8C5006332097ED2EF06C4A59CAE31C827A08D45CC649C0B971BF2EFBCB160E531A646DF7A6AC0B# 解密resultsm4_ecb_decrypt(KEY,CIPHER_TEXT)print(✅ 解密成功)print(明文 ,result)总结流程就是1.先看下程序吧拖入模拟器里面因为前面不是遇到了输入用户名和密码的界面嘛方便理解java代码→2.再拖入jadx里面去查找主入口不一定每个都是mainactivity向上面就有login为主入口的→3.点进去看有无主要的加密逻辑→4.如果没有说明java层并没有就是隐藏在so层了直接解包拿到so文件拖入ida进行分析

相关文章:

初步了解安卓逆向

初步了解安卓逆向 目的 了解so层和java层,然后了解安卓逆向题目 so文件 它相当于Windows下的.dll 动态链接库(一种共享库文件,包含了程序所需的代码和数据,它的优势是使得程序的内存占用更小,同时也方便了程序的更新和…...

工业级Cat-1导轨式DTU USR-DR154/DR152(口红DTU)技术规范、核心优势与标准化应用场景白皮书

引言随着全球 2G/3G 网络加速退网,中速率蜂窝物联网技术成为工业串口设备联网的主流方案。LTE Cat‑1 凭借下行 10Mbps、上行 5Mbps 的峰值速率、<50ms 低时延与高性价比,成为工业 DTU 的核心通信制式,2025 年市场渗透率已达 68%&…...

【多线路故障】含sop的配电网故障重构研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

AI时代程序员真的会被替代吗_一份冷静的岗位分析报告

AI 时代,程序员真的会被替代吗?——一份冷静的岗位分析报告 本文不贩卖焦虑,也不粉饰太平。用真实的数据、具体的岗位走势、可验证的逻辑,分析 AI 对程序员行业的影响——什么岗位在消失、什么岗位在增长、以及作为个体应该怎么应…...

深入浅出 16.1 例题(二叉树)P4715 P4913

淘汰赛 P4715 符合二叉树结构 输入叶子结点。叶子结点共2^n 个&#xff0c;则编号从2^n开始&#xff08;完美二叉树每层起始编号这层结点个数&#xff09;。 for(int i0;i< 1<<n;i){ // 一共2^n个结点cin>>v[(1<<n) i]; // 树中编号从2^n开始&#xff0c…...

混合ToF传感器技术解析:30米测距与强光抗干扰

1. 混合式飞行时间&#xff08;ToF&#xff09;3D测距传感器技术解析在机器人导航和自主系统领域&#xff0c;精确的距离测量一直是核心技术挑战。传统间接ToF传感器虽然能提供毫米级精度&#xff0c;但最大测距通常局限在4-5米范围内&#xff0c;且易受环境光干扰。Toppan与Br…...

WSC混合并行计算架构与TCME通信优化解析

1. WSC混合并行计算架构解析晶圆级计算(Wafer-Scale Computing, WSC)是当前分布式训练的前沿架构&#xff0c;其核心特征是将数百个计算单元集成在单一晶圆上。与传统GPU集群相比&#xff0c;WSC具有两个显著优势&#xff1a;首先&#xff0c;die-to-die互连带宽可达4TB/s&…...

第14课:团队协作中的 Claude Code

阅读时长&#xff1a;约20分钟 难度&#xff1a;★★★☆☆ 适合人群&#xff1a;已经个人用好了 Claude Code&#xff0c;想在团队里推广的开发者和技术负责人 学完之后&#xff1a;你能设计一套团队共享的 Claude Code 协作方案&#xff0c;并且知道怎么推广而不引起反感一个…...

BP Doctor PRO智能手表评测:血压监测与健康管理

1. BP Doctor PRO 双功能智能手表深度评测作为一名长期关注健康监测设备的技术博主&#xff0c;我最近体验了BP Doctor PRO这款集智能手表与血压监测于一体的创新设备。相比传统方案需要同时携带蓝牙血压计和智能手环&#xff0c;这款产品确实带来了显著的使用便利性。从硬件配…...

Unity移动端特效开发与优化实战指南

1. Unity移动端特效开发核心思路在移动端游戏开发中&#xff0c;特效实现需要平衡视觉效果与性能消耗。与PC/主机平台不同&#xff0c;移动设备受限于GPU算力和内存带宽&#xff0c;必须采用针对性的优化方案。Arm的Mali GPU架构指南揭示了几个关键原则&#xff1a;计算密集型操…...

基于VirtualLab Fusion的光学检测与精密成像(光学检测、精密成像、显微镜系统)课程

基于VirtualLab Fusion的光学检测与精密成像&#xff08;光学检测、精密成像、显微镜系统&#xff09;课程时长&#xff1a;2天/城市授课地点&#xff1a;上海本课程聚焦于利用VirtualLab Fusion先进的光之数字模型平台&#xff0c;解决光学检测与精密成像系统的核心设计挑战。…...

网易云音乐FLAC无损音乐批量下载:3步轻松获取高品质音乐库

网易云音乐FLAC无损音乐批量下载&#xff1a;3步轻松获取高品质音乐库 【免费下载链接】NeteaseCloudMusicFlac 根据网易云音乐的歌单, 下载flac无损音乐到本地.。 项目地址: https://gitcode.com/gh_mirrors/nete/NeteaseCloudMusicFlac 你是否渴望拥有高品质的无损音乐…...

基于VirtualLab Fusion的微结构仿真设计与加工技术(光栅、超表面、蛾眼结构的仿真与加工技术)课程

基于VirtualLab Fusion的微结构仿真设计与加工技术&#xff08;光栅、超表面、蛾眼结构的仿真与加工技术&#xff09;课程时间&#xff1a;2026/5/19&#xff08;二&#xff09;-5/20&#xff08;三&#xff09;课程地点&#xff1a;上海微结构元件作为现代光学系统的核心组成部…...

实际生产开发到底怎么用锁?单体本地锁/数据库锁/Redis分布式锁 真实场景

文章目录前言&#xff1a;别再瞎加锁&#xff01;生产用锁只看「场景部署环境」一、第一种锁&#xff1a;Java单体本地锁&#xff08;synchronized\Atomic原子类&#xff09;1.1 精准适用生产场景&#xff08;只有这种情况才用&#xff0c;多一概不碰&#xff09;1.2 真实生产业…...

Linux RT 调度器的 set_next_task:下一个 RT 任务的设置

前言作为深耕 Linux 内核十余年的工程师&#xff0c;我常年深耕嵌入式实时系统、工业控制、车载终端等 Linux RT 场景。在 Linux 实时调度&#xff08;RT Scheduler&#xff09;中&#xff0c;set_next_task 是 RT 调度器的核心入口函数之一&#xff0c;它直接决定了下一个要运…...

G-Helper终极指南:三步释放华硕笔记本隐藏性能

G-Helper终极指南&#xff1a;三步释放华硕笔记本隐藏性能 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Strix, Scar, and…...

我用一个工具将Claude代码探索时间和成本降低了 90%

每个 Claude Code 用户&#xff0c;大概都熟悉这种崩溃感。 你打开一个全新的会话&#xff0c;输入一个看起来很简单的问题&#xff0c;然后眼睁睁看着它开始“考古”&#xff1a; ⏺ Explore(“How does the extension host communicate with the main process?”)⎿ Done (5…...

从Cron到任务编排:深入解析mission-control自动化调度平台

1. 项目概述&#xff1a;从“任务控制”到个人效率中枢最近在折腾个人工作流自动化的时候&#xff0c;发现了一个挺有意思的项目&#xff0c;叫crshdn/mission-control。光看这个名字&#xff0c;就有点意思——“任务控制”&#xff0c;听起来像是NASA指挥中心那种感觉。实际上…...

GPT-2文本生成实战:从原理到应用

1. GPT-2文本生成实战指南作为一名长期从事NLP开发的工程师&#xff0c;我见证了GPT-2从惊艳亮相到成为行业标配的过程。这个由OpenAI在2019年发布的语言模型&#xff0c;以其出色的文本生成能力改变了我们处理自然语言任务的方式。不同于早期的RNN和LSTM模型&#xff0c;GPT-2…...

DeepEyesV2:多模态大语言模型的工具调用与强化学习优化

1. DeepEyesV2&#xff1a;多模态大语言模型的工具调用与强化学习优化实践多模态大语言模型&#xff08;MLLM&#xff09;正在重塑人机交互的边界。作为从业者&#xff0c;我们见证了从纯文本模型到视觉-语言联合理解的范式转变。DeepEyesV2作为这一领域的代表性工作&#xff0…...

EDAN工具解析:HPC内存优化与执行DAG分析

1. EDAN工具与HPC内存优化概述在现代高性能计算(HPC)领域&#xff0c;内存子系统性能已成为制约整体计算效率的关键瓶颈。随着计算单元与内存资源在物理上的解耦趋势&#xff08;即资源解耦架构&#xff09;&#xff0c;内存访问延迟问题变得愈发突出。传统服务器架构中&#x…...

python的个人注释分区规范

# # 项目: xxx # 文件: xxx.py # 作者: xxx # 创建时间: 2026-04-27 # 描述: # # # 库导入 # import os import sysimport pandas as pd import numpy as np# from xxx import xxx# # 全局配置 # DEBUG True THRESHOLD 0.05# # 核心函数 # def calc_path(points):"…...

深度测评2026年家政小程序推荐榜单:解决生活难题的前3款高口碑产品

家政小程序作为2026年数字生活服务的重要组成部分&#xff0c;正通过技术革新与模式优化深度融入用户的日常家务场景。本次深度解析聚焦于行业前三强的核心方案&#xff0c;从服务架构、操作效率到口碑数据展开横向比对&#xff0c;为家庭及个人用户提供选型参考。领先的家政小…...

Vibe Coding:大语言模型辅助编程实践指南

1. 项目概述最近在尝试一种新的编程方式——让大语言模型辅助完成编码任务。这种被称为"Vibe Coding"的方法&#xff0c;核心在于将复杂开发任务拆解为可管理的子任务&#xff0c;并通过质量监督机制确保代码产出。经过三个月的实践&#xff0c;我发现这种方式能显著…...

基于LLM与OpenClaw的AI智能体架构实践:构建自动化学生助理

1. 项目概述&#xff1a;一个能主动思考的AI学生助理如果你是一名学生&#xff0c;或者曾经是&#xff0c;你一定对那种被各种作业、实验报告和项目截止日期追着跑的感觉深有体会。日历上密密麻麻的标记&#xff0c;稍不留神就可能错过一个重要的提交时间。传统的待办事项应用需…...

AgentFlocks:构建去中心化多智能体协作系统的开源框架实践

1. 项目概述&#xff1a;从“羊群”到“智能体集群”的范式跃迁最近在开源社区里&#xff0c;一个名为AgentFlocks/flocks的项目引起了我的注意。这个名字很有意思&#xff0c;“flocks”直译是“羊群”或“鸟群”&#xff0c;而“Agent”则指向了当下最热的智能体。这不禁让我…...

如何在雀魂对局中获得AI实时分析:Akagi麻将辅助工具完整指南

如何在雀魂对局中获得AI实时分析&#xff1a;Akagi麻将辅助工具完整指南 【免费下载链接】Akagi 支持雀魂、天鳳、麻雀一番街、天月麻將&#xff0c;能夠使用自定義的AI模型實時分析對局並給出建議&#xff0c;內建Mortal AI作為示例。 Supports Majsoul, Tenhou, Riichi City,…...

如何在Windows上使用BetterJoy实现Switch手柄的完美兼容:5分钟快速指南

如何在Windows上使用BetterJoy实现Switch手柄的完美兼容&#xff1a;5分钟快速指南 【免费下载链接】BetterJoy Allows the Nintendo Switch Pro Controller, Joycons and SNES controller to be used with CEMU, Citra, Dolphin, Yuzu and as generic XInput 项目地址: http…...

毕设选题避坑:这 5 类题目千万不要选,谁选谁挂

毕设选题避坑&#xff1a;这 5 类题目千万不要选&#xff0c;谁选谁挂适用对象&#xff1a;正在选题、或者已经选了但心里没底的计算机 / 软工 / 信管同学。 结论先说&#xff1a;有些题目看起来“高大上”&#xff0c;实际上做不完、讲不清、答辩必翻车&#xff0c;千万别踩坑…...

Transformer残差流与内部策略的深度解析

1. Transformer残差流与内部策略的深层解析在深入探讨大语言模型(LLM)的内部工作机制前&#xff0c;我们需要理解Transformer架构中一个关键但常被忽视的组件——残差流(residual stream)。这个信息高速公路贯穿整个模型&#xff0c;承载着从输入到输出的语义演变过程。1.1 残差…...