自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 PE文件(十一)移动导出表和重定位表

默认情况下.DLL的ImageBase为0x10000000,所以如果一个程序要用的DLL没有合理的修改分配装载起始地址,就可能出现多个DLL的ImageBase都是同一个地址,造成装载冲突。如果只移动函数名称表的话,对剩下的数据加密后,当需要根据函数名去调用导出函数时,由于字符串被加密,只能根据函数名称表查到名称字符串所在地址,但是无法匹配字符串。6.修改导出表中的成员值,指向三个子表在新节中的位置,由于各个子表在导出表的地址数据是RVA,因此需要将FOA转成RVA。

2024-07-15 21:01:41 749

原创 PE文件(十)重定位表

重定位表的引入程序加载过程在win32下,每一个PE文件(其可能由多个子PE文件组成)在运行时,操作系统会给分配一个独立的4GB虚拟内存,内存地址从0x00000000到0xFFFFFFFF。其中低2G为用户程序空间,高2G为操作系统内核空间。并且操作系统会将该文件中数据拉伸成内存中数据,从ImageBase开始,分配SizeOfImage大小空间当一个主PE文件由很多个子PE文件组成,当我们运行主PE文件时,所有的PE文件共享操作系统分配的一个4GB虚拟空间。

2024-07-13 22:55:30 868

原创 PE文件(九)导出表

解析此图:该PE文件以.def的方式自定义序号导出函数,定义了序号13、14、16、17、19的导出函数,那么Base的值应为13,那么序号为13的函数相对相对下标就是0,序号14的导出函数相对下标就是1,序号为15的导出函数虽然没有,但是会把位置空出来,定义地址值为NULL,即0x00000000,序号16的导出函数相对下标就是3…导出函数名称表RVA我们在硬盘数据找该表地址时要先转成FOA,这个地址指向的表记录了导出函数的名称字符串RVA首地址,而不是导出函数名称。//导出函数名称表RVA *

2024-07-10 17:42:39 988

原创 PE文件(八)静态与动态链接库

本章内容为导入表和导出表的前置内容。

2024-07-08 21:51:16 1041

原创 PE文件(七)扩大节合并节数据目录

添加shellcode有以下几种的方式:1.直接在任意节的空白区添加代码2.新增节添加代码3.扩大最后一个节添加代码4.合并节并添加代码今天我们学习如何扩大节,合并节扩大节在上一节的学习中,我们可以通过上移NT头和节表覆盖DOS Stub以获取足够的空白区来增加新的节表以及后续新增节,但是当整体上移覆盖DOS Stub之后,多出来的空白区域还不够新增节表时,我们就可以使用扩大最后一个节的方法来添加我们的shellcode扩大节主要用于当我们在。

2024-06-10 19:29:16 1025

原创 计算机组成原理

​从物理信息上看,当我们拆开机箱时可以发现cpu和内存条都是插在一块电路板上(主板),因此cpu可以与内存条通过主板上的电路通信,这样也就实现了信息的读取。CPU在执行指令时需要去内存中寻找数据,而寻找内存地址的能力叫做寻址能力,CPU由地址线的数量决定能够表示的地址范围以及地址数量。一个十进制数每一位数由0-9的数字进行表示,起始位级(数的最右边)大小为10^0,每升一个位级(向左移动一位),大小乘10。由此可见,一个数字在不同的位级所表示的数量不同,比如百位上表示百这个数量,十位上表示十这个数量。

2024-05-30 18:43:09 612

原创 PE文件(六)新增节-添加代码

我们有时候发现文件内存中未对齐的大小确实比文件中对齐的大小大,这是由于节中包含初始化数据的缘故。当整体上移后空白出来的空间还不够新增节表的大小时,我们可以采用扩大最后一个节的方式,将添加的代码加到最后一个节扩大的空间中,由于内存对齐的原因,我们会有很大一部分的空间供我们去添加代码。二.当满足添加节表的条件时,我们可以将已有的一个节表的40字节信息复制一份紧挨着最后一个节表的末尾(节表与节表之间时连续的),然后再定义之后的40字节都是0,之后再根据新增节的信息,去修改对应节表的字段值。

2024-05-24 19:31:36 1081

原创 PE文件(五)代码节空白区添加代码

本节的目的就是教会我们在一个可执行文件的代码节的空白区添加一段代码。大致思路:正常的文件中OEP记录着程序入口的地址,现在我们将此可执行文件的程序入口OEP地址指向call0 x123456指令的地址,使其先执行我们添加的代码,执行完指令后再jmp 0x456789跳转回原来正常的文件OEP指向的程序入口地址,之后程序正常运行注意在代码节空白区添加代码相当于给在硬盘上的文件中添加数据,添加完后再运行文件。该过程可以理解为文件注入。

2024-05-14 11:50:17 795

原创 PE文件(四)FileBuffer-ImageBuffer

4.复制所有的节:通过第一个节对应节表中的PointerToRawData的值确定该节在FileBuffer的起始地址,然后通过SizeOfRawData的值确定该节在FileBuffer中需要复制的数据的大小,再通过VirtualAddress再加上ImageBase得到此节在ImageBuffer中的起始地址,最后将FileBuffer对应的数据在ImageBuffer中的起始地址位置开始复制,完成第一个节的复制。此时ImageBuffer中的文件的数据满足文件运行的条件,但文件仍然不能真正的运行。

2024-05-07 18:25:24 664

原创 PE文件(三)节表

Name数组的长度最大为8字节,如果定义节的名称为.text,由于.text对应的ASCII码分别为0x2E, 0x74, 0x65, 0x78,0x74,所以Name数组中的数据为2E 74 65 78 74 00 00 00,一共8字节。所有的节表一起记录了该.exe文件中所有的节的信息,每一个节都有对应的节表来存储信息,所有的节对应的节表组合在一起就构成了PE文件的节表结构。内存中的地址:节表在4GB内存中的地址要加上imagebase的值,才是节表真正在内存中的起始地址。

2024-04-26 21:20:10 919

原创 PE文件(二)PE头字段说明

PE头字段 = DOS头 + PE标记 + 标准PE头 + 可选PE头我们今天分析一下PE头字段中所有重要成员的含义。

2024-04-24 21:45:06 1044

原创 PE文件(一)PE结构概述

同一份文件在内存中和在硬盘中的内容是一样的,但是他们文件内存起始位置是不一样的,它们分节之间的空白区域大小是一样的,这似乎与我们之前所作的文件硬盘与内存分布图有所不同,这是由于对齐的机制。我们之前在找DOS头时,DOS头以0x000000e0结尾, 指向了左侧地址e0的地方,从图中可知,e0的地方有5045,在最右侧有PE文字,这也正好说明了此处是pe文件真正开始的地方,即NP头开始,但这个e0并不是一直固定的。每一个节,都有一个对应的节表(图中块表)用于记录节的相关信息,如每一个节的概要性信息。

2024-04-18 21:59:31 1137

原创 Windows SDK(六)组合框与列表框控件

const WCHAR * szCity[5] = { L"北京",L"上海", L"深圳", L"广州", L"曹县" };

2024-04-07 17:17:38 950

原创 Windows SDK(五)按钮静态文本与编辑框控件

我们首先应该知道,所谓按钮静态文本等等控件都是窗口,他们都是隶属于父窗口下的子窗口,所以在创建控件前,我们要首先创建一个父窗口,此处我们直接使用Windows桌面程序创建时,程序自动为我们创建的一个窗口,该窗口如下表示:nullptrnullptrnullptr此时我们已经有了一个主窗口,接下来开始讲解控件的创建和应用在以下控件内容中,我们首先在全局变量中定义我们的控件ID,以便我们后续控件的查找#define0#define1#define2按钮的创建。

2024-04-02 21:23:30 896 1

原创 Win32预备知识

由于计算机内存中存储数据都是以二进制数据(0,1)存储,所以为了存储字符(如a),我们将每一个字符都赋值一个数字进行表示,如a对应97,b对应98。这样每一个字符都有对应的二进制数据,也叫做ASCII编码,用于保存在内存中 了。这就是所谓的ASCII编码的来源ASCII码使用指定的7 位二进制数组合来表示128种可能的字符。标准ASCII 码也叫基础ASCII码,使用7位二进制数(高位二进制为0)来表示所有的大写和小写字母,数字0到9、标点符号, 以及在美式英语中使用的特殊控制字符。

2024-03-21 15:06:15 780

原创 汇编语言程序设计(二)十六位汇编框架、子程序与堆栈

如下是16位通用寄存器,存储在cpu硬件中AX 返回值AX寄存器分为两部分 AH和ALAH高8位 存储功能号AL低8位 存储返回码以下是一个AX寄存器应用:给高位AL,00低位AL,16进制要以h结尾BXCX计数器DXSI目标寄存器DI源寄存器SP栈顶指针寄存器BP栈底指针寄存器16位堆栈每单元占2字节常见编译器指令r查看寄存器及下一行的指令u查看汇编代码t单步步入 遇见子程序进入内部 遇到int 21h指令时不要用tp。

2024-02-09 12:42:41 2079

原创 汇编语言(一) 电路与十六位处理器

八根电线代表一个数的八位二进制形式,这十六根电线代表两个值,电线之间的相互触碰,完成了数与数之间的运算,结果由另外八根电线输出结果。cpu只能识别01,开关很形象的表示01,最初的编程就是用打孔机打孔,表示01,输入设备交给。电线第一次输入,触发器将其值存储在锁存中,到电线第二次输入,第一次的值和第二次的值进行。每根电线都有对应的触发器,每次有电线输入数据时,触发器将值存储在锁存中,当有需要时,锁。第一个可执行汇编指令地址中,汇编指令的硬编码有五个字节,则下一个可执行汇编代码地址由该。

2024-02-08 14:03:54 843

原创 Windows系统编程(一) 文件与目录操作

以下程序需要包含头文件。

2024-02-06 20:50:38 908

原创 CTF re和pwn学习与就业

2024-02-06 19:18:15 163

原创 Windows SDK(四)鼠标和键盘消息处理

HFONT hFont = CreateFont(20, 10, 0, 0, 0, 0, 0, 0, GB2312_CHARSET, 0, 0, 0, 0, L"宋体");DrawText(hdc, L"蓝色", -1, &rect, DT_NOCLIP);DrawText(hdc, L"红色", -1, &rect, DT_NOCLIP);

2024-02-03 21:03:54 1321

原创 Windows SDK(一) 基础知识作业

01.尝试使用MessageBox的各种按钮类型,并且接受返回状态。02.进行WCHAR与CHAR之间的互相转换,并且正确输出。

2024-02-02 17:09:56 115

原创 Windows SDK(三)GDI图形绘制基础

HFONT hFont = CreateFont(100, 50, 0, 0, 0, 0, 0, 0, GB2312_CHARSET, 0, 0, 0, 0, L"宋体");创建实心画刷 参数为三原色。

2024-02-02 12:37:52 848

原创 Windows SDK(二)窗口程序创建流程

参数依次 窗口类名称 标题名 风格 x坐标,如上参数是一个绝对坐标 y坐标 宽度 高度 副窗口句柄,没有写nullptr 菜单句柄,没有写nullptr 实例句柄 参数,没有填nullptr,其返回值是一个窗口句柄。回并派发到窗口过程函数中进行处理,处理完毕后返回到消息循环,再次访问消息队列,重复以上。翻译传入的消息,如键盘打字传入的消息是虚拟键码,此处转换成字符消息。是以消息驱动的操作系统,需要不停获取消息并分发,也叫消息循环。退出程序,必须有,否则点击窗口关闭,窗口消失但线程无法结束。

2024-02-01 14:47:12 567

原创 Windows SDK(一) 基础知识

Window程序编程参考资料:编程:Windows程序设计第五版Windows系统编程:Windows核心编程第五版SDK:软件开发套件SDK就是API的集合(应用程序编程接口)

2024-01-31 15:18:52 814

原创 STL标准库(五) 算法,伪函数与空间适配器

利用空间适配器进行分配空间,()中的数字代表要分配的定义的类型的空间大小,此处分配一个int类型内存空间。申请了一个类的类型的空间适配器。

2024-01-27 22:20:31 624

原创 STL标准库(四) 关联容器

关联容器主要有两类 set和map,都属于双向迭代器set 集合 基于平衡二叉树(红黑树)存储,元素值唯一且有序multiset 多重集合 基于平衡二叉树(红黑树)存储,元素值可以重复unordered_set 无序集合 基于哈希表 无序的,但是元素值唯一,使用时需要包含头文件<unordered_set>以上三个功能基本一致,只是内部实现有所不同unordered_multiset 多重无序集合如下一个程序演示set关联容器#include <set> 需要包含该头文件template <typename

2024-01-27 19:41:21 373

原创 C++(一) 类之封装

类的三大特性:封装 继承 多态类是在结构体的基础上进化而来类由成员变量(属于对象),成员方法(属于类)构成创建对象时开辟的空间是用来存储成员变量的成员方法是属于类的,不属于对象。所有对象调用的方法,都是同一类方法。

2024-01-26 22:39:38 386

原创 STL标准库(四) 容器适配器

打印栈容器类型发现是class std::deque,是默认以class _Container = deque容器实现。指定栈内部使用vector,不可使用其他不支持类型,但声明并调用该其他类型自己的方法是没有错误的。

2024-01-26 21:11:46 379

原创 STL标准库(三)序列容器之list

定义一个int类型5个元素初始化为123的双向链表,obj是迭代器,该迭代器是struct std::bidirectional_iterator_tag 双向迭代器 支持++ --!

2024-01-26 14:38:42 801

原创 STL标准库(三)之forward_list

struct std::forward_iterator_tag 该迭代器是一个单向迭代器,只能从头部开始使用,支持++ * = 运算符。声明一个当前有五个元素的单向链表。*it = 124;*it = 123;如下一个程序进行演示讲解。

2024-01-26 14:14:18 703

原创 STL标准库(三)序列容器之deque

std::cout

2024-01-26 13:47:08 341

原创 C++拾遗(四) 函数

std::cout

2024-01-25 15:20:50 399

原创 C++拾遗(三)引用与指针

声明与定义引用和指针是两种不同的概念,尽管它们在某些方面有一些相似之处,但它们在功能和用途上是有所区别声明与定义引用:引用是别名,是对已存在变量的另一个称呼,一旦一个变量被引用,就不能再被引用其他变量。这里,ref是a的引用,它们引用的是同一个对象。指针:指针是一个变量,其值为另一个变量的地址。指针可以被重新赋值以指向其他变量。这里,ptr是一个指向a的指针。初始化和绑定引用:引用必须在声明时就初始化,并且一旦一个引用被绑定到一个对象,就不能再被重新绑定到其他对象。

2024-01-24 23:08:52 639

原创 C++拾遗(二) 引用

打印结果a=10 b=20。打印结果a=10 a=20。

2024-01-24 20:50:59 1248

原创 C++拾遗(一) 内存

C++程序在执行时,将内存大方向划分为4个区代码区:存放函数体(如main函数)的二进制代码,即存放 CPU 执行的机器指令,由操作系统进行管理。代码区特点:1.代码区是共享的,共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可 2.代码区是只读的,使其只读的原因是防止程序意外地修改了它的指令全局区:存放全局变量和静态变量以及常量,其中常量属于全局区的常量区。该区域的数据在程序结束后由操作系统释放。栈区:由编译器自动分配释放, 存放函数的参数值,局部变量等堆区:由程序员分配和释放,若程序员不释放

2024-01-24 12:15:46 1320

原创 STL标准库(二)序列容器之vector

使用其特性操作符[]std::cout << obj.size() << std::endl;

2024-01-22 21:29:25 409

原创 STL标准库(二)序列容器之array

输出反向第一个和最后一个元素。

2024-01-22 14:38:45 1000

原创 数据结构与算法(一)线性表

逻辑结构有以下几种关系没关系一对一关系 一对多关系 多对多关系a是b的前驱,c是b的后继该四种关系有以下别名集合 线性表 树 图。

2024-01-21 20:24:21 351

原创 并发编程(二)互斥体解决线程同步问题

加锁,当一个线程在访问该函数时,其他线程无法访问。程序运行,打印结果实际应该2000000但每次运行打印随机数,原因是丢失操作。如上操作,多线程需要访问该函数时,保证每个时刻只有一个线程在访问。需要包含<mutex>库 std::mutex 互斥体类型。//构造函数调用时枷锁,析构函数调用时解锁。此后原程序在哪会出错,就在哪加一个锁,如上述程序。g_Value++;

2024-01-15 16:23:59 357

原创 并发编程(一)线程基础知识与线程控制

因为Windows实现了线程调度,即再线程切换时,上个线程代码执行到的地方的线程的状态,线程上下文,通用寄存器,段寄存器,硬件调试寄存器,EIP(指令指针寄存器),EFLAGS等都会被Windows通过Windows(Context)保存,直到再次切换回来后再加载。原本在后台运行的线程,由于各种问题,线程提前崩坏,没有正常返回,等待函数没有接收到返回,抛一个异常,遇到此情况跳过即可。如在此处加一个循环,程序在执行该循环时,程序没有死亡,并发函数也不会死亡,而是一起执行两个函数。

2024-01-15 12:45:44 904

空空如也

空空如也

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

TA关注的人

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