Windows rootkits of 2005, part two(翻译)

RootKits——windows内核的安全防护 上一篇有讲到怎样利用键盘控制芯片的端口去控制键盘,但是仅仅利用定时器来实现键盘的控制是非常浪费时间的。所以我们应该换一种方式,比如说挂钩键盘击键事件的中断。整整个中断的挂钩我们在前面已经分析过了,这里将其和上一篇整合。首先利用sidt指令将键盘击键事件的中断处理事件进行挂钩,将我们的函数放入击键处理函数当中使得中断的时候调用我们的函数。然后跳转到原来的中断处理函数进行真正的中断处理。源代码如下: 阅读详情
        上一篇文章中,我们谈到了当前的rootkit开发技术。本文更深入一点,将焦点集中在rootkit技术的最前沿。在第三篇,也就是本系列的最后一篇中,将重点论述rootkit侦测的各种方法及安全方面的专业的应对措施。

        本文讲述的方法是在Black Hat 2005大会上介绍的Shadow Walker的rootkit原型试验时提出的。这些方法使得攻击者通过控制扫描器在硬件层次所读到的内存来隐藏已知或未知的恶意代码。虽然我们的焦点是在rootkits之上,但该技术潜在的影响颇令人担忧。因为它可以被应用到从蠕虫到间谍软件的所有形式的恶意代码上。

1.1 可持久的rootkit与基于内存的rootkit
        一般来说,rootkits分两种:可持久的rootkit和基于内存的rootkits。其最根本的区别就是被感染的机器重新启动后,两者的持久性。可持久的rootkit在系统重启后还继续存在,而基于内存的rootkit则不行。要想在重启后还继续存在,必须满足两个条件。第一,必须有些手段可以在被感染的系统上长久的保存他们的代码,比如存在硬盘上。第二,必须在系统启动序列中放置一个钩子,以便他们能够从硬盘被加载到内存中开始运行。
        基于内存的rootkit不会去保存他们的代码到硬盘,也不会去hook启动过程。他们仅仅存在与内存中,或许就是通过一次软件exploit就被隐蔽的安装进内存了,因此这类rootkit相对于其可持久的兄弟隐蔽性更好,其优势不容置疑。虽然它在系统重启后就不存在了,看起来似乎没用。但是,要知道服务器可是经常连续几天,几周甚至几个月都保持在线。实际上,基于内存的rootkit失去影响的可能跟难以预料的攻击者的需要大致是平衡的。

1.2 隐藏rootkit
        Rootkit的编写者为了在系统中隐藏他们的rootkit的存在,开发了一些巧妙的技术,从各种hook技巧到直接更改内核对象(Direct kernel object manipulation, DKOM)都有。然而即使像FU这样成熟的内核rootkits也有其固有的缺陷[ref 1]。虽然这些Rootkits控制执行路径很有一套,但是基本都没有办法控制其它应用程序看到的内存。因此,这些rootkits如果想要不被发现,必须注意两个问题。第一,必须能隐藏他们本身的执行代码;第二,必须能够隐藏其对操作系统组件的内存所作的修改(比如hooks)。没有这些能力的话,在原始的内存签名侦测扫描面前,即使最成熟的公开的内核rootkits也只是sitting-ducks,要知道20年前的防病毒软件就已经开始使用这种扫描技术了。可持久的rootkis则需要另外处理隐藏其在长期存储媒介上的代码以及其系统启动序列中的钩子。本文后面只会谈到前两个问题。实际上,我们的讨论仅限于基于内存的rootkit。
        隐藏代码或者其对内存的修改是病毒作者们很早以前就遇到的问题。为了与文件系统签名扫描作斗争,病毒作者们发展了多态变种技术。这种技术使得保持相同功能的一块代码在表面上看起来不一样。可以用英语中的同义词(拼写不同,然而意思相近)来类比一下。多态的病毒用不同的代码(同义词)替换指令(原来的词语)来执行相同的功能。这种变异的病毒表面上看起来有区别,就可以逃过基于简单模式的侦测。
        Rootkit也已经在整合多态技术上取得了一些成效。只是这种公开的rootkit还非常少。虽然多态技术对于把rootkit的代码部分同扫描的签名区分开有些效果,但还不理想。因为这对于隐藏rootkit对其他系统组件的二进制代码做的修改没有帮助。也就是说,劫持系统组件留下了内存完整性校验的弱点。因此,更好的解决方案不是改变rootkit的代码,而是改变其他系统组件"看到"它的途径。接下来会看到现在架构是如何准许虚拟内存管理器颠覆的,这样一来非多态的的内核模式rootkit就能够控制操作系统和其他进程所读到的内存。第2节回顾一下虚拟内存的基本架构和支持的操作。第3节讲述Shadow Walker的rootkit原型试验是如何扰乱虚拟内存子系统达到其在安全扫描器前隐藏执行代码的。在第4节,也就是最后一节中将讨论这种技术对于安全专家和黑客的潜在意义。

2.虚拟内存概念
        现代的大多数系统架构都区分虚拟内存核物理内存。通常,系统更多的是在处理虚拟内存。在一个安装了256MB内存的32位系统的机器上,虽然我们只有256MB物理内存,但是虚拟内存有4GB。简而言之,物理内存就是被安装的内存条的数量,而虚拟内存则是由处理器的地址总线的宽度定义。因此有了32位处理器我们就能寻址最大2^32字节,即4GB的虚拟内存。而在64位机器上,则可以寻址2^64字节,超过16EB。
        虚拟内存有两种不同的实现方案,即分段和分页,X86架构两种都支持。本文关注的是Shadow Walker要破坏的分页部分。分页最基本的思想就是虚拟内存地址空间和物理内存地址空间被分成固定大小的块。

        虚拟内存块被称为页面(page),页面被映射到物理内存块上,物理内存块叫帧(frame)。页表和页目录记录了关联到它们对应的frame所需要的映射信息以及保护信息和状态信息。关键就是当分页被启用后,每个内存访问必须要查找以确定其映射到的物理帧以及该帧当前是否在内存中。这就会产生实质的性能开销,尤其是当系统架构是像Intel Pentium那样的基于2级页表方案的时候更是如此。
        通过对虚拟内存和物理内存加以区分,硬件和操作系统能够让进程相信它有比世纪的物理内存多得多的内存。分页对于应用程序来说是不可见的,从应用程序的角度看,它有它自己私有的4GB虚拟内存。而不必去关心世纪的物理内存是多少,也不用管虚拟地址是如何映射到物理内存的。由于虚拟地址空间可以比物理地址空间大很多,进程就有可能要求获取的内存超过可用物理内存。这种情况下,操作系统就需要临时交换物理内存中的一部分数据到磁盘以腾出空间来满足当前的内存需求。这是通过复制部分帧到交换文件并标记这些帧对应的页表项(PTE)的状态为缺页来实现的。当这些页面再次被访问时,因为它们当前不在物理内存中,所以会产生一个缺页错误。操作系统的缺页错误处理会发出I/O请求把被请求的页面从交换文件中加载进来。如果这时候没有物理内存可用,则在把请求的页面加载进来之前必须先交换另一些页面到磁盘文件。

     在一个2级分页方案中,内存访问的动作分如下几步:
     1.在页目录中查找确定是否该地址所在的页表当前在物理内存中。
     2.如果不在,发一个I/O请求将该页表从磁盘的交换文件中加载进来。
     3.查找页表确定是否请求的页面当前在物理内存中。
     4.如果不在,发一个I/O请求将该页从磁盘交换文件中加载进来。
     5.在页面根据偏移值查找需要的字节数。

     图1说明了x86架构的地址转换处理过程。从上面的步骤中可以看到,在最坏的情况下,一个简单的内存访问可能需要3次内存访问和2次磁盘I/O。于是硬件设计者开发了Translation Lookaside Buffer(TLB)来帮助解决这个问题。TLB是用于处理频繁的虚拟地址到物理地址映射的高速缓存。当有内存访问发生,在查找页目录和页表前,会首先从TLB中查找虚拟地址到物理地址的转换信息。如果找到了,称之为“命中(hit)”,否则称之为“未命中(miss)”。因为TLB查找起来比执行页表访问要快很多,所以内存访问通过TLB来避免前面提到的性能开销。

    

                                                 图1   x86虚拟地址到物理地址的转换

3.Shoadow Walker如何工作
     当前的Shadow Walker原型试验由2个驱动构成:一个修改过的FU rootkit驱动和一个用于隐藏FU rootkit的内存钩子驱动。因为Shadow Walker只不过是打算验证原型试验,所以没有尝试去隐藏这个内存钩子驱动或者隐藏缺页处理器以及对应的中断钩子。另外还有一些实现上的限制,比如PAE(Physical Address Extension)或多处理器支持。Shadow Walker不是一个功能完整的rootkit,以它当前的实现来看,从多个角度都可以察觉到它。这里只是展望一下rootkit技术的未来。如果技术娴熟的攻击者写出了真正强大的的基于Shadow Walker技术的rootkit,蠕虫或间谍软件,能够被给定存在的恶意代码侦测技术的状态,那真是太可怕了。攻击者可以用这些方法隐藏已知或未知的恶意病毒不被基于签名的扫描器发现,不被启发式的探测器发现,也不被完整性检查器发现。下一段将讲述Shadow Walker使用的虚拟内存扰乱技术的实现细节。
     众所周知,内存访问有三种基本类型(读,写和执行),然而很少有人知道32位的x86处理器实际上只支持两种类型:读/执行和写/执行。这就意味着所有的内存都是可执行的,没有其他直接支持的标记它的手段来指示是否该内存可执行。x86的这种诡异的行为导致很难把堆栈设置成不可执行,于是便成了缓存区溢出侵入系统的祸害[ref 2]。这种架构的另一个怪异行为则不甘示弱,一个软件安全开发组发现通过附加的软件支持在Unix下可以实现不可执行的内存[ref 3],那就是著名的PaX。Shadow Walker利用了一些PaX团队的研究来隐藏在Windows系统中执行的代码。
     现在的rootkit如果想要不被察觉,还需要解决两个额外的问题:
     1.必须能够隐藏他们自己的执行代码躲过内存签名扫描。
     2.必须能够隐藏修改过的操作系统组件的内存(hook即是典型)来躲过启发式侦测(比如使用VICE工具)和完整性校验。
     为了达到这些目的,rootkit必须能够控制安全扫描器之类的其它应用程序执行原始内存读取操作所返回的数据。很明显,如果rootkit发现了对其可执行代码段的读取访问,那就可以认为有扫描器在找它了。

3.2 Shadow Walker扰乱虚拟内存
     Shadow Walker要扰乱虚拟内存涉及三个问题。首先它必须能够区分和过滤对某块内存(例如它本身的执行代码所在的内存或者一些已经被扰乱的操作系统API的内存)的执行、读和写访问。其次,当察觉到这种读取访问时,必须能够欺骗它。最后,要确保被感染的系统的性能不会受影响。
     第一个问题可以通过将要隐藏的页面的PTE标记为“不存在”,然后hook缺页处理器(page fault handler)来解决。这样一来Shadow Walker就能捕获对这些页面的访问并且在随后的缺页处理器中过滤掉。在缺页处理器中,检查保存的指令指针和缺页地址,如果两者相同,那么这次内存访问就是执行操作。否则就是读/写操作。值得一提的是Shadow Walker需要区分是由于内存hook导致的缺页还是OS需要服务导致的普通缺页。通过确保所有的隐藏页面在非分页内存中可以解决这个问题。由于Shadow Walker现在就是设计成的隐藏驱动的页面,这总是在非分页池,所以这个不是问题。
     第二个问题有些棘手,而且跟第三个问题不降低性能有关系。一旦缺页处理器被调用,我们发现是对隐藏页面的读访问,我们就修改PTE以及更改物理帧地址不工作。因此,我们可以保证执行访问被翻译到我们扰乱了的帧,而读写访问被翻译到了干净的帧。然而,要记住TLB才是内存访问路径的开始,内存访问会将相应的转换加载到TLB。Pentium实际上使用了分离的TLB架构,Shadow Walker use this fact to devious advantage. 分离的TLB架构意味着有两个TLB,一个记录执行访问的翻译结果(ITLB),另一个纪录读写访问的翻译结果(DTLB)。一般来说,两个TLB是同步的,保持相同的映射信息。不过,要使分离的TLB不保持同步,使其记录不同的虚拟内存到物理内存的映射还是有可能的。

  
                                          图2: TLB Desynchronization


     一旦加载,大多数内存访问会通过TLB来解决,不会产生缺页错误。当然,第一次执行和数据访问该页面时、TLB缓存线路清除时、在上下文切换时以及显式TLB刷新时还是会缺页的。这几个缺页错误不或导致任何问题,仅仅是要求缺页处理器重新同步TLB。到最后就给我们带来了第3个问题:维持系统性能。

Shadow Walker导致的缺页率的小的增长相对于现代TLB极高的命中率来说,不会有太明显的影响!

4.Conclusion

        Shadow Walker provides an example of an ironic, however, common yin/yang theme in computer security. It takes an originally defensive solution to a security problem (with the PaX-based buffer overflow protection) and inverts it into an offensive exploitation technique. The recent controversy surrounding Sony's usage of rootkit technology to provide Digital Rights Management is yet another compelling example. The lines between protection and exploitation between the "hacker" and the "security professional" are not as clearly defined as many would like to believe.

In the first article of the series, we showed that security applications can't trust the integrity of operating system APIs. Now, we show that the violation of trust runs much deeper. Shadow Walker bids user mode malware scanners a final goodbye and places rootkit detection strictly within the kernel realm. In the third and final article of this series we will discuss rootkit detection and threat mitigation.

5. References

[ref 1] Fuzen, FU Rootkit. http://www.rootkit.com/project.php?id=12
[ref 2] Hardware support has subsequently been added for non-executable memory in 64-bit systems as well as some AMD Sempron and Intel Pentium 4 processors. Windows also provides limited software support in the form of Data Execution Prevention (DEP) as of Windows XP Service Pack 2 and Windows 2003 Server.
[ref 3] PaX. http://pax.grsecurity.net/docs/pax.txt
[ref 4] Butler, James, "VICE - Catch the hookers!" Black Hat, Las Vegas, July, 2004. www.blackhat.com/presentations/bh-usa-04/bh-us-04-butler/ bh-us-04-butler.pdf

5.1 Further reading

Rutkowska, Joanna. "Concepts For The Stealth Windows Rootkit", Sept 2003 http://www.invisiblethings.org/papers/chameleon_concepts.pdf

Russinovich, Mark and Solomon, David. Windows Internals, Fourth Edition.

6. About the authors

James Butler is the CTO of Komoku, which specializes in high assurance, host integrity monitoring and management. Before that, Mr. Butler was the Director of Engineering at HBGary, Inc. focusing on rootkits and other subversive technologies. He is the co-author and a teacher of "Aspects of Offensive Rootkit Technologies" and co-author of the newly released bestseller "Rootkits: Subverting the Windows Kernel."

Sherri Sparks is a PhD student at the University of Central Florida. Currently, her research interests include offensive/defensive malicious code technologies and related issues in digital forensic applications.

 
2020黑客大会——深入浅出现代Windows Rootkit 为什么你会想到用一个Rootkit? 一、内核驱动在机器里有着很高的权限 二、与一个传统的反病毒软件的权限相同 三、相对于用户层来说,对于内核病毒的解决措施(mitigations)和方案更少 四、反病毒软件对于Rootkit的动作可见度较差 五、反病毒软件容易忽略驱动 驱动利用与签名 利用合法的驱动有很多的(quite a few)好处: 1.简单地修改就可以做到提权 2.找到一个有漏洞的驱动是相对简单(relatively trivial)的一件事 加载驱动 3.不容易被检测到 缺点就是:依赖操作系统, 阅读详情

相关推荐

别再为PCB和散热器文件发愁了!手把手教你用ADS导出DWG文件给工厂(附单位转换避坑指南)

本文详细解析了从ADS设计到PCB/散热器加工的DWG文件导出全流程,重点介绍了单位转换、分层导出策略及散热器文件处理等关键步骤,帮助射频工程师避免加工误差和返工。特别提供了mil与mm单位转换的精确处理方法,确保设计文件与工厂加工需求无缝对接。

weixin_30814329的博客 617

探索隐藏的角落:Windows Rootkits - 高级系统监控与防御实践

探索隐藏的角落:Windows Rootkits - 高级系统监控与防御实践 在计算机安全的世界中,了解并对抗 Rootkits 是一项至关重要的技能。GitCode 上的 项目,为我们提供了一个深入研究和实践 Windows 平台 Rootkit 技术的宝贵资源。 项目简介 该项目是一个开源的学习平台,主要由 C++ 和汇编语言编写,涵盖了多种类型的 Windows Rootkit 技术。它包...

gitblog_00073的博客 661

【5G核心网】Packet Forwarding Model 数据包转发模型

CP 通过建立,修改,删除 PFCP 会话上下文,以及通过为每个 PFCP 会话赏析哪问提供 PDR FAR QER URR BAR,来控制 UP 面的数据包处理。 每一个 PDR 都包含 PDI(Packet Detection Information,包探测信息),一个或多个字段,与输入数据包进行匹配,并可能与以下规则相关联,从而提供了适用于与 PDI 匹配的数据包的指令集: - One FAR(包含了处理数据包的相关指令) an Apply Act...

zhonglinzhang 1万+

Windows rootkits in 2005, part two

Windows rootkits in 2005, part twoJames Butler, Sherri Sparks 2005-11-171. IntroductionIn our previous article, we discussed current rootkit development techniques. In this article, we take it a step

eaglenet的专栏 1105

ADS 2013安装教程

1.2013和2014安装过程是一样的,运行ads2013_06_shp_windows文件进行安装 2.点击“NEXT”。 3.选择I accept,然后点击“NEXT”。 4.选择“complete”,然后点击“NEXT”。 5.选择安装路径,最好默认安装路径,安装路径不要有中文,然后点击“NEXT”。 6.点击“NEXT”. 7.如下路径默认安装,然后点击“NEXT”。 8.点击“NEXT”。 ...

谢谢关注“小鱼教你模数电”,各平台同号 6009

Android 12.0 以太网和wifi共存的产品wifi优先级设置功能实现

在12.0的系统ROM定制化开发中,在对于一些有线网和wifi共存的产品中,由于某些产品的特殊要求首选使用wifi,而在原生 系统中以太网的优先级高于wifi的,所以就需要从优先级的设置来分析,实现设置优先级的相关功能实现

安卓兼职framework和app工程师的博客 944

Windows rootkits of 2005, part one(翻译)

 出于学习计算机和英语的目的,尝试翻译一些英文的技术帖,我尽量翻译准确,然而不能保证,感兴趣的请参看原文:http://www.securityfocus.com/infocus/1850阅读基础:保护模式,PE文件格式,设备驱动程序                                             Windows rootkits of 2005, part o

coding_hello的专栏 2239

第14.7章 高翔博士最新开源框架Lightning-LM源码解读(七):PoseExtrapolator模块深度剖析,揭秘激光SLAM高频位姿外推核心技术

PoseExtrapolator是Lightning-LM框架中负责高频位姿外推的核心模块,通过融合DR(航位推算)、激光里程计和PGO(位姿图优化)数据实现精准实时定位。模块初始化依赖PGO数据,后续通过DR数据进行高频位姿更新,并利用PGO结果进行误差补偿。关键函数AddDRLocAndExtrapolate处理DR增量位姿,结合速度补偿机制逐步修正误差,保证高频输出的同时提升精度。该模块体现了多传感器融合思想,通过互补性数据(高频DR与低频高精PGO)实现鲁棒定位,代码中使用了SE3位姿表示、互斥锁保

行知SLAM 350

ShadowWalker1.0学习笔记4 ——Hook IDT

//Hook & Unhook IDT //俩函数,位于idtHook.cpp中。 //功能就是根据中断号Hook/Unhook IDT struct IDT_GATE {     unsigned OffsetLo        :16;   //bits 15....0         unsigned Selector        :16;   //segment s

ccx_john的专栏 897

【AUTOSAR-IpduM】-2.2-创建并配置一个接收RX的(Multiplexed-I-PDU)多路复用

案列背景: 在CFG中配置一个发送TX的(Multiplexed-I-PDU)多路复用Frame。 目录 1 在Arxml中创建一个发送的多路复用Frame 2 CFG导入带多路复用Frame的ARXML 2.1 CFG中提示的错误Error 2.2 如何解决CFG中提示的错误Error 3 结尾 <--返回「Autosar_BSW高阶配置」总目录--> <--返回「Autosar_BSW高阶配置」专栏主页--> <--返回「个人博客」首页--&g..

「汽车电子助手」的博客 1571

YOLOv8改进,YOLOv8添加DCNv3可变性卷积,无需编译

DCNv3在DCNv2版本上进行了改进,上一期我们在YOLOv8中添加了DCNv2,这一期我们将添加DCNv3,DCNv3代码详解可以参考链接:代码详解——可变形卷积(DCNv3)

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 5021

循环嵌套(多层 for 循环)

表:order(订单表,order_id, user_id)、user(用户表,user_id, user_name)✅ 优化:先查所有订单,拿到所有 user_id 批量 in 查询,内存 join。✅ 优化:先把优惠券转 HashMap,单层循环查找(hash 查找 O (1))SQL 只有 2 次,O (1) 数据库查询,内存遍历 O (n)。需求:查询所有订单列表,同时带出每个订单对应的用户名称。需求:订单列表、优惠券列表,把订单匹配对应的优惠券名称。复杂度:O (M+N),非常快。

weixin_43732943的博客 215

【Altium designer】BOM导出 Bill of Materials 如何自定义格式

【Altium designer】如何自定义BOM导出格式 我们用Excel做一个xx.xlt的2003的模版文件,取文件名为:AltiumDesiger PCB BOM Template.xlt 将AltiumDesiger PCB BOM Template.xlt文件存放在:AltiumDesiger 安装目录的Template文件夹内

夜半少年的博客 2718

Python+Agent入门笔记(六):记忆和状态,从“一次性问答”到“能用助手”

滑动窗口的缺点很明显:被扔掉的信息就真没了。如果用户第一轮说“我不吃辣”,隔了二十轮让他推荐餐厅,模型已经忘了。定期把旧的对话压缩成一段总结,作为一条特殊的消息插进去。"""把除 system 和最近 keep_recent 条以外的消息,压缩成一条摘要。返回新的 messages 列表。"""# 把旧消息拼成纯文本,让模型总结content = f"[工具结果]把除 system 和最近 keep_recent 条以外的消息,压缩成一条摘要。返回新的 messages 列表。

qq_41241612的博客 108

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【数据结构-5】单链表的实现

单链表,具体来说是单向的、不带头的、不循环的链表。链表由一个一个节点组成,每个节点分为数据域和指针域,数据域存放数据,指针域存放下一节点的地址。这样,就可以根据指针域中的地址找到下一个节点,节点就串起来了构成了单链表。

a bit 215

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

本地chatbot4--引入LangGraph

上一节实现了chatbot的连续调用工具的功能,但目前流程还是提示词→模型→解析→调用工具(可选)→输出线性的一条路走到底(LangChain)只适合简单线性任务(问答、摘要、简单RAG)agent的本质是:“模型决定调工具→执行→结果喂回模型→再决定……直到完成”。举例:读日志 → 解析 ─失败→ 重试(≤3次) ─→ 退出│成功↓算统计 → 对比历史 → 生成报告 → [人工审核卡点] → 发送。

weixin_45859446的博客 103

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

C# 数据结构和特殊类型

.NET Core(现称.NET)提供丰富数据结构,优化性能与开发效率。日常开发首选List<T>和Dictionary<TKey,TValue>;高性能场景推荐Span<T>与Memory<T>减少内存分配;并发环境使用ConcurrentDictionary等线程安全集合;避免非泛型集合如ArrayList。

cccloveforever的博客 746

C++ 入门笔记(十七):list 入门 —— 为什么 list 不能 sort?

第17课:用大白话讲清 list 的双向链表结构、哨兵头、push_back 四步、迭代器封装、merge 与 splice 的区别,以及 vector 排序为什么常比 list 快。

wo_jack的博客 251

list

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

xie0510_的博客 293

3.链表相关知识点

链表

2501_93884468的博客 436

上万数据的批量插入

当数据达到上万上十万的时候,如何批量插入

junxunfs的博客 46

软件商店常见问题标准处理流程

从底层软件源来看,/etc/apt/sources.list配置错误、源地址失效、公网与内网离线源混用、ARM64与x86_64架构源串用,以及DNS解析异常、系统代理配置错误,都会导致商店无法获取应用数据;打开该应用,确认可正常运行;软件商店作为系统内置的图形化软件分发与安装入口(UKUI桌面配套组件,底层依赖APT软件源),承担着应用软件的浏览、搜索、下载、安装、升级与卸载等核心功能,是终端软件部署与管理的关键通道。覆盖软件商店启动、页面加载、应用下载、安装、卸载、搜索、自身更新等全部业务场景。

qq_39496637的博客 307

【AI 开发从入门到进阶 · 10】收官篇:LoRA 微调、模型评估、推理加速与生产部署全链路

本文系统梳理了大模型微调与生产落地的全流程,从决策是否微调、优选LoRA技术方案,到代码实现、效果评估、推理加速与FastAPI服务封装,最终构建可迭代的生产级AI系统。强调“逐级升级”原则,倡导以数据闭环驱动优化,避免技术冲动。全系列贯穿工程化思维,提供可复用模板与实战建议,助力开发者从模型训练迈向稳定可用的AI服务部署。

信息安全领域优质创作者|操作系统领域专家 126

ARIA规范

ARIA用来补充原生HTML缺失的语义,原则:优先原生标签,ARIA仅做补充。 ARIA角色role:定义组件身份,分为地标角色、构件角色、文档角色;构件角色用于自定义弹窗、tab、下拉菜单等复杂组件; ARIA状态与属性:以aria-开头,描述组件实时状态;常用:aria-label、aria-labelledby、aria-describedby、aria-hidden、aria-expanded、aria-selected、aria-modal、aria-live; 常用场景:图标按钮用aria-l

2401_83227843的博客 471

LangGraph(03):状态归约、并行更新与消息管理

并行节点写入报错?历史消息无法清理?本文拆解 LangGraph 状态归约与消息增删改机制,带你精确控制复杂工作流状态。

专注于 Agent 工程、AI 产品、Harness Engineering、LLM 算法等方向,OpenMathModel、Nivik 等开源项目作者 142
上一篇: Windows rootkits of 2005, part one(翻译)
下一篇: Windows rootkits of 2005, part three(翻译)
野男孩
博客等级 码龄21年 451粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值