- 博客(120)
- 收藏
- 关注
原创 mmap详解
① 提高文件读写效率对文件的读取操作跨过了页缓存,减少了数据的拷贝次数,用内存读写取代I/O读写,提高了文件读取效率。② 实现了用户空间和内核空间的高效交互方式。两空间的各自修改操作可以直接反映在映射的区域内,从而被对方空间及时捕捉。③ 提供进程间共享内存及相互通信的方式。不管是父子进程还是无亲缘关系的进程,都可以将自身用户空间映射到同一个文件或匿名映射到同一片区域。从而通过各自对映射区域的改动,达到进程间通信和进程间共享的目的。
2025-02-26 18:17:36
986
原创 3-迭代器
I:迭代器T:迭代器相应类别在调用func_impl,传入iter和iter所指的值,编译器会自动进行模板参数推导,于是我们就得到了迭代器的相应类别。所谓的 Traits 编程技法就是增加一层中间的模板iterator_traits及其的两个偏特化版本,用于支持pointer和const pointer。通过iterator_traits来“萃取”得到迭代器的value type。iterator_traits的核心在于:模板参数推导机制 + 内嵌类型定义机制 + 模板偏特化机制。
2025-02-26 17:23:55
763
原创 2. 空间配置器
/ 配置内存,然后构造对象delete pf;// 将对象析构,然后释放内存调用 ::operator new 分配内存;调用 Foo::Foo() 构造对象内容。调用 Foo::~Foo() 将对象析构;调用 ::operator delete 释放内存。
2025-02-26 16:32:07
914
原创 1. STL概述
为了建立数据结构和算法的统一标准,并且降低他们之间的耦合关系(coupling)以提升各自的独立性、弹性、交互操作性,C++ 社群里诞生了 STL。适配器是指用来修饰容器(containers)或仿函数(functors)或迭代器(iterators)接口的东西。容器主要是各种数据结构:vector、list、deque、set、map,用于存储数据。从实现的角度来看,配置器是一个实现了动态空间分配、空间管理、空间释放的类模板。迭代器主要是用作容器和算法之间的“连接器(胶合剂)”,是一种“
2025-02-26 15:55:20
787
原创 websocket原理详解
WebSocket本质上也是基于 TCP 上应用层协议,用来弥补http协议在持久通信能力上的不足。webSocket是一种在单个TCP连接上进行全双工双向通信的协议。WebSocket允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建长连接,并进行双向数据传输。WebSocket客户端与服务器通信的最小单位是帧(frame),一条完整消息是由一个或多个帧组成的。
2025-02-26 15:17:24
1224
原创 C++泛型编程
Variadic Template是C++11的一个很重要的特性,它对参数进行了高度泛化,能表示0到任意个数、任意类型的参数。相比C++98/03,类模版和函数模版中只能含固定数量的模版参数,可变模版参数无疑是一个巨大的改进。可变模版的变体现在两个方面:参数个数参数类型。
2025-02-26 14:22:41
655
原创 C++容器之std::deque
和空 std::array 容器不同,空的 std::deque 容器在创建之后可以做添加或删除元素的操作,因此这种简单创建 deque 容器的方式比较常见。创建一个具有 10 个元素(默认为 0)的 deque 容器。创建一个包含 10 个元素(值都为 5)的 deque 容器。注意:采用此方式时必须保证新旧容器存储的元素类型一致。//拷贝普通数组,创建deque容器//适用于所有类型的容器//拷贝arr容器中的{13,14,15}
2025-02-26 10:06:10
747
原创 Namespace:资源隔离
可以在进程刚创建的时候通过clone系统调用为新进程分配一个或多个新的Namespace。通过setns()将进程加入到已有的Namespace中。通过unshare()为已存在的进程创建一个或多个新的Namespace。
2025-02-25 21:35:12
681
原创 CGroup:资源管理和限制
CGroup,Control Group,是Linux内核提供的一种资源管理和限制机制,用于对进程进行分组并对分组内的进程进行资源限制、优先级调整等操作。CGroup的主要目标是提供一种统一的接口来管理系统资源,如:CPU、内存、磁盘I/O、网络等。Cgroup文件系统:用于存储Cgroup的配置信息和状态数据。子系统Subsystem:用于实现对特定资源的管理和限制,如:CPU子系统、内存子系统等。控制组Control Group:用于对进程进行分组,每个控制组可以关联一个或多个子系统。
2025-02-25 21:12:41
888
原创 C++之智能指针
auto_ptrunique_ptrshared_ptrweak_ptr其中后三个是C++11支持,第一个已经被C++11弃用。智能指针主要用于管理在堆上分配的内存,它可以将普通的指针封装为一个栈对象。当栈对象的生存周期结束后,会在析构函数中释放掉申请的内存,从而防止内存泄漏。C++11 中最常用的智能指针类型为shared_ptr,它采用引用计数的方法,记录当前内存资源被多少个智能指针引用。该引用计数的内存在堆上分配,当新增一个时引用计数加1,当过期时引用计数减1。
2025-02-25 15:19:56
762
原创 C++虚函数表详解
每个使用虚函数的类(或者从使用虚函数的类派生)都有自己的虚函数表虚函数表是编译器在编译时设置的静态数组虚函数表中包含可由类的对象调用的每个虚函数的函数指针,指向该类可访问的虚函数。编译器还会添加一个隐藏指向虚函数表的指针,称之为虚表指针vptr。虚表指针vptr在创建类实例时自动生成,以便指向该类的虚拟表虚表指针vptr是一个真正的指针,每个类对象的都会分配一个。这也意味着vptr会由派生类继承结论:构造函数不能,析构函数可以,且某些情况下析构函数是必须声明为虚函数。原因:① 析构函数。
2025-02-22 17:34:04
750
原创 C++之using
子类Derived私有继承了Base,正常情况下对于Derived来说成员变量size和成员函数getSize都是私有的。如果在子类Derived使用了using语句,可以改变它们的可访问性。如上述例子中,getSize成员函数可以按public的权限访问,成员变量size可以按protected的权限访问。C语言中常用typedef A B这样的语法,将B定义为A类型,也就是给A类型一个别名B。对应typedef A B,使用using B=A可以进行同样的操作。
2025-02-22 16:03:21
301
原创 C++预编译指令
C语言由源代码生成可执行程序的过程如下:源程序 -> 编译预处理 ->编译 ->优化程序 ->汇编程序 ->链接程序 ->可执行文件预处理过程先于编译器对源代码进行处理,读取源程序,对其中的预编译指令(以#开头的指令)和特殊符号进行处理。或者说是扫描源代码,对其进行初步的转换,产生新的源代码提供给编译器。预编译过程还会删除程序中的注释和多余的空白字符。以符号#开头的编译指令称为预处理命令。包含文件:将源文件中以#include格式包含的文件复制到编译的源文件中,可以是头文件,也可以是其它的程序文件。
2025-02-22 15:25:32
605
原创 C++四种cast
C语言风格的强制类型转换比较强大且万能,需要使用类型转换的地方都可以使用C语言风格的强制类型转换。正是因为这种万能性,C语言风格的类型转换在使用上没有提供任何约束,没有任何约束代表着无法提供任何检查,包括静态和动态检查。所以使用此类型转换的时候,需要编程者来负责转换的安全性C语言风格的类型转换有两种形式,这两种形式都可,就是写法不一样为了弥补C语言风格强制类型转换无任何约束,无法提供语法层面的类型转换相关的安全检查,C++提供了四种cast来应对不同过的情况。
2025-02-22 15:03:58
660
原创 动态内存分配
需要在 new [] 一个对象数组时,需要保存数组的维度,C++ 的做法是在分配数组空间时多分配了 4 个字节的大小,专门保存数组的大小,在 delete [] 时就可以取出这个保存的数,就知道了需要调用析构函数多少次了。malloc和calloc之间的不同点是:malloc 不会设置内存为零,而 calloc 会设置分配的内存为零。尝试重新调整之前调用 malloc 或 calloc 所分配的 ptr 所指向的内存块的大小。分配所需的内存空间,并返回一个指向它的指针。size -- 元素的大小。
2025-02-22 14:37:35
217
原创 函数指针和对调函数
函数返回值类型 (*函数指针变量名) (函数参数列表);这个语句就定义了一个指向函数的指针变量 p。它是一个指针变量,所以要有一个“*”,即(*p)前面的 int 表示这个指针变量可以指向返回值类型为 int 型的函数括号中的两个 int 表示这个指针变量可以指向有两个参数且都是 int 型的函数。“(*函数指针变量名)” 两端的括号不能省略,括号改变了运算符的优先级。如果省略了括号,就不是定义函数指针而是一个函数声明了,即声明了一个返回值类型为指针型的函数。
2025-02-22 11:37:51
765
原创 C++内存分区和调用约定详解
函数的调用约定(calling convention)指的是进入函数时,函数的参数是以什么顺序压入堆栈的,函数退出时,又是由谁(Caller还是Callee)来清理堆栈中的参数。在函数定义时加上修饰符来指定,如...在VS工程设置中为工程中定义的所有的函数指定默认的调用约定:(注意:这种做法对类成员函数无效)Project|Project Property|Configuration Properties|C/C++|Advanced|Calling Convention|选择调用约定。
2025-02-22 11:15:30
891
原创 C运行时库:CRT和C++标准库:STL
为了提高C语言的开发效率,C标准定义了一系列常用函数,称为C库函数。但是C标准仅仅定义了函数原型,没有提供实现。因此实现C库函数的这个任务留给了各个支持C语言标准的编译器。每个编译器通常实现了标准C的超集,称为C运行时库(C Run-Time Library),简称CRT。CRT包含了C程序运行的最基本和最常用的函数,没有CRT则main()函数不会被调用,exit()也不能被响应。C运行库与平台相关。
2025-01-23 14:47:39
649
原创 VSCode中launch.json和tasks.json说明
文件功能:launch.json是调试器设置配置文件,它的作用是运行、调试program字段指定的可执行文件字段说明:重点字段详解:文件功能:用于定义前置任务,例如:代码编译字段说明:重点字段详解:此处可以换一种写法:
2025-01-23 11:19:32
283
原创 VSCode+docker部署开发环境
将本机目录G:\src挂载到docker容器里,这样容器中修改的代码就可以同步到本机中。第二步:配置国内源sources.list。第一步:在Windows机器上安装docker。VSCode连接docker容器的方法参考。VSCode在docker中开发的方法参考。可以看到,docker容器正在后台运行。第三步:编写Dockerfile。第四步:构建docker镜像。
2025-01-23 11:17:53
262
原创 VSCode--Windows下使用VSCode远程Linux机器进行开发和调试
此处必须打开某个.cc文件才能生成合适的launch.json和tasks.json,因为launch.json和tasks.json都是根据文件名和类型生成的。第四步:进入到.ssh/这个文件夹,查看一下有没有成功生成公钥和私钥,创建一个文件authorized_keys,并将第二步生成的公钥内容复制其中。添加launch.json文件,不需要tasks.json。因为既然是附加调试,那么肯定已经编译好了。本质上说:tasks.json完成编译的工作,launch.json启动编译得到的程序进行调试。
2025-01-23 11:09:25
1122
原创 内联函数inline
inline virtual 唯一可以内联的是:编译器明确知道所调用的对象是哪个类,这只有在编译器具有实际对象而不是对象的指针或引用时才会发生。内联是在编译期建议编译器内联,而虚函数的多态性在运行期,编译器无法知道运行期调用哪个代码,因此虚函数表现为多态性时(运行期)不可以内联。内联函数是以代码膨胀(复制)为代价,通过省去了函数调用的开销,从而提高函数的执行效率。如果执行函数体内代码的时间相比于函数调用的开销较大,那么内联函数的效率会更差。虚函数可以是内联函数,但是当虚函数表现多态性的时候不能内联。
2025-01-23 10:35:46
417
原创 内存对齐和类、结构体大小计算
通过以上分析可以得出,在结构体中,不同的数据成员排序方式可能导致结构体的大小不一样。这就要求我们根据实际情况分析结构体的数据成员,以达到最优的定义方式。结构体对象使用少的时候可能只差几个字节的内存,这无关紧要。但是如果我们定义的是一个链表,链表元素是结构体方式定义的,当链表长度增大时,那这节省的内存空间就不可忽视了。结构体内存对齐字节数可以通过#pragma pack(n) 的方式来指定。如果某些时候我想4字节对齐,有些时候我又想8字节对齐,那么怎么解决这个问题呢?
2025-01-23 10:08:00
824
原创 4-.vmp模版文件分析
ProductCode是VMP对产品的定义,此字段需要和序列码生成时使用的VMProtectProductInfo结构体中pProductCode是相同的。通过以上分析,如果命令行使用VMProtect_Con.exe和.vmp文件对程序进行加壳时,我们可以将.vmp文件不需要的字段删除进行简化。在命令行使用VMProtect_Con.exe和.vmp文件对程序进行加壳时,Protection字段的内容可以没有。表明对程序进行加壳使用的加密算法和位数,需要和之后脱壳时生成序列号指定的算法和位数相同。
2025-01-22 17:23:54
290
原创 3-VMProtect序列号
对于使用VMProtectBeginUltraLockByKey接口进行代码保护的程序,如果通过VMProtectSetSerialNumber函数设置的VMP序列号中包含HWID,则内部会校验机器HWID是否一致。注意:g_vModulus和g_vPrivate分别是RSA非对称加密的n和d,需要和.vmp文件中的PublicExp、PrivateExp、Modulus是同一套。① 将VMProtect.exe中的导出密钥对的内容替换以上内容。可以看到:输入包含正确HWID的序列号,代码正常执行。
2025-01-22 17:14:33
874
原创 2-VMProtect的使用
如果对代码保护以后将其编译成静态库lib,其他代码在集成sdk以后,对编译得到的exe需要使用VMProtect.exe进行加壳处理,否则就需要产品携带对应的VMProtectSDK32.dll或VMProtectSDK64.dll进行发布。如果报错如上,则表示此exe使用了VMP保护代码,或者继承了使用VMP保护的sdk,但是其编译以后没有使用VMProtect.exe对二进制exe进行加壳处理,导致exe依赖于VMProtectSDK32.dll运行。注意:对代码进行简单保护可以使用此函数进行保护。
2025-01-22 17:05:03
788
原创 1-VMProtect介绍
VMProtect与其他软件保护程序的主要区别在于它能够使用不同的方法保护代码的不同部分:一部分代码可以虚拟化,另一部分是混淆保护,关键片段使用组合方法进行保护。同时,VMProtect具有内置的反汇编程序,可与Windows和MacOS可执行程序配合使用,还可以链接编译器创建的MAP文件,以快速选择代码片段进行保护。VMProtect的基本原则是通过使应用程序代码和逻辑变得非常复杂,让破解者必须进行进一步的分析和破解,从而提供有效的保护。执行虚拟化代码片段的虚拟机是嵌入到受保护应用程序的结果代码中的。
2025-01-22 16:52:47
991
原创 VLD--C++内存泄漏检测
然而,在堆栈跟踪中包括所有帧,一直到VLD自己的代码,对于调试VLD本身是有用的。但是如果在程序运行目录下拷贝一份vld.ini,并将其中的ForceIncludeModules字段指定为需要检测dll名,则可以检测指定dll的内存泄露。注意:与1.9版本之前的VLD不同,现在可以将vld.h包含在每个源文件中,或将其包含在许多源文件所包含的公共头文件中。如果dll中不包含vld.h,即使主程序中包含了vld.h,那么也是无法检测到dll中的内存泄露的。内存泄露检测中要追溯的调用堆栈的最大层数。
2025-01-20 14:40:25
1019
原创 20-C++使用OpenSSL库之CA证书操作
从X509证书中获取X509结构fp:文件指针,通过fopen函数获得X509:[传出参数]cb:回调函数,一般设置为NULLu:传递给回调函数的参数,一般设置为NULL成功返回X509结构指针,失败返回NULL分配和释放X509_STORE结构//分配和初始化一个空的X509_STORE结构,并将其引用计数设置为1//对store的引用计数+1//对store的引用计数-1。如果引用计数变为0,释放内部存储的证书和其自身。
2025-01-20 11:11:12
847
原创 18-C++使用OpenSSL库之AES对称加密
函数原型:函数作用:设定加密用的Key;参数说明:返回值:0:成功-1:userkey、key为空-2:密钥长度不是128、192、256函数原型:函数作用:设定解密用的Key;参数说明:返回值:0成功-1userkey、key为空-2密钥长度不是128、192、256函数原型:函数说明:AES加密/解密单个数据块(16个字节),ECB模式参数说明:1.4AES_cbc_encrypt--CBC模式加解密函数原型:函数作用:AES加密/解密单个数据块(
2025-01-20 10:14:17
415
原创 17-C++使用OpenSSL库之信息摘要
目录1.MDX系列1.1函数介绍1.1.1MD51.1.2MD5_XXXX1.1.3MD2和MD41.2代码示例1.2.1openssl1.2.2windows函数说明:Redirectingdemo示例:OpenSSL中文手册|OpenSSL中文网1.1.1MD5函数功能:使用MD5计算hash,得到128位(16字节)的信息摘要函数原型:函数参数:函数返回值:成功返回指向hash值的指针函数功能:如果要计算信息摘要的数据不是全部在内存中,可以使用以下这系列
2025-01-20 10:05:52
252
原创 16-PKCS7介绍
PKCS7定义了一种通用的消息语法,包括数字签名和加密等用于增强的加密机制,PKCS#7与PEM兼容,所以不需其他密码操作,就可以将加密的消息转换成PEM消息。在PKI技术框架中,许多方面都需要经过严格的定义,如用户的注册流程、数字证书的格式、CRL的格式、证书的申请格式以及数字签名格式等,这些格式需要规定统一的标准。PKCS是由美国RSA数据安全公司及其合作伙伴制定的一组公钥密码学标准,其中包括证书申请、证书更新、证书作废表发布、扩展证书内容以及数字签名、数字信封的格式等方面的一系列相关标准。
2025-01-20 09:55:26
386
原创 15-OpenSSL命令行之smime:生成PKCS7数据、数字信封
发送方生成一个随机对称加密密钥,使用对称加密密钥对发送内容进行加密,再用接收方的公钥对对称加密密钥进行加密,最后将加密的对称密钥和加密的发送内容按PKCS#7标准,编码组成一个“数字信封”。PKCS7结构的签名数据(sign)是把原始数据、签名值、签名证书、附加证书(可用于证书链验证)、证书吊销列表打包。S/MIME工具,用于处理S/MIME邮件,用于生成PKCS7数据、加密、解密、签名和验证S/MIME消息。第四步:解析生成的签名数据。第二步:准备要签名的数据。第三步:生成签名数据。
2025-01-20 09:52:05
337
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人