基于处理器调试机制的Rootkit隐形技术

4.软件断点 调试的本质: 想办法让被调试程序触发异常 触发异常后就会向DEBUG_OBJECT里发送调试事件 调试器接管异常的过程 一般调试器都会有软件断点,内存断点,硬件断点… 其实这些无非就是想让被调试程序触发异常再让调试器来接管。 在OD中随便一个地址按下F2后程序执行到那就会被断下来,这时调试器将会拥有被调试程序的控制权,这个过程我们称为“中断到调试器”。 当我们在OD中按下F2其实就是将那个地... 阅读详情
 本文将向读者介绍一种通过处理器的调试机制来实现Rootkit的隐形的技术。这种技术的特点是,无需利用系统的缺陷,直接处理器的正常功能就能达到隐形的目的。本文将以Linux系统为例来介绍如何实现基于调试寄存器的隐形方法。
  一、概述
  几年来,用于在攻陷的机器上实现隐形技术和方法越来越多,让人目不暇接。其中,有一些直接篡改系统调用表,有一些修改中断处理程序,凡此种种,在此不再一一列举。不过,这些方法的共同之处在于,都以可见的形式修改了底层的操作系统,这使得它们很容易被发现。
   本文中,笔者利用调试机制这一x86平台的共同特性,用内核级Rootkit实现了终极的隐形。虽然该方法通用于所有IA-32兼容平台,但我们这里以 Linux操作系统为例,讲解如何在不碰钩子技术的各种“传统”目标(如系统调用表、中断处理程序等)的情况下拦截正常执行流程的技术。 实际上,这种隐形技术是如此高超,以至于还没有人发现我们的存在。
  在本文中,当我们说“调试器”时,实际上指的是只能从ring 0访问的IA-32的调试机制,对于用户空间的调试程序来说,是无法利用这个机制的,只有某些内核调试工具才能使用这个机制。
  二、处理器的调试机制
   为了让开发人员过得更轻松些,Intel公司引入了一个机制来处理调试过程。按照Intel公司的用户手册的说法,“IA-32架构提供了大量的调试设 施,供调试代码、监视代码执行和处理器性能之用。这些设施对调试应用程序软件、系统软件和多任务操作系统都是非常重要的 ”。开发人员可以通过一组专用寄存器(称为调试寄存器,从DR0至DR7)来使用该机制,这样他们就可以根据内存地址来设置硬件断点了。一旦执行流到达带 有断点标记的地址,控制权就会交给调试中断处理程序(INT 1),该处理程序继而调用do_debug()函数(定义在/i386/kernel/traps.c文件中)来处理引起异常的实际情况。
  可 以通过调试寄存器(DB0~DB7)和两个与模式特定的寄存器(MSR)来访问这种调试支持。对本文而言,我们只需关心调试寄存器就行了。这些寄存器存放 的是内存地址和I/O位置,我们将其称之为断点。断点既可以是用户在程序中选定的位置(指令断点),也可以是内存中的数据存储区(数据断点),还可以是指 定的I/O端口(I/O断点),程序员或者系统设计人员通常希望程序在这些指定的地方停下来,以便调用调试软件来检查处理器的状态。
  当内存或 I/O设备访问某个断点地址时,就会引起一个调试异常(#DB)。我们可以进一步为断点规定引起中断的具体的内存访问方式或者I/O访问方式,例如一个内 存读和/或写操作或者I/O读和/或写操作(即以规定之外的方式访问该断点时不会引起中断)。调试寄存器同时支持指令断点和数据断点。MSR是从P6系列 处理器开始引入IA-32架构的,它用于监视分支、中断和异常,并记录下最后分支、中断或者异常所使用的源地址和目的地址,以及最后中断或者异常之前发生 的分支的源地址和目的地址。
  三、调试寄存器
  Intel 处理器提供了8个调试寄存器,来控制处理器的调试活动。我们不仅可以使用MOV 指令从这些寄存器中读取数据,还可以向这些寄存器中写入数据。调试寄存器既可以作为这些指令的源操作数,也可以用于这些指令的目的操作数,不过,因为调试 寄存器是些特权资源,所以只有当MOV 指令在实地址模式、SMM或者CPL为0的保护模式中运行时才能访问这些寄存器;当从任何其他特权级中试图读或者写调试寄存器时,都将引起一个通用保护异 常。
  调试寄存器的主要作用是设置并监视1到4个断点,编号为从0到3。该调试机制使我们可以通过两个专用寄存器DR6和DR7来管理各断点,对于这两个寄存器将在后面详细介绍。对于每个断点,可以使用这两个调试寄存器来指定和/或检测下列信息:
  断点所在的线性地址(将在哪个线性地址上发生断点,即用DRn指出要监视的内存起始地址)
  断点位置的长度(1、2、3或4字节)(即用LENn字段指出要监视的内存区域长度)
  必须对该地址引起的调试异常所执行的操作
  该断点是否启用
  调试异常发生时,是否提供断点条件
  下面我们对各个寄存器安装功能分别加以详细介绍。
  调试地址寄存器
  每个调试地址寄存器(DR0-DR3)保存一个断点的32位线性地址。断点的比较是在物理地址转换之前进行的。
  调试寄存器DR4和DR5
  启用调试扩展时(控制寄存器的DE标志位被置为1,即CR4.DE=1),调试寄存器DR4和DR5被预留,因此,如果试图引用这两个寄存器,将引起无效操作码异常。DE标志位为0时,这些寄存器作为DR6和DR7的别名。
  调试状态寄存器(DR6)
  这个专用寄存器用来报告最近一次调试异常发生时的调试条件(当断点发生时,向调试器报告该断点的具体情况,以便调试器区分发生的是哪个断点。),在这个寄存器中的标志可以给出下列信息:
  B0~B3(位0至位3)指示检测到的断点条件
  BD(位13)指示指令流中的下一个指令将访问一个调试寄存器(DR0~DR7)
  BS(位14)指示(当设置时)调试异常是由单步执行模式(EFLAGS.TF=1)触发的
  BT (位15)指示(当设置时)这是由于任务切换时目标任务的TSS中的调试陷阱标志位被置1所导致的调试异常
  看官请注意,处理器从不清空DR6寄存器的内容,为什么?呵呵,这是软件的工作。
  调试控制寄存器(DR7)
  调试控制寄存器(DR7)启用或者禁用断点,并设置断点条件。它的标志位和字段控制下列事项:
  L0~L3(位0、2、4、6)启用(当设置时)与当前任务相关断点的断点条件
  G0~G3 (位1、3、5、7启用(当设置时)所有任务相关断点的断点条件
  LE 和GE (位8和9)导致处理器去精确地检测那个引起数据断点条件的指令。在P6系列处理器中,这两个标志不被支持
  GD (位13)启用(当设置时)调试寄存器的保护,会在任何MOV 指令访问调试寄存器之前产生一个调试异常
  R/W0~R/W3 (位16、17、20、21、24、25、28和29)为相应的断点规定断点条件。要了解更多信息请阅读英特尔手册
  LEN0~LEN3(位18、19、22、23、26、27、30和31)分别对应DR0~DR3四个调试地址寄存器,用来指定要监控的访问长度
  四、隐身法
   很好,如今我们已基本了解了IA-32调试机制的所有方面。但读者会问:到底该如何隐身呢?目前,我们了解了一些重要的事情:我们可以在一个内存地址上 设置一个断点,执行流一旦到达该断点,控制权马上会被重定向到调试处理程序(INT 1)。想想看,如果用我们自己的调试处理程序或者底层函数替换现有调试处理程序或者底层函数,结果会怎么样? 如下所示:
  ENTRY(debug)pushl $0pushl $ SYMBOL_NAME(do_debug)jmp error_code
   可以看到,实际的调试处理程序是C函数do_debug(),它定义在traps.c文件中。是的,我想我们能给INT 1处理程序打补丁,并且由我们自己来调用do_debug(),或者我们可以拿出我们自己do_debug()并且等待调试处理程序调用它,这样我们就能 确保IDT毫发无损了。但是我们的处理程序应该处理什么?当然,大部分情况下我们需要检查一些参数,然后将控制权传回操作系统实际的 do_debug()。但是我们应该监视哪些参数呢?
  五、劫持sys_call_table[]
  现在应该考虑如何利用 onunnt读/写/执行已做标记的内存地址来劫持系统调用表了。至于地址,既可以是INT 80处理程序的地址,也可以是系统调用表的地址,它们的最终效果是一样的。这样一来,每当操作系统查找syscall时,控制权就会传给我们的处理程序。 这时,我们有两个选择:要么直接在IDT中劫持INT 80处理程序,或者在内存中劫持sys_call_table[]的有效地址。这两种方法都能达到我们的目的,所以我们这里选择A。我们可以用以下函数来 返回INT 80处理程序的地址。
  get_idt_entry: sidt    idtrmovl    idtr+2, %ebx leal    (%ebx, %eax, 8), %ebxmovw    (%ebx), %cxroll    $16, %ecxmovw    0x6(%ebx), %cxroll    $16, %ecxmovl    %ecx, %eax ret
  只要知道了这个地址,我们就可以设置断点了,如下所示:
   set_bpm: movl    $0x80, %eaxcall    get_idt_entry movl    %eax, %dr0xorl    %eax, %eax orl     $0x2080, %eaxmovl    %eax, %dr7 ret
   如您所见,set_bpm()函数将INT 80所在的内存地址装入DR0,并且还在DR7中设置相应的标志,包括神奇的GD位,它使我们可以监视谁在访问调试寄存器以及为什么访问调试寄存器。这个 位对于我们来说非常重要,因为它“于任何访问调试寄存器的MOV指令执行之前产生一个调试异常”。这意味着什么?很明显,如果有人试图读/写调试寄存器, 控制权会在该指令执行之前被传递给我们的处理程序。这样,我们就能够知道是否有人打算检查调试寄存器,实际上在他们下手之前就知道了。这使我们有足够的时 间来隐藏行踪:我们可以让一切恢复原状,然后等待一段时间,让危险过去后,我们可以简单地跳过影响调试寄存器指令,等等。最好向系统表明调试寄存器是清白 的,并且在稍等片刻之后,重新钩住所的东西——这是最适合我们的。
  六、处理程序
  目前,我们不需要在系统调用表或者INT 80处理程序上打任何补丁就可以操纵执行流的重定向,但是,我们的处理程序将要处理什么呢?作为最简单的启动程序,我们的处理程序需要检查%eax 寄存器的值,因为它包含我们想要的syscall号,并让操作系统使用我们提供的syscall。下面是一个简单的处理程 序:4444444444444444444444
  asmlinkage void new_do_debug(struct pt_regs * regs, long error_code) {
  unsigned long condition;unsigned long mask = 0x2008;
  __asm__ __volatile__("movl %%db6,%0" : "=r" (condition));
   if (condition & BD_FLAG) { /* someone is r/w the registers */condition &= ~BD_FLAG;__asm__ __volatile__ ("movl %0, %%db6" : : "r" (condition));regs->eip += 3;__asm__ __volatile__ ("movl %0, %%db7" : : "r" (mask));}if (condition & DR_TRAP0) {if (regs->eax == __NR_time) sys_call_table[__NR_time] = hacked_time;if (regs->eflags & VM_MASK) {(*old_do_debug)(regs,error_code);__asm__ __volatile__ ("movl %0, %%db7" : : "r" (mask));}
  condition &= ~DR_TRAP0;__asm__ __volatile__ ("movl %0, %%db6" : : "r" (condition));__asm__ __volatile__ ("movl %0, %%db7" : : "r" (mask));regs->eflags |= X86_EFLAGS_RF;} else {(*old_do_debug)(regs, error_code);__asm__ __volatile__ ("movl %0, %%db7" : : "r" (mask));}
  return;}
  在这里, 我们应该做些什么?首先,我们捕获状态寄存器(DR6)的值,并设法弄清什么触发了我们的处理程序。如果触发该处理程序的是我们所放置的断点的话,那么我 们就要对%eax 寄存器的值跟决定去劫持的syscall(本例为sys_time())的值进行比较。在本例中,为了节约空间与时间,我们直接修改了 sys_call_table[],不过不用担心,因为hacked_time()一运行就会将sys_call_table[]改回原 样:55555555555555555555555
  asmlinkage long hacked_time(int *tloc){sys_call_table[__NR_time] = original_time;printk("<1>WE changed it!!/n");return original_time(tloc);}
  当然,为此还有别的方法也根本不需要碰系统调用表,但是考虑到hacked_time()要做的第一件事是把sys_call_table[]的值改回原样,这意味着实际的改变只出现不到一微秒,所以这不会是个问题。
   现在我们已经知道了如何在一个内存地址上设置断点,如何启用断点;此外,我们也获悉,在既不需要篡改INT 80处理程序,也无需篡改系统调用表处理程序或系统调用表本身的情况下,我们照样可以劫持正常的执行流程。这的确是一种有趣的技术,多少有一点像魔术。 但是,我们还是修改了INT 1处理程序,或者至少给do_debug()函数打了补丁,所以我们的活动还不够隐秘。
  七、神奇的障眼法
   至此,我们目睹了那么多的美妙技术:我们控制了系统,但是谁也检测不到对内核的直接篡改。借助于GD/BD位,我们得以拂去自己的踪迹:如果某人想要查 看调试寄存器的话,我们也能够轻而易举地应付他们的好奇(regs->eip +=3)。但是,如果有人要检查整个IDT的完整性,该怎么办呢?或者,如果调试器或者类似的工具需要将自己处理程序放在INT 1上,结果又会这样?那么,我们的处理程序会丢失么?别着急,我们可以再次向DR6和DR7求救。我们需要做的,如下所示:
  在INT 1上设置你的处理程序
  设置断点来监视INT 80地址
  另外设置一个断点(辅助断点)来监视我们的处理程序的地址
   但它不可能就这么简单,是的,的确如此!这样的话,在我们的对手看来,我们根本就没有损坏内核。我们早已解释了劫持INT 80需要做什么,如今让我们讨论一下INT 1。通过在INT 1或者do_debug()函数中放置一个辅助断点,就可以确保当有人企图读内核内存中我们唯一修改过的位置时,我们可以事先知道。最好是将那个地址返回 到原地址。如此以来,当一些险恶的工具企图在IDT中检查我们的存在时,我们让它们看的是未触动过的值。这的确是一种“深度隐藏”方式。
  但 是,我们会失去对内核的控制吗?还好这不是真的,因为控制权仍在我们手中:我们可以在几纳秒之后“重新安装”我们的rootkit,所以他们每次检查我们 时,他们总是看不到我们,就像给他们施了障眼法一样。 当对付一个试图将自己的钩子放进INT 1处理程序中的调试器(或者类似的工具)时,这种技术也是很有帮助的。设想一下:我们检测到这种企图,让一切恢复正常,调试器放置钩子,我们劫持他们的钩 子作为一个正常INT 1劫持,一旦他们检查他们的存在,例如通过检查处理程序的存在,我们让它们看他们自己。
  八、结束语
  本文介 绍了一种利用处理器的调试机制实现Rootkit的隐形的方法。它的美妙之处在于它实际上是IA-32处理器的一项基本功能,而不是什么漏洞什么的。就像 您所看到的,这是一种威力强大的技术,能够在目标系统上达到完全隐形的目的。因为调试支持是处理器的一种基本功能,所以本文讨论的技术能够用于运行在 IA-32机器上的论任何操作系统,所以它具有很好的通用性。
【推荐100个unity插件之8】实现多人在线联机游戏——Mirror插件的使用介绍(附项目源码) 基于Mirror的Unity多人游戏开发指南 本文介绍了使用Mirror插件开发Unity多人游戏的基本流程。Mirror是Unity的高级网络API,替代了已废弃的UNet系统。文章详细讲解了如何导入Mirror插件,创建NetworkManager网络管理器,处理常见错误,以及创建玩家角色和出生点。 主要内容包括: 创建场景NetworkManager并配置必要组件 为玩家添加NetworkIdentity和NetworkTransform组件 设置玩家初始生成位置和生成方式 常见错误及解决方法 通过M 阅读详情

相关推荐

基于Spring Boot在线远程考试系统的设计与实现

结合先进的互联网技术,开发符合需求的软件,让数据内容管理不管是从录入的及时性,查看的及时性还是汇总分析的及时性,都能让正确率达到最高,管理更加的科学和便捷。目前的信息时代,对信息的管理趋于高效化,便捷化,这也是计算机大力普及所带来的便利,此程序软件在设备选用上,依靠的是比较大众的电脑设备,对电脑的配置没有过多要求,一般学校的计算机机房的电脑都可以满足程序开发需求,另外,开发出此款程序,让信息处理变得高效率,其所带来的高效益是远超程序开发的低成本的,因此程序开发的资金投入是可以忽略不计的。

ITbiyesheji的博客 1218

探索隐形调试艺术:VivienneVMM——新一代的Intel VT-x虚拟机监控框架

[VivienneVMM](https://github.com/user/VivienneVMM),一个基于Intel VT-x技术的隐形调试框架,由[tandasat](https://github.com/tandasat)的[HyperPlatform](https://github.com/tandasat/HyperPlatform)延伸而来,让内核级别的调试工作更加隐蔽且高效。这个强

gitblog_00018的博客 560

从厘米级到公里级:北斗网格10级精度在ArcPro中的完整应用指南

本文提供了北斗网格十级精度体系在ArcGIS Pro中的完整应用指南。详细解析了从660公里到1.5厘米的十级网格尺度及其编码逻辑,并重点演示了如何在ArcPro中生成网格、计算编码,以及根据项目需求(如滑坡监测)选择合适精度层级的实战策略。指南旨在帮助GIS专业人士利用这套统一的网格框架,高效管理多尺度空间数据并优化分析工作流。

Black的专栏 474

软件调试之软件断点

软件断点 INT 3 指令,即通常所说的“软件断点”,一条X86系列处理器专门用于支持调试的指令。该指令目的是使CPU中断(break)到调试器,供调试器对执行现场进行各种分析。 INT 3 Visual C++ 嵌入内联汇编指令,示例如下: VS没有下断点,程序会自动断在INT 3 指令所在的位置。这正是通过注入代码手工设置断点的方法。 反汇编窗口如下: 内存地址002719CE 处有INT 3 指令。 打开寄存器窗口,EIP=002719CE INT 3属于陷阱异..

maomao171314的专栏 2510

如何实现三种不同RAM?(单端口RAM、伪双端口RAM、真双端口RAM|verilog代码|Testbench|仿真结果)

RAM(随机存取存储器)是计算机系统中的一种主要存储器件,用于存储和读取数据。在RAM中,单端口RAM(Single-port RAM)和双端口RAM(Dual-port RAM)是两种常见的类型,双端口RAM又分为真双端口(True dual-port RAM)和伪双端口RAM(Simple dual-port RAM)。那么什么是单端口和双端口?又该如何区分真双端口和伪双端口?输入只有一组数据线和一组地址线,读写共用地址线,输出只有一个端口。

Loudrs的博客 1万+

DeepSeek+即梦:AI视频创作从0到1全突破

本文为 DeepSeek 与即梦生成视频全攻略,从前期注册登录、熟悉工具界面及硬件网络准备入手,助读者开启 AI 视频创作。详细阐述利用 DeepSeek 构思脚本、即梦实现画面生成与静态图转动态视频的方法,包括提示词编写、参数调整等技巧。同时介绍后期合成音画、添加字幕特效及多平台适配要点,结合实战案例解析全流程。还分享进阶提示词优化、版权注意等避坑指南,为创作者提供从 0 到 1 的 AI 视频创作完整解决方案。

邓邓子的博客 8118

硬件断点和软件断点(整理)

文章目录 断点的类型 软件断点:由非法指令异常实现,适用于运行于内存中的程序(软件实现)。以x86为例,向某个地址打入断点,实际上就是往该地址写入断点指令INT 3,即0xCC。目标程序运行到这条指令之后就会触发SIGTRAP信号,gdb捕获到这个信号,根据目标程序当前停止位置查询gdb维护的断点链表,若发现在该地址确实存在断点,则可判定为断点命中[1]。 硬件断点:由硬件特性实现(数量有限),适用于直接在flash中运行的程序。 为什么要分软件断点和硬件断点呢? 既然软件断点是要往某个地址写入断

十一月zz的博客 6069

三维重建(十八)——colmap的使用(粗浅)

三维重建(十八)——colmap的使用(粗浅)

河海大学研究生在读的学习笔记 1378

Windows软件调试学习笔记(五)—— 软件断点&内存断点

软件调试学习笔记(五)—— 软件断点调试的本质软件断点分析INT 3执行流程 调试的本质 描述: 1)调试的本质是触发异常与调试器接管异常的过程。 2)不论是软件断点,硬件断点还是INT 3断点,本质都是触发异常。 软件断点 当使用调试器在任意代码位置设置断点时,本质上是将当前代码位置的字节码改为0xCC,对应的汇编指令为INT 3。 调试器为了界面的美观,不会直接在反汇编界面将修改后的数据显示出来。 可以使用WinHex查看内存数据进行验证。 软件断点执行流程: 被调试进程: 1)CPU检测到INT

lzyddf的博客 2481

RH850 GreenHillSoftware Install

IDE一次链接到一个Compiler/Green Hills Debug Probe安装目录。如果您安装了IDE、编译器和绿山调试探测器软件,安装程序会将安装链接在一起。如果您只使用Advanced Install选项安装IDE,那么当您第一次启动它时,IDE会提示您链接到编译器和绿山调试探针安装*。如果您使用Advanced Install选项只安装编译器和绿山调试探针软件,安装程序会提示您将IDE的安装链接到新的编译器和绿山调试探针安装。

舊梦的博客 1219

YOLOv8极速瘦身实战:LAMP剪枝让模型又快又准

一个庞大的模型虽然强大,但在实际部署,尤其是资源受限的边缘设备(如无人机、移动电话、嵌入式系统)上,却面临着严峻的挑战:高昂的内存占用、巨大的计算量以及随之而来的高延迟和高能耗。本教程从LAMP剪枝的深刻理论出发,详细解释了它如何通过最小化最坏情况下的L2失真,并借助巧妙的数学简化,最终推导出一种高效、无超参数、层自适应的剪枝策略。它如同为臃肿的模型进行一次精准的“瘦身手术”,通过移除网络中冗余或不重要的权重、神经元甚至整个结构,来显著降低模型的参数量和计算量(FLOPs),从而实现推理加速和资源节约。

FJN110的博客 259

显示隐藏文件 + 断点打印调试

1.显示隐藏文件夹显示:defaults write com.apple.finder AppleShowAllFiles -bool true隐藏:defaults write com.apple.finder AppleShowAllFiles -bool false 2.断点调试 设置断点 目标行运行后在控制台输入 po 加 要打印的对象 然后回车 转载于:http...

weixin_30507481的博客 104

NCCL 核心集体通信操作深度解析:从原理到优化实践

操作逻辑:若 N 个 GPU 各持有一段数据(大小为 S),通信后每个 GPU 会持有所有 N 段数据(总大小为 N×S)。典型场景:多卡推理结果聚合、模型并行中间结果同步。操作逻辑:N 个 GPU 各持有数据,通过归约(求和、取平均等)运算后,所有 GPU 获得相同结果。典型场景:数据并行训练的梯度聚合(如 SGD 优化器)。操作逻辑:N 个 GPU 各持有 N 份数据分片,通信后每个 GPU 获得所有 GPU 的对应分片。典型场景。

jundao1997的专栏 679

硬件断点和软件断点

在嵌入式开发,经常用到JTAG仿真器。JTAG仿真器可以满足嵌入式程序调试的基本要求:断点设置、单步调试、内存编辑、变量、寄存器观测等。而断点设置是JTAG仿真器最基本的调试功能。用户需要系统在设置断点处停下来后再进行调试。断点根据原理和用途不同又分为几个不同的种类。   断点可分为硬件断点和软件断点两大类:   1.硬件断点需要目标CPU的硬件支持,当前流行的ARM7/9内部硬件设计提供

gowyz的专栏 1万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

汇编实验之用debug命令查看寄存器和内存中的内容

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、用Debug的R命令查看、改变CPU寄存器的内容r命令查看cpu寄存器内容:r命令改变寄存器中的内容:二、用Debug的D命令查看内存中的内容用D命令直接查看内存中的内容用“D 段地址:偏移地址”的格式来查看内存某处的内容用Debug的E命令改写内存中的内容 前言 在之前安装好DOSBox后,使用debug命令进行汇编语言的实验一。 1.使用Debug命令查看寄存器的值。 2.使用Debug命令查看内存的内容。 一、

weixin_51165960的博客 2万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Debug中标志寄存器的查看

IP寄存器之后的顺序依次为: 溢出标志OF(Over flow flag)         OV(1)  NV(0) 方向标志DF(Direction flag)         DN(1)  UP(0) 中断标志IF(Interrupt flag)         EI(1)  DI(0) 符号标志SF(Sign flag)              NG(1)  PL(0) 零标

用文章记录成长 2483

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

DEBUG里标志寄存器状态位英文全称

想知道 DEBUG 里显示状态位的英文全称,便于记忆。悬赏分:10 | 解决时间:2009-9-28 23:39=======================================最佳答案:标志寄存器是一个( 16 )位的寄存器,由( 状态 )标志和( 控制 )标志两部分组成。------------------------------------OF(OV/NV):Over     

做而论道的博客 2036

记一次FPGA工程艰难的debug经历(模块一定要寄存器输出)

最近调试一个项目,时序没有报错,仿真没有问题,但是上板始终差一个bit,因为更换过器件,所以怀疑IP,各种怀疑,最后没办法,只能在signaltap上一个模块一个模块抓,然后跟仿真结果对比,最终定位到一个计数器。计数器的代码如下 always @(posedge clk or posedge reset) begin // 模块3 if (reset) dinCnter ...

qq_16923717的博客 3389

9.6 基于中断的功能调用

计算机组成 9 中断和异常 9.6 基于中断的功能调用 那现在,我在执行这些运算之后,也就是执行这些程序的过程中呢,又遇到了一个奇怪的现象。这里突然有一个地方写着,请查看紧急操作手册的第二百项,那我就翻到这个地方去了。翻到前面,然后找第二百项,然后找到了对应的操作——是让我在本子的某一个地方写一个数。这是怎么回事呢?一般来说,刚才我们学到的都是我在运算当中遇到了异常的情况,然后我主动去...

bangren3304的博客 328

Linux断点方法,一种基于Linux问题断点的定位方法及系统与流程

本发明属于Linux断点解决技术领域,涉及一种基于Linux问题断点的定位方法及系统。背景技术:在Linux的日常测试过程中,经常会遇见一些未知的原因下系统启动过程中突然出现的宕机,黑屏等现象。导致系统无法正常启动运行,而且现有技术中无法定位重启过程中出线的问题;导致宕机,黑屏现象频发且影响正常的启动程序。此为现有技术的不足之处。因此,针对现有技术中的上述缺陷,提供设计一种基于Linux问题断点的...

weixin_33246707的博客 379

linux断点续传程序,Linux下怎么实现断点续传

当要传送的文件较大,过程中如果网络中断了,就比较悲剧了。那么Linux下怎么实现断点续传呢?学习啦小编分享了Linux下实现断点续传的方法,希望对大家有所帮助。Linux下实现断点续传方法断点续传的原理其实断点续传的原理很简单,就是在 Http 的请求上和一般的下载有所不同而已。打个比方,浏览器请求服务器上的一个文时,所发出的请求如下:假设服务器域名为 wwww.sjtu.edu.cn,文件名为 ...

weixin_35712811的博客 2141

查看debug 状态寄存器

of(溢出)   df(方向)   if(中断)   sf(符号)   zf(零)   af(辅助进位)   pf(奇偶)   cf(进位)      为一的时候      ov(OVerflow)   dn(DowN)   ei(Enable   Interrupt)   ng(NeGtive)   zr(ZeRo)   ac(Auxiliary   Carry)   pe(Parity  

zhankai1122的博客 3004

Linux输入输出重定向与用户管理精要

本文系统梳理了Linux输入输出与用户组管理核心内容。输入输出部分涵盖字符设备与块设备区别、文件描述符、重定向与管道机制,重点解析2>&1等易错点;用户管理部分详解3A安全机制、用户分类、配置文件及常用命令(如useradd、passwd、sudo),强调权限最小化与安全审计。全文突出实践应用,适用于系统运维与考试复习。

2301_80092853的博客 633

Linux 网络排障实战:工业边缘场景下的 ss 与 netsta

工业网关的网络问题 — 服务起不来、连接堆积、外联异常 — 大多能从 socket 状态入手定位。;netstat 属于已停止维护的 net-tools,本文仅作对照。从工程实战角度梳理连接排查的完整用法。

ZenovaEdgeOS的博客 407

linux下面Kconfig简说depends on和select

关键字作用在你这段配置里的含义depends on门槛:条件不满足,选项不出现必须有 I2C、V4L2、MD6000 平台支持select强制:本选项开启,则被选项自动开启IMX178 开启时,自动打开 Media Controller 和 V4L2 Subdev API简单记:depends on管“我需不需要别人”select管“我开启了就顺手把别人拉上”。备注: 不会被看见,则不会被编译进去default nhelp+123。

hezhensheng007的专栏 195

USB 技术系列 11 · USB Linux 驱动框架

本文系统解析Linux USB驱动框架,涵盖USB Core、HCD(xhci-hcd/dwc3)、类驱动(CDC/HID/Mass Storage)分层架构,详解usb_device_id匹配、probe/disconnect生命周期及Device Tree配置。结合RISC-V N300实战,揭示Host/Device双模式驱动开发核心逻辑,助力嵌入式BSP开发者掌握USB子系统全栈能力。

peter_pan_study的博客 272
上一篇: Aspxshell 1.1 开源发布
下一篇: 一种基于NTLDR的BOOTKIT──原理及实现
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值