FUTo

FUTo_enhanced.zip 著名的的Rootkit,有很强的学习价值 立即下载
Author: peter # Views: 1259 Printer Friendly ...

 Foreward

Since the introduction of FU, the rootkit world has moved away from implementing system hooks to hide their presence. Because of this change in offense, a new defense had to be developed. The new algorithms used by rootkit detectors, such as BlackLight, attempt to find what the rootkit is hiding instead of simply detecting the presence of the rootkit's hooks. This paper will discuss an algorithm that is used by both Blacklight and IceSword to detect hidden processes. This paper will also document current weaknesses in the rootkit detection field and introduce a more complete stealth technique implemented as a prototype in FUTo.

Thanks:

Peter would like to thank bugcheck, skape, thief, pedram, F-Secure for doing great research, and all the nologin/research'ers who encourage mind growth.

C.H.A.O.S. would like to thank Amy, Santa (this work was three hours on Christmas day), lonerancher, Pedram, valerino, and HBG Unit.

 Introduction

In the past year or two, there have been several major developments in the rootkit world. Recent milestones include the introduction of the FU rootkit, which uses Direct Kernel Object Manipulation (DKOM); the introduction of VICE, one of the first rootkit detection programs; the birth of Sysinternals' Rootkit Revealer and F-Secure's Blacklight, the first mainstream Windows rootkit detection tools; and most recently the introduction of Shadow Walker, a rootkit that hooks the memory manager to hide in plain sight.

Enter Blacklight and IceSword. The authors chose to investigate the algorithms used by both Blacklight and IceSword because they are considered by many in the field to be the best detection tools. Blacklight, developed by the Finnish security company F-Secure, is primarily concerned with detecting hidden processes. It does not attempt to detect system hooks; it is only concerned with hidden processes. IceSword uses a very similar method to Blacklight. IceSword differentiates itself from Blacklight in that it is a more robust tool allowing the user to see what system calls are hooked, what drivers are hidden, and what TCP/UDP ports are open that programs, such as netstat, do not.

 Blacklight

This paper will focus primarily on Blacklight due to its algorithm being the research focus for this paper. Also, it became apparent after researching Blacklight that IceSword used a very similiar algorithm. Therefore, if a weakness was found in Blacklight, it would most likely exist in IceSword as well.

Blacklight takes a userland approach to detecting processes. Although simplistic, its algorithm is amazingly effective. Blacklight uses some very strong anti-debugging features that begin by creating a Thread Local Storage (TLS) callback table. Blacklight's TLS callback attempts to befuddle debuggers by forking the main process before the process object is fully created. This can occur because the TLS callback routine is called before the process is completely initialized. Blacklight also has anti-debugging measures that detect the presence of debuggers attaching to it. Rather than attempting to beat the anti-debugging measures by circumventing the TLS callback and making other program modifications, the authors decided to just disable the TLS routine. To do this, the authors used a tool called LordPE. LordPE allows users to edit PE files. The authors used this tool to zero out the TLS callback table. This disabled the forking routine and gave the authors the ability to use an API Monitor. It should be noted that disabling the callback routine would allow you to attach a debugger, but when the user clicked "scan" in the Blacklight GUI Blacklight would detect the debugger and exit. Instead of working up a second measure to circumvent the anti-debugging routines, the authors decided to analyze the calls occuring within Blacklight. To this end, the authors used Rohitabs API Monitor.

In testing, one can see failed calls to the API OpenProcess (tls zero is Blacklight without a TLS table). Blacklight tries opening a process with process id (PID) of 0x1CC, 0x1D0, 0x1D4, 0x1D8 and so on. The authors dubbed the method Blacklight uses as PID Bruteforce (PIDB). Blacklight loops through all possible PIDS calling OpenProcess on the PIDs in the range of 0x0 to 0x4E1C. Blacklight keeps a list of all processes it is able to open, using the PIDB method. Blacklight then calls CreateToolhelp32Snapshot, which gives Blacklight a second list of processes. Blacklight then compares the two lists, to see if there are any processes in the PIDB list that are not in the list returned by the CreateToolhelp32Snapshot function. If there is any discrepancy, these processes are considered hidden and reported to the user.

 Windows OpenProcess

In Windows, the OpenProcess function is a wrapper to the NtOpenProcess routine. NtOpenProcess is implemented in the kernel by NTOSKRNL.EXE. The function prototype for NtOpenProcess is:

NTSTATUS NtOpenProcess (
    OUT PHANDLE ProcessHandle,
    IN ACCESS_MASK DesiredAccess,
    IN POBJECT_ATTRIBUTES ObjectAttributes,
    IN PCLIENT_ID ClientId OPTIONAL);

The ClientId parameter is the actual PID that is passed by OpenProcess. This parameter is optional, but during our observation the OpenProcess function always specified a ClientId when calling NtOpenProcess.

NtOpenProcess performs three primary functions:
  • 1. It verifies the process exists by calling PsLookupProcessByProcessId.
  • 2. It attempts to open a handle to the process by calling ObOpenObjectByPointer.
  • 3. If it was successful opening a handle to the process, it passes the handle back to the caller.
PsLookupProcessByProcessId was the next obvious place for research. One of the outstanding questions was how does PsLookupProcessByProcessId know that a given PID is part of a valid process? The answer becomes clear in the first few lines of the disassembly:

PsLookupProcessByProcessId:
  mov edi, edi
  push ebp
  mov ebp, esp
  push ebx
  push esi
  mov eax, large fs:124h
  push [ebp+arg_4]
  mov esi, eax
  dec dword ptr [esi+0D4h]
  push PspCidTable
  call ExMapHandleToPointer

From the above disassembly, it is clear that ExMapHandleToPointer queries the PspCidTable for the process ID.

Now we have a complete picture of how Blacklight detects hidden processes:
  • 1. Blacklight starts looping through the range of valid process IDs, 0 through 0x41DC.
  • 2. Blacklight calls OpenProcess on every possible PID.
  • 3. OpenProcess calls NtOpenProcess.
  • 4. NtOpenProcess calls PsLookupProcessByProcessId to verify the process exists.
  • 5. PsLookupProcessByProcessId uses the PspCidTable to verify the processes exists.
  • 6. NtOpenProcess calls ObOpenObjectByPointer to get the handle to the process.
  • 7. If OpenProcess was successful, Blacklight stores the information about the process and continues to loop.
  • 8. Once the process list has been created by exhausting all possible PIDs. Blacklight compares the PIDB list with the list it creates by calling CreateToolhelp32Snapshot. CreateToolhelp32Snapshot is a Win32 API that takes a snapshot of all running processes on the system. A discrepancy between the two lists implies that there is a hidden process. This case is reported by Blacklight.
 PspCidTable

The PspCidTable is a "handle table for process and thread client IDs". Every process' PID corresponds to its location in the PspCidTable. The PspCidTable is a pointer to a HANDLE_TABLE structure.

typedef struct _HANDLE_TABLE {
   PVOID        p_hTable;
   PEPROCESS    QuotaProcess;
   PVOID        UniqueProcessId;
   EX_PUSH_LOCK HandleTableLock [4];
   LIST_ENTRY   HandleTableList;
   EX_PUSH_LOCK HandleContentionEvent;
   PHANDLE_TRACE_DEBUG_INFO DebugInfo;
   DWORD        ExtraInfoPages;
   DWORD        FirstFree;
   DWORD        LastFree;
   DWORD        NextHandleNeedingPool;
   DWORD        HandleCount;
   DWORD        Flags;
};

Windows offers a variety of non-exported functions to manipulate and retrieve information from the PspCidTable. These include:
  • - [ExCreateHandleTable] creates non-process handle tables. The objects within all handle tables except the PspCidTable are pointers to object headers and not the address of the objects themselves.
  • - [ExDupHandleTable] is called when spawning a process.
  • - [ExSweepHandleTable] is used for process rundown.
  • - [ExDestroyHandleTable] is called when a process is exiting.
  • - [ExCreateHandle] creates new handle table entries.
  • - [ExChangeHandle] is used to change the access mask on a handle.
  • - [ExDestroyHandle] implements the functionality of CloseHandle.
  • - [ExMapHandleToPointer] returns the address of the object corresponding to the handle.
  • - [ExReferenceHandleDebugIn] tracing handles.
  • - [ExSnapShotHandleTables] is used for handle searchers (for example in oh.exe).
Below is code that uses non-exported functions to remove a process object from the PspCidTable. It uses hardcoded addresses for the non-exported functions necessary; however, a rootkit could find these function addresses dynamically.

typedef PHANDLE_TABLE_ENTRY (*ExMapHandleToPointerFUNC)
                     ( IN PHANDLE_TABLE HandleTable,
                       IN HANDLE ProcessId);

void HideFromBlacklight(DWORD eproc)
{
               PHANDLE_TABLE_ENTRY CidEntry;
               ExMapHandleToPointerFUNC map;
               ExUnlockHandleTableEntryFUNC umap;
               PEPROCESS p;
               CLIENT_ID ClientId;

               map = (ExMapHandleToPointerFUNC)0x80493285;

               CidEntry = map((PHANDLE_TABLE)0x8188d7c8,
                         LongToHandle( *((DWORD*)(eproc+PIDOFFSET)) ) );
               if(CidEntry != NULL)
               {
                  CidEntry->Object = 0;
               }
               return;
}

Since the job of the PspCidTable is to keep track of all the processes and threads, it is logical that a rootkit detector could use the PspCidTable to find hidden processes. However, relying on a single data structure is not a very robust algorithm. If a rootkit alters this one data structure, the operating system and other programs will have no idea that the hidden process exists. New rootkit detection algorithms should be devised that have overlapping dependencies so that a single change will not go undetected.

 FUTo

To demonstrate the weaknesses in the algorithms currently used by rootkit detection software such as Blacklight and Icesword, the authors have created FUTo. FUTo is a new version of the FU rootkit. FUTo has the added ability to manipulate the PspCidTable without using any function calls. It uses DKOM techniques to hide particular objects within the PspCidTable.

There were some design considerations when implementing the new features in FUTo. The first was that, like the ExMapHandleXXX functions, the PspCidTable is not exported by the kernel. In order to overcome this, FUTo automatically detects the PspCidTable by finding the PsLookupProcessByProcessId function and disassembling it looking for the first function call. At the time of this writing, the first function call is always to ExMapHandleToPointer. ExMapHandleToPointer takes the PspCidTable as its first parameter. Using this knowledge, it is fairly straightforward to find the PspCidTable.

PsLookupProcessByProcessId:
  mov edi, edi
  push ebp
  mov ebp, esp
  push ebx
  push esi
  mov eax, large fs:124h
  push [ebp+arg_4]
  mov esi, eax
  dec dword ptr [esi+0D4h]
  push PspCidTable
  call ExMapHandleToPointer

A more robust method to find the PspCidTable could be written as this algorithm will fail if even simple compiler optimizations are made on the kernel. Opc0de wrote a more robust method to detect non-exported variables like PspCidTable, PspActiveProcessHead, PspLoadedModuleList, etc. Opc0des method does not requires memory scanning like the method currently used in FUTo. Instead Opc0de found that the KdVersionBlock field in the Process Control Region structure pointed to a structure KDDEBUGGER_DATA32. The structure looks like this:

typedef struct _KDDEBUGGER_DATA32 {

    DBGKD_DEBUG_DATA_HEADER32 Header;
    ULONG   KernBase;
    ULONG   BreakpointWithStatus;       // address of breakpoint
    ULONG   SavedContext;
    USHORT  ThCallbackStack;            // offset in thread data
    USHORT  NextCallback;               // saved pointer to next callback frame
    USHORT  FramePointer;               // saved frame pointer
    USHORT  PaeEnabled:1;
    ULONG   KiCallUserMode;             // kernel routine
    ULONG   KeUserCallbackDispatcher;   // address in ntdll

    ULONG   PsLoadedModuleList;
    ULONG   PsActiveProcessHead;
    ULONG   PspCidTable;

    ULONG   ExpSystemResourcesList;
    ULONG   ExpPagedPoolDescriptor;
    ULONG   ExpNumberOfPagedPools;

    [...]

    ULONG   KdPrintCircularBuffer;
    ULONG   KdPrintCircularBufferEnd;
    ULONG   KdPrintWritePointer;
    ULONG   KdPrintRolloverCount;

    ULONG   MmLoadedUserImageList;

} KDDEBUGGER_DATA32, *PKDDEBUGGER_DATA32;

As the reader can see the structure contains pointers to many of the commonly needed/used non-exported variables. This is one more robust method to finding the PspCidTable and other variables like it.

The second design consideration was a little more troubling. When FUTo removes an object from the PspCidTable, the HANDLE_ENTRY is replaced with NULLs representing the fact that the process "does not exist." The problem then occurs when the process that is hidden (and has no PspCidTable entries) is closed. When the system tries to close the process, it will index into the PspCidTable and dereference a null object causing a blue screen. The solution to this problem is simple but not elegant. First, FUTo sets up a process notify routine by calling PsSetCreateProcessNotifyRoutine. The callback function will be invoked whenever a process is created, but more importantly it will be called whenever a process is deleted. The callback executes before the hidden process is terminated; therefore, it gets called before the system crashes. When FUTo deletes the indexes that contain objects that point to the rogue process, FUTo will save the value of the HANDLE_ENTRYs and the index for later use. When the process is closed, FUTo will restore the objects before the process is closed allowing the system to dereference valid objects.

 Conclusion

The catch phrase in 2005 was, ``We are raising the bar [again] for rootkit detection''. Hopefully the reader has walked away with a better understanding of how the top rootkit detection programs are detecting hidden processes and how they can be improved. Some readers may ask "What can I do?" Well, the simple solution is not to connect to the Internet, but a combination of using both Blacklight, IceSword and Rootkit Revealer will greatly help your chances of staying rootkit free. A new tool called RAIDE (Rootkit Analysis Identification Elimination) will be unveiled in the coming months at Blackhat Amsterdam. This new tool does not suffer from the problems brought forth here.

 Bibliography

[1] Blacklight Homepage. F-Secure Blacklight http://www.f-secure.com/blacklight/
[2]FU Project Page. FU http://www.rootkit.com/project.php?id=12
[3]IceSword Homepage. IceSword http://www.xfocus.net/tools/200505/1032.html
[4]LordPE Homepage. LordPE Info http://mitglied.lycos.de/yoda2k/LordPE/info.htm
[5]Opc0de. 2005. How to get some hidden kernel variables without scanning http://www.rootkit.com/newsread.php?newsid=101
[6]Rohitabs API Monitor. API Monitor - Spy on API calls http://www.rohitab.com/apimonitor/
[7]Russinovich, Solomon. Microsoft Windows Internals Fourth Edition.
[8]Silberman. RAIDE:Rootkit Analysis Identification Elimination http://www.blackhat.com/html/bh-europe-06/bh-eu-06-speakers.htmlSilberman
py-futu-api:富途 OpenAPI Python SDK 富途 OpenAPI 简介 开源项目可以满足使用进行量化投资的需求, 并提供包括Python、Json/Protobuf协议的行情及交易接口。 安装 pip install futu-api 注: 本API支持Python2.7/Python3.x, 推荐安装anaconda2或anaconda3环境,方便快捷。 快速上手 # 导入futu-api import futu as ft # 实例化行情上下文对象 quote_ctx = ft.OpenQuoteContext(host="127.0.0.1", port=11111) # 上下文控制 quote_ctx.start() # 开启异步数据接收 quote_ctx.set_handler(ft.TickerHandlerBase()) # 设置用于异步处理数据的回调对象(可派生支持自定义) # 低频数据 立即下载

相关推荐

Python-futuapi富途量化投资平台FutuQuantTradingAPI

​futu-api开源项目可以满足使用富途Open API软件进行量化投资的需求, 提供包括Python接口、Json和Protobuf接口的行情及交易的API。

FUTo: Bypassing Blacklight and IceSword

1.前言摘要自从介绍了FU,ROOTKIT世界就从执行系统HOOK,转移到了隐藏他们的存在。因为在攻击方面新的改变,那么新的防御就不得被建立。新的算法被ROOTKIT检测系统采用。例如BLACKLIGHT,就已经从原来检测ROOTKIT HOOK的存在,转变到试图找到是什么ROOTKIT正在隐藏。这篇文章将讨论被Blacklight和IceSword用来检隐藏进程的算法。他也将展示,在ROOTKI

1259

Python数据爬取超详细讲解(零基础入门,老年人都看的懂)

Python数据爬取超详细讲解(零基础入门,老年人都看的懂)

python03011的博客 3754

[转载]基于pspCidTable的进程检测技术

基于pspCidTable的进程检测技术文章作者:gz1x信息来源:邪恶八进制信息安全团队(www.eviloctal.com)一.     pspCidTable概念及内核调试二.     获取pspCidTable的方法三.     几种进程检测方法的对比四.     anti-pspCidTable技术及其他一.     pspCidTable概念及内核调试-----------------

yaneng的专栏 4534

MineMap开发教程: 北斗网格位置码实时调度技术详解

本文介绍了MineMap4.0引擎中北斗网格位置码的实时调度技术。北斗网格位置码是我国自主研发的空间位置编码标准,具有层次化结构、三维编码等特点。MineMap4.0通过BeiDouGrid类实现了高效的实时调度机制,重点展示了按预想高度进行网格调度的核心功能。关键技术包括视锥体裁剪、LOD控制、高度筛选算法和交互式查询等。该技术在智慧城市、环境监测等领域具有广泛应用前景,凭借高性能、高精度等优势,为三维地理信息可视化提供了有力支撑。

weixin_42568040的博客 1457

用Python手把手教你实现一个多层感知机(MLP)——从理论到代码实战

本文详细介绍了如何使用Python和Theano库从零开始实现多层感知机(MLP),涵盖从核心原理到代码实战的全过程。通过构建隐藏层、输出层和完整MLP模型,结合权重初始化、激活函数选择和训练技巧,帮助开发者深入理解神经网络工作机制,并应用于实际机器学习任务。

web39explorer的博客 971

KPCR

KPCR结构体 CPU临时记录线程信息的一个结构体 kd> dt _kpcr nt!_KPCR +0x000 NtTib : _NT_TIB +0x01c SelfPcr : Ptr32 _KPCR +0x020 Prcb : Ptr32 _KPRCB +0x024 Irql : UChar +0x02...

qq_41490873的博客 387

【Bug已解决】openclaw max turns reached / Tool calls exceeded limit — OpenClaw 最大轮次超限解决方案

OpenClaw 在执行过程中达到最大轮次限制任务未完成,本质是 --max-turns 设置过小或任务过于复杂。文中给出增加轮次、--continue 继续、分步执行等完整方案。

一键难忘的博客 5505

Rootkit技术

随着安全技术的发展和计算机用户群的技术提高,一般的木马后门越来越难生存,于是一部分有能力的后门作者把眼光投向了系统底层——ring 0。位于ring 0层的是系统核心模块和各种驱动程序模块,所以位于这一层的木马也是以驱动的形式生存的,而不是一般的exe。后门作者把后门写成符合wdm规范 (windows driver model)的驱动程序模块,把自身添加进注册表的驱动程序加载入口,便实现了“无启

唯一谣|Airs|走尽天涯路|极地阳光 917

打破RK3588 GPIO中断响应延迟的枷锁,开启高效编程

本文针对RK3588芯片在智能安防和工业自动化应用中出现的GPIO中断响应延迟问题展开深入分析。通过硬件原理剖析,发现延迟主要源于中断控制器优先级设置、线路干扰等硬件因素,以及中断处理函数复杂、内核调度延迟等软件问题。提出硬件优化方案包括合理布局布线、电源稳定设计,软件层面则通过精准配置设备树、精简中断处理函数、利用工作队列等内核机制进行优化。测试结果显示,优化后中断响应延迟从50-80ms降至10-20ms,高负载下也能稳定在50ms以内。文章最后展望了AI技术在中断调度中的潜在应用价值。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 364

RK3588&RK3576实现 HW-ID DTB(动态加载不同的Kernel DTB)功能

RK平台的U-Boot⽀持检测硬件上的GPIO或者ADC状态动态加载不同的Kernel DTB,暂称为HW-ID DTB(Hardware id DTB)功能。

Wynter 849

如何在10分钟内安装和配置FUTO Keyboard:新手快速入门教程

FUTO Keyboard是一款注重隐私保护的现代Android键盘,基于Android开源键盘LatinIME开发,确保所有操作在本地完成,不会收集用户数据。本教程将帮助你在10分钟内完成安装和基础配置,让你快速体验这款安全高效的键盘工具。 ## 准备工作:了解FUTO Keyboard的核心优势 FUTO Keyboard的核心理念是**离线优先**和**隐私保护**,与其他键盘应用相比,

gitblog_00962的博客 543

【Agent】AI Agent架构趋势及演进

本文系统介绍了AI Agent架构的发展趋势和技术框架,涵盖单Agent与多Agent系统设计、提示词工程与上下文管理、SpringAI开发框架等关键技术。重点阐述了AI原生应用参考架构,包括Nacos配置管理、Higress AI网关、RocketMQ会话状态管理等核心组件解决方案。同时深入探讨了AI应用可观测性体系,包含OpenTelemetry全链路追踪、关键指标监控以及基于LoongSuite开源工具的数据采集评估方法,为构建高效可靠的AI应用提供了全景式技术参考。

一个内容严谨、方向前沿、极具实践价值的AI大模型技术分享站 1107

FUTO Keyboard键盘布局系统解析:支持自定义和手势输入的完整方案

FUTO Keyboard是一款专注于隐私保护的Android开源键盘应用,提供完整的键盘布局系统和手势输入功能。这款键盘基于Android开源键盘LatinIME开发,通过创新的键盘布局设计和强大的自定义功能,为用户提供安全、高效且个性化的输入体验。前100字内自然地融入了核心关键词FUTO Keyboard、键盘布局和手势输入。 ## 🎯 为什么选择FUTO Keyboard? FUTO

gitblog_00881的博客 414

基于YOLOv10的PCB电子元件智能识别系统设计与实现

数据预处理模块:负责对原始PCB图像进行标注、增强和格式转换模型训练模块:基于YOLOv10架构进行模型训练和优化推理检测模块:加载训练好的模型进行实时检测用户界面模块:提供友好的交互界面,方便用户操作和结果可视化YOLO(You Only Look Once)系列算法自2016年提出以来,经历了多次迭代更新。YOLOv1-v3:奠定了YOLO系列的基础架构YOLOv4-v7:引入大量优化技巧和网络结构改进YOLOv8-v9:进一步优化模型结构和训练策略YOLOv10。

YOLO 157

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

FUTO Keyboard完全指南:构建现代化离线Android键盘系统

FUTO Keyboard是一款专注于隐私保护的现代化Android开源键盘应用,旨在为用户提供完全离线的输入体验,确保您的打字数据永远不会被跟踪或收集。作为LatinIME项目的分支,它保留了Android开源键盘的所有功能,同时加入了重要的隐私保护改进。 ## 为什么选择FUTO Keyboard? 在当今数据驱动的时代,大多数键盘应用都会在后台收集您的输入习惯和个人信息。FUTO Key

gitblog_00490的博客 665

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

FUTO Keyboard主题系统:自定义键盘外观的完整教程

FUTO Keyboard是一款功能强大的开源Android键盘应用,提供了丰富的主题系统,让你可以轻松自定义键盘的外观,打造属于自己的个性化输入体验。无论是喜欢深色模式还是明亮主题,FUTO Keyboard都能满足你的需求。 ## 探索FUTO Keyboard的主题世界 FUTO Keyboard内置了多种精美的主题,涵盖了不同的风格和色彩方案,让你可以根据自己的喜好和使用场景进行选择。

gitblog_00196的博客 474

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

如何构建和发布FUTO Keyboard应用:完整部署指南

FUTO Keyboard是一款注重隐私保护的Android键盘应用,完全离线运行,不会收集用户数据。本文将为您提供完整的FUTO Keyboard构建和发布指南,帮助您从源代码编译到最终部署的全过程。无论您是开发者想要贡献代码,还是用户想要自定义构建,这篇教程都将为您提供详细的步骤说明。 ## 🚀 环境准备与项目克隆 在开始构建FUTO Keyboard之前,您需要准备好以下开发环境:

gitblog_00276的博客 396

安卓默认键盘正在追踪你!两种方法教你避免,FUTO 键盘是更好选择

默认情况下,“操作”键设置为打开表情符号选择器,但可以将其更改为任何包含的操作,比如语音输入、切换语言、撤销、重做、文本编辑器、剪贴板管理器、主题切换器、键盘模式、设置、从剪贴板粘贴、剪切到剪贴板、复制到剪贴板、全选、上箭头、下箭头、左箭头、右箭头和单词样式等。要禁用这些功能(绝对应该这么做),打开手机的“设置”应用,输入“语言”,点击“语言 - Gboard”,点击“隐私”,然后将每个选项的开关滑到“关闭”位置。Gboard 是安卓默认键盘,除非花时间让它变得更隐私,否则它就在追踪你。

safetybug的博客 20

FUTO Keyboard多语言支持详解:从英语到藏语的完整布局方案

FUTO Keyboard是一款基于Android开源键盘LatinIME构建的现代化输入法应用,专注于提供**离线隐私保护**和**多语言输入体验**。作为一款开源键盘项目,FUTO Keyboard支持从英语到藏语等多种语言的完整布局方案,为用户提供安全、高效的输入解决方案。💪 ## 🌍 FUTO Keyboard的多语言支持架构 FUTO Keyboard的多语言支持建立在强大的语言

gitblog_00007的博客 158

FUTO Keyboard多语言输入法:从英语到藏语Wylie转换器的实现指南 [特殊字符]

在移动设备上输入非拉丁文字一直是技术挑战,特别是对于像藏语这样的复杂文字系统。FUTO Keyboard作为一款专注于隐私保护的Android开源键盘,通过创新的Wylie转换器技术,为藏语用户提供了完美的输入解决方案。本文将深入探讨这款多语言输入法的核心功能,特别是其藏语Wylie转换器的实现原理和使用方法。 ## 什么是FUTO Keyboard?🤔 FUTO Keyboard是基于An

gitblog_01146的博客 540

FUTO Keyboard手势输入系统:滑动输入的高级实现原理

FUTO Keyboard是一款功能强大的开源Android键盘应用,其核心亮点之一就是精准高效的手势输入系统。通过滑动输入功能,用户可以在不抬起手指的情况下快速输入单词,大幅提升打字效率。本文将深入解析FUTO Keyboard手势输入系统的实现原理,带你了解滑动输入背后的技术奥秘。 ## 手势输入的核心技术架构 FUTO Keyboard的手势输入系统采用了多层次的技术架构,从触摸感知到最

gitblog_00477的博客 313

FUTO Keyboard隐私保护功能深度解析:为何选择完全离线输入法

在数字时代,隐私保护已成为用户选择软件的重要考量因素。FUTO Keyboard作为一款完全离线的输入法应用,为用户提供了终极的隐私保护解决方案。这款开源的Android键盘应用承诺"保持离线且不监视用户",让您的每一次按键都安全地停留在设备本地,彻底告别数据泄露风险。 ## 🔒 完全离线:隐私保护的核心优势 FUTO Keyboard最核心的隐私保护功能就是**完全离线运行**。与大多数主

gitblog_00442的博客 364

FUTO Keyboard智能联想功能:基于本地词典的完整实现方案

在当今注重隐私的数字时代,FUTO Keyboard提供了一个创新的解决方案:完全离线的智能联想输入功能。这款开源键盘应用通过本地词典技术实现智能联想,确保您的输入数据永远不会离开设备,同时提供流畅的输入体验。😊 ## 🔍 智能联想的核心架构 FUTO Keyboard的智能联想功能建立在多层词典系统之上,主要包括以下几个关键组件: ### 1. 词典管理器(DictionaryFaci

gitblog_00508的博客 373

如何掌握FUTO Keyboard死键组合键:终极字符输入解决方案

FUTO Keyboard作为一款功能强大的开源Android输入法,在处理特殊字符输入方面有着出色的表现,特别是其死键(Dead Key)和组合键处理机制。🎯 无论是需要输入带重音符号的外语字符,还是复杂的数学符号,FUTO Keyboard都能提供完整而高效的解决方案。 ## 🔧 什么是死键和组合键? 在键盘输入中,**死键**指的是那些不会立即产生可见字符的按键,而是等待后续按键来组

gitblog_00586的博客 359
上一篇: Invisibility on NT boxes
下一篇: 接入路由器做NAT,做限速的一些想法
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值