自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(38)
  • 收藏
  • 关注

原创 VC++ error C1001: 内部编译器错误 c\error.h”,第 1291 行) 原因和解决

原因是使用模板时实现方法没写分号。

2024-03-21 14:17:57 380 2

原创 switch自制软件开发环境搭建

任天堂switch自制软件开发环境搭建

2023-01-19 09:55:39 5707

原创 njs内存池代码阅读

njs内存池阅读

2022-08-28 22:57:27 284

原创 nginx 官方的脚本njs环境搭建和使用

njs使用

2022-08-07 17:58:02 2184

原创 windows lua natvis文件

lua natvis

2022-08-06 12:29:54 211

原创 多继承强转的指针偏移问题

多继承强转的指针偏移问题

2022-06-26 16:55:58 234

原创 vs natvis编写,自定义vs中变量的展示

vs 自定义变量显示

2022-06-25 23:09:54 1245

原创 skynet环境搭建

skynet环境搭建本博客的使用环境ubuntu20.04gcc version 9.4.0autoconf1. 获取源码并且编译1.1 获取源码githubgit clone https://github.com/cloudwu/skynet.gitgiteegit clone https://gitee.com/mirrors/skynet.git不能访问github,可以去gitee里面clone镜像1.2 编译源码获取完毕之后直接使用make编译make li

2022-05-04 19:49:34 1337

原创 c/c++和python交互

环境:gcc version 9.3.0Python 3.8.10wsl-ubuntu20.041. 开发环境搭建安装python的dev包sudo apt install python3-dev安装完成后会在/usr/include/中会有python对应版本的头文件2. 环境测试2.1 Makefile编写INC=/usr/include/python3.8LIB=python3.8SRC=python3call.cTARGET=python3callall: gcc

2022-02-20 21:03:32 1396 2

原创 windows 搭建lua调试环境

1. makefile 文件的简要分析LUA_A= liblua.aCORE_O= lapi.o lcode.o lctype.o ldebug.o ldo.o ldump.o lfunc.o lgc.o llex.o lmem.o lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o ltm.o lundump.o lvm.o lzio.oLIB_O= lauxlib.o lbaselib.o lcorolib.o ldblib.o l

2022-01-16 22:54:03 749

原创 WSl gdb调试的坑

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

2022-01-13 23:01:32 1010 2

原创 7.lua语法解析-token函数

1.lua的zio1.1 zio的定义typedef const char * (*lua_Reader) (lua_State *L, void *ud, size_t *sz);struct Zio { size_t n; //缓存长度 const char *p; //缓存 lua_Reader reader; //读取内容的回调函数 void *data; //回调函数的参数 lua_State *L; /* Lua state (for reade

2021-10-10 13:57:53 872

原创 6.lua指令与虚拟机

1. lua函数1.1 函数定义typedef int (*lua_CFunction) (lua_State *L);typedef struct CClosure { ClosureHeader; lua_CFunction f; TValue upvalue[1]; /* list of upvalues */} CClosure;typedef struct Proto { //语法解析的输出 CommonHeader; lu_byte numparams; /

2021-09-25 17:24:04 367

原创 5.lua api

1.lua的数据类型#define LUA_TNONE (-1) //无类型#define LUA_TNIL 0 //空类型#define LUA_TBOOLEAN 1 //bool#define LUA_TLIGHTUSERDATA 2 //指针(需要关注内存释放)#define LUA_TNUMBER 3 //数据#define LUA_TSTRING 4 //st

2021-09-05 23:30:39 756

原创 原始套接字使用总结 (端口扫描和流量统计实现)

1. 网络中的四层应用层传输层网络层数据链路层数据链路层:解决点对点的通讯 (mac地址)网络层:解决主机到主机的通讯 (ip地址)传输层:解决一台主机的任意的进程和另一台主机的任意进程的通讯 (端口)应用层:解决应用程序个各种业务问题1.1 传输层tcp套接字的使用int fd = socket(AF_INET,SOCK_STREAM,0);AF_INET/AF_INET6 ipv4/ipv6这种套接字可以直接使用tcp协议,发送和接受

2021-07-11 22:52:02 1231 2

原创 4. lua调试脚本编写

1. 调试lua源码带来的麻烦在之前的三篇文章中写了lua中最基本的数据类型和数据结构的实现,lua数据类型的实现、lua中string的实现、lua Table的实现。这些基础数据结构在lua源码中大量的使用,给调试带来了一定的困扰。如TValue的实现,把一切数据类型集合在一起。如果我使用gdb去打印这个值我需要做的是,查看TValue的类型 tt_ 查看具体类型到底是int、float、还是string等数据类型,以此我们需要写一些脚本给我们的调试带来便利。2. gdb的脚本编写gdb脚本中可

2021-06-28 16:42:03 1332

原创 Windows平台实现内存hook,改写别人的函数

内存Hook功能: 把其他人写的函数或者库中的函数在调用的时候跳转到自己写的函数中1.实现所用到的Windows api//写入进程内存WriteProcessMemory(PVZ_handle, //进程句柄(LPVOID)address, //起始地址date, //写入数据sizeof(date), //写入长度NULL);//返回值非零值代表成功。//读进程内存BOOL ReadProcessMemory(HANDLE hProcess,//进程句柄PVOID pvAdd

2021-06-23 11:23:36 3580

原创 8 nginx锁(spinlock,ngx_shmtx_t)

1. 原子变量1.1 c语言嵌入汇编的写法asm("汇编语句":输出寄存器:输入寄存器:会被修改的寄存器);1.2 与原子变量实现相关的汇编指令1.2.1 lock前缀指令LOCK指令前缀会设置处理器的LOCK信号,直到使用LOCK前缀的指令执行结束,这会使这条指令的执行变为原子操作。在多处理器环境下,设置LOCK信号能保证某个处理器对共享内存的独占使用。只能操作下列指令:ADD, ADC, AND, BTC, BTR, BTS, CMPXCHG, CMPXCH8B,CMPXCHG16

2021-06-23 11:22:44 373

原创 7. nginx线程池

文章目录nginx模块模块定义配置指令结构模块的组织core模块core模块的ctxcore模块的执行流程nginx线程池线程池模块定义线程池的其他结构线程池初始化流程启动线程池线程的回调函数完成任务回调投递任务nginx模块模块定义struct ngx_module_s { ngx_uint_t ctx_index; //同类的数组序号(类似二次索引) ngx_uint_t index; //模块数组序号

2021-06-23 11:22:30 359

原创 3.lua Table实现

1. 数据结构的定义table的定义typedef struct Table { CommonHeader; lu_byte flags; //是否存在元方法 lu_byte lsizenode; //hash部分的大小(这个值是以2为底的对数值) unsigned int alimit; //数组大小 TValue *array; //数组部分 Node *node; //hash部分 Node *lastfree; //指向hash部分最后一个未使用的节点

2021-06-16 22:06:22 592

原创 2.lua 中string的实现

数据结构定义#define CommonHeader struct GCObject *next; lu_byte tt; lu_byte markedtypedef struct GCObject { CommonHeader;} GCObject;typedef union Value { struct GCObject *gc; /* collectable objects */ void *p; /* light userdata */ lua_CF

2021-06-13 09:47:29 492

原创 1.lua数据类型的实现

lua中的常用的数据类型print(type(a))a = 10print(type(a))a = trueprint(type(a))a = {}print(type(a))a = "aaaa"print(type(a))a = function () print("aaaa")endprint(type(a))输出:nilnumberbooleantablestringfunction可以看到lua中的变量类型支持简单类型的数字类型、和bool类型,也支

2021-06-13 09:46:33 446

原创 6.nginx双端队列(ngx_queue_t)

nginx 双端队列定义struct ngx_queue_s { ngx_queue_t *prev; ngx_queue_t *next;};双端队列的实现大部分都是宏实现,头节点为哨兵节点。队列初始化#define ngx_queue_init(q) \ (q)->prev = q;

2021-06-12 23:57:04 219 1

原创 5.nginx字符串(ngx_str_t)

nginx 字符串定义typedef struct { size_t len; //数据长度 u_char *data; //数据} ngx_str_t;len:字符串大小data:字符串有了len成员标志可以不使用C风格的字符串以’\0’结尾字符串初始化#define ngx_string(str) { sizeof(str) - 1, (u_char *) str }#define ngx_null_string { 0, NULL }

2021-06-12 23:53:58 1508

原创 4.nginx链表(ngx_list_t)

nginx链表定义typedef struct ngx_list_part_s ngx_list_part_t;struct ngx_list_part_s { void *elts; //内存指针 ngx_uint_t nelts; //当前使用的元素个数 ngx_list_part_t *next; //指向下一个节点};typedef struct { ngx_list_part_t *last; //指向

2021-06-12 23:53:10 94

原创 3.nginx数组(ngx_array_t)

nginx数组定义typedef struct { void *elts; //数组头指针 ngx_uint_t nelts; //当前使用的数组元素数量 size_t size; //数组元素大小 ngx_uint_t nalloc; //数组最大的元素个数 ngx_pool_t *pool; //内存池} ngx_array_t;数组的创建static ngx_inline ngx_int_t ngx_arr

2021-06-12 23:52:20 425

原创 2.nginx内存池

内存池的定义typedef struct ngx_pool_large_s ngx_pool_large_t;typedef void (*ngx_pool_cleanup_pt)(void *data);struct ngx_pool_large_s { ngx_pool_large_t *next; void *alloc;};struct ngx_pool_cleanup_s { ngx_pool_cleanup_pt

2021-06-12 23:50:46 64

原创 1.nginx调试环境搭建

1. 软件工具nginxopenssl 加密解密库pcre 正则库zlib 压缩库2. 生成makefile文件和obj目录指定三个库的路径开启nginx大部分的功能./configure --prefix=/usr/local/nginx --with-http_realip_module --with-http_addition_module --with-http_gzip_static_module --with-http_secure_link_module --

2021-06-12 23:49:34 163

原创 ptrace使用和调试

1. 文章参考[原创]一窥GDB原理-PwnLinux ptrace系统调用详解:利用 ptrace 设置硬件断点<<软件调试>> 张银奎2. ptrace函数原型enum __ptrace_request{ PTRACE_TRACEME = 0, //被调试进程调用 PTRACE_PEEKDATA = 2, //查看内存 PTRACE_PEEKUSER = 3, //查看struct user 结构体的值 PTRACE_POKEDATA = 5, //

2021-06-12 23:22:41 4949 6

原创 gdb调试c

启动gdb 程序名gdb 程序名 core文件gdb --pid pidgdb 程序名 -x 脚本运行及环境设置set args #设置运行参数 如nginx -c tem.conf -> set args -c tem.confset env [变量名] = 值 #设置环境变量unset env [变量名] #取消环境变量show env [变量名] #显示环境变量流程控制run 参数 #如nginx -c tem.conf

2021-05-13 22:42:42 222

原创 c语言 goto lable 双取址(&&),动态goto的实现

goto 基本用法#include <stdio.h>int main(int argc,char* argv[]){ int *p = (int *)malloc(sizeof(int)); if (!P) { goto error; } return 0;error: return -1;}用法:给定一个标签名直接goto标签名标签名地址获取#include <stdio.h>int main(int argc,char* argv

2021-05-05 17:32:43 1893

原创 谈谈c指针的本质

想了很久最终还是写了篇关于c指针的文章。那么指针是干嘛的?指针只是用来保存地址的并且可以间接引用内存,仅此而已没有什么高深的东西。那么地址又是什么东西,内存的标号。内存标号又是啥,一个无符号数,用来表示内存的位置用的。一个经典的c指针入门的程序#include <stdio.h>int main(int argc,char *argv[]){ int a = 10; int *p = &a; printf("a = %d\n",a);

2021-01-31 17:19:53 126

原创 逆向分析c++虚函数指针和虚函数表及其内存结构

1. 环境和工具Ubuntu 18.04.4 LTSg++ 7.5.0objdump 静态反汇编gdb + peda插件 动态调试2. 从一个程序说起#include <iostream>class AA{public: virtual void print() {std::cout << "AA" <<std::endl;}};class BB{public: virtual void print() {std::cou

2020-11-23 16:34:42 1196

原创 32位下printf的坑(输出错误的值)

记一次使用printf的坑printf输出错误?32位编译#include <stdio.h>#include <stdint.h>int main(int argc, char *argv[]){ int64_t a = 20; int32_t b = 10; printf("a:%d b:%d\n", a,b); getchar(); return 0;}输出:a:20 b:0这是模拟当时的情况,printf想用’’%d’的方式打印两个变量。

2020-11-08 13:27:33 1836

原创 c/c++ setjmp、longjmp实现,实现一个简单的协程

文章目录1.任务切换原理1.1 x86用户层几个关键的寄存器1.2 逆向一个函数了解几个关键的寄存器的作用1.2.1 32位汇编1.2.2 64位汇编1.3 切换实现1.3.1 setjmp和longjmp的实现1.4 测试切换代码2. 协程实现2.1 协程设计2.2 协程定义2.3 协程初始化2.4 协程调度1.任务切换原理1.1 x86用户层几个关键的寄存器eip/rip:存放cpu下一条指令esp/rsp:存放栈顶地址ebp/rbp:保存函数栈底,用于快速找到函数参数和局部变量1.2

2020-10-30 16:40:35 2430

原创 ShellCode编写和远程代码注入

文章目录1.ShellCode是什么2.ShellCode的编写原则3.TEB与PEB1)TEB线程信息获取当前线程的TEB2)PEB进程环境块获取当前进程的TEBPEB_LDR_DATALDR_DATA_TABLE_ENTRY在任意进程中找到一个LDR_DATA_TABLE_ENTRY1.一些结构体的定义2.寻找方法4.ShellCode的实现思路5.远程注入代码6.关于我在vs2017编写时遇到的问题解决方法1.ShellCode是什么一段特殊的代码,不依赖与任何进程环境。简单来讲就是一段可以在Wi

2020-09-15 17:37:14 1295 1

原创 IAT hook实现 (修改pe中的导入表实现hook)

IDA hook的编写1. 实现hook的原理在pe文件中有导入表,导入表中用函数名字和地址,我们把这个地址改变做到hook的效果。一下所有代码是32位的只使用了c语言之前分析过导入表,本文不在分析只实现hookpe结构解析实现所用到的Windows api//用于获取当前模块的基地址 GetModuleHandleA(NULL)HMODULEWINAPIGetModuleHandleA( _In_opt_ LPCSTR lpModuleName );//用于修改内存属

2020-07-21 16:27:49 1403 2

原创 pe文件解析

文章目录pe文件解析1.pe文件总图2.大体的分类2.1 dos头部分2.2 pe头2.2.1 标准pe头2.2.2 扩展pe头2.3段表2.4 验证3.rva和foa3.1对齐的相关变量3.2什么是对齐3.3pe文件中的对齐3.4 rva和foa的转换算法3.5验证算法4 导出表4.1实验4.2 利用输出的foa地址找到函数5 导入表5.1 输出模块的名字和依赖模块的函数表5.2 在内存中输出OriginalFirstThunk 和 FirstThunk 指向的结构pe文件解析1.pe文件总图所有成

2020-07-21 14:29:37 780

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除