后端开发
C++ 标签描述

目录 介绍: 理论: 案例: 生产者-消费者问题: 介绍: C是一种支持多线程编程的编程语言,它提供了丰富的多线程支持来充分利用现代多核处理器的性能。C多线程编程通常使用标准库中的 头文件以及其他相关的标准库组件来实现。 理论: 常用的类:std::thread类,用于创建和管理线程等等std::this_thread命名空间中的函数来处理线程的等待和分离等等互斥锁(std::mutex)、条件变量(std::condition_variable)和原子操作(std::atomic) 线程池:线程池是一种管理和复用线程的技术,以避免频繁创建和销毁线程。C标准库中没有直接提...

  Sl8rSHQRquUs   2023年11月02日   36   0   0 C++

1、标准原子类型 标准原子类型的定义位于头文件<atomic>内。原子操作的关键用途是取代需要互斥的同步方式,但假设原子操作本身也在内部使用了互斥,就很可能无法达到期望的性能提升。有三种方法来判断一个原子类型是否属于无锁数据结构: 所有标准原子类型(std::atomic_flag除外,因为它必须采取无锁操作)都具有成员函数is_lock_free(),若它返回true则表示给定类型上的操作是能由原子指令直接实现的,若返回false则表示需要借助编译器和程序库的内部锁来实现。 C程序库提供了一组宏:ATOMIC_BOOL_LOCK_FREE、ATOMIC_CHAR_LOCK_FR...

  qRkaI2jdXwf2   2023年11月02日   155   0   0 C++

目录 介绍: 案例: 介绍: C元编程(Metaprogramming)是一种高级技术,允许在编译时生成代码和执行代码。它使用C的模板系统和编译器的特性来实现,在某些情况下,可以用来生成高性能的代码或实现通用的库。下面是C元编程的详细介绍: 模板元编程:C元编程主要使用模板来进行。你可以创建模板类或函数,这些模板在编译时会被实例化成具体的类型或函数。通过特化和递归等技术,你可以实现非常复杂的操作。 编译时计算:元编程允许你在编译时执行计算,而不是在运行时。这可以用于计算常量、类型判断、循环展开等任务。这有助于提高程序的性能,因为计算在编译时完成,不需要在运行时消耗时间。 模板...

  Sl8rSHQRquUs   2023年11月02日   37   0   0 C++

节表(SectionTable)是WindowsPE/COFF格式的可执行文件中一个非常重要的数据结构,它记录了各个代码段、数据段、资源段、重定向表等在文件中的位置和大小信息,是操作系统加载文件时根据节表来进行各个段的映射和初始化的重要依据。节表中的每个记录则被称为IMAGE_SECTION_HEADER,它记录了一个段的各种属性信息和在文件中的位置和大小等信息,一个文件可以由多个IMAGE_SECTION_HEADER构成。 在执行PE文件的时候,Windows并不在一开始就将整个文件读入内存,PE装载器在装载的时候仅仅建立好虚拟地址和PE文件之间的映射关系,只有真正执行到某个内存页中的指令...

  hBX5Chl6BH5z   2023年11月02日   36   0   0 C++

宏的一些作用,包括但不限于这些 定义一个变量、字符串、类型 定义一个函数、条件表达式 条件编译、调试信息,异常类 定义结构体、命名空间 定义模版、枚举、函数对象 define宏定义在C中用于定义常量、函数、条件编译、字符串、条件表达式、变量、注释、调试信息、类型、函数等,下面是一些define宏定义的用法举例: 需要注意的是,define宏定义是一种文本替换,它不会进行类型检查和语法检查,容易出现错误。因此,在使用define宏定义时,应该遵循一些规范,例如使用大写字母来表示常量、使用括号来保证优先级等。同时,应该避免滥用define宏定义,以免影响代码的可读性和可维护性。 条件编译 d...

  vWa2lMmTbsfJ   2023年11月02日   31   0   0 C++

返回值优化RVO 在cppreference中,是这么介绍RVO的 Inareturnstatement,whentheoperandisthenameofanon-volatileobjectwithautomaticstorageduration,whichisn'tafunctionparameteroracatchclauseparameter,andwhichisofthesameclasstype(ignoringcv-qualification)asthefunctionreturntype.ThisvariantofcopyelisionisknownasNRVO,"named...

  K0dmrIVVXpCd   2023年11月02日   36   0   0 C++

1、条件变量 当线程需要等待特定事件发生、或是某个条件成立时,可以使用条件变量std::condition_variable,它在标准库头文件<condition_variable>内声明。 std::mutexmut; std::queue<data_chunk>data_queue; std::condition_variabledata_cond; voiddata_preparation_thread() { while(more_data_to_prepare()) { constdata_chunkdata=prepare_data(); std::lock...

  qRkaI2jdXwf2   2023年11月02日   27   0   0 C++

前一篇水文中,老周演示了 QAbstractItemModel抽象类的继承方法。其实,在Qt的库里面,QAbstractItemModel类也派生了两个基类,能让开发者继承起来【稍稍】轻松一些。 这两个类是 QAbstractListModel和 QAbstractTableModel。 QAbstractListModel类专门用来实现一维列表结构模型的。它实现了index、parent等方法,并且把columnCount方法变成了私有成员(一维列表不需要它)。继承时直接实现rowCount、data、setData这几个方法即可; QAbstractTabl...

  omQ9qq6Upg4c   2023年11月02日   27   0   0 C++

1.IO模型 内存和外设的交互叫做IO,网络IO就是将数据在内存和网卡间拷贝。 IO本质就是等待和拷贝,一般等待耗时往往远高于拷贝耗时。所以提高IO效率就是尽可能减少等待时间的比重。 IO模型 简单对比解释 阻塞IO 阻塞等待数据到来 非阻塞IO 轮询等待数据到来 信号驱动 信号递达时再来读取或写入数据 多路转接 让大批线程等待,自身读取数据 异步通信 让其他进程或线程进行等待和读取,自身获取结果 1.1阻塞IO 执行流在某个文件描述符下读取数据时,执行流一直等待IO条件就绪后读取数据,这就是阻塞IO。 1.2非阻塞IO 执行流会以循环的方式反复尝试读取数...

  Knt7UlBCzcLs   2023年11月02日   46   0   0 C++

在笔者前几篇文章中我们一直在探讨如何利用Metasploit这个渗透工具生成ShellCode以及如何将ShellCode注入到特定进程内,本章我们将自己实现一个正向ShellCodeShell,当进程被注入后,则我们可以通过利用NC等工具连接到被注入进程内,并以对方的权限及身份执行命令,该功能有利于于Shell的隐藏。本章的内容其原理与《运用C语言编写ShellCode代码》中所使用的原理保持一致,通过动态定位到我们所需的网络通信函数并以此来构建一个正向Shell,本章节内容对Metasploit工具生成的Shell原理的理解能够起到促进作用。 读者需要理解,套接字(socket)是计算机网...

  hBX5Chl6BH5z   2023年11月02日   36   0   0 C++

智能指针是C语言中一种方便、安全的内存管理工具。智能指针可以自动管理对象的生命周期,避免手动分配和释放内存时可能出现的内存泄漏和悬挂指针等问题。在C11标准中,引入了三种智能指针:unique_ptr、shared_ptr和weak_ptr。 类型 含义 备注 std::unique_ptr   独占资源所有权的指针。 std::shared_ptr   共享资源所有权的指针。 std::weak_ptr   享资源的观察者,需要和std::shared_ptr一起使用,不影响资源的生命周期。 unique_ptr是一种独占式智能指针,它拥...

  SVF6WDa1rb6O   2023年11月02日   52   0   0 C++

记录开发简单职工管理系统遇到的一些问题,黑马教程https://www.bilibili.com/video/BV1et411b73ZP147P166 头文件与源文件 头文件只声明,源文件来实现(本质上是类内声明类外实现) 源文件需要引用特定的头文件 ifndefOOPFINAL_WORKER_H defineOOPFINAL_WORKER_H include<iostream> include<string> usingnamespacestd; classWorker{ public: virtualvoidShowInfo()=0; virtuals...

  tO4BObh3ADwk   2023年11月02日   57   0   0 C++

IAT(ImportAddressTable)Hook是一种针对Windows操作系统的APIHooking技术,用于修改应用程序对动态链接库(DLL)中导入函数的调用。IAT是一个数据结构,其中包含了应用程序在运行时使用的导入函数的地址。 IATHook的原理是通过修改IAT中的函数指针,将原本要调用的函数指向另一个自定义的函数。这样,在应用程序执行时,当调用被钩子的函数时,实际上会执行自定义的函数。通过IATHook,我们可以拦截和修改应用程序的函数调用,以实现一些自定义的行为,比如记录日志、修改函数参数或返回值等。 IATHook的步骤通常包括以下几个步骤: 获取目标函数的地址:通过遍...

  hBX5Chl6BH5z   2023年11月02日   63   0   0 C++

在可执行文件PE文件结构中,通常我们需要用到地址转换相关知识,PE文件针对地址的规范有三种,其中就包括了VA,RVA,FOA三种,这三种该地址之间的灵活转换也是非常有用的,本节将介绍这些地址范围如何通过编程的方式实现转换。 如下是三种格式的异同点: VA(VirtualAddress,虚拟地址):它是在进程的虚拟地址空间中的地址,用于在运行时访问内存中的数据和代码。VA是相对于进程基址的偏移量。在不同的进程中,相同的VA可能映射到不同的物理地址。 RVA(RelativeVirtualAddress,相对虚拟地址):它是相对于模块基址(ModuleBaseAddress)的偏移量,用于定位模...

  hBX5Chl6BH5z   2023年11月02日   57   0   0 C++

本章笔者将介绍一种通过Metasploit生成ShellCode并将其注入到特定PE文件内的Shell注入技术。该技术能够劫持原始PE文件的入口地址,在PE程序运行之前执行ShellCode反弹,执行后挂入后台并继续运行原始程序,实现了一种隐蔽的Shell访问。而我把这种技术叫做字节注入反弹。 字节注入功能调用WritePEShellCode函数,该函数的主要作用是接受用户传入的一个文件位置,并可以将一段通过Metasploit工具生成的有效载荷注入到特定文件偏移位置处。 读者在使用该函数之前需要通过WinHex找到注入位置,我们以如下截图中的30352为例; 接着读者需要自行准备一段She...

  hBX5Chl6BH5z   2023年11月02日   76   0   0 C++

Relocation(重定位)是一种将程序中的一些地址修正为运行时可用的实际地址的机制。在程序编译过程中,由于程序中使用了各种全局变量和函数,这些变量和函数的地址还没有确定,因此它们的地址只能暂时使用一个相对地址。当程序被加载到内存中运行时,这些相对地址需要被修正为实际的绝对地址,这个过程就是重定位。 在Windows操作系统中,程序被加载到内存中运行时,需要将程序中的各种内存地址进行重定位,以使程序能够正确地运行。Windows系统使用PE(PortableExecutable)文件格式来存储可执行程序,其中包括重定位信息。当程序被加载到内存中时,系统会解析这些重定位信息,并将程序中的各种内...

  hBX5Chl6BH5z   2023年11月02日   47   0   0 C++

1.TCP/IP协议栈 链路层:负责下图所示物理链接标准 IP层(网络层):选择合适的路径传输数据,无法解决数据传输错误问题,所以需要TCP/UDP协议作为保障 TCP/UDP(传输层):IP层(网络层)解决传输路径问题,确定了路径,就进行传输数据,IP层只关注一个数据包如何进行传输,至于传输过程数据包是否损坏,传输多个包顺序的控制,IP层无法解决,上述的问题都由TCP/UDP(传输层解决),TCP/UDP(传输层)在IP层(网络层)之上,决定主机之间数据传输方式,给不可靠IP协议赋予可靠性。 应用层:提供封装将上述的几个层进行封装,提供给外部socket(套接字)让我们进行编程,我们进行...

  mwbi0mYvaIaH   2023年11月02日   46   0   0 C++

脱壳修复是指在进行加壳保护后的二进制程序脱壳操作后,由于加壳操作的不同,有些程序的导入表可能会受到影响,导致脱壳后程序无法正常运行。因此,需要进行修复操作,将脱壳前的导入表覆盖到脱壳后的程序中,以使程序恢复正常运行。一般情况下,导入表被分为IAT(ImportAddressTable,导入地址表)和INT(ImportNameTable,导入名称表)两个部分,其中IAT存储着导入函数的地址,而INT存储着导入函数的名称。在脱壳修复中,一般是通过将脱壳前和脱壳后的输入表进行对比,找出IAT和INT表中不一致的地方,然后将脱壳前的输入表覆盖到脱壳后的程序中,以完成修复操作。 数据目录表的第二个成员...

  hBX5Chl6BH5z   2023年11月02日   47   0   0 C++

重定位表(RelocationTable)是WindowsPE可执行文件中的一部分,主要记录了与地址相关的信息,它在程序加载和运行时被用来修改程序代码中的地址的值,因为程序在不同的内存地址中加载时,程序中使用到的地址也会受到影响,因此需要重定位表这个数据结构来完成这些地址值的修正。 当程序需要被加载到不同的内存地址时,相关的地址值需要进行修正,否则程序运行会出现异常。而重定位表就是记录了在程序加载时需要修正的地址值的相关信息,包括修正地址的位置、需要修正的字节数、需要修正的地址的类型等。重定位表中的每个记录都称为一项(entry),每个entry包含了需要修正的地址值的详细信息,通常是以可变长...

  hBX5Chl6BH5z   2023年11月02日   31   0   0 C++

最近在公司项目上遇到程序运行时崩溃,也不好在log日志中定位。查找了资料发现,谷歌的一个开源项目Breakpad,统一了这三平台win、linux、mac生成dump的方式来捕捉崩溃。 大致研究了一下,主要依赖一个静态库和几个头文件,我这边编译出来放到网盘上大家自行使用。 链接:https://pan.baidu.com/s/19elsFxnKfzdNaX6cURruAw?pwd=JJLM提取码:JJLM  用法就是在工程文件pro里引入库: forqBreakpad qBreakpad中需要使用到network模块 QT+=network 启用多线程、异常、RTTI、STL支持...

  4BUFAcHFeoKM   2023年11月02日   26   0   0 C++