自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(71)
  • 资源 (1)
  • 收藏
  • 关注

原创 硬编码(修改RIP相关指令)

本文详细介绍了x86架构中修改RIP寄存器的各类指令。主要内容包括: 单字节JCC条件跳转指令(0x70-0x7F),解析其跳转方向和偏移量计算规则 双字节JCC指令(0F开头)的查表方法及跳转特性 其他修改RIP的关键指令:LOOP系列(0xE0-0xE3)、CALL(0xE8)、JMP(0xE9/0xEA/0xEB)、RET(0xC3/0xC2)等 跨段跳转指令(0xCB/0xCA)的工作原理 文章通过图表清晰展示了指令编码格式和跳转方向判断标准,是理解x86控制流指令的实用参考。

2025-06-14 17:07:51 305

原创 硬编码(定长指令与变长指令)

指令编码机制解析 本文详细介绍了x86/x64架构的指令编码机制,重点分析了定长指令和变长指令的区别: 指令组成:指令长度主要由Opcode、ModR/M和SIB三部分决定,其中Opcode是最核心部分(1-3字节) 指令类型: 定长指令(如50h):单字节即可确定指令(如push rax) 变长指令(如00h):需要通过查表结合ModR/M等字段才能确定完整指令(如add) 查表方法:通过Intel手册中的Opcode表(如A.2.4.1)可以查询指令对应关系,并介绍了Zz表示法的解读方法 寻址编码:详细

2025-06-14 11:52:25 471

原创 硬编码(前缀指令)

x86/x64指令架构中的前缀指令是可选的指令修饰符,位于指令的最前端。常见前缀分为四组:锁定和重复前缀(如F0H、F3H)、段覆盖前缀(如2EH、3EH)、操作数大小覆盖(66H)和地址大小覆盖(67H),每组最多使用一个前缀。64位模式下还有REX前缀(40H-4FH)扩展寄存器操作,以及VEX/EVEX前缀支持SIMD指令。前缀通过特定字节值识别(如x64dbg用冒号分隔前缀),主要用于修改指令行为(如内存访问、操作数大小等)。

2025-06-14 10:27:12 373

原创 汇编(JCC指令)

常用jcc指令解释

2025-06-12 01:00:00 884

原创 汇编(函数调用)

本文介绍了x86架构下函数调用的关键机制。首先对比了JMP和CALL指令的区别,指出CALL在跳转时会将返回地址压栈,实现函数的多处调用。其次讲解了参数传递方法,当参数超过8个时需使用堆栈传参。然后详细阐述了堆栈平衡的概念,强调函数返回前要调整ESP指针恢复堆栈状态,可通过外平栈(add esp)或内平栈(ret n)实现。最后介绍了更安全的EBP寻址方式,通过保存/恢复EBP寄存器维护栈帧结构,避免直接使用ESP寻址的偏移计算问题。文中包含具体汇编代码示例说明各机制实现方法。

2025-06-11 16:18:08 474

原创 汇编(cpu寄存器描述)

寄存器是CPU内部的高速存储单元,用于临时存储数据、指令和地址,访问速度远快于内存。x86架构有8个32位通用寄存器(如EAX、EBX),x64扩展为16个64位寄存器(如RAX、RBX),新增R8-R15寄存器并优化参数传递机制。不同寄存器有特定用途:RSP/RBP管理栈,RAX存储返回值,RIP指向下一条指令。栈用于存储运行时中间数据,通过PUSH/POP操作管理。EIP寄存器存储下一条指令地址,只能通过JMP、CALL和RET等控制转移指令间接修改。这些寄存器协同工作,实现高效的数据处理和程序执行。

2025-06-11 10:32:47 444

原创 win32相关(IAT HOOK)

如何编写IAT Hook

2025-06-07 15:41:49 298

原创 win32相关(消息Hook)

本文介绍了Windows消息钩子的实现方法,主要涉及三个关键API:SetWindowsHookEx设置钩子、CallNextHookEx传递钩子信息、UnhookWindowsHookEx卸载钩子。核心实现是将钩子函数封装在DLL中,通过SetWindowsHookEx安装全局或线程特定的键盘钩子。文章展示了完整的DLL代码实现,包括键盘消息处理回调函数KeyboardProc,以及调用的示例程序。当钩子成功安装后,系统会将DLL注入到目标进程,实现对按键消息的监控和输出。这种方法既可用于消息处理,也可作

2025-06-07 10:07:40 418

原创 pe文件结构(TLS)

TLS(线程局部存储)技术解析 TLS(Thread Local Storage)是解决多线程变量同步问题的机制,允许线程内部函数访问专有变量而不影响其他线程。主要用途包括: TLS变量:通过__declspec(thread)创建线程局部变量,每个线程拥有独立副本。 TLS回调函数:在PE文件中注册回调函数,在进程/线程创建/销毁时自动触发,可用于安全防护。其特点包括: 执行早于程序入口点(OEP) 可实现反调试等功能 通过.CRT$XLX段注册回调数组 PE结构支持:通过IMAGE_TLS_DIRECT

2025-06-06 11:54:03 691

原创 初识硬编码(x86指令描述)

文章摘要 程序由指令和数据组成,CPU将符合格式的数据视为指令执行。x86/x64架构遵循Intel手册规定的指令格式,其中x64是x86的扩展。Intel手册第二卷详细描述了指令格式。学习硬编码需要借助反汇编工具(如x64dbg、OllyDBG、IDA Pro等)将二进制转换为汇编代码。汇编指令长度在1-15字节之间。x86和x64的指令结构图示展现了它们的差异与联系。

2025-06-05 20:54:14 190

原创 win32相关(远程线程和远程线程注入)

作用:创建在另一个进程的虚拟地址空间中运行的线程。

2025-06-05 12:49:51 943

原创 win32相关(内存映射文件)

内存映射文件是将磁盘文件映射到进程地址空间的技术,允许像访问内存一样读写文件。示例代码展示了Windows系统下使用CreateFileMapping和MapViewOfFile实现文件映射的过程,包括读取和修改文件内容。特别说明了对系统DLL文件映射时的"写时拷贝"机制(通过FILE_MAP_COPY参数),当修改映射的系统文件时会创建副本,不影响其他进程使用的原始文件。这种技术提供了高效的文件I/O操作方法,同时确保了系统文件的完整性。

2025-06-03 14:20:51 233

原创 win32相关(虚拟内存和物理内存)

在win32操作系统下,每个进程都有它自己独立的4GB空间,是window给它分配的一个虚拟空间,并不是真正的物理空间,这4GB空间中,分为高2G和低2G,高2G是应用程序的,低2G空间是给内核应用共享的空间。虚拟内存(硬盘空间,当物理空间【内存条】不够用时,可以设置把硬盘上的一块空间拿来当做物理内存来使用)32位的系统最多可以识别物理内存为64G,但由于操作系统的限制比如XP,只能识别4G。更多的细节被操作系统封装在了底层实现,我们用户在平时的使用当中是感受不到的。

2025-06-02 22:38:10 323

原创 win32相关(事件)

摘要:本文介绍了Windows中的事件机制和线程同步技术。事件是系统或应用程序中可被检测的动作/状态变化,使用CreateEventW创建事件对象。通过示例代码展示了如何利用事件实现线程同步控制,包括线程等待事件触发的基本模式。随后探讨了生产者-消费者模型,演示了通过两个事件对象交替触发实现有序线程协作。代码展示了生产线程和消费线程如何通过事件信号交替执行,确保每次生产后消费,维持数据容量平衡,体现了"同步=互斥+有序"的原理。

2025-06-02 12:45:40 256

原创 win32相关(互斥体)

文章摘要: 互斥体(Mutex)是解决跨进程访问内核临界资源的机制,比线程锁更适用于多进程环境。通过CreateMutex创建命名互斥体,进程可通过WaitForSingleObject获取访问权,ReleaseMutex释放。与线程锁相比,互斥体支持超时等待、异常处理,但效率略低。常用于限制程序多开(检测ERROR_ALREADY_EXISTS),示例代码展示了互斥体的创建、获取、释放流程及其在多进程互斥访问中的应用效果。

2025-06-01 11:30:41 319

原创 win32相关(临界区)

摘要 本文通过多线程卖票的例子演示了线程安全问题。当多个线程同时访问全局变量g_num时,会出现线程不安全情况,如同一张票被重复销售。解决方法是使用Windows临界区(CRITICAL_SECTION)机制:先创建并初始化临界区变量,然后在访问共享资源前调用EnterCriticalSection进入临界区,访问结束后调用LeaveCriticalSection离开临界区。修改后的代码确保了同一时间只有一个线程能访问全局变量,从而解决了线程安全问题。

2025-05-31 19:39:42 282

原创 win32相关(创建线程)

摘要 线程是操作系统调度的最小执行单位,比进程更轻量,共享进程资源但拥有独立执行流。Windows系统提供多种线程操作API,如CreateThread创建线程、SuspendThread/ResumeThread控制线程状态、WaitForSingleObject等待线程完成等。线程有激发态和非激发态之分,主线程结束会强制终止子线程。通过工具函数可枚举系统线程并对其进行管理。线程编程需要注意资源共享和同步问题。

2025-05-30 21:35:43 372

原创 win32相关(进程间通信)

本文介绍了两种Windows进程间通信方法:WM_COPYDATA消息传递和邮槽通信。 WM_COPYDATA方式: 使用特殊的WM_COPYDATA消息传递数据 需要构建COPYDATASTRUCT结构体包含数据和大小 演示了发送端和接收端的实现代码 邮槽通信方式: 单向通信机制(客户端写入,服务端读取) 支持本地和网络通信(基于UDP协议) 使用CreateMailslot、CreateFile、WriteFile、ReadFile等API 提供了发送端和接收端的代码示例 这两种方法都能有效实现Wind

2025-05-28 17:23:43 241

原创 win32相关(进程相关API)

本文介绍了Windows系统中与进程管理相关的API函数。主要内容包括:1) 进程ID(PID)和句柄的概念;2) 关键API函数如CreateProcess(创建进程)、TerminateProcess(终止进程)和OpenProcess(打开进程)的使用方法及其参数说明;3) 特殊创建标志CREATE_SUSPENDED的作用;4) 其他常用进程信息获取函数如GetModuleFilename、GetCurrentDirectory等。文章还列举了多个辅助进程管理API,如获取进程ID、命令行、启动信息

2025-05-27 10:14:32 395

原创 win32相关(动态链接库)

动态链接库(DLL)是Windows系统中实现代码共享的重要机制。本文介绍了DLL的基本概念、特点和创建使用方法。DLL的主要优势包括代码共享、模块化设计、资源节省和运行时加载。创建DLL时提供了两种导出函数方式:声明导出和模块定义导出。使用DLL也有两种主要方法:lib隐式链接和LoadLibrary动态加载,前者将代码直接嵌入程序,后者则保持程序小巧但需要依赖外部DLL文件。通过具体代码示例展示了DLL的创建和调用过程,帮助开发者理解这一重要的Windows编程概念。

2025-05-27 10:00:23 725

原创 win32相关(句柄表)

内核对象是操作系统内核层创建的结构体,用于管理进程、线程、文件等资源。Windows和Linux中常见的内核对象类型包括进程对象、线程对象、文件对象等。由于用户程序无法直接访问内核地址空间,操作系统通过句柄表来管理内核对象,用户必须通过句柄来操作内核对象。多个进程可以通过OpenProcess或继承机制共享同一个内核对象。句柄表中的一个参数决定内核对象是否可被继承,子进程只能继承父进程中设置为可继承的内核对象。总结来说,共享内核对象的两种主要方式是通过OpenProcess打开进程,或通过父进程创建子进程并

2025-05-23 13:09:27 286

原创 win32相关(进程的创建过程)

什么是进程?进程简单来讲就是提供程序所需要的资源(如数据,代码等)我们来简单的看一下32位(x86),64位系统下的虚拟内存分布情况是怎样的也可以通过以下代码来查看内存信息32位 Windows 用户模式内存布局(典型情况)每一个进程都有一个虚拟的4g地址空间(x86),但实际上只有低2g(用户空间)才是程序自身能使用的地址,剩下的高2g(内核空间)是操作系统使用的地址,这2g的虚拟空间并不是当前程序独占的,只有当程序有使用到时,操作系统才会分配空间。

2025-05-20 16:44:37 370

原创 win32相关(字符编码)

ASCII编码是最基础的字符编码标准,使用7位二进制数表示128个字符,扩展ASCII则使用8位表示256个字符。GB2312编码兼容ASCII,单字节ASCII字符保持不变,双字节表示中文字符。Unicode为全球字符提供唯一数字标识,采用码点表示字符,范围为U+0000到U+10FFFF。Unicode的存储方式包括UTF-16和UTF-8,UTF-16固定使用2或4字节,而UTF-8采用变长存储,节省空间但解析复杂。UTF-8根据码点范围使用1到4字节表示字符,适合网络传输。

2025-05-17 17:29:29 782

原创 pe文件二进制解析(用c/c++解析一个二进制pe文件)

本文介绍了如何使用C++解析PE文件的二进制结构,并提供了控制台版本的实现代码。文章首先解释了RVA(相对虚拟地址)与FOA(文件偏移地址)的转换方法,接着定义了几个关键的结构体来存储PE文件的不同部分信息,如节表、基本数据和表地址等。代码通过读取PE文件,解析其DOS头、NT头、标准PE头和扩展PE头,并获取节表、导出表、导入表和重定位表的信息。文章还展示了如何通过函数获取和打印这些信息,帮助开发者理解PE文件的结构和内容。

2025-05-13 14:46:04 463

原创 PE文件结构(重定位表)

重定位表是PE文件格式中的关键数据结构,用于记录可执行文件或DLL中需要重定位的地址信息。其主要作用包括支持地址空间随机化(ASLR)、DLL共享以及可执行文件加载的灵活性。重定位表位于PE文件数据目录项的第6个结构,通常通过RVA(相对虚拟地址)定位。其结构体包含虚拟地址和块大小信息。重定位类型多样,常见的有32位和64位平台的标准重定位类型(IMAGE_REL_BASED_HIGHLOW和IMAGE_REL_BASED_DIR64),以及特定平台如ARM、RISC-V和LoongArch的专用类型。某些

2025-05-13 14:31:34 571

原创 PE文件结构(导入表)

什么是导入表?导入表就是pe文件需要依赖哪些模块以及依赖这些模块中的哪些函数回想我们导出表的内容,导出表的位置和大小是保存在扩展pe头最后一个结构体数组当中的第一个成员是我们的导出表,第二成员就是我们的导入表了通过分析pe文件,得出导入表的位置在0x20400(RVA)我们来看一下导入表的结构。

2025-05-07 18:56:42 366

原创 PE文件结构(导出表)

什么是导出表?导出表是PE文件中记录动态链接库(DLL)对外提供的函数或数据的列表,包含函数名称、序号和内存地址等信息,供其他程序调用可以使用IDA等工具查询dll,sys,exe的导出函数可以看到在IDA中已经成功的给我们查找出了当前dll的导出函数首先先回忆一下之前pe的内容1.DOS头,DOS块2.NT头,标准pe头,扩展pe头在扩展pe头的最后一个属性中,就存放着对应的16张表 ( IMAGE_DATA_DIRECTORY )第一个结构体数组就存放的是导出表的位置和大小。

2025-05-05 17:52:01 837

原创 Object Pascal组件

在使用Object Pascal开发图形界面程序时,需要使用到窗体与组件的各种功能IDE的选择:可以使用Delphi或者是开源的Lazarus(我们这里使用 lazarus )

2024-11-10 14:11:28 843

原创 Object Pascal 过程与函数

在Pascal中过程和函数是很相似的,主要的区别是函数有返回值 ,而过程没有返回值定义的方法也有些不同,过程是 procedure 而函数是用 functionfunction 方法名 ([形参列表]) : 返回值类型;var// 局部声名begin// 语句end;// 声名typepublic// 声明一个无参数、无返回值的方法// 声明一个带参数、有返回值的方法end;// 实现// 实现 MyMethod 方法begin// 方法体');end;

2024-09-29 22:39:45 401

原创 Object Pascal 数组

语法格式一:二维数组Type语法格式二:二维数组Type同时也支持定义赋值var// 直接忽略定义部分 (最常用)

2024-09-25 22:05:38 327

原创 vue3快速入门(看心情更新)

如果想要ref定义对象类型的响应式数据,需要使用.value来拿到对象注:ref不能定义多次响应式对象或基本类型import {ref} from 'vue' // 想让那个数据是响应式的就用ref包一下])// 用ref定义响应式的数据需要在对象的后面.value 拿到这个对象// ref可以直接修改整个对象 这样改完后还是响应式对象games = {[id:4,name:'赛博朋克2077']} // reactive 不能这样

2024-09-21 12:06:00 688

原创 Object Pascal 结构化程序设计

属于元素的属于元素的属于元素的# Object Pascal 逻辑运算符注:逻辑运算符的优先级分别是:Not > And > Or(Xor)

2024-09-21 11:48:08 239

原创 Object Pascal 基本数据类型

注:以下标红的表示最常用的数据类型整数类型Integer实数类型Real字符类型Char字符串类型String布尔类型Boolean其他基本类型枚举类型子界类型示例代码。

2024-09-13 15:16:55 1042

原创 数据类型与声明形式

Win32汇编中的数据类型与声明数据的方式

2023-07-14 10:10:50 194

原创 开始Win32汇编

win32汇编入门,第一个win32汇编程序

2023-07-11 10:18:11 384

原创 Linux常用命令

查看防火墙某个端口是否开放。开放防火墙端口3306。检查端口被哪个进程占用。

2022-10-24 09:59:26 449

原创 MySQL JDBC

JDBCJDBC(java database connectivity): sun公司为了简化和统一java连接数据库,定义的一套**规范(**类,接口)实现用java代码操作Mysql import com.mysql.jdbc.Driver; import java.sql.*; public class Idejdbc { public static void main(String[] args) throws Exception { /**

2022-04-09 17:29:25 191

原创 反射、注解、动态代理

摘要 本文详细介绍了Java反射机制的核心概念和使用方法。主要内容包括: Class类的获取方式:三种获取字节码对象的方法(对象.getClass()、Class.forName()、类名.class)以及获取类名的方法。 类加载器体系:介绍了三种类加载器(启动类、扩展类、应用类加载器)及其作用范围。 构造方法的反射操作:通过Constructor类获取各种访问权限的构造方法,以及如何通过newInstance()方法实例化对象,包括处理私有构造方法的暴力反射。 方法的反射操作:演示如何获取并调用类的成员方

2022-04-08 10:59:29 224

原创 Mysql进阶

多表之间的关系外键约束_- 保证引用完整性. 用来维护多表间关系语法:alter table 表名1 add constraint 外键名 foreign key(外键字段名) references 表名2(主键字段名) -- 把tb做为外键表,tp做为主键表,进行引用 (外键字段:tp_id, 主键字段:t_id, 外键表名:tp_tb) alter table tb add constraint tp_tb foreign key(tp_id) references tp(t_id

2022-04-05 21:12:26 599

原创 快速入门MySql

Sql语句Sql的语法- 每条语句以分号结尾(命令行里面需要),如果在navicat,java代码中不是必须加的- SQL在window中不区分大小写,关键字中认为大写和小写是一样的Sql的分类- Data Definition Language (DDL数据定义语言) :操作数据库,操作表- Data Manipulation Language(DML数据操纵语言):对表中的记录操作增删改- Data Query Language(DQL 数据查询语言):对表中的查询操作- D

2022-04-04 20:06:04 664

Jcc指定格式(IA32Jcc)

Jcc手册

2023-07-14

标志寄存器。。。。。。。

。。。

2022-06-17

空空如也

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

TA关注的人

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