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,一经查实,立即删除!

相关文章

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

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

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

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

全新子比主题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地址: 在以上配置文件中添…

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

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

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

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

THP4 SOP16 芯片 高速光耦芯片

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

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

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

Java配置 Redis 连接互斥锁或队列预先加载缓存

学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……) 2、学会Oracle数据库入门到入土用法(创作中……) 3、手把手教你开发炫酷的vbs脚本制作(完善中……) 4、牛逼哄哄的 IDEA编程利器技巧(编写中……) 5、面经吐血整理的 面试技…

【HuggingFace 如何上传数据集 (2) 】国内网络-稳定上传图片、文本等各种格式的数据

【HuggingFace 下载】diffusers 中的特定模型下载,access token 使用方法总结【HuggingFace 下载中断】Git LFS 如何下载指定文件、单个文件夹?【HuggingFace 如何上传数据集】快速上传图片、文本等各种格式的数据 上文的方法因为是 https 协议&#xf…

1024-过去一年的总结

目录 前言 (10月-24.01)故事的开始 (2月-7月)漫长的学习与探索 (8月-现在)低谷期 自我审视 前言 1024在即,就借此机会讲一讲过去一年的经历,也算是全方位总结一下自己 (10月-24.01)故事的开始 那就从去年大一入学…

【C++】STL——priority_queue优先级队列

目录 前言priority_queue的使用简单使用在OJ中的使用 priority_queue的模拟实现基本功能仿函数在这里插入图片描述 前言 上一节我们说了stack和queue这两种容器适配器,而priority_queue(优先级队列)同样也是属于容器适配器,它会优…

【Fargo】9:模拟图片采集的内存泄漏std::bad_alloc

std::bad_alloc 崩溃。这样的内存分配会导致内存耗尽 is simulating an image of size 640x480 with 3 bytes per pixel, resulting in an allocation of approximately 921,600 bytes (or around 900 KB) for each image. The error you’re encountering (std::bad_alloc) ty…

Java 多线程(四)—— 线程安全 与 volatile 与 单例模式

什么是线程安全 在进行多线程编程的时候,当我们编写出来的多线程的代码运行结果不符合我们的预期的时候,这时候就是 bug,这种 bug 是由于多线程的问题而产生出来的 bug 我们称之为 线程安全问题 当我们编写出来的多线程代码运行之后的结果符…

学习文档(5)

Redis应用 目录 Redis应用 Redis 除了做缓存,还能做什么? Redis 可以做消息队列么? Redis 可以做搜索引擎么? 如何基于 Redis 实现延时任务? Redis 除了做缓存,还能做什么? 分布式锁&…

三周精通FastAPI:5 查询参数和字符串校验

FastAPI手册:https://fastapi.tiangolo.com/zh/tutorial/query-params-str-validations/ 查询参数和字符串校验 FastAPI 允许你为参数声明额外的信息和校验。让我们以下面的应用程序为例: from fastapi import FastAPIapp FastAPI()app.get("/it…

基于springboot+thymeleaf+springsecurity搭建一套web小案例

一、前言 本案例中的源代码已上传到资源库,可自行下载,传送阵 https://download.csdn.net/download/qq_36260963/89906196 Spring Boot是为了简化Spring应用的创建、运行、调试、部署等而出现的,使用它可以做到专注于Spring应用的开发&#x…

git clone 鉴权失败

git clone 鉴权失败问题 1. 问题描述2. 解决方法 1. 问题描述 使用git clone自己的代码报如下错误: 正克隆到 xxx... Username for https://github.com: Password for https://xxxgithub.com: remote: Support for password authentication was removed on Augu…

RAG流程的实现与改进

一、 RAG流程图 数据入库:读取本地数据并切成小块,并把这些小块经过编码embedding后,存储在一个向量数据库中(下图1——6步);相关性检索:用户提出问题,问题经过编码,再在…