自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Linux下静态库和动态库

笔记搬运工一、库的科普1、什么是库文件?库是二进制文件,是源代码文件的另一种表现形式,是一些功能相近或相似的函数集合体;2、使用库的好处提高代码可重用性,提高程序的健壮性(优秀的库往往是资深程序员编写的,久经考验)可减少开发者的开发代码量,缩短开发周期;3、库制作完成后, 如何给用户使用头文件—包含了库函数的声明库文件—包含了库函数的代码实现 注意: 库不能单独使用, 只能作为其他执行程序的一部分完成某些功能, 也 就是说只能被其他程序调用才能使用.库可分静态库(sta..

2022-03-09 14:04:58 333 1

原创 编译原理之GCC基本使用

一、从源代码到可执行文件大概发生了什么?一、 编译程序(此处内容来自某大佬博客) 做了部分修改1、 编译器是一种将源语言(即用某种程序设计语言写成的)程序翻译为目标语言(即用二进制数表示的伪机器代码写成的)程序的翻译程序,相当于在程序员和CPU之间翻译人员。后者在windows操作系统平台下,其文件的扩展名通常为.obj;在Linux下文件扩展名是.o。该文件通常还要经过进一步的连接,生成可执行文件(机器代码写成的程序,文件扩展名为.exe)。通常有两种方式进行这种翻译,一种是编译go/c/c++等,直

2022-03-08 16:35:40 425

原创 函数返回值的方式

- [ ] 2022/3/1(此处讨论的不是返回值和返回指针/引用的情况,而是当返回不同数据长度,编译器是如何指定返回方式的不同编译器,处理的情况不同,下面的分析是基于VS2019的msvc编译器:返回值长度小于4字节,通过一个寄存器带出被调函数的栈空间;返回值长度在4到8字节之间,通过两个寄存器带出;返回值长度大于8字节,通过产生临时量带出,因为寄存器已经没有足够的内存存放了;另外,该临时量是在函数被调用前就创建好,把其地址压入栈中,函数被调用时对临时量赋值好,以下开始分析:1)函数返回宽

2022-03-01 16:54:16 541

转载 C++异常

定义:异常是一种程序控制机制,与函数机制独立和互补异常设计目的:栈机制是一种高度节律性控制机制,面向对象编程却要求对象之间有方向、有目的的控制传动,从一开始,异常就是冲着改变程序控制结构,以适应面向对象程序更有效地工作这个主题,而不是仅为了进行错误处理。异常设计出来之后,却发现在错误处理方面获得了最大的好处。异常的错误处理机制:1)C++的异常处理机制使得异常的引发和异常的处理不必在同一个函数中,这 样底层的函数可以着重解决具体问题,而不必过多的考虑异常的处理。上层调 用者可以再适当的位置设计对

2022-02-19 16:29:15 750

原创 函数模板与类模板的理解

一、什么是模板?1.1、一语蔽之:把函数或类要处理的数据类型和返回的数据类型参数化,使得相同的表达逻辑可以处理不同的数据对象,得到不同类型结果的通用行为,这就是模板;1.2、当工厂里面要生产一把刀,需要将滚烫的铁水倒入到模具里面,然后再经过锤炼就得到一把锋利的刀。函数模板和模板函数正是这样的一组关系,函数模板相当于做刀的模具,而模板函数就是我们得到的刀。1.3、模板的益处:我认为,模板一方面提高了程序编写的效率,大大降低了项目的代码冗余率;另一方面,给用户提供了更丰富的功能,往往一个接口就可以处理多

2022-02-18 15:52:09 460

原创 对多态的理解

一、静态联编和动态联编1、联编是指一个程序模块,代码之间的相互关联的过程2、静态联编是程序的匹配、连接在编译阶段实现,也称为早期匹配或早期绑定;例如,函数重载就是静态联编的一种3、动态联编是指程序联编在运行时才进行,也称为晚绑定;switch语句和if语句是动态联编的例子;二、什么是多态以及多态的实现条件1、三连问:定义一个空的类型,里面没有任何的成员变量或者成员函数,对这个类型进行 sizeof 运算,结果是?结果为1,空类型的实例不包含任何信息,按道理sizeof()会得到0;但空类型

2022-02-16 21:20:50 742

原创 虚继承基本原理

一、可以先看看这个链接黑马C++课程里面的例子讲解二、从内存布局看虚继承原理1、普通类的菱形继承:虚基类的成员会被拷贝两份,一模一样的,导致了空间的浪费;class A {public: int age=10;};class B: public A {public: int b;};class C : public A {public: int c;};class D : public B, public C {public: int d;};2、基于虚基类的菱形

2022-02-16 13:45:35 9385 1

原创 对句柄的理解

一、句柄描述1)通过一个简单的数据拎起一大堆数据,这个简单的数据就叫做句柄,即Handle;2)指针也是一种句柄,因为用户可以通过它存储的32位地址值,可以访问到背后大量数据,如通过数组指针访问数组,通过对象指针访问对象等;但由于指针存储的是可以操作内存的地址,这是与句柄不一样的地方(句柄只是个编号,不与地址对应,也不是地址);3)windows系统有许多的内核对象程序,如打开的文件,创建的线程,程序的窗口等等;这些对象占内存空间较大,当需要传递这些对象程序的时候,直接采用拷贝传递将导致效率低下,所以

2022-01-21 12:35:42 197

原创 private和public

一、结构体/类的定义和实现分离,代码可读性更强(非必须)//xxx.h头文件struct Test{ int x; int y; int z; void Init(int x,int y,int z); void Function1(); void Function2(); void Function3();}//xxx.cpp#include<stdio.h>#include"structure.h"void Test::Init(int x, int y,

2022-01-02 21:37:48 2830

原创 pE文件操作--移动导出表

一、什么是导出表?先回顾一下导出表的结构:相对复杂的是AddressOfFunctions,AddressOfNames和AddressOfNameOrdinals这三个子表;其中地址表存储的是导出的函数地址,名称表存储的是以名字导出的函数的函数名的RVA,序号表存储的是以序号导出的函数的序号(序号+Base才是真正的序号值)二、为什么要移动各种表?这些表是编译器生成的,里面存储了非常重要的信息;在程序启动的时候,系统会根据这些表做初始化的工作,如将用到的DLL中的函数地址存储到IAT表;为了

2021-12-28 12:48:34 722

原创 PE文件解析--重定位表

一、系统加载程序的过程双击打开一个exe时,系统会为该exe创建一个进程,分配独立的虚拟4G空间。低2G为用户空间,前后64k不会被分配,0-FFFF用于做各种检查,空指针一般就指向这里;后64K用于与内核交互,高2G空间是内核使用的一般情况下,exe都是可以按照ImageBase的地址进行加载的,因为exe是第一个贴进虚拟4G空间的,但DLL文件不是;DLL文件是有exe使用它的时候才会加载到相应的exe进程空间;当然DLL也可以被另一个DLL调用;当DLL文件加载到进程空间的时候,可能会出现

2021-12-22 14:25:09 531

原创 PE文件解析--导出表

1、定位导出表可选pe头中的最后一个字段:数据目录项typedef struct _IMAGE_DATA_DIRECTORY { DWORD VirtualAddress; DWORD Size; } IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY; 如何找到这个结构前面的文章已经说过。而且这个 Size 字段不一定是真实的。上面 Vi

2021-12-22 10:17:37 1555

原创 PE文件扩大节的代码实现

一、扩大节(一般只适合扩大最后一个节)//1、拉伸到内存//2、重新分配一块新的内存:SizeOfImage + Ex//3、将最后一个节的SizeOfRawData和VirtualSize改成N,// N=SizeOfRawData=VirtualSize=(SizeOfRawData或者VirtualSize 内存对齐后的值) + Ex//4、修改sizeofimage大小,sizeofimage = sizeofimage + Ex二、代码实现PVOID EnlargeLast

2021-12-11 15:55:07 750

原创 PE文件合并节的代码实现

当DOS stub的空间也不够80个字节的时候,需要把原有的几个节表合并成一个节表,这样就可以腾出两个节表的空间,进而可以增加新的节。疑惑:原有文件的几个节之间的联系会受合并节带来的影响吗?当代码节调用数据节的时候,如何指定位置?合并节后,唯一节表的属性是原有节的属性或运算出来的结果,会带来安全问题吗?为什么合并节要先拉伸出来才能合并,因为拉伸后才是文件在内存中的状态?但拉伸这个动作本来就是按照fileBuffer中的pe头部属性virtualsize和sizeofrawdata,virtualaddre

2021-12-11 15:31:55 351

原创 switch的汇编分析

1:当if语句的判断条件是(表达式==常量)的形式,switch语句相当于if语句的简写,且效率更快(比较的次数减少)如果不加break,那么在找到对应常量的语句执行后,会把后面其他的常量下的语句全部执行直到default的break处;2、switch反汇编代码的变化//案例1---添加case后面的值,一个一个的增加,观察反汇编代码的变化...

2021-10-21 10:01:04 1769

原创 结构体(补充)

一、sizeof的使用void test1() { char a = 23; short b = 20; int c = 40; char arr[10] = { 0 }; short arr2[10] = { 0 }; int arr3[10] = { 4 }; printf("sizeof(a)=%d\nsizeof(b)%d\nsizeof(c)%d\nsizeof(arr)%d\nsizeof(arr2)=%d\nsizeof(a)=%d\n", sizeof(a), sizeof(

2021-10-19 22:31:21 103

原创 结构体的反汇编分析

一、为什么用结构体?char、short、int、float、数组等都是宽度不同的容器,用来存储程序执行所需要和所产生的数据,其中数组是存储相同宽度数据的容器,那么当需要存储不同宽度的不同类型的数据时,结构体是一个非常适合的选择二、结构体的定义和使用结构体的定义 结构体内部变量在定义时,除了自身以外可以使用任何类型(不能递归定义)结构体的使用void function() {/*提升堆栈:默认大小0xC0:分配的栈空间大小----0x100-0xC0=0x40001D44E0 pu

2021-10-19 20:08:27 396

原创 参数、局部变量、返回值和数组的反汇编分析

返回值是如何传递的?char类型:函数计算结果放入al,然后再通过al把返回值赋给main的变量short类型:函数计算结果用eax存储,返回时取ax的值赋给main的变量(为什么char类型的返回值是存储在al来返回,而short类型的返回值是存储在eax,不应该是ax吗?虽然最后还是用的ax来赋值)int类型:函数计算结果存入eax,返回时也是把eax的值赋给main的变量参数传递的本质总结:参数传递相当于将上层函数的变量或表达式的值复制一份,传递给下函数(思考:传地址也是这样吗?

2021-10-16 23:30:46 475

原创 循环语句的反汇编分析

for语句的句法实例分析1汇编代码的一般顺序:表达式1----->表达式3-----》表达式2,如下图也可以如下汇编代码所示,按正常的顺序逻辑:1—2----31 mov eax,[ebp+8]//赋初值2 mov [ebp-4],eax 3 mov edx,[ebp-4]//条件判断4 cmp edx,[ebp-Ch]5 jge 16 6 mov eax,[ebp-4]//循环体7 push eax8 push offset string "%d\n"9 call

2021-10-16 09:40:58 561

原创 从汇编角度理解正向编程

一、变量的声明全局变量声明int a,b,c;//在函数外声明的变量都是全局变量void fun1(){ a=10; b=20; c=a;}void fun2(){ int a=10,b=20; // mov [a (02BC46Ch)],0Ah; mov [b(02BC470h)],14h; mov [c (02BC474h) ],1Eh; int c = a;}局部变量声明void fun3(){ int a,b; a=10,b=20;//mov [ebp-8],0x

2021-10-15 16:46:37 185

原创 if语句逆向分析(中)

if…else if…else if…else多分支语句的反汇编判断//参考准则如下 //1、当每个跳转指令要跳转的地址前面都有JMP指令 //2、上面的跳转指令的地址都是一样的 //3、如果某个分支没有条件判断,则为else部分IF_begin: 影响标志位的指令; jxx [else if 的地址];IF_end jmp end;else if_begin: 影响标志位的指令; jxx [else is 的地址]else begin:......else e

2021-10-15 11:19:25 158

原创 IF语句逆向分析(上)

一、全局变量二、函数参数的分析三、if语句逆向分析四、if—else----语句逆向分析五、if—else if-----else—逆向分析

2021-10-13 17:19:08 342

原创 处理机调度与死锁&&内存管理

一、处理机调度与死锁1.1处理机调度的层次和调度算法的目标1.1.1处理机调度的层次高级调度 ---- 主要功能是根据某种算法,决定将外存上处于后备队列中的哪几个作业调入内存,为他们创建进程,分配必要的资源;只要勇于多道批处理系统。(从外存拿东西到内存) 低级调度-----根据某种算法,决定就绪队列中的哪个进程应获得处理机,并有分派程序将处理机分配给被选中的进程。低级调度等于进程调度,是最基本的一种调度。 中级调度-----又被称为内存点调度,主要是为了提高内存利用率和系统吞吐量,把暂时不能

2020-08-16 21:56:08 681

原创 应用层&&进程的描述与控制

目录一、应用层知识点1.1DNS协议1.2 FTP协议(文件传送协议)1.3TELNET远程终端协议1.4万维网www1.5电子邮件1.6动态主机配置协议DHCP二、进程的描述与控制2.1进程的基本概念2.2进程与程序的区别2.3进程控制2.4进程同步2.5进程通信2.6线程一、应用层知识点1.1DNS协议(一)是什么?即负责网络域名(点分英文式网址:如www.gzhu.edu.cn)到IP地址的解析的分布式系统。则运行该系..

2020-08-09 19:33:25 1192

原创 网络层和传输层

一、网络层知识点总结:1.1网络层提供的两种服务 A、让网络负责可靠交付:虚电路服务 B、网络尽最大努力交付:数据报服务 对比的方面 虚电路服务 数据报服务 思路 可靠通信应当由网络来保证 可靠通信应当由用户主机来保证 连接的建立 必须有 不需要 终点地址 ...

2020-08-02 18:25:15 1732

原创 Linux基础学习以及计算机网络物理层和数据链路层

一.新手常用的Linux命令1).常用系统工作命令:echodaterebootpoweroffwgetpstoppidofkillkillall2).系统状态检测命令:ifconfig命令: 被用于配置和显示Linux内核中网络接口的网络参数。用ifconfig命令配置的网卡信息,在网卡重启后机器重启后,配置就不存在。要想将上述的配置信息永远的存的电脑里,那就要修改网卡的配置文件了。uname(选项) 用于打印当前系统相关信息(内...

2020-07-26 19:11:56 270

原创 第二周学习笔记

目录一.SQL 简介:用于访问和处理数据库的标准的计算机语言1)是什么:2)能干啥:(对数据库进行增删查改操作)(特别提醒)要创建发布数据库中数据的网站,您需要以下要素:二.SQL语法1)数据库表:2)SQL 语句3)SQL语句分类:a)查询和更新指令构成了 SQL 的 DML 部分:b)SQL 中最重要的 DDL 语句:使我们有能力创建或删除表格三.常用SQL语句用法1)SELECT :SELECT +列名称 +FROM +表名称 或SE...

2020-07-19 11:20:17 2555

原创 7月6--7月11学习汇总

HTML基础教程学习收获:1)初步了解了HTML基础的一些基本常识,如:1.HTML是什么?(超文本标记语言)2.HTML有什么用?(是构成网页文档的主要语言,能够把不同计算 机中的文本或者图形能够方便的联系在一起 ,形成一个资源库。)3.HTML的结构和常用标签的使用(如HTML的结构包括头部 (Head)、主体 (Body) 两大部分。头部描述浏览器所需的信息,主体包含所要说明的具体内容。以及HTML 元素指的是从开始标签(start tag)到结束标签(end tag)的所有代码等等,在此不

2020-07-12 09:37:07 173

广州大学计算机考研.zip

广州大学计算机考研.zip

2020-07-05

空空如也

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

TA关注的人

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