详细介绍doxygen的基本到进阶用法
文档生成工具方案盘点
Doxygen: (直接生成.html)简单可用
Doxygen(生成.xml)+ 前端工具(由.xml生成html,例如 docsforge)
基于clang解析(Standardese/Hdoc/Cldoc):不一定提供latex=>pdf
Sphinx: 需要手写独立的.rst文件,再生成,不好维护
.md转html(MkDocs/Docusaurus):需要手写独立的.md文件,再生成
Doxygen+Sphinx组合:需要进一步搭配Breathe,或定制开发的工具
最方便简单无痛使用的到头来还就是Doxygen
Doxygen官网
Doxygen 是一个文档生成工具,用于为源码生成说明文档。我们可以在代码中按照 Doxygen 要求的语法编写代码注释,然后使用 Doxygen 将程序中的注释提取出来生成一个文档。我们一般都把注释写在代码中,所以使用 Doxygen 生成的文档也能够非常方便地更新。Doxygen 还会在文档中引用源码文件,故我们也可在 ...
盘点各种C++开发中可能使用到的工具及其详细使用方式
参考链接
代码性能分析代码性能分析乃是分析程序,用以从执行时间、内存使用、函数调用以及其他指标等方面来衡量其性能的一个过程。这有助于我们去识别:
热点:消耗 CPU 时间最多的函数和代码块
频率:递归调用次数异常多的函数
低效内存使用:存在内存泄漏或过度分配的区域
缓慢的函数或者循环:一般来讲,那些得进行优化从而提高整体速度的函数。
这种分析使开发者能够明确,哪些部分对应用程序性能的拖累最大,从而集中精力进行优化,而不是随意进行更改。
大体上来说,有两类主要的性能分析器,它们各自具有不同的优势和适用场景:
采样型性能分析器:周期性捕获程序状态快照,轻量级且开销极小,适合长时间运行的应用程序。但对于生命周期很短的函数,可能无法提供准确的信息。例如“Very Sleepy”、谷歌性能分析工具(gperftools)、Visual Studio 性能分析器以及英特尔 VTune 放大器。
插桩型性能分析器:为每个函数调用和代码块捕获详细且准确的数据,提供更精确结果,但开销较高,不适合生产环境。例如包括 GNU 性能分析器(gpr ...
加壳加密工具盘点与评估
概述发布出去的DLL所面临的风险:
直接引用
反编译
反射
如果DLL一点措施都不做的话,上面任意一种都可以达到破解目的的。
保护方式盘点
混淆类的工具(如Dotfuscator,但是可以通过ILSpy、Reflector等反编译哦,直接COPY代码也能运行)
加密类的工具(如MaxToCode,网上有相应的破解教程)
加壳类的工具(如Sixxpack,网上有相应的破解教程)
强签名(签名只是防止项目中的某一个DLL被篡改了,不能防止反编译或反射的哦)
上面那些工具的目的归结出来大约完成两个目的,一是不能看,二是不能调,当然,我们也是实现这两个目的,只是手段不同。
一、不能看:.NET DLL可以包含托管堆代码(可以被反编译的)与非托管堆代码(不能被反编译,要反编译也是更高层次的了,不在讨范围内),我们将核心逻辑代码置于非托堆代码中,由托管堆代码提供接口供外部调用,调用时将非托管代码通过.NET动态编译特性编译后返回执行结果。这样就保证了不能看。
二、不能调:我们在非托管代码中加入验证调用者来源功能,判断调用者的HASH值是不是与在非托管代码中约定的 ...
AI相关工具和技术盘点
基本术语
向量数据库: CloseVector
LLM:大语言模型
介绍几种联系上下文的方式
下面均以langchain为例
Buffer Memory
存储每段对话作为LLM的新输入
Conversation Sumary Momory
将对话信息传给LLM进行摘要,将此摘要作为开头部分传入LLM
Conversation Buffer Window Memory
将最近的k组对话存储起来,作为下一轮的LLM的输入
Conversation Summary Buffer Memory
第2种和第3种方式的结合,将最近的k组对话存储起来以及[上一轮的摘要+老k组对话]的摘要+新k组对话,作为下一轮的LLM的输入(使用token长度来决定什么时候刷新输入)
优点,不仅有短期记忆,也有长期记忆
entity memory
通过LLM提取对话中有关实体的知识并积累
vector store back memory或思维导图记忆方式
向量数据库匹配或思维导图记忆方式
对长文本做总结的方式
下面均以langchain为例
stuff模式
直接将 ...
C++11到C++20的新特性解析
c++11特性可以参考
C++标准介绍优秀的c++知识库:cppreference
C++标准演化
C++98(1.0) 正式版本
C++03(TR1)
C++11(2.0) 正式版本
C++14
C++17
C++20
C++23
编译器对C++11的支持情况
两个层面的新特性
语言
Variadic Templates
move Semantics
auto
Range-base for loop
Initializer list
Lambdas
…
标准库
type_traits
unordered_set
forward_list
array
tuple
Con-currency
regex
thread
bitset
…
确认支持C++标准程序内部由下面的宏标识C++标准
123456//C++11#define __cplusplus 201103L//C++98#define __cplusplus 199711L//查询C++标准库cout<<__cplusplus<<endl;
...
有关字符编码的知识点
字符编码下面介绍多种编码方式:
ANSI编码原始的ASCII编码
原始的ASCII码只占一个字节
ASCII编码的拓展:GB2312(GBK)或GB2312-80GB2312或GB2312-80:专门用来表示中文的编码
实现原理把80~FF的表给占用了,由80~FF开头的两个字节拼在一起表示一个字符
12中国D6 D0 B9 FA
GB2312(GBK)或GB2312-80也就是ANSI编码(各国各自的编码格式统称ANSI)
缺点其他象形文字国家也是采取和我国一样的策略,所以各个国家看到的同一个编码意思不一致。
ANSI编码也就是GB2312(GBK)或GB2312-80,表示英文字符时用一个字节,表示中文字符时用两个或4个字节
UNICODE编码一张包含全世界所有文字的一个编码表,Unicode的编码范围是:0~0x10FFFF,可以容纳100多万个符号!
但他只是一个符号集,只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。
详解参阅
UCS-2和UCS-4在将UTF8和UTF16、UTF32的区别之前,再先科普两个名词:UCS-2和UC ...
加解密相关知识及其背后原理阐述
加解密相关涉及到网络数据传输的且对传输的数据有安全性需求的,就需要传输数据之前对数据进行加密操作,常用的网络通信方式有
socket通信 —- 如 socket API编程
http协议通信 —- 如B/S模式
为保证网络通信时数据的安全,就需要对数据进行加密
常用的加密的方式对称加密加密和解密使用的是同一个秘钥
秘钥分发困难
加密效率高
安全级别低(相对与非对称加密)
AEAD解密方式
非对称加密
非对称加密可靠的前提在于: 对方真的是对方,非对称加密害怕被冒充
加密和解密所使用的秘钥不同,是一个秘钥对,包含:
公钥 — 可以公开的秘钥
私钥 — 不能公开的秘钥
传输的数据对谁更重要,谁就拿私钥
私钥加密,公钥解密的场景:可以用于确定该信息来自私钥拥有者
公钥加密,私钥解密的场景:可以用于向私钥拥有者传递数据防止被其他人解密
加密的过程:使用公钥加密,必须使用私钥解密;使用私钥加密,必须使用公钥解密
秘钥分发简单
加密效率低
安全级别高
加密需要实现:
秘钥生成,秘钥校验
秘钥生成模块应该与实际使用该模块的项目关 ...
windows开发相关知识点,涵盖部分驱动级内容
Win32需要学习哪些内容
字符
多线程
线程同步
窗口的本质
windows消息机制
子窗口的使用
进程
内存管理
文件系统
内存映射
DLL
远程注入
模块隐藏
进程通信
HOOK专题(各种类型HOOK/绕过全代码校验)
malloc在windows上的底层也是win32实现的
win32的API主要是存放在C:/IWINDOWS/system32和C:/IWINDOWS/SysWow64 下面的所有dll
SysWow64 存的是32位dll,而system32存的是64位DLL
几个重要的DLL:
Kernel32.dll:最核心的功能模块,比如管理内存,进程和线程相关的函数等。
User32.dll:是Windows用户界面相关应用程序接口,如创建窗口和发送消息等。
GDI32.dll:全程是Graphical Device Interface(图形设备接口),包含用于画图和显示文本的函数。
使用win32的api只需要包含头文件:#include<windows.h>
windows错误码查询 ...
64位游戏逆向经验
64位64位逆向比32位还要简单一点
32位与64位的区别内存大小的区别32位:FFFFFFFF
64位:FFFFFFFFFFFFFFFF
寄存器的区别32位:eax ebx ecx edx ebp esp esi edi
64位:rax rbx rcx rdx rbp rsp rsi rdi r8 r9 r10 r11 r12 r13 r14 r15
64的高8位很多是0
浮点寄存器的区别32位:XMM0–XMM15 64位
64位:XMM0–XMM15 128位
64位添加了YMM0–YMM15 128位
寄存器的作用的区别rax和eax依然作为返回值
32位的函数约定有很多种
64位的函数约定默认设置了fastcall,因此基本只用一种:fastcall 函数约定。函数传递方式几乎是固定的了
32位的fastcall:优先ecx和edx来传递参数,再有参数的话用push
64位的fastcall:优先rcx,rdx,r8,r9来传递参数,再有的话,就从堆栈传递(和32位有一点区别,开辟堆栈空间直接往里面赋值的,看不到push)
...
fps辅助整体分析
FPS游戏特性导致的,需要非常高的实时性,不能过度的网络验证
绘制部分可以使用透明窗口覆盖在游戏上,非常难以检测
自瞄部分,捕捉准星数据,准星路径曲线不规则或有中断(不能平滑,人类操作鼠标非常不圆滑)
连续爆头的行为检测行为数据异常等等
相关基础角度计算
tan,cos,sin函数,参数为弧度,弧度为π表示180度。
atan2,acos2,asin2,返回值为弧度。
$$角度=(弧度*180)/π$$
$$弧度=(角度*π)/180$$
了解线性代数:
向量内积是一个向量在另一个向量上的投影长度乘以另一个向量的长度
12//比如:[1,3]和[3,0]的向量内积为:[1,3]*[3,0]=3+0=3
矩阵的乘法:
快捷键写法1234if(GetKeyState(VK_F1)&1)//VK_F1是键码{ //按下F1执行里面的指令,再按下F1停止执行里面的指令}
绘制的三种方法
hook d3d/opengl
优:完全不闪,代码简单
缺:非常容易被检测
游戏窗口上自行 ...