C/C++
文章平均质量分 80
没事干写博客玩
真正的大师永远怀着一颗学徒的心。
展开
-
一篇文章理解堆栈溢出
向后合并是指如果前一个区块没有被使用,将自身指针指向前一个区块,并且将大小合并,向前合并则相反。向前合并和向后合并,并不是说对于当前区块来说,合并到前一个或合并到后一个,而是正好相反。这是一个简单的堆溢出题,我将其中的函数都重命名了,在IDA中你能知道这些函数时做什么的。,但是我们也仅仅是指修改了一个内存地址,而不是像栈溢出那样修改了它的执行流程。在进入需要call的函数后,如果我们从栈的低地址一直覆盖内容到高地址,就可以。的第二处出现了栈溢出,但是我们发现溢出的大小实在是太小了,我们无法写入。原创 2024-07-01 00:07:29 · 1344 阅读 · 1 评论 -
PLT、GOT ELF重定位流程新手入门(详细到爆炸)
如果你使用当前rip+0x2fe2你会得到一个错误的地址,因为x64下的RIP相对寻址需要跳过当前RIP,也就是其实是下一条指令的地址+0x2fe2。让它进行跳转,但是这样你就不会理解为什么汇编代码没有变跳转的地址却不同,新手兄弟们可以跟着我一步一步计算,我们首先看看这个jmp是。这就很奇怪了,网上的文章明明说这是索引,确实是这样,其实这里传入的是。我们注意一下.got.plt的地址,由于关闭了pie,我们可以看到地址了,是。是不是很好玩,此时存的内容就是它的下一条指令地址,看图。原创 2023-02-05 21:25:27 · 1467 阅读 · 0 评论 -
Windows 驱动开发 新手入门(四)
本篇文章介绍一下设备对象,这是写驱动过滤的基础,比如键盘,串口等等的过滤。是的缩写,直译就是物理设备对象,一般来说,就是在就是的设备对象。 只能返回设备对象地址。 指向包含 Unicode 字符串的缓冲区的指针,该字符串是设备对象的名称。 指定表示所需访问的。 通常 ,DesiredAccess指定FILE_READ_DATA。 不经常指定FILE_WRITE_DATA或FILE_ALL_ACCESS访问权限。 指向表示相应设备对象到用户模式代码的文件对象的指针(如果调用成功)。 指向表示命名逻辑、虚原创 2022-06-21 21:12:03 · 2034 阅读 · 1 评论 -
Windows 驱动开发 新手入门(三)
之前的文章Windows 驱动开发 新手入门(一)Windows 驱动开发 新手入门(二)在之前我们大概知道驱动是什么,应用层如何和内核层通信后,我打算再补充一些知识。在第一篇文章中,为了好理解,我写过一句话,是,就是,在驱动中入口函数中打印,可以看见所属,也就是。我们知道在应用层开发时,通过Windows公开的API,我们可以在应用层去设置线程,进程的优先级,优先级越高,那么下次它获得CPU调度的机会就越大,此时我们可以通过SwitchToThread允许执行优先级较低的线程,或Sleep(0)立即重原创 2022-06-11 01:43:27 · 1830 阅读 · 2 评论 -
Win10 x64 KeServiceDescriptorTable SSDT 偏移计算理解
Win10 x64 KeServiceDescriptorTable SSDT 偏移计算理解引言站在巨人的肩膀上实现代码通用的偏移计算方法引言很久没写博客了,水个博客,KeServiceDescriptorTable 和 KeServiceDescriptorTableShadow的原理我就不写了,百度很多,主要这篇写如何定位x64下未导出的KeServiceDescriptorTable。站在巨人的肩膀上前辈们在之前已经找到了一个计算公式,通过读取msr寄存器的0xC0000082读取到原创 2021-11-23 03:54:40 · 1636 阅读 · 1 评论 -
Windows 驱动开发 新手入门(二)
Windows 驱动开发 新手入门(二)引言创建NT式驱动关于提示无法找到证书代码分解DEVICE_EXTENSIONPsSetCreateProcessNotifyRoutineIRP_MJ_DEVICE_CONTROL派遣函数IO控制码 IoControlCode创建加载驱动程序引言之前的文章大概了解的驱动程序的结构和一些主要的函数,本篇我们写一个NT式驱动,用来监控进程的创建与销毁。创建NT式驱动由于VS2019中无法帮我们快速创建NT式驱动,我们使用上一篇文章的项目改造一下即可,删除cpp文原创 2021-02-12 19:28:07 · 3240 阅读 · 13 评论 -
Windows 驱动开发 新手入门(一)
Windows 驱动开发 新手入门(一)引言驱动介绍Win10 WDK建立一个驱动项目建立MyDriver.cpp理论知识驱动入口派遣函数 MajorFunctionDevice和SymbolicLinkDeviceExtensionIRP引言本文是对Windows下的驱动开发有一个简单的介绍,我尽可能写的小白文一些,因为大多数的驱动开发书籍对新手来说还是过于难理解。驱动介绍在介绍驱动开发之前,先了解一下基础知识,驱动是什么的?驱动这个词是由Driver直译的,这和平常开发中的测试驱动开发(TD原创 2021-02-12 18:37:22 · 16766 阅读 · 9 评论 -
static变量 你真的了解吗
static 变量你真的了解吗引言static初始化猜测结论引言突然想到以前没事干去看编译器编译之后的switch,static之类的产生的汇编代码,觉得有趣,switch写过了,这次写static。static初始化所有人都知道在函数内定义static变量后只会初始化一次,就像下面这样:#include <iostream>using namespace std;int test(){ static int a = 10; if (a==10){ cout <原创 2021-01-20 01:15:38 · 322 阅读 · 0 评论 -
windows和linux下c/c++程序的退出事件/信号处理
windows和linux下c/c++程序的退出事件/信号处理引言atexitSetConsoleCtrlHandlerLinux 信号处理有哪些信号简单的signal捕捉信号集信号屏蔽字(block) && 信号未决字(pending)屏蔽信号sigaction函数与sigaction结构体sigaction结构体:sigaction函数sigsuspend 信号暂停引言Linux的信号和Windows中的事件很像,朋友问我有没有办法让一个控制台程序退出前执行某些东西,所以就可以写在一原创 2021-01-03 22:10:50 · 4147 阅读 · 0 评论 -
Windows 对象私有命名空间的使用
Windows 对象私有命名空间的使用,以前的笔记#include "pch.h"#include <iostream>#include <windows.h>#include <Sddl.h> // ConvertStringSecurityDescriptorToSecurityDescriptor#include <strsafe.h> // StringCchPrintfint main(){原创 2021-01-03 20:59:22 · 414 阅读 · 0 评论 -
C/C++ 给 Java 通过Socket传输int问题
C/C++ 给 Java 通过Socket传输int问题引言int高低位乱序解决引言事情是这样的,朋友有个软件,但是是单机版本,他想实时向服务器传输生成出来的报告,算是服务器那边有个备份。我先看了一下,软件是C/C++的,CRT也是版本齐全,而且那台电脑也不允许装什么其他环境了,我很自然的就用C/C++写了,而服务端使用JAVA写的,因为服务器那边本来就装了JAVA环境,但没有10以上版本的CRT,所以我就用了2个不同语言写了。int高低位乱序如果两边同时使用c/c++写,那么不会出现这个问题,因原创 2020-12-28 17:21:39 · 1022 阅读 · 1 评论 -
C++ 方法后的const及引用限定符作用
C++ 成员函数后的const及引用限定符作用const 限定符const跟在成员方法后引用限定符const 限定符我们最早学习const应该是在字符串函数中使用的const char* szSource,此时我们虽然可以通过szSource++,一个字符一个字符读取,但是无法修改字符内容,比如*szSource='a'。const跟在成员方法后class Foo{public: Foo() { data = 10; } void show() const { //data原创 2020-12-14 16:10:02 · 563 阅读 · 0 评论 -
SOCKET_RAW 手动封装TCP协议
SOCKET_RAW 手动封装TCP协议还是笔记,移到博客来了。/*使用IP头包含选项创建原始套接字之后,再打开IP_HDRINCL 选项,即可在IP头中封装自己的协议,而不是仅仅使用系统预定义的协议。一般可以使用这种方法来发送UDP和TCP数据IP数据报格式:Version域:这4位指定了数据报的IP版本。对IPV4来说此域值为4.IHL(IP header length 的缩写):因为IP头长度不是固定的,所以需要这4位来确定IP数据报中数据部分的开始位置。大多数IP数据报不包含此原创 2020-12-13 21:18:39 · 676 阅读 · 0 评论 -
SOCKET_RAW 手动封装UDP协议
SOCKET_RAW 手动封装UDP协议还是笔记,移到博客来。/*使用IP头包含选项创建原始套接字之后,再打开IP_HDRINCL 选项,即可在IP头中封装自己的协议,而不是仅仅使用系统预定义的协议。一般可以使用这种方法来发送UDP和TCP数据IP数据报格式:Version域:这4位指定了数据报的IP版本。对IPV4来说此域值为4.IHL(IP header length 的缩写):因为IP头长度不是固定的,所以需要这4位来确定IP数据报中数据部分的开始位置。大多数IP数据报不包含此选项原创 2020-12-13 21:17:19 · 761 阅读 · 0 评论 -
SOCKET 广播消息
SOCKET 广播消息还是笔记,移过来了// 广播消息.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。////其实和UDP是没什么区别,就是多了个BROADCAST 的设置。。。。。//这次因为无聊 所以看看MAKEWORD 到底做了什么,和我的想法一样吗,结果是,它的做法比我强。。#include "pch.h"#include <iostream>#include <winsock2.h>#include <process.h&原创 2020-12-13 21:15:37 · 295 阅读 · 0 评论 -
SOCKET IP多播
IP多播以前的笔记,注释都在代码里,移过来了。// IP多播.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。//#include "pch.h"#include <iostream>#include <process.h>#include <WinSock2.h>#include <ws2ipdef.h>#pragma comment(lib,"ws2_32.lib")#pragma warning(disabl原创 2020-12-13 21:13:29 · 817 阅读 · 0 评论 -
SOCK_RAW 实现ICMP路由追踪
SOCK_RAW 实现ICMP路由追踪#include <pch.h>#include <iostream>#define _WINSOCK_DEPRECATED_NO_WARNINGS#include <winsock2.h> #include <ws2tcpip.h>using namespace std; #pragma comment(lib, "Ws2_32.lib") //IP报头typedef struct IP原创 2020-12-13 21:11:51 · 427 阅读 · 0 评论 -
SOCK_RAW ICMP 协议 PING
SOCK_RAW 实现ICMP以前的笔记,移过来了。ICMP需要使用 原始套接字。原始套接字是允许访问底层传输的一种套接字协议,它们可能会被恶意利用,因此 仅 Administrator用户组有权限创建SOCK_RAW类型的套接字。任何人在NT下都可以创建原始套接字,但没有Administrator权限的人不能用它做任何事情,因为bind函数会直接返回错误,错误码:WSAEACCESS。如果需要绕开管理员权限,可以使用windows提供的IcmpSendEcho系列函数。在发送ping请求的时候原创 2020-12-13 21:10:24 · 861 阅读 · 0 评论 -
程序员编程规范
程序员编程规范变量的命名一定要短,越短内存占用就越低 int a = 1; const char* b = "xxxxx"; long c = 99; //能用一个字母就绝对不用2个函数名一定要加密,不能让别人知道自己要做什么void N85n2935(){ I8959h45() //todo something}void I8959h45(){ JT20...原创 2020-04-27 22:38:51 · 452 阅读 · 2 评论 -
从 set_new_handler 来看泛型的互斥特性
从 set_new_handler 来看泛型的互斥特性引言栗子真正的意义引言关于 set_new_handler,effctive c++ 中有写,这里就跳过,这次只是讲如何偏门的利用泛型特性。如果有好几个类都需要重写new方法,我们需要重写很多的operator new,因为我们同样需要的是这几个类都有特定的new的异常捕获函数,而不能因为继承,导致所有的类共用一个异常捕获函数。栗子下面的泛型类,我们可以发现,根本没有使用到这个T类型,那么为什么要这么做?我们是为了继承,在面向对象中,我们总原创 2020-12-01 04:04:14 · 225 阅读 · 0 评论 -
std::thread和pthread的区别 及 传递对象指针和引用
std::thread和pthread的区别 及 传递对象指针和引用引言区别std::thread 如何传递对象引言朋友突然问我,pthread和std::thread有什么区别?我不知道他为什么会问到这个问题,但是看到问题后我的第一反应是,你是不是C和C++混学的。区别pthread是linux下的多线程API,头文件为pthread.h,关于linux线程和进程区别本篇文章略过,因为本文算是给自学人的科普。std::thread是c++标准库中的线程库,其意义在于可以跨平台不改代码因为在wi原创 2020-11-30 17:40:20 · 4823 阅读 · 0 评论 -
switch与if的本质区别
Switch与If的本质区别ififif编译器编译后实际上就是test,cmp然后jmp到目标地址,它一定会进行比较的计算原创 2020-11-16 16:17:11 · 409 阅读 · 0 评论 -
C/C++ php/python/lua java 基本类型字节
C/C++ php java 基本数据类型字节C/C++x86x64php/python/luax86x64javax86x64C/C++x86char wchar short word dword float double无变化,不说了int 4字节long 4字节long long 8字节boolean 1字节BOOL 4字节BOOLEAN 4字节x64int 4字节long 8字节long long 8字节boolean 1字节BOOL 4字节BOOLEAN原创 2020-06-09 18:03:20 · 194 阅读 · 0 评论 -
Most vexing parse(最烦人的解析)
Most vexing parse(最烦人的解析)引言错误的方式Most vexing parse 解释证明如何避免引言Most vexing parse 是 effective c++ 书中写到的,写本文是为了讲清这到底是什么.错误的方式#include <iostream>class A { public: A(const std::string& name){ std::cout << name << std::e原创 2020-08-24 22:49:34 · 421 阅读 · 0 评论 -
进程和线程/线程上下文 简单介绍
进程和线程/线程上下文 简单介绍引言进程线程线程上下文CONTEXT 结构引言进程是资源分配的最小单位,线程是CPU调度的最小单位。上面这句话是抄的,是的,我粘贴来的,因为说的确实是对的,虽然很笼统。搞过高并发的都用过线程,因为在JAVA中基本没有人使用多进程的方式,Python倒是有一部分人用多进程。之前写过相关的文章,小白可以先入个门。函数调用过程小白文了解一下VEH HOOK。进程进程是系统分配资源的单位,一个进程并不能让程序真正的“跑”起来,当你运行一个程序的时候,启动了一个进原创 2020-08-16 22:27:15 · 1046 阅读 · 0 评论 -
DOS头和NT头(PE头)结构及移位(小白文详细篇)
DOS头和NT头(PE头)结构及移位(x86 x64 小白文详细篇)DOS头PE头PE头移位DOS头一个PE文件起始的部分开始就是DOS头,不要觉得难理解,这和GIT,BMP,JPG,RAR等等都一样,只是在文件起始部位标识这个文件属于什么文件类型。下面是DOS头在winnt.h中的定义:typedef struct _IMAGE_DOS_HEADER { // DOS .EXE header WORD e_magic; // Magic原创 2020-06-11 18:43:41 · 2274 阅读 · 0 评论 -
GDI HDC 双缓冲 CompatibleDC & CompatibleBitmap
GDI 双缓冲 内存DC引言MFC和WINDOWS全局API区分HDC&CDCOnPaint 消息OnEraseBkgnd 消息单缓冲绘制双缓冲绘制双缓冲绘制原理:CDC 双缓冲引言本篇写GDI是为了给后面如何写一个小的后门程序做基础,关于SOCKET篇可以看我之前的文章。MFC和WINDOWS全局API区分这里还是要写一下的,毕竟目前来看有可能很多新手直接接触的是QT框架,对MFC这种老框架不是很熟,写这个的原因是MFC中有很多API和WINDOWS原生的API是同名的,区别在于MFC的原创 2020-06-10 01:53:37 · 1017 阅读 · 0 评论 -
栈溢出攻击 shellcode 编写
栈溢出攻击 shellcode 编写引言shellcode 如何写思考有没有可以指定jmp的call呢?实现写汇编代码栗子:引言之前的文章写了原理在这:栈溢出攻击 原理这次我们就讲讲shellcode怎么写,莫要再用msf当脚本小子了。shellcode 如何写思考上一篇文章我们讲了攻击原理,我们可以覆盖掉EIP,使程序在ret时跳转到我们覆盖的地址,执行call。但是这无法使其执行我们自己的汇编代码,因为我们目前能做的仅仅是覆盖ESP导致EIP错误,继续向下覆盖可覆盖掉参数。除非有一个C原创 2020-06-02 04:00:59 · 1049 阅读 · 0 评论 -
栈溢出攻击 原理
栈溢出攻击漏洞形成原因:什么情况下EIP可被准确覆盖这两天都没写文章,但是我看这个博客ID名字既然叫没事干写博客玩,那就得写,哪怕水也得继续水着。而且最近我也打算写关于安全方面的文章了,从基础开始吧。萌新在看这篇文章之前,可能需要先看看这个:函数调用过程小白文了解一下漏洞形成原因:栈溢出后导致esp被覆盖,这样我们等于说可以控制程序以非正常流程跳到我们想要到地址去。由于windows系统中使用小端存储,所以低位存在低地址,高位存在高地址。首先我们需要知道的是,字符串其实是由字符数组组成,我们原创 2020-06-01 11:57:54 · 1232 阅读 · 0 评论 -
C++ std::function与std::bind
C++ functional std::function与std::bindC中的函数指针C++ 中的std::functionC++ 中的std::bindC中的函数指针在C中 很多地方会用到函数指针,比如调用动态库方法会用到。在C语言中我们是这样定义函数指针的:int add(int a, int b) { return a + b;}int main(){ //定义一个函数指针类型 typedef int(*Testptr)(int, int); //定义这个函数指针 指向ad原创 2020-05-28 20:55:02 · 195 阅读 · 1 评论 -
WIndows与Linux中的文件内存映射
WIndows与Linux中的文件内存映射Windows 内存映射Linux的内存映射Windows 内存映射这里所说的内存映射,并不是MDL的内存映射,只是文件映射内核对象再映射到当前应用程序的地址空间。至少需要一个文件内核对象CreateFile或任何能获得文件句柄的方式创建文件映射内核对象 CreateFileMapping映射到当前应用程序的地址空间 MapViewOfFil...原创 2020-05-04 03:12:41 · 479 阅读 · 0 评论 -
Windows 纤程/协程
Windows下 纤程/协程理论知识,立足根本使用须知代码写这篇文章的原因是,很多框架都有协程/纤程的支持,但是具体是什么样的呢?为什么协程方式性能会更好?很多初学者听个词,听风就是雨,把协程和IO能混成一个概念。理论知识,立足根本在Windows2000 / XP中,纤程(fiber)相当于用户级别的线程或轻进程.纤程由Win32库函数支持, 对核心是不可见的.纤程可以通过Switc...原创 2020-05-02 21:36:09 · 939 阅读 · 0 评论 -
SOCKET IOCP( 二)
SOCKET IOCP 二便于理解小帮手实现SOCKET IOCP 一上一篇文章我们使用的是accept进行监听,而收发使用的是IOCP方式,但是这样在监听阶段时是阻塞状态,这篇文章我们通过AcceptEx方式来完全异步处理。便于理解小帮手因为我们要使用AcceptEx,我们需要想到的是,在上一篇文章我们在Accept监听到之后再与完成端口建立关联但是想要完全异步的处理,我们需要在...原创 2020-05-02 21:13:24 · 265 阅读 · 0 评论 -
SOCKET IOCP( 一)
SOCKET IOCP 一引言便于理解小帮手Accept 方式的IOCP代码引言最近又有空了,但是最近看见很多关于Java netty的东西,大家想到最多的就是NIO,事实上我这里要科普一下netty在windows下我想应该使用的是select并不是iocp,所以性能会和linux上有很大差距,我个人觉得netty的nio不是netty牛X的重点,而是它在Java中池化内存等等,但这并不妨...原创 2020-05-02 20:57:20 · 582 阅读 · 0 评论 -
函数调用过程小白文了解一下
函数调用小白文了解一下基础理论栗子代码的长短基础理论大多数人都知道,一个函数的调用会发生压栈,EIP入栈,返回时会还原EIP和出栈,但是大多学习编程的人没有学习过汇编语言,所以我这里用小白文的方式让大家理解具体发生了什么。说用小白文,就用小白文,但是还是需要说一些基础知识。这里不会写出所有寄存器,因为毕竟要用小白文。不然没接触过汇编的会被各个寄存器搞懵逼。EBP 栈的基址指针,也就是栈...原创 2020-04-27 21:23:50 · 430 阅读 · 0 评论 -
左值 右值 拷贝构造 移动构造
左值 右值 拷贝构造 移动构造左值右值拷贝构造移动构造读此篇文章,你得先了解变量在寄存器中的赋值过程和生命周期。左值左值的意思很简单,就是左边的值,在编程语言中,左边的值一般来说是变量 int var = 10;此时 var 就是左值。准确的来说左值就是可以被赋值的值,也就是变量。右值还是上面那段代码,在右边的就是右值,所以10就是右值,这么解释其实并不完全对。因为可能有些人会...原创 2020-04-26 23:39:02 · 573 阅读 · 0 评论 -
remove_reference(引用移除)
在介绍remove_reference之前,我们先看一段代码int main(){ int a[] = {1,2,3}; decltype(*a) b = a[0]; a[0] = 4; cout << b; return 0;}上面的代码会输出什么?输出为4,因为decltype(*a)返回*a的类型,我们知道*a的类型实际上是int& ,所...原创 2020-04-26 22:32:03 · 9833 阅读 · 7 评论 -
记一次帮朋友调试私服服务端的过程
记一次帮朋友调试私服服务端的过程起因处理方式更奇怪的BUG处理方式起因因为游戏太老了,原公司早都没了,所以有很多奇怪的BUG。服务端大概是这样的:group端管理角色的创建,账号等等gate端负责和玩家,group,game 3方通信game端管理地图和脚本(为了热更新)gate端负责和玩家通信,那么玩家切换地图会是gate通知game2,这玩家切换从game1切换到了game2...原创 2020-04-18 21:58:01 · 770 阅读 · 0 评论 -
SOCK_RAW 写一个简单的网络嗅探器
之前有一篇写UDP反射放大攻击的为什么IP头和UDP头可以伪造,看下面的TCP自己想一想就知道了一般情况下我们使用的都是封装好的TCP或UDP协议。但事实上我们可以自己封装和解析。注意:SOCK_RAW 程序必须有管理员权限简单实现代码/*通常的套接字只能响应与自己MAC地址相匹配的或是以广播行事发出的数据帧。对于其他形式的数据帧网路接口采取的动作是直接丢弃。为了使网卡接收所有经...原创 2020-04-11 09:02:16 · 779 阅读 · 0 评论 -
MDL 内存映射实现HOOK
简单的NT式驱动typedef NTSTATUS (*REALZWQUERYDIRECTORYFILE)(IN HANDLE hFile,IN HANDLE hEvent OPTIONAL,IN PIO_APC_ROUTINE IoApcRoutine OPTIONAL,IN PVOID IoApcContext OPTIONAL,OUT PIO_STATUS_BLOCK pIoSt...原创 2020-04-11 03:45:28 · 1116 阅读 · 0 评论