4.1 探索LyScript漏洞挖掘插件

news2024/11/26 11:31:32

在第一章中我们介绍了x64dbg这款强大的调试软件,通过该软件逆向工程师们可以手动完成对特定进程的漏洞挖掘及脱壳等操作,虽然x64dbg支持内置Script脚本执行模块,但脚本引擎通常来说是不够强大的,LyScript 插件的出现填补了这方面的不足,该插件的开发灵感来源于Immunity调试器中的ImmLib库,因Immunity调试器继承自Ollydbg导致该调试器无法支持64位应用的调试,同时该调试器也长期没有开发者进行维护,正是在这种情形之下LyScript诞生。

  • LyScript官方地址:https://github.com/lyshark/LyScript

LyScript是一款 x64dbg 自动化控制插件,通过Python控制x64dbg的行为,实现远程动态调试,解决了逆向工作者分析程序,反病毒人员脱壳,漏洞分析者寻找指令片段,原生脚本不够强大的问题,通过与Python相结合利用Python语法的灵活性以及其丰富的第三方库,加速漏洞利用程序的开发,辅助漏洞挖掘以及恶意软件分析。

LyScript插件的安装非常容易,读者只需要在官方下载对应的插件并放入到plugins/根目录下即可,当插件加载成功,读者可看到如下图所示的输出信息,过程中可能会出现网络通信授权框,请读者允许并放行即可;

接着读者还需要打开命令行,并通过pip命令安装对应的插件包,LyScript插件一般而言分为两个核心包LyScript用于实现基于函数的通信机制,而LyScriptTools则是对函数的类版封装,两者建议全部安装;

  • 安装标准包:pip install LyScript32 或者 pip install LyScript64
  • 安装扩展包:pip install LyScriptTools32 或者 pip install LyScriptTools64

安装此插件读者应该具备了Python开发环境,版本必须大于3.6才可以,当环境具备后,读者可执行上述命令,依次安装这几个不同的版本。

Microsoft Windows [版本 10.0.19042.1826]
(c) Microsoft Corporation。保留所有权利。

C:\Users\admin> pip install LyScript32
C:\Users\admin> pip install LyScript64
C:\Users\admin> pip install LyScriptTools32
C:\Users\admin> pip install LyScriptTools64

4.1.1 如何使用插件

LyScript 插件提供了丰富的 API 封装函数,包括寄存器、调试、模块、内存、堆栈、进程和线程等不同类别的函数。这些函数可以帮助开发者更方便地访问和修改程序的内部信息,便于调试和破解,但需要开发者具备一定的编程和调试经验,并遵守相应的规范和准则,以确保软件的安全和稳定性。

注意:首先读者需要启动带有插件功能的x64dbg调试器,并手动拖入一个任意被调试进程到调试器中,这是使用插件功能的必备条件,基于Python下的LyScript模块无法独立运行,这一点读者需要格外注意。

根据插件官方解释,用户在使用该插件时首先需要通过dbg = MyDebug()初始化一个调试控制类,当这个类被初始化结束后则可以通过dbg.connect()函数连接到调试器中,当连接被建立时则默认会创建一个持久会话直到Python脚本结束才会被强制断开,在连接期间读者也可通过dbg.is_connect()检测套接字是否存在,如下面这段代码则是一个最基本的实现方法。

>>> from LyScript32 import MyDebug
>>>
>>> dbg=MyDebug()
>>>
>>> connect_flag = dbg.connect()
>>> print("连接状态: {}".format(connect_flag))
连接状态: True
>>>
>>> ref = dbg.is_connect()
>>> print("是否在连接: ", ref)
是否在连接:  True
>>>
>>> dbg.close()
True

在该代码示例中,用户首先通过导入 LyScript 插件中的MyDebug类,创建了一个名为dbg的实例,并初始化该类。接着调用dbg.connect()函数,建立连接。连接成功后,使用is_connect()函数检查套接字是否存在,并将结果打印出来。最后,调用dbg.close()函数以关闭调试器连接。

4.1.2 读取或设置寄存器参数

寄存器是计算机中的一种高速存储设备,位于CPU内部。它们由一些元器件构成,通常是用于存储和操作CPU指令和数据的硬件单元。不同的CPU架构可能会有不同的寄存器数量、位宽和功能。

寄存器是计算机架构中非常重要的一部分,因为他们能够在CPU执行指令时快速地存储和读取数据,从而提高计算速度。寄存器的存储速度比内存快得多,通常称为“零缓存器延迟”(zero cache delay),所以它们是程序优化的主要目标之一。

寄存器的功能多种多样,包括存储数据、指令地址、指令结果,以及用于计算、判断等各种用途。常见的寄存器包括累加器、计数器、指针寄存器、标志寄存器等。在程序中,寄存器经常用来存储中间计算结果和临时变量,通常比内存访问更快,从而提高程序运行效率。

在x64dbg中寄存器通常会展现在屏幕的右上角,以32位为例,默认情况下寄存器可被分为,通用寄存器,标志寄存器,DR系列特殊寄存器组,以及段选择子等。

通用寄存器以及该寄存器的功能如下表格所示;

寄存器名描述
EAX累加器,用于存放一些计算结果或指针。
ECX计数器,主要用于循环计数等功能。
EDX数据寄存器,被用于存放一些指针或标志信息。
EBX基地址寄存器,主要用于访问内存中的数据。
ESP栈指针,用于指向当前的栈顶。
EBP基址指针,通常被用来指向当前的栈帧。
ESI源索引寄存器,通常用于字符串操作。
EDI目标索引寄存器,也常常用于字符串操作。

标志寄存器以及该寄存器的功能如下表格所示;

标志寄存器含义
CF进位标志 (Carry Flag)。该标志表示在执行无符号算术指令时是否发生了进位。
PF奇偶标志 (Parity Flag)。该标志表示指令执行后结果的低八位中1的个数是否为偶数。如果是偶数,标志位被设置为1,否则为0。
AF奥半字进位标志 (Auxiliary Carry Flag)。该标志表示执行指令后低四位的进位情况。
ZF零标志 (Zero Flag)。该标志表示上一条指令执行后结果是否为零。如果结果为零,标志位被设置为1,否则为0。
SF符号标志 (Sign Flag)。该标志表示结果是否为负数。如果结果为负数,标志位被设置为1,否则为0。
TF调试标志 (Trap Flag)。该标志用于单步调试,当该标志被设置为1时,CPU将在执行完每一条指令后暂停,这使得调试器可以检查这一指令对寄存器和存储器的影响。
IF中断允许标志 (Interrupt Flag)。如果该标志为1,表示CPU允许响应来自外部设备的可屏蔽中断请求。
DF方向标志 (Direction Flag)。该标志用于指示字符串操作指令是否应该向前 (DF=0) 或向后 (DF=1) 方向进行操作。
OF溢出标志 (Overflow Flag)。该标志表示在执行有符号算术指令时是否发生了溢出。

LyScript插件中,通常会使用get_register()函数获取特定通用寄存器的参数,与之对应的可以使用set_register()函数实现设置,如下片段则是分别获取与设置特定寄存器组的函数调用规范;

>>> eax = dbg.get_register("eax")
>>> hex(eax)
'0xa'
>>>
>>> eip = dbg.get_register("eip")
>>> hex(eip)
'0x76fdc3b8'
>>>
>>> flag = dbg.set_register("eax",100)
>>> flag
True
>>> hex(dbg.get_register("eax"))
'0x64'

同理,对于获取与设置标志寄存器,也有一对标准的通用函数get_flag_register()函数用于获取一个标志,而与之对应的set_flag_register()函数则用于设置一个标志,需要注意的是在设置标志时,第二个参数需传入一个状态[设置为真 True] / [设置为假 False]而不是接受一个字符或整数;

>>> tf = dbg.get_flag_register("tf")
>>> tf
False
>>>
>>> zf = dbg.get_flag_register("zf")
>>> zf
True
>>>
>>> flag = dbg.set_flag_register("cf",True)
>>> flag
True
>>>

4.1.3 使用调试控制系列函数

调试器的核心功是对程序进行调试,而调试器内部实现往往会调用操作系统提供的调试API,调试系列函数是这些API之一,用于帮助开发者在程序执行时得到更多的信息,包括内存值、指令执行状态、变量状态等,以便更加全面和深入地了解代码的运行情况和错误。调试系列函数的主要作用如下:

  • 用于设置和管理断点,包括硬件断点、软件断点等。
  • 提供各种调试命令,包括单步执行、运行到某个指定位置、查看内存寄存器的状态信息等,为程序的调试过程提供必要的信息。

总之,调试系列函数为调试器提供了丰富的操作接口和调试工具,使得开发人员能够更加深入和全面地了解程序的运行状态,并借助这些信息更好地调试和定位程序的错误和漏洞。

首先介绍的是set_debug()函数,该函数是调试器中一个非常重要的函数,它被用于影响调试器的状态,常见的操作包括前进一次、后退一次、暂停调试、终止调试等。在调试过程中,开发人员会根据需要进行不同的调试操作,以理解程序执行的过程、获得代码执行的状态信息以及找到代码中的错误。

该函数的可用的动作范围包括:暂停(Pause)、运行(Run)、步入(StepIn)、步过(StepOut)、到结束(StepOver)、停止(Stop)以及等待(Wait)。通过调用set_debug()函数,并传递相应的参数,读者可以方便地进行调试操作,并随时获取程序的运行状态信息。例如,将参数设置为“暂停”,则可以暂停程序的执行、查看程序内存中的值以及检查程序调用栈等信息;将参数设置为“运行”则可以继续程序的执行,直到遇到下一个断点或者程序结束。

我们以步入(StepIn)、步过(StepOut)为例,读者可使用如下命令执行一次动作;

>>> dbg.set_debug("StepIn")
True
>>> dbg.set_debug("StepOut")
True
>>>

此外判断调试器动作也是一种非常普遍的功能,插件内提供了is_debugger() /is_running()/is_run_locked()三个调试函数,函数is_debugger可用于验证当前调试器是否处于调试状态,函数is_running则用于验证是否在运行,函数is_run_locked用于检查调试器是否被锁定(暂停),这三个函数的调用规范与上方基本一致;

>>> dbg.is_debugger()
True
>>> dbg.is_running()
False
>>> dbg.is_run_locked()
True

4.1.4 使用断点设置系列函数

断点是调试器中常用的工具之一,可以帮助开发人员暂停程序的运行并检查程序中的错误。x64dbg中的断点分为以下几类:

  • 软件断点(BP):软件断点是一种在程序执行期间暂停程序并引起中断的代码指令,可用于修复软件中的一些缺陷或调试程序。在x64dbg中,使用“F2”键可以在程序的代码段中设置软件断点,碰到指定断点时会暂停程序并进入调试模式,以便对程序进行调试。

  • 硬件断点:硬件断点是一种针对某个具体的地址,由CPU硬件支持的断点,当程序执行到该地址时,CPU会中断程序并通知调试器进行调试。硬件断点在调试器中设置方式和软件断点相同,也是通过“F2”键来设置。在使用硬件断点时,需要特殊注意硬件断点的数量,因为硬件断点数量通常非常有限。

  • 内存断点:内存断点是一种根据条件变化暂停程序执行的断点,它可以对内存地址进行监视,当内存中的指定值在程序运行时发生变化时触发中断。在x64dbg中,可以通过“右键菜单”中的“内存浏览器”或“内存”窗口设置内存断点。

LyScript插件可以使用set_breakpoint()函数设置软件断点,使用delete_breakpoint()函数删除一个软件断点,使用check_breakpoint()函数可用于检测断点是否被命中,使用get_all_breakpoint()可用于输出当前所有断点

>>> eip = dbg.get_register("eip")
>>> dbg.set_breakpoint(eip)
True
>>> dbg.check_breakpoint(eip)
True
>>> ref = dbg.get_all_breakpoint()
>>> ref
[{'addr': 4584081, 'enabled': 1, 'hitcount': 0, 'type': 1}, {'addr': 1996337564, 'enabled': 1, 'hitcount': 0, 'type': 1}, {'addr': 1996337612, 'enabled': 1, 'hitcount': 0, 'type': 1}, {'addr': 1996337643, 'enabled': 1, 'hitcount': 0, 'type': 1}]

同理,当读者需要设置硬件断点是可使用set_hardware_breakpoint()设置,但需要注意硬件断点在32位系统中最多设置4个,如果需要取消断点则可使用delete_hardware_breakpoint()函数将断点进行移除;

断点类型可用范围:[类型 0 = HardwareAccess / 1 = HardwareWrite / 2 = HardwareExecute]

>>> ref = dbg.set_hardware_breakpoint(eip,2)
>>> print(ref)
True
>>> ref = dbg.delete_hardware_breakpoint(eip)
>>> print(ref)
True

4.1.5 使用堆栈系列函数

堆栈窗口是调试器非常重要的一个功能窗口,可以帮助开发人员监视程序运行时的堆栈信息。该窗口能够显示当前线程的调用栈、局部变量(Local Variables)以及函数参数(Function Parameters)等重要信息,并以图形化的方式呈现出来,方便用户进行查看和调试。

在x64dbg的堆栈窗口中,对于每一个程序运行时的线程,都会显示当前线程的调用栈信息,最上面的栈帧表示当前正在执行的函数,下面栈帧则为调用该函数的函数。用户可以通过向上和向下翻转堆栈栈帧查看程序函数调用的层级,便于查找程序执行过程中的错误和问题。

此外,在当前调用栈帧中,用户还可以查看当前函数的参数和局部变量等信息,这些信息通常是有助于调试程序问题的关键性信息。用户可以通过右键单击堆栈窗口中的任何一帧来切换该帧的状态,包括指针、参数、图像、字符串、十六进制等,以便更加准确地查看当前栈的信息。

综上所述,堆栈窗口是x64dbg调试器中非常重要的一个功能窗口,可以帮助用户在程序执行过程中理解、调试和跟踪程序执行的层次结构和变量信息,解决代码的问题,提高开发效率。

堆栈系列函数包括了push_stack()用于向目标堆栈中压入一个数值,与之对应的pop_stack()则用于在堆栈中弹出一个元素,peek_stack()函数用于检查堆栈内的参数,可设置偏移值,不设置则默认检查第一个也就是栈顶。

>>> check = dbg.peek_stack()
>>> check
1996055601
>>>
>>> check = dbg.peek_stack(1)
>>> hex(check)
'-0x757bb72f'
>>>
>>> dbg.push_stack(10)
True
>>> dbg.push_stack(10)
True
>>> dbg.pop_stack()
True
>>> check = dbg.peek_stack(1)
>>> hex(check)
'0x76f96431'
>>>

4.1.6 使用反汇编系列函数

反汇编是调试器中非常重要的核心功能之一,它可以将已编译的二进制代码转换为对应的汇编代码,帮助开发人员了解程序的执行流程和代码逻辑,并定位代码问题。在x64dbg调试器中,反汇编功能是其核心功能之一,具有以下特点:

  • 显示汇编代码:x64dbg反汇编窗口可以将二进制代码反汇编为对应的汇编代码,包括指令、寄存器、内存地址等信息,方便开发人员进行代码分析和调试。
  • 支持多种格式:除了常见的AT&T格式和Intel格式汇编代码之外,x64dbg还支持多种反汇编码格式,比如Hopper、GDB和IDA等,满足不同开发人员的需求。
  • 集成调试功能:x64dbg反汇编窗口还集成了调试功能,支持在反汇编视图中设置断点、单步执行、条件断点等操作,可以帮助开发人员更加有效地调试程序。
  • 支持多种反汇编引擎:x64dbg支持多种反汇编引擎,包括TitanEngine、Capstone、BeaEngine等,可以进行更加准确和全面的反汇编分析。

反汇编是x64dbg调试器的核心功能之一,可以帮助开发人员进行代码分析和调试,定位代码问题,提高开发效率。通过x64dbg的反汇编功能,开发人员可以有效地了解程序的代码逻辑、执行流程和指令序列,为调试和分析程序提供有力的支持。

当读者需要使用插件控制调试器反汇编时可以使用get_disasm_code()该函数主要用于对特定内存地址进行反汇编,需传入两个参数,并输出一个字典类型的数据集合,如下案例我们反汇编EIP位置处向下的30个行;

>>> eip = dbg.get_register("eip")
>>> disasm_dict = dbg.get_disasm_code(eip,30)
>>>
>>> for ds in disasm_dict:
...     print("地址: {} 反汇编: {}".format(hex(ds.get("addr")),ds.get("opcode")))
...
地址: 0x76fdb19c 反汇编: ret
地址: 0x76fdb19d 反汇编: mov ecx, dword ptr ds:[0x770537C0]
地址: 0x76fdb1a3 反汇编: test cl, 0x3
地址: 0x76fdb1a6 反汇编: je 0x76FDC66E
地址: 0x76fdb1ac 反汇编: push eax
地址: 0x76fdb1ad 反汇编: push 0x76F36CF0

4.1.7 使用内存读写系列函数

内存读写功能,可以让读者在调试阶段直接读取和修改程序的内存内容,方便程序调试和分析。下面是对LyScript插件内存读写功能的简要概述:

  • 内存读取:通过LyScript插件,开发人员可以通过代码读取已经加载的程序进程的内存中特定地址的值。该插件提供了几个不同的内存读取函数,包括ReadByte()、ReadWord()、ReadDword()、ReadQword()等。通过这些函数,开发人员可以直接读取目标窗口中的指定内存地址,以获取其值。

  • 内存写入:除了读取程序内存的值,LyScript插件还支持修改程序的内存值。内存写入函数为WriteByte()、WriteWord()、WriteDword()、WriteQword()等几个相关的函数。通过这些函数,开发人员可以直接修改目标窗口中的指定内存地址,以达到调试和分析程序的目的。

通过LyScript插件的内存读写功能,读者可以直接读取和修改目标程序的内存信息,方便调试和分析程序。同时,该插件也提供了一些内存操作API,一些常用的内存操作功能,帮助安全从业者更加方便地操作内存数据。

当读者需要读取内存数据时可以使用read_memory_byte()来实现,如下案例中通过get_register()函数获取到当前EIP的内存地址,并使用内存读函数获取该内存中的前十条数据集,输出效果如下所示;

>>> eip = dbg.get_register("eip")
>>>
>>> for index in range(0,10):
...     ref = dbg.read_memory_byte(eip+index)
...     print(hex(ref))
...
0xc3
0x8b
0xd
0xc0
0x37
0x5
0x77
0xf6
0xc1
0x3

至此本章基本介绍就到此为止,本章介绍了在Windows平台中使用LyScript插件进行反汇编和调试的相关内容。首先介绍了LyScript插件的基本功能和使用方法,如通过不同的命令进行反汇编、查看汇编代码、设置断点等。并结合具体案例,演示了如何在LyScript中使用不同的命令进行程序反汇编和调试。同时,还介绍了调试器中常用的断点类型及其功能,并以x64dbg为例对堆栈窗口的功能进行详细介绍。读者如果需要了解更多关于LyScript插件的使用手册可自行去官方查阅。

原文地址

https://www.lyshark.com/post/20c98ded.html

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

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

相关文章

2020~2030年 中国智能驾驶市场和技术趋势分析及主流芯片方案概述

分析及主流芯片方案概述智能驾驶已经成为中国用户买车时首选的配置之一,从L0到L2的整个产品布局,已经是车厂卖车时候的重点宣传点,智能驾驶不同于自动驾驶,无论是法律法规和产品定义都有着明确且清晰的定义。用户本身智能驾驶产品…

十个创业九个死,如何看待大学生创业?

虽然大家都在说“十个创业九个死”,尤其是前几年疫情的影响,很多创业和开店铺的都以失败告终,可是对于大学生来说,创业是很值得去做的一件事情。 熟悉我的朋友都知道,我是从事软件开发行业的,虽然前几年的…

实训笔记7.5

实训笔记7.5 7.5一、座右铭二、软件--软件工程2.1 需求分析2.2 系统设计2.2.1 概要设计2.2.2 数据库设计2.2.3 详细设计 2.3 编码开发/实现2.4 系统测试2.5 系统部署运行和维护 三、Java界面编程---仅作了解四、maven--自动化构建工具4.1 作用:4.2 maven如何帮助我们…

C#常见技能_结构

大家好,我是华山自控编程朱老师 前几天一个学员在学习C#与结构交互时,也不知道结构法可以用来做什么 。下面我们就详细讲讲C# 和结构交互的相关知识。 在C#编程中,结构是一种数据类型,它可以用于存储和组织相关数据,并提供对数据…

MySQL原理探索——24 MySQL是怎么保证主备一致的

在前面的文章中,我不止一次地和你提到了 binlog,大家知道 binlog 可以用来归档,也可以用来做主备同步,但它的内容是什么样的呢?为什么备库执行了 binlog 就可以跟主库保持一致了呢?今天我就正式地和你介绍一…

Selenium 中并行测试的重要性

目录 前言 并行测试 Selenium 中的并行测试 使用 TestNG 和 Selenium 进行并行测试 为什么我们需要在 Selenium 中进行并行测试? 更多测试范围 减少测试时间 成本效益 优化 CI/CD 流程 持续测试 实施并行测试 总结 前言 随着技术的进步,测试…

【JavaEE进阶】Spring核心与设计思想

1,Spring是什么? 我们通常所说的Spring指的是 Spring Framework(Spring 框架),它是一个轻量级的 Java 开源框架,有着活跃庞⼤的社区。Spring 是为了解决企业应用开发的复杂性而创建的,不仅⽀持…

Linux网络抓包工具tcpdump

tcpdump 指令可列出经过指定网络界面的数据包文件头,可以将网络中传送的数据包的 “头” 完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供 and、or、not 等逻辑语句来帮助你摘取有用信息。   由于它需要将网络接口设置为…

青岛大学_王卓老师【数据结构与算法】Week04_11_案例分析与实现1_学习笔记

本文是个人学习笔记,素材来自青岛大学王卓老师的教学视频。 一方面用于学习记录与分享,另一方面是想让更多的人看到这么好的《数据结构与算法》的学习视频。 如有侵权,请留言作删文处理。 课程视频链接: 数据结构与算法基础–…

STM32网络通信Web Server中SSI和CGI的应用

介绍 最近由于项目功能需要,开始研究STM32 WebServer通信以及SSI和CGI应用方法。项目结束后,主要总结浏览器与STM32之间进行通行,STM32作为服务器而浏览器做为客户端进行通行。 文件介绍 此部分的代码是根据ST官方的Web Server例程的基础上…

ubuntu配置pppoe的详细过程

虽然我的是22,其实这跟ubuntu的具体版本没什么关系 1 为什么要装pppoe联网? 联想主机装上ubuntu后发现wifi网络在启动后一段时间找不到,突然搜索不了,后来问导师才知道师妹之前就是用这个电脑,然后也碰到过。 所以不…

开发抖音短视频账号矩阵系统技术实现能解决一机一号实名认证问题?

一、短视频账号矩阵系统解决一机一号实名认证问题? 目前站在开发者角度来看问的比较多,做开发技术类矩阵saas工具,需要的多账号怎么解决,这需要从两个方面来做开发解决。 第一、从开发角度来看技术开发首先解决代理ip分发问题&a…

SPSS读取纯文本文件

纯文本文件是通用的一种格式文件,根据纯文本文件中数据的排序方式,可以将其分为自由格式和固定格式。自由格式文本文件的数据项之间必须有分隔符,固定格式数据项之间不需要分隔符。 1.以自由格式读取数据 (1)选择“文…

【嵌入式Qt开发入门】如何使用Qt进行绘制实时图表——QChart 图表

要想使用 Qt Charts,我们的 Qt 版本得使用 Qt 5.7 之后的版本。其实 Qt Charts 并不是 Qt 5.7 才有的,是在 Qt 5.7 以前只有商业版本的 Qt 才有 Qt Charts。我们能免费下载的 Qt 版本都是社区(开源)版本。 Qt Charts 很方便的绘制…

LTD233次升级|官网商城全球卖货•上传文章SEO关键字•创建下载中心

1、支持第三方支付平台Billing System,支持人民币结算外币商品 2、中文商城支持海外收货地址 3、文章批量上传支持传入 SEO关键字 4、拍卖应用支持查看竞价中的报价记录 5、新增下载文件模块 商城应用 1) 支持第三方支付平台 Billing System 在本次升级中&…

IM即时通讯+智能审批,助力企业效能提升

在企业运行中,大都会使用即时通讯去进行沟通交流,即传递文字信息、各类文档文件甚至是实时的语音和视频通话。而随着技术的不断深入,即时通讯软件越发成熟,它已经不再仅仅只是一个简单的聊天工具,而是包涵办公、协作、…

2023年测试之路,从功能测试进阶测试开发工程师,突破内卷...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 测试开发工程师到…

LiangGaRy-学习笔记-Day28

1、回顾知识 1.1、docker启动MySQL 安装docker #准备好二进制的包 [rootNode2 ~]# ls docker-20.10.9.tgz docker-20.10.9.tgz [rootNode2 ~]# #解压docker的二进制包 [rootNode2 ~]# tar -xf docker-20.10.9.tgz #把它移动到/usr/local/下 [rootNode2 ~]# mv docker /usr/…

《MySQL技术内幕》读书总结(一):MySQL体系结构和存储引擎

文章目录 前言:1、定义数据库和实例2、MySQL体系结构3、MySQL存储引擎InnoDBMyISAM 4、连接MySQL 前言: 该技术文章是我阅读《MySQL技术内幕 InnoDB存储引擎》第2版的总结梳理 我写这里文章的目的:书中的内容过于系统和繁琐,并不是…

小白也能轻松上手的6个流程图工具

随着信息时代的到来,流程图已经成为各行各业展示业务流程、工作流程、数据流程等必不可少的形式之一。但是对于初学者来说,学习和使用传统的流程图软件有一定的门槛,因此,本文将推荐6款适合初学者的在线流程图软件,让您…