Go_Parser部署、使用与原理分析

文章目录

  • 前言
  • 1、概述
  • 2、安装与使用
    • 2.1、源码安装
      • 2.1.1、部署系统依赖组件
        • 2.1.1.1、部署IDA Pro 7.5 SP3
        • 2.1.1.2、部署Python 3.9.13
        • 2.1.1.3、部署Go 1.13.1
      • 2.1.2、使用源码安装系统
    • 2.2、使用方法
      • 2.2.1、准备测试程序
      • 2.2.2、创建IDA Pro项目
      • 2.2.3、使用Go_Parser解析二进制程序
  • 3、测试用例
  • 4、参考文献
  • 总结


前言

  本博客的主要内容为Go_Parser的部署、使用与原理分析。本博文内容较长,因为涵盖了Go_Parser的几乎全部内容,从部署的详细过程到如何使用Go_Parser对Go语言编译得到的二进制进行逆向分析,以及对Go_Parser进行逆向分析的原理分析,相信认真读完本博文,各位读者一定会对Go_Parser有更深的了解。以下就是本篇博客的全部内容了。


1、概述

  Go_Parser是一个针对Go语言二进制文件的解析工具,灵感来源于golang_loader_assist和jeb-golang-analyzer。它具有多项核心功能:

  • 解析firstmoduledata:firstmoduledata是Go语言二进制文件中的一个重要结构,它包含了各种关于模块的信息,如导入表、导出表以及运行时类型信息等。Go_Parser能够自动定位并解析firstmoduledata,从中提取出有用的信息。
  • 解析pclntab:pclntab(PC Line Table)是一种用于存储程序计数器(PC)和源代码行号之间映射关系的数据结构。通过解析pclntab,Go_Parser能够恢复函数的符号信息,并提取源码文件列表,有助于理解程序的结构和执行流程。
  • 解析strings和string pointers:Go语言中的字符串在二进制文件中以字符串常量的形式存在,而字符串指针则用于指向这些字符串。Go_Parser能够解析二进制文件中的字符串及其指针,有助于分析程序中的字符串使用情况。
  • 解析types:在Go语言中,类型信息对于理解程序的数据结构和对象之间的关系至关重要。Go_Parser能够解析二进制文件中的types信息,并为这些类型的各种属性添加有意义的注释或数据引用(dref),帮助逆向分析人员更好地理解程序的数据结构。
  • 解析itab:itab(Interface Table)是用于实现Go语言接口的数据结构,在二进制文件中保存了接口类型和实现类型之间的映射关系。通过解析itab,Go_Parser能够理解程序中接口的使用情况,有助于分析程序的设计和实现。

  通过以上核心功能,Go_Parser能够帮助逆向分析人员深入理解和解析Go语言的二进制文件,从而更好地进行逆向工程和安全分析。此外Go_Parser工具基于Python语言开发。

2、安装与使用

软件环境硬件环境约束条件
Windows 10专业版使用2个处理器,每个处理器3个内核,共分配6个内核本文所讲解的Go_Parser源代码于2024.05.06下载
具体的软件环境可见“2.1、源码安装”章节所示的软件环境内存8GB本文所安装的Go_Parser源代码于2023.05.06下载
暂无硬盘200GB具体的约束条件可见“2.1、源码安装”章节所示的软件版本约束
暂无Go_Parser部署在VMware Pro 17上的Windows 10系统上(主机系统为Windows 11),硬件环境和软件环境也是对应的VMware Pro 17的硬件环境和软件环境暂无

2.1、源码安装

2.1.1、部署系统依赖组件

2.1.1.1、部署IDA Pro 7.5 SP3
  1. 首先来到当前用户的根目录中,创建一个名为“IDAPro7.5”的文件夹:
    在这里插入图片描述

  2. 然后来到这里下载IDA Pro 7.5 SP3的免安装压缩包,然后将下载好的免安装压缩包解压刚刚创建的名为“IDAPro7.5”的文件夹中:
    在这里插入图片描述

  3. 然后执行下面的程序:
    在这里插入图片描述

  4. 然后按如下图所示进行选择:
    在这里插入图片描述

  5. 然后按如下图所示进行选择:
    在这里插入图片描述

  6. 然后按照如下图所示进行选择:
    在这里插入图片描述

  7. 然后按如下图所示进行选择:
    在这里插入图片描述

  8. 因为后续需要使用Python 3.9来支持IDA Pro 7.5 SP3,所以我们将该目录中名为“ida75sp3_python39_win”的压缩文件解压到当前目录中并全部替换原有文件:
    在这里插入图片描述

  9. 然后启动IDA Pro 7.5 SP3:
    在这里插入图片描述

  10. 然后按照如下图所示进行选择:
    在这里插入图片描述

  11. 然后按照如下图所示进行选择:
    在这里插入图片描述

  12. 然后会出现如下图所示的界面,这就代表IDA Pro 7.5 SP3部署完毕,以后需要使用的时候都按照该步骤启动IDA Pro 7.5 SP3,不再赘述:
    在这里插入图片描述

2.1.1.2、部署Python 3.9.13
  1. 首先来到Python官网下载Python 3.9.13的安装文件到本地:
    在这里插入图片描述

  2. 然后启动下载后的安装文件,并按照如下图所示进行选择:
    在这里插入图片描述

  3. 然后按如下图所示进行选择:
    在这里插入图片描述

  4. 然后按如下图所示进行选择:
    在这里插入图片描述

  5. 然后按如下图所示进行选择:
    在这里插入图片描述

  6. 等待安装完成:
    在这里插入图片描述

  7. 然后按如下图所示进行选择:
    在这里插入图片描述

  8. 然后打开CMD:
    在这里插入图片描述

  9. 在打开的命令行窗口中执行python命令,会出现如下图所示的内容,这就代表Python 3.9.13部署完毕:
    在这里插入图片描述

2.1.1.3、部署Go 1.13.1
  1. 首先来到Go语言官网下载Go 1.13.1的安装文件到本地:
    在这里插入图片描述

  2. 然后打开安装文件,并按如下图所示进行选择:
    在这里插入图片描述

  3. 然后按如下图所示进行选择:
    在这里插入图片描述

  4. 然后按如下图所示进行选择:
    在这里插入图片描述

  5. 然后按如下图所示进行选择:
    在这里插入图片描述

  6. 然后按如下图所示进行选择:
    在这里插入图片描述

  7. 然后等待安装:
    在这里插入图片描述

  8. 然后按如下图所示进行选择:
    在这里插入图片描述

  9. 然后打开命令行终端,执行go version命令,会打印如下图所示的内容,这代表Go 1.13.1部署完毕:
    在这里插入图片描述

2.1.2、使用源码安装系统

  1. 首先来到Go_Parser的官网下载Go_Parser的源代码到本地:
    在这里插入图片描述

  2. 然后将下载好的Go_Parser的源代码解压到任意位置,在这里我将其解压到系统的桌面:
    在这里插入图片描述

  3. 那么到此时,Go_Parser就已经部署完毕了,因为Go_Parser是以IDA Pro 7.5 SP3的插件的形式使用的,所以不需要额外的安装。只是使用Go_Parser的时候将下载好的Go_Parser的源码当作脚本直接执行即可。关于Go_Parser的具体使用方法,请参考“2.2、使用方法”章节

2.2、使用方法

2.2.1、准备测试程序

  1. 在系统的桌面创建一个名为“test.go”的文件,并在其中输入如下内容,最后保存后退出即可:
package mainimport "fmt"func main() {fmt.Println("Hello, World!")
}
  1. 然后在系统桌面打开CMD,并执行如下命令来将上面的源码编译为二进制程序:
> go build -o test

2.2.2、创建IDA Pro项目

  1. 首先打开在“2.1.1.1、部署IDA Pro 7.5 SP3”章节中部署好的IDA Pro,并将刚刚编译好的二进制程序导入到IDA Pro中:
    在这里插入图片描述

  2. 然后按如下图所示进行选择:
    在这里插入图片描述

  3. 然后按如下图所示进行选择:
    在这里插入图片描述

  4. 然后按如下图所示进行选择:
    在这里插入图片描述

  5. 然后按如下图所示进行选择:
    在这里插入图片描述

  6. 然后按如下图所示进行选择:
    在这里插入图片描述

  7. 然后就会得到如下图所示的界面,这就是使用IDA Pro对我们的测试文件的初次反汇编的结果。不过由于Go语言有非常多的独有的特点,所以仅仅靠IDA Pro无法解析这些Go语言独有的特点。那么就要利用到本文介绍的Go_Parser插件来对其进行反汇编了,从而得到更精细的反汇编结果:
    在这里插入图片描述

  8. 此外,我们还可以查看我们测试文件的main()函数对应的反汇编代码:
    在这里插入图片描述

2.2.3、使用Go_Parser解析二进制程序

  1. 当我们按照以上步骤做好准备工作后,按照如下图所示加载Go_Parser插件:
    在这里插入图片描述

  2. 然后选择在“2.1.2、使用源码安装系统”章节中解压好的Go_Parser的源码目录中的名为“go_parser.py”的文件,并将其打开:
    在这里插入图片描述

  3. 然后会出现如下图所示的窗口,提示我们正在使用Go_Parser脚本分析该二进制程序。我们无需对该窗口进行任何操作:
    在这里插入图片描述

  4. 当解析成功后,会在输出窗口打印一些提示信息。并且可以发现解析前的汇编代码与解析后的汇编代码确实发生了变化,这说明我们成功在IDA Pro 7.3 SP3中使用Go_Parser插件解析了Go语言编译得到的二进制程序。后续就可以根据解析结果对该二进制程序进行更进一步的分析:
    在这里插入图片描述

3、测试用例

  1. 首先在系统的桌面创建一个名为“test.go”的文件,并在其中输入如下内容,最后保存后退出即可:
package mainimport "fmt"func main() {fmt.Println("Hello, World!")
}
  1. 然后在系统桌面打开CMD,并执行如下命令来将上面的源码编译为二进制程序:
> go build -o test
  1. 然后打开在“2.1.1.1、部署IDA Pro 7.5 SP3”章节中部署好的IDA Pro,并将刚刚编译好的二进制程序导入到IDA Pro中:
    在这里插入图片描述

  2. 然后按如下图所示进行选择:
    在这里插入图片描述

  3. 然后按如下图所示进行选择:
    在这里插入图片描述

  4. 然后按如下图所示进行选择:
    在这里插入图片描述

  5. 然后按如下图所示进行选择:
    在这里插入图片描述

  6. 然后按如下图所示进行选择:
    在这里插入图片描述

  7. 然后就会得到如下图所示的界面,这就是使用IDA Pro对我们的测试文件的初次反汇编的结果。不过由于Go语言有非常多的独有的特点,所以仅仅靠IDA Pro无法解析这些Go语言独有的特点。那么就要利用到本文介绍的Go_Parser插件来对其进行反汇编了,从而得到更精细的反汇编结果:
    在这里插入图片描述

  8. 此外,我们还可以查看我们测试文件的main()函数对应的反汇编代码:
    在这里插入图片描述

  9. 当我们按照以上步骤做好准备工作后,按照如下图所示加载Go_Parser插件:
    在这里插入图片描述

  10. 然后选择在“2.1.2、使用源码安装系统”章节中解压好的Go_Parser的源码目录中的名为“go_parser.py”的文件,并将其打开:
    在这里插入图片描述

  11. 然后会出现如下图所示的窗口,提示我们正在使用Go_Parser脚本分析该二进制程序。我们无需对该窗口进行任何操作:
    在这里插入图片描述

  12. 当解析成功后,会在输出窗口打印一些提示信息。并且可以发现解析前的汇编代码与解析后的汇编代码确实发生了变化,这说明我们成功在IDA Pro 7.3 SP3中使用Go_Parser插件解析了Go语言编译得到的二进制程序:
    在这里插入图片描述

  13. 我们着重来看输出窗口中的内容,首先来看如下图红框和红箭头处所示的内容:
    在这里插入图片描述
    根据这个输出,可以发现Go_Parser已经成功地找到了firstmoduledata对象,并且确认了其魔数为0xfffffffb。这个结构在Go语言的二进制文件中非常重要,包含了关于模块的各种信息。另外,输出中显示了总共有0x75f个函数。这表明在二进制文件中存在着相当数量的函数,它们可能是程序的各种组件、功能或者库函数。

  14. 然后再来看如下图红框和红箭头处所示的内容:
    在这里插入图片描述
    这段输出显示了Go_Parser工具在解析二进制文件时创建了一系列函数,并列出了这些函数的地址。每一行的格式是Create function @ address,其中address是函数在内存中的地址。这些函数可能是在二进制文件中定义的各种代码块,例如程序的不同功能模块、库函数或者用户自定义函数等。另外,输出还显示了Go语言的根目录路径为c:\go,这表明在解析过程中发现了程序所使用的Go语言的根目录路径。

  15. 然后再来看如下图红框和红箭头处所示的内容:
    在这里插入图片描述
    这条输出表明Go_Parser工具对126个函数指针进行了重命名操作。函数指针是指向函数的指针变量,对其进行重命名可能是为了提高代码的可读性和理解性,或者为了匹配函数的实际名称。通过重命名函数指针,逆向分析人员可以更容易地理解代码中函数指针的作用和含义,从而更好地理解程序结构和行为。

  16. 然后再来看如下图红框和红箭头处所示的内容:
    在这里插入图片描述
    这段输出显示了Go_Parser工具在解析二进制文件时发现的源文件路径。在这个例子中,发现了一个源文件路径为C:/Users/iie-iisd/Desktop/test.go。这个路径可能是二进制文件所对应的源代码文件的路径。通过记录源文件路径,可以帮助逆向分析人员将二进制文件中的代码和相应的源代码文件联系起来,进而更好地理解和分析程序的功能和结构。

  17. 然后再来看如下图红框和红箭头处所示的内容:
    在这里插入图片描述
    这段输出指示了Go语言的版本为1.13.1。这个信息对于逆向分析人员来说可能是有用的,因为不同版本的Go语言可能会有一些语法和行为上的差异。知道程序是使用哪个版本的Go语言编译的,可以帮助分析人员更好地理解代码中的一些特性和行为,以及避免由于版本差异引起的误解。

  18. 然后再来看如下图红框和红箭头处所示的内容:
    在这里插入图片描述
    这段输出显示了pclntbl的地址为0x4ec3c0。pclntbl是一种用于存储程序计数器(PC)和源代码行号之间映射关系的数据结构。在Go语言的二进制文件中,pclntbl包含了关于函数的调试信息,例如每个函数的起始地址、指令地址和对应的源代码行号等。知道pclntbl的地址可以帮助逆向分析人员定位到该数据结构在内存中的位置,并且通过解析它,可以获得关于函数调试信息的更多细节,从而更好地理解程序的结构和执行流程。

  19. 然后再来看如下图红框和红箭头处所示的内容:
    在这里插入图片描述
    这些错误信息表明Go_Parser在解析二进制文件时遇到了一些问题,无法处理某些字符串。具体来说:

    • 第一个错误指出,在地址0x56ece0处的字符串长度为5143,但无法使用在地址0x417e2c处的函数中。类似地,第二个错误指出另一个字符串长度为10763,但无法在另一个函数的上下文中使用。
    • 第三个和第四个错误显示了两个较短的字符串,长度分别为108。同样,它们也无法在指定的函数中使用。
    • 最后一个错误指出了一个长度为1000000000的字符串,这是一个非常大的字符串。由于其巨大的长度,可能会导致内存或其他资源方面的问题。

    总的来说,这些错误提示了在解析二进制文件时遇到的一些字符串处理问题。这些问题可能会影响到程序的正确解析和理解,因此需要进行进一步的调查和修复。此外,Go_Parser 工具成功地从二进制文件中解析了1316个字符串,并且准备好将它们用于后续的分析过程。这些字符串可能包含了关于程序结构和功能的重要线索,有助于逆向分析人员理解程序的行为和内部机制。

  20. 然后再来看如下图红框和红箭头处所示的内容:
    在这里插入图片描述
    这条输出表明正在构建所有类型。在Go语言中,类型信息对于理解程序的数据结构和对象之间的关系非常重要。因此,在逆向工程中,解析和构建类型信息是一项关键任务。通过构建所有类型,可以建立类型之间的关系,帮助逆向分析人员更好地理解程序的结构和数据流。这些类型信息可能包括基本类型、自定义类型、结构体、接口等。一旦所有类型都被成功构建,逆向分析人员就可以更深入地分析程序的数据结构和对象之间的关系,从而更好地理解程序的功能和行为。

  21. 然后再来看如下图红框和红箭头处所示的内容:
    在这里插入图片描述
    这段输出提供了有关类型链接(Typelinks)的信息,以及在构建类型过程中发现的一些警告和结果:

    • Typelinks address is 0x4eb680:这表示类型链接的地址为0x4eb680。类型链接用于在运行时实现Go语言中的接口。了解类型链接的地址可以帮助逆向分析人员定位到它们在内存中的位置,并进一步分析接口的实现。
    • WARNNING: empty type @ ...:这些警告表示在构建类型时遇到了一些空类型。这可能是由于二进制文件中存在一些缺失或错误的类型定义导致的。虽然这些警告可能会影响到后续的分析过程,但它们并不会阻止工具的继续运行。
    • Standard types building finished. Total types count: 1175:这说明标准类型的构建已经完成,共计1175种类型。标准类型包括Go语言中的基本类型(如int、string)和标准库中的一些常见类型。
    • Extra types building done, total count: 1:这表示额外类型的构建也已完成,共计1种类型。额外类型可能是一些用户自定义的类型或者第三方库中的类型。
    • Start to parse Itab:这是一个开始解析Itab的提示。Itab是用于实现Go语言接口的数据结构,它保存了接口类型和实现类型之间的映射关系。
    • Itab parsing done, total count: 22:这表示Itab解析完成,共计找到了22个接口实现。解析Itab可以帮助理解程序中接口的使用情况,有助于分析程序的设计和实现。

    综合来看,这段输出提供了关于类型构建和解析过程的一些关键信息,有助于逆向分析人员理解程序的类型系统和接口实现。

  22. 总而言之,IDA Pro对Go语言编译得到二进制程序的解析效果并不好(因为Go语言有很多独有的特性),而Go_Parser可以帮助我们更好的解析Go语言编译得到二进制程序,且根据以上信息我们可以回到IDA Pro中对测试程序进行后续的分析。不过因为我们主要介绍Go_Parser,故不对IDA Pro中的操作进行过多介绍,感兴趣的读者可以自行查看(其实就是将以上解析结果替换原有的汇编代码,不做过多介绍,若后续有需求再将其更新到该文档中)。

4、参考文献

  1. Go_Parser:一款针对IDAPro的Galong二进制代码分析工具
  2. [PYG绿化集成全插件版]IDA Pro 7.5 SP3 (x86, x64, ARM, ARM64, PPC, PPC64, MIPS) + SDK+DOC
  3. 无符号GoLang逆向经历
  4. Go二进制文件逆向分析从基础到进阶——综述
  5. Python Releases for Windows | Python.org
  6. [原创]GoParser——Yet Another Golang binary parser for IDAPro
  7. 没有任何安装的文档么? · Issue #3 · 0xjiayu/go_parser
  8. 【Go】windows下的Go安装与配置,并运行第一个Go程序
  9. Go语言环境安装及配置
  10. All releases - The Go Programming Language
  11. go语言文件逆向认知篇(ida7.6直接绕行)
  12. Go二进制文件逆向分析从基础到进阶——MetaInfo、函数符号和源码文件路径列表
  13. Go二进制文件逆向分析从基础到进阶——Tips与实战案例-安全客 - 安全资讯平台
  14. Go二进制文件逆向分析从基础到进阶——数据类型
  15. Go二进制文件逆向分析从基础到进阶——itab与strings

总结

  以上就是本篇博文的全部内容,可以发现,Go_Parser的部署与使用过程并不复杂,我们本篇博客对其进行了详细的分析。相信读完本篇博客,各位读者一定对Go_Parser有了更深的了解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/882569.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

植物大战僵尸杂交版游戏分享

植物大战僵尸杂交版游戏下载:夸克网盘分享 无捆绑之类的隐形消费,下载即玩

电力调度控制中心在电力系统中的作用

在庞大而复杂的电力系统中,电力调度控制中心犹如一颗智慧的心脏,扮演着不可或缺的角色。它不仅是电力输送与分配的指挥官,更是确保电网安全、稳定、高效运行的守护者。关于电力调度控制中心在电力系统中的作用,我们具体了解一下。…

URL+Tcp/IP+Http Https

URL 1,在WWW上,每一个信息资源都有统一的且在网上唯一的地址,该地址就叫URL,(统一资源定位器),它是WWW的统一资源定位标志,就是指网络地址,用于定位网络资源,例如:视频,音…

全新子比主题7.9.2开心版 子比主题最新版源码

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 wordpress zibll子比主题7.9.2开心版 修复评论弹授权 可做付费下载站 含wordpress搭建视频教程zibll子比主题安装视频教程支付配置视频教程,视频都是语音讲解,…

AI产品经理:从入门到精通,一篇文章带你入门!(附学习资料)

一、AI产品经理工作全流程概览 AI产品经理工作全流程中与普通产品经理的区别主要是多了算法模型部分,包括模型预研、数据准备、模型构建、模型宣讲、模型验收,协作的对象相对普通产品经理也多了算法工程师。 二、需求定义 需求定义主要要定义清楚以下几…

Ubuntu系衍生版手动修改配置网卡的配置总结

一、Ubuntu系的IP地址配置文件的目录: sudo vim /etc/network/interfaces 二、以DHCP方式配置网卡: 在以上配置文件中添加以下两行: auto enp3s0 iface enp3s0 inet dhcp 三、为网卡配置静态IP地址: 在以上配置文件中添…

vue $nextTick 实现原理

nextTick的实现 一:nextTick介绍二:手写nextTick三:具体代码四:实现细节 一:nextTick介绍 nextTick 是 Vue.js 框架中的一个方法,它允许延迟执行一个函数,直到 DOM 更新完成。当你修改了数据并…

python-qq定时自动消息发送

预设 qq需要可以enter发送消息 发qq表情代码需要开启快捷表情 import sys import win32gui import win32con import win32clipboard as w import win32api import time import subprocess import datetime import webbrowser import tkinter as tk vb_file_path "./op…

探索迷宫的奥秘:用 C++ 打造你的迷宫游戏之旅!

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

面试官:重量级锁的8连问,你能接住几个?

前言 接上一篇偏向锁的十连问,继续升级到重量级锁的进阶版,检验一下自己离精通重量级锁还有多远。建议在读之前了解下Java中重量级锁的实现原理。 重量级锁的ObjectMonitor和JUC中的AQS有什么异同 为什么ObjectMonitor需要cxq和entryList两个等待队列 …

AUTOSAR_EXP_ARAComAPI的5章笔记(15)

☞返回总目录 相关总结:AutoSar AP CM服务接口级别的数据类型总结 5.5 服务接口级别的数据类型 以下章节描述了在ara::com中服务接口用户定义数据类型的 C 语言映射。这里的 “用户定义” 是指那些不是由ara::com API 定义(例如InstanceIdentifier、F…

2024前端面试题-1.自我介绍+常见考点汇总

一、自我介绍模板 个人信息教育背景工作经验技能专长优势特点 (注:括号)内的内容可视具体情况决定说不说。以下内容仅为个人想法,仅供参考交流,不喜勿喷,感谢留情~* 1、个人信息: 姓名&…

Leetcode 3325. Count Substrings With K-Frequency Characters I

Leetcode 3325. Count Substrings With K-Frequency Characters I 1. 解题思路2. 代码实现 题目链接:3325. Count Substrings With K-Frequency Characters I 1. 解题思路 这一题思路上就是一个滑动窗口。 我们考察窗口的左边界依次为0到n-1时右边界能够取到的最…

数据结构编程实践20讲(Python版)—19字典树

本文目录 19 字典树(Trie)S1 说明字典树结构字典树的构建与查找字典树的特点字典树的应用领域 S2 示例S3 应用1:基于 big.txt 实现单词的自动补全功能S3 应用2:实现 IP 路由中的最长前缀匹配S3 应用3:基于 Trie 的压缩…

THP4 SOP16 芯片 高速光耦芯片

光电耦合器输入端加电信号使发光源发光,光的强度取决于激励电流的大小,此光照射到封装在一起的受光器上后,因光电效应而产生了光电流,由受光器输出端引出,这样就实现了电一光一电的转换。 由于光耦合器输入输出间互相…

防火墙和堡垒机有什么区别?

防火墙和堡垒机在网络安全领域都扮演着至关重要的角色,但它们在功能、部署位置、作用范围等方面存在显著差异。 一、功能定位 防火墙:防火墙是一种网络安全系统,主要作用是在私有网络与公网之间建立一道安全屏障,监控和控制网络流量。它通过预定义的安全规则,决定哪些数…

5g工业路由器最新案例:高原气象站网络升级项目

背景: 某省气象局决定在高原地区升级其气象观测网络,以提高天气预报的准确性和及时性,同时为气候变化研究提供更可靠的数据支持。该项目面临以下挑战: 需要在高原广袤且地形复杂的区域部署大量自动气象站,要求网络覆…

【Excel】【VB和JS】表格内容姓名、卡号、身份证敏感信息转换为图片打印

VB代码: Function ConvertCellToImageAndPlace(n As Long, m As Long)Dim sourceCell As RangeSet sourceCell Sheets("Sheet2").Cells(n, m)sourceCell.CopyPicture Appearance:xlScreen, Format:xlPictureDim targetCell As RangeSet targetCell She…

优化SQL查询的最佳实践:提升数据库性能的关键

SQL 查询是数据库操作的核心,特别是当数据量庞大时,性能问题尤为明显。优化 SQL 查询不仅能减少响应时间,还能提高系统整体的可伸缩性。本文将从索引、查询结构、数据库设计和缓存等方面详细介绍如何优化 SQL 查询以提升性能。 一、索引的使…

kotlin 中 ::class ::class.java 和 .javaClass 区别

在 Kotlin 中,获取一个类的类对象(Class 对象)有几种不同的方式,包括 ::class、::class.java 和 .javaClass。每种方式都有其特定的用途和适用场景。下面是对这三种方式的详细解释: ::class 用途:获取 Kotl…