冰河暗涌防不胜防 BIOS下实现的Telnet后门

BIOS中隐藏Telnet后门 该项目仅为实验性项目,目的是学习国外技术。该项目主要目的是想隐藏一个Telnet后门 在主板的BIOS内,并让其随着计算机系统及操作系统成功的运行起来。运行后能反向Telnet连 接到指定的计算机接受CMD控制。 立即下载

来源:51CTO
作者:成松林

【51CTO.com 独家特稿】该项目仅为实验性项目,主要目的是想隐藏一个Telnet后门在主板的BIOS内,并让其随着计算机系统及操作系统成功的运行起来。运行后能反向Telnet连接到指定的计算机接受控制。

项目涉及的相关知识及技术目录

1、 实验环境,使用bochs调试工具。

2、 刷新BIOS技术问题。

3、 代码植入BIOS问题。

4、 源代码相关技术问题:
 

A、如何编写BIOS模块(如:PCI、 ISA)。

B、实模式关于HOOK磁盘中断的问题。

C、磁盘中断中选择再次HOOK的问题。

D、NT保护模式下设置物理地址映射。

E、NT保护模式下线性地址寻址问题。

BIOS模块调试实验环境采用Bochs

Bochs虚拟机可以调试BIOS及操作系统,Bochs使用主要是配置它的配置文件,我们以实例配置文件简单讲解,Bochs实验调试等网上有很多相关文章,这里简单讲解。

我的配置实例:文件名xp.bxrc,修改后的及需要设置的内容如下:

  1. ######使用的系统BIOS模块######  
  2. romimage: file=$BXSHARE/BIOS-bochs-latest  
  3. ######使用的CPU 相关参数######  
  4. cpu: count=1, ips=10000000, reset_on_triple_fault=1 
  5. ######设置内存大小       ######  
  6. megs: 128  
  7. ######添加我们的BIOS模块######  
  8. optromimage1: file=test.bin, address=0xd0000 
  9. ######使用的VGAROM模块######  
  10. vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest  
  11. ######设置虚拟机硬盘与光盘######  
  12. ata0-master: type=disk, path="c.img", mode=flat, cylinders=4161, heads=16, spt=63 
  13. #ata0-slave: type=cdrom, path="xp.iso", status=inserted 
  14. ######设置引导设备        ######  
  15. boot: c  
  16. #boot: cdrom, disk 

 

Bochs调试加载配置文件方法:可以设置一个bat文件,如下内容:
set BXSHARE=d:/bochs
%BXSHARE%/bochsdbg.exe -q -f xp.bxrc

如何刷新各种BIOS问题

各种BIOS刷新相关工具早已在网上流传,工具的使用这里不作介绍,IcLord的作者已经给出很多编程方法实现。这里简单说下。

UniFlash开源项目我也详细分析过,如果有必要我会给出UniFlash源代码的详解,该项目指出可以刷写所有BIOS芯片,但是该项目刷新BIOS存在很多问题,绝大多数情况是无法刷新的我实验过很多次,也尝试修改他的代码过很多次,没找到原因。

Aword BIOS已经有通用的刷写API调用,不管在NT下还是在实模式下,IcLord也作了讲解。如果有时间我会给出实模式及NT下的刷写源代码及分析。

代码植入BIOS问题

关于网上提及的,IcLord讲到的我就不再做重复的分析。这里主要讲下我们的模块可以植入哪些地方以方便隐藏。以前的教程讲过的方法存的问题分析。
一、 ISA模块形式植入:这种方式只适合于较早的计算机,因为目前的计算机系统BIOS是不会加载ISA模块的。故只能做实验调试用的方法。
二、 PCI模块形式植入:该方法虽然系统BIOS都要加载PCI ROM,但是系统BIOS只加载实际存在的PCI卡的ROM模块。而且通常BIOS设置中可以
关闭相应的ROM启动。
三、 HOOK BootBlock或者说要启动的模块:该方法当然我认为是最有效的,但是又存在很多技术上的难题。检验和问题,不同BIOS的结构问题,过早的HOOK还存在再次获取CPU运行机会问题等等。

本人实验过以上提及的所有方法,我认为HOOK PCI、VGA及相关启动模块是比较可寻的办法。为什么?一般这类的ROM模块是必须启动的,而且调试发现一般它的ROM本身代码用不完自身设置的大小,我们可以借助剩余大小隐藏我们的代码。例如:集成显卡会把显卡ROM集成到系统BIOS模块中,我们可以对该模块进行HOOK,修改ROM头部的跳转指令,跳到我们的代码开始处执行,我们的代码执行完后跳转到它的代码开始处执行。

如何编写BIOS模块

BIOS是分模块组合在一起的。这里对PCI及ISA模块作下简单分析,VGA模块跟PCI模块几乎一样。模块主要是头部有个规范,该规范适合所有BIOS系统。具体可以参看《PCI系统结构》及其他书籍。

源代码实例可以参看国外ROMOS开源项目,该开源项目的思想很值得学习。该项目讲解了如何在BIOS中嵌入一个小型DOS,如:FreeDos。采用了把整个DOS系统盘镜像植入BIOS中,跟早期的PXE引导DOS机制类似,然后HOOK磁盘中断,模拟DOS系统盘镜像出一个盘,源代码编译后只有900多字节。这种思想在早期还是很值得学习的。
实模式关于HOOK磁盘中断问题

很早前就有业界内人士发贴问,为什么在我的ROM模块中HOOK磁盘中断会失败呢?关于这个问题现在目前网上已经有人作出过回答,国外的开源项目在2003年我都看到过。

由于我们的ROM模块过早的运行,可能运行在磁盘服务前面了,这时如果HOOK Int 13h会因为BIOS加载磁盘服务时重写Int 13h IVT值,故我们设法HOOK其他服务,这个服务要求较早被BIOS安装且不会再次修改且加载操作系统前调用,最佳的这个服务选择就是int 18h、int19h服务。可以参看
BIOS源代码,也可以参看PXE SDK说明文档略有讲过。

我们的磁盘服务代码建议放在实模式高端内存,通过BIOS数据区域可修改,内存40:13,即物理地址413h处的值。降低常规内存值,高端的内存就留给我们用。我们的保护模式下运行的代码建议也放在这段内存,且要求放在以页基址开始的内存中,以便后面代码的页映射我们的保护模式代码物理页。页基址:内存物理页地地址开始的低12位为零,参看《80386保护模式教程》。

若我们的代码直接在内存的ROM映射区内,可能导致在NT下访问不到我们的代码,因为NT内核加载程序ntldr可能不会映射该段内存,甚至可能BIOS在使用后都会关闭ROM区域这段内存,而且ROM区域这段内存在初始化后被系统BIOS设置成只读不能写。当然我们可以采取用int 15h服务对ROM区域这段内存映射。

当然也可以在NT启动过程中,在我们的磁盘服务中对想映射的内存都映射。由于代码大小的限制,故有些没必要的代码。尽量不使用了。

磁盘中断服务中再次HOOK问题

为了使我们的程序再次获得CPU运行机会,我们不得不得再次设法。调试发现NTLDR进入保护模式后在加载NT内核文件时,会切换CPU到实模式调用Int 13H服务进行磁盘读。

我们挂接磁盘服务就是为了截取NTLDR的读操作,这里我们可以HOOK 或者修改NTLDR另一部分OsLoader的代码,跳转到我们的代码执行。当然也可以直接HOOK ntosknrl导出的服务,参看我在2008.4.1发布的“程序从DOS/BIOS驻留内存到WINNT下监视内存数据”。

注意,HOOK OsLoader的代码时选择HOOK指令问题,由于NTLDR切换到实模式读取数据,读完后会在保护模式下搬移数据到规划位置,进行内核的安装。故HOOK时选择HOOK指令就选择FFh/15h:使用CALL NEAR [OFS32]指令进行,该指令寻址采用绝对地址,类似指令也可以。

当然我们的代码再次运行就会运行在OsLoader代码被我们HOOK处,调用我我们的代码执行,这时我们的代码运行环境:DS = ES = 10h保护模式段,内存模式: FLAT。在这里我们可以通过扫描_BlLoaderData数据结构,获取NTOSKRNL镜像基址。

可以通过PE搜索NTOSKRNL导出的API,可以参看网上相关教程。现在再次HOOK NTOSKRNL导出函数KeAddSystemServiceTable,HOOK该函数
可以截获win32k.sys添加它自己的服务,以便我们再再次HOOk win32.sys导出函数NtUserRegisterClassExWOW。HOOK该函数可以截取所有应用层程序注册窗口类,以便我们再再再次HOOK窗口类过程。这时我们的代码就运行在NT的应用层模式下。
NT保护模式下设置物理地址映射

先看一个WinDbg实例关于在我们的磁盘服务中获取CR3值修改页映射的分析,以前我的分析内容:

  1. NT内核被加载高端的2GB内存(80000000h~0ffffffffh)。参看NT内存安排..  
  2.  
  3. a、win2k adv ser:   WINDBG 看到 NT Kernel base = 0x80400000 也就是NTOSKRNL.exe加载位置  
  4.  
  5.          kd> r @cr3      ;断点位置在NTOSKRNL.exe里现在还没有应用程序故低端内存还未使用  
  6.  
  7.               cr3=00030000 ;->页目录表所在物理页(物理地址30000h)  
  8.  
  9.           kd> d 80030000 80030800  ;看页目录发现现在低端2GB(0~80000000h)还未分配  
  10.  
  11.               80030000  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................  
  12.  
  13.               80030010  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................  
  14.  
  15.               80030020  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................  
  16.  
  17.           kd> d 80030800           ;看高端开始分配情况页表(80000000h开始的分配情况)  
  18.  
  19.               80030800  63 21 03 00 63 41 03 00-63 51 03 00 63 31 03 00  c!..cA..cQ..c1..  
  20.  
  21.               80030810  63 11 7c 00 63 21 7c 00-63 31 7c 00 63 41 7c 00  c.|.c!|.c1|.cA|.  
  22.  
  23.               80030820  63 51 7c 00 63 61 7c 00-63 71 7c 00 63 81 7c 00  cQ|.ca|.cq|.c.|.  
  24.  
  25.           ;实例1:看80400000h(NT Kernel base),这个线性地址到物理地址映射情况.  
  26.  
  27.               ;线性地址最高10位页目录项(每项占4Byte):80400000h最高10位=201h.  
  28.  
  29.               ;在页目表位置:201h*4=804h 在内存地址=[cr3]+804h..具体看保护模式教程  
  30.  
  31.               kd> d 80030000+804 ;看在页目录表位置的值  
  32.  
  33.                 80030804  63 41 03 00 63 51 03 00-63 31 03 00 63 11 7c 00  cA..cQ..c1..c.|.  
  34.  
  35.               ;二级页表所在物理页地址:63 41 03 00转换下34163h,物理页地址:34000h,163h是页属性.  
  36.  
  37.               kd> d 80034000     ;看在页表的值  
  38.  
  39.                 80034000  63 01 40 00 63 11 40 00-63 21 40 00 63 31 40 00  c.@.c.@.c!@.c1@.  
  40.  
  41.               ;物理地址基址:63 01 40 00转换下400163h,#物理地址基址#:400000h,163h是页属性  
  42.  
  43.               ;最后发现物理地址基址(页地址)在400000h..观察物理地址400000h是NTOSKRNL.exe映像.  
  44.  
  45.               kd> d 80400000 ;观察物理地址400000h  
  46.  
  47.                 80400000  4d 5a 90 00 03 00 00 00-04 00 00 00 ff ff 00 00  MZ..............  
  48.  
  49.                 80400010  b8 00 00 00 00 00 00 00-40 00 00 00 00 00 00 00  ........@.......  
  50.  
  51.          ;实例2:看我们代码映射情况我们代码在物理地址:9e000h从线性地址8009e000h分析映射情况  
  52.  
  53.               ;8009e000h在页目录位置最高10位=200h*4,在内存地址=[CR3]+200h*4...  
  54.  
  55.               kd> d 80030000+200*4  
  56.  
  57.                 80030800  63 21 03 00 63 41 03 00-63 51 03 00 63 31 03 00  c!..cA..cQ..c1..  
  58.  
  59.                ;二级页表对应物理地址:63 21 03 00转换下物理页基址=32000h ,163是页属性  
  60.  
  61.                ;8009e000h所在二级页表位置:32000h+9eh*4(8009e000h线性地址12~22的位)...  
  62.  
  63.                 kd> d 80032000 + 9e *4  
  64.  
  65.                   80032278  23 e1 09 00 03 f1 09 00-03 01 0a 00 03 11 0a 00  #...............  
  66.  
  67.                ;物理地址基址(页基址):23 e1 09 00转换下09e000h,123是页属性..  
  68.  
  69.           ;#实例3:Windows运行起后用的页目录表线性地址:0c0000000h映射到物理地址情况.  
  70.  
  71.                kd> d 80030000 + c00 ;计算略.页目录表位置,观察发现指向自己的...  
  72.  
  73.                  80030c00  67 00 03 00 63 00 f0 17-00 00 00 00 63 31 a9 02  g...c.......c1..  
  74.  
  75. b、winXP:  WINDBG 看到 Kernel base = 0x804d8000 PsLoadedModuleList = 0x8055b420 
  76.  
  77.           kd> r @cr3   ;断点位置在NTOSKRNL.exe里现在还没有应用程序故低端内存还未使用  
  78.  
  79.                cr3=00039000 ;->页目录表所在物理页(页目录物理地址30000h)  
  80.  
  81.                kd> d 80039000 80039800  ;看页目录发现现在低端2GB(0~80000000h)还未分配  
  82.  
  83.                  80039000  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................  
  84.  
  85.                kd> d 80039800           ;看高端开始分配情况页表(80000000h开始的分配情况)  
  86.  
  87.                  80039800  e9 b9 00 f6 06 a1 08 10-75 1b f6 06 a3 08 10 75  ........u......u  
  88.  
  89.           ;实例1:看我们代码映射情况我们代码在物理地址:9e000h从线性地址8009e000h分析映射情况  
  90.  
  91.                  ;8009e000h在页目录位置最高10位=200h*4,在内存地址=[CR3]+200h*4...  
  92.  
  93.                  kd> d 80039000+200*4  
  94.  
  95.                    80039800  63 b1 03 00 e3 01 40 00-63 e1 03 00 e3 01 00 01  c.....@.c.......  
  96.  
  97.                  ;二级页表对应物理地址:63 b1 03 00转换下物理页基址=3b000h ,163是页属性  
  98.  
  99.                  ;8009e000h所在二级页表位置:3b000h+9eh*4(8009e000h线性地址12~22的位)...  
  100.  
  101.                  kd> d 8003b000 + 9e *4  
  102.  
  103.                    8003b278  03 e1 09 00 03 f1 09 00-03 01 0a 00 03 11 0a 00  ................  
  104.  
  105.                 ;物理地址基址(页基址):03 e1 09 00转换下09e000h,103是页属性..  
  106.  
  107. --------->  ;*#实例2:手工修改分页让物理地址映射到线性地址,WINXP.80000000h BIOS/DOS向量区没映射.#*  
  108.  
  109.                  kd> d 80000000  ;可看到现在没映射的情况,无法通过线性地址访问.  
  110.  
  111.                    80000000  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????  
  112.  
  113.                    80000010  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????  
  114.  
  115.                  ;80000000h的最高10位确定在页目录表位置=200h*4=800h.在页目录物理地址:[cr3]+800h  
  116.  
  117.                    kd> d 80039000+200*4;可发现二级页表已映射(63b10300)页属性163.物理地址(页)3b000h  
  118.  
  119.                      80039800  63 b1 03 00 e3 01 40 00-63 e1 03 00 e3 01 00 01  c.....@.c.......  
  120.  
  121.                      ;80000000h的12~22位次高10位确定在二级页表位置:物理地址3b000h+0*4  
  122.  
  123.                    kd> d 8003b000;观察发现确实没映射.全0.注意:一个页项占4字节...  
  124.  
  125.                      8003b000  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................  
  126.  
  127.                    ;修改成让它对应物理地址:000就可以,只修改允许访问就可以.也就是byte ptr [8003b000]=63  
  128.  
  129.                      kd> e 8003b000 63  
  130.  
  131.                      kd> d 8003b000  ;修改成功  
  132.  
  133.                        8003b000  63 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  c...............  
  134.  
  135.                    ;观察修改后的情况.;注意:要想设置生效.让WINDBG执行下G.让0C0000000等cr3被改等..  
  136.  
  137.                      kd> g        ;让系统自动刷新TLB等寄存器....  
  138.  
  139.                      kd> d 80000000  
  140.  
  141.                        80000000  53 ff 00 f0 53 ff 00 f0-c3 e2 00 f0 53 ff 00 f0  S...S.......S...  
  142.  
  143.           ;#实例3:Windows运行起后用的页目录表线性地址:0c0000000h映射到物理地址情况.  
  144.  
  145.                 kd> d 80039000 + c00 ;计算略.页目录表位置,观察发现指向自己的...  
  146.  
  147.                   80039c00  67 90 03 00 63 00 f0 0f-00 00 00 00 63 31 e2 01  g...c.......c1..  
  148.  
  149. c、分析以上总结:发现最开始获取的cr3值一直在用。  
  150.  
  151. 故我们修改页项的效果会在windows运行后也生效通过以上的实例分析可以看出NT系统的页映射情况。  
  152.  
  153. 进入保护模式之后这个CR3的值也就是页目录表位置被映射到了虚拟地址0c0000000h。  
  154.  
  155. 上面调试的实例页目录表地址就可以直接使用这个虚地址。 

 

例如:在我们的代码中把我们的代码拷贝到SharedUserData空间未使用处去,就使用了页映射代码,直接修改第一个页指向的物理页,就是我们代码所在的物理页。

NT保护模式下线性地址寻址问题

关于我们的代码进入保护模式以后,所有指令的寻址问题,这里作一下分析。当我们代码第一个在保护模式下执行的指令,是前面提到的磁盘服务中对OsLoader的代码进入HOOK,也提到了采用什么样的HOOK指令以便寻址。

接哪之后,我们的代码就开始运行在保护模式未分页情况下,我们采取的方法是把我们的代码拷贝到SharedUserData空间未使用处,涉及到拷贝的指令也必须运行在保护模式分页下,因为SharedUserData空间是一个虚地址。

在这里我们采用了把我们的拷贝代码指令搬移到NTOSKRNL镜像的MZ与PE之间的区域,设置HOOK NTOSKRNL导出函数KeAddSystemServiceTable首先跳转到拷贝指令执行,HOOK NTOSKRNL导出函数KeAddSystemServiceTable采用相对跳转指令它们在同一个空间。

当我们的拷贝指令把我们的代码拷贝到SharedUserData空间未使用处之后,我们的代码就有一个固定的虚地址,所有后续指令都可以采用这个虚地址进行寻址。

如何适配自定义激光雷达数据到LIO-SAM:解决ring和time参数缺失问题 本文详细解析了如何将非标准激光雷达(如速腾、Livox)适配到LIO-SAM框架中,重点解决ring和time参数缺失问题。提供了从源码修改到通用适配中间件的多层级解决方案,并包含实机测试与性能调优指南,帮助开发者高效完成雷达数据适配。 阅读详情

相关推荐

Oracle登录报错ORA-12560?5分钟搞定TNS协议适配器错误的完整修复指南

本文详细解析了Oracle登录报错ORA-12560(TNS协议适配器错误)的成因与解决方案。从基础服务检查到高级网络配置排查,提供了一套完整的修复流程,帮助数据库管理员快速解决连接问题,确保Oracle数据库的稳定运行。

weixin_29278805的博客 519

实现网络唤醒开机程序

好久没发贴了..发个垃圾程序..最近给自己管理的服务器写的.. 作者:成松林 QQ:179641795 Email:cheng_5103@126.com ;goto make ;实现网络唤醒开机程序 .386 .model flat, stdcall option casemap :none   ; case sensitive  include d:\masm32\incl

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 855

YOLOv8知识蒸馏实战:用BCKD和LD在自制数据集上分别提点1.63%和1.69%的保姆级教程

本文详细介绍了在YOLOv8模型上应用知识蒸馏技术(BCKD和LD方法)的实战教程,通过自制数据集实现性能提升1.63%和1.69%。内容涵盖环境配置、模型选择、BCKD和LD的具体实现及调参技巧,适合目标检测领域的开发者和研究者。

weixin_29082143的博客 245

SSH与Telnet的区别

最近登录主机的时候,经常碰到了telnet连不上但ssh可以连上,ssh连不上但telnet可以连上,今天花了点时间把他们两者之间的异同点进行了对比整理,归纳如下: 1,本质:telnet是明码传输,ssh是加密传输。telnet通过TCP/IP协议来访问远程计算机来控制你的设备,其传输的数据和口令是明文形式的。这样攻击者就很容易得到你的口令和数据。其方式也很简单,他以中间人的身份冒充你的设备截取你的数据,然后再把假数据再传给你的远程设备,从而达到攻击的目的。SSH是替代Telnet和其他远程控制台管...

铁马冰河入梦来 3万+

新手必看!Unity中Tag和Layer的7个实际应用场景(含MOBA案例)

本文深入探讨Unity中Tag和Layer的7个实际应用场景,特别以MOBA游戏开发为例,详细解析如何利用LayerMask进行高效场景管理和碰撞检测优化。从双相机方案到射线检测的精准控制,帮助开发者掌握这些基础功能的进阶用法,提升游戏性能和开发效率。

weixin_28723171的博客 313

TOEIC托业词汇汇总(完整版)

1.appointment 约会,约定2.attendance 出席人数;出席3.cabinet 橱柜4.calendar 日历;月历;行事历5.clerk 办事员,书记6.directory 人名住址薄7.duplicte 复制;副本8.filing 归档9.in-tray 待处理文件盒10.monitor 检测;监视;追踪11.out-tray 已处理文件盒12.partition 分隔;分隔物(如墙壁等)13.postage 邮费。

weixin_39676449的博客 1万+

计算机网络之远程终端协议TELNET

TELNET 是一个简单的远程终端协议。用户用 TELNET 就可在其所在地通过 TCP 连接注册(即登录)到远地的另一个主机上(使用主机名或 IP 地址)。TELNET 能将用户的击键传到远地主机,同时也能将远地主机的输出通过 TCP 连接返回到用户屏幕。这种服务是透明的,因为用户感觉到好像键盘和显示器是直接连在远地主机上。TELNET 也使用客户服务器方式。在本地系统运行 TELNET 客...

weixin_30849403的博客 346

YOLO模型从10MB瘦到2MB!剪枝+INT8量化双方案(精度损失<1%,附部署代码)

摘要:本文介绍了一种针对边缘设备的YOLO模型轻量化方案,通过"结构化剪枝+INT8量化"组合技术,将YOLOv8n模型从6.4MB压缩至2MB,体积减少68.75%,推理速度提升80%,同时保持精度损失小于1%。文章详细讲解了剪枝工具选择、通道剪枝实现、量化校准等关键步骤,并提供了完整的代码示例。特别强调了剪枝保留率、校准集使用、微调必要性等实践要点,帮助开发者在树莓派等资源受限设备上实现高效目标检测。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 755

让 AI 查订单、查库存、发消息:Spring AI 自定义工具(Tool)实战与工具描述工程

本文详解Spring AI 2.0中如何将Spring Bean方法通过@Tool注解暴露为AI可调用工具,核心在于“描述工程”——工具名需见名知义,描述要具体清晰,参数须注明格式与范围。强调错误应返回结果而非抛异常,敏感操作需人工兜底。针对海量工具场景,推荐使用检索式注册。结合实战案例与踩坑指南,提供从注册、描述到容错的完整方法论,助力高效构建可信赖的AI工具链。

weixin_43128865的博客 291

RockChip Android14 修改LCD背光最大值

在调试LCD屏时时长会出现硬件不匹配,导致电流过大,屏幕发热严重。在不调整硬件的情况下,我们可以通过修改软件,降低LCD背光最大值来实现适配。我们都知道LCD屏背光是靠pwm来控制,一般来说最大值可以设置为255,针对上述问题,我们可以通过软件来降低该值,比如200,100等等。

qq_34968572的博客 631

高通平台开发系列讲解(系统篇)系统关机流程

📢本篇章主要图解高通平台系统关机流程。

内核笔记 3212

工厂设备接MES为什么慢:协议识别与点表配置自动化的技术拆解

工业现场设备接 MES 的周期主要消耗在协议识别与点表配置。本文拆解这条链路的四层结构,给出点表映射的数据模型、两种部署架构的对比,以及可直接落地的三项验收口径与校验代码。适合工控集成、MES 实施、设备联网方向的工程师。

emfuture的博客 357

工商银行数据智能架构实践

工商银行大数据平台技术创新与实践摘要(149字): 工商银行构建了企业级大数据云基础设施,形成包含批量计算、流计算、联机分析等核心能力的技术架构。平台创新性地实现流批一体处理,将个人储蓄存款监测时效提升至分钟级;通过实时数仓技术将报送时效缩短至1-5分钟;融合内外部数据构建风控模型,债券违约预警准确率达100%。平台还支撑了"码上赢"精准营销和空间数据服务等创新应用,未来将向存算分离、实时数仓和云数智融合方向演进,持续提升数据价值转化能力。

银行信息系统应用架构详解 538

list

的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。,因此反向迭代器的实现可以借助正向迭代器,即:反向迭代器内部可以包含一个正向迭代器,对正向迭代器的接口进行包装即可。是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。迭代到该位置,在这段位置上迭代需要线性的时间开销;最大的缺陷是不支持任意位置的随机访问,比如:要访问。还需要一些额外的空间,以保存每个节点的相关联信息。个元素,必须从已知的位置。

xie0510_的博客 243

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

向 excel、word、pdf 三种文档中占位符插入数据

【代码】向 excel、word、pdf 三种文档中占位符插入数据。

weixin_45934659的博客 31

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

C++ STL 反向迭代器:从源码框架到适配器实现

在 C++ STL 中,反向迭代器(reverse_iterator)是一个很典型的设计案例:它本身并不直接持有容器数据,而是通过封装一个正向迭代器,把「前进」变成「后退」,从而让同一个容器既能正序遍历,也能逆序遍历。本文从 SGI-STL 3.0 的源码框架出发,梳理反向迭代器的设计思路,再手写一个通用的迭代器适配器,并在vector和list中完成适配与测试。在 SGI-STL 3.0 中,反向迭代器的核心源码位于。反向迭代器是一个适配器,各个容器再基于它适配出自己的反向迭代器类型。下面截取list。

Godbro的博客 225

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

[C++]:7.STL:list

好久不见,firdawn小课堂又和大家见面啦。今天我们要学习的内容是list容器,list也是一种常用的数据结构。下面是本章的思维导图,那么让我们开始学习吧!自定义的list,由三个结构构成。分别是链表的最小组成单位,也就是链表节点。以及迭代器类和list类其实要特别说明的是, List的迭代器,它不是单纯的指针,因为我们如果对指针直接进行解引用操作的话,我们得到的是这个节点,而不是节点里面存储的值并且我们对这个指针加加,得到的也不是下一个节点的地址,而是所在节点的下一个单位的地址。

2301_80817679的博客 168

RT-Thread 5.4.0 完整版架构剖析(下):IPC、时钟、内存、设备与组件

从 IPC 全量、时钟与定时器、内存管理,到设备框架、组件层、软件包机制、移植裁剪与速查表,补齐 RT-Thread 5.4.0 完整版的下半张地图。

182

CMake 多目录工程实战:静态库与动态库的完整构建示例

本文通过一个完整CMake项目示例,展示了如何构建静态库(math)与动态库(sort),并分别在test1、test2中链接使用。项目结构清晰,顶层CMakeLists.txt统一管理变量,各子目录独立配置编译规则。通过add_library生成库,link_directories和link_libraries实现链接,最终完成构建与验证。重点区分了静态库(打包进可执行文件)与动态库(运行时加载)的差异,适用于实际工程化开发与面试准备。

2303_77004089的博客 108

第2讲:提示注入攻击——原理与防御

提示注入是攻击者通过恶意指令绕过AI系统规则的安全威胁,分为直接注入(如覆盖指令、角色扮演越狱)和间接注入(藏于文档或搜索结果中)。防御需三重机制:检测(识别高危模式与多轮诱导)、加固(设置优先级、随机分隔符、锁定输出)、净化(清除控制字符、编码、截断超长输入)。结合上下文分析与多模态处理,可有效防范编码绕过、过度净化等陷阱。核心理念:防御需检测、加固、净化联动,筑牢AI应用安全防线。

sandaoliuge的博客 248

CompletableFuture 实战:异步任务编排、异常处理、超时与线程池边界

本文以用户主页接口为例,详解 CompletableFuture 在异步任务编排中的实战应用。通过并行执行用户资料、订单与推荐数据查询,显著降低耗时。重点剖析了默认线程池风险、任务组合方式(如 allOf 与 thenApply)、异常处理机制、超时控制及上下文传递问题。强调应为阻塞 I/O 任务自定义线程池,避免占用 commonPool,并通过 completedFuture 灵活处理可选分支。最终实现高效、可控的异步编排,兼顾性能与稳定性。

此人很懒,什么都没有写~~ 349

TypeError: must be str, not list

【代码】TypeError: must be str, not list。

Forerunner and Successor 先駆者と後継者 35

Python 开发的实践:从数据结构选型到框架决策

规模多大?决定用list还是set,Pandas 还是 Polars。瓶颈在哪?I/O 密集用异步,CPU 密集用进程/自由线程,内存受限用列式与惰性执行。代价是什么?消除手动维护窗口的出错面,TaskGroup消除失败任务不被取消的泄漏,消除 N+1,Protocol消除为类型约束而引入的继承层级——每个选择都在消除某类代价,同时也引入新的约束。能回答这三个问题,比记住更多 API 更有用。愿你我都能在各自的领域里不断成长,勇敢追求梦想,同时也保持对世界的好奇与善意!

weixin_45809780的博客 365

2026 GEO工具实测:竞品分析的技术判断方法是什么?

GEO竞品分析需确保四要素对齐:问题集、平台、时间与口径。数据采集方式(API或爬虫)影响准确性,可通过抽测对比验证。关键在于验证原始数据一致性,偏差超20%即存疑。对比口径应透明,支持自定义问题池并分维度(平台、品类)分析,避免片面结论。唯有技术严谨,数据才可决策赋能。

2603_96364115的博客 73

CMake 实战指南:从基础语法到静态库/动态库制作与链接

本文系统介绍了CMake的基本用法,涵盖注释、变量定义、C++标准设置、可执行文件输出路径配置、文件查找及头文件引入。重点讲解了如何通过add_library创建静态库与动态库,并结合include_directories和target_link_libraries实现依赖管理。内容实用,适合作为CMake入门与项目构建参考。

2303_77004089的博客 203
上一篇: 多obj 连接时遇到的错误 Linker Tools Warning LNK4098
下一篇: 【PE】加区段
cmdhack
博客等级 码龄19年 20粉丝 77原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值