自定义博客皮肤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)
  • 收藏
  • 关注

原创 软件工程——(5)软件测试 思维导图

2021-05-22 16:58:24 372

原创 软件工程——(4)软件设计 思维导图

2021-05-22 16:57:15 1402

原创 软件工程——(3)需求分析 思维导图

2021-05-22 16:55:38 2513

原创 软件工程——(2)软件项目管理 思维导图

2021-05-22 16:54:06 697

原创 软件工程——(1)软件与软件工程 思维导图

2021-05-22 16:50:57 548

原创 CrackMe练习-029

目录查壳测试程序代码分析分析结果查壳  这个程序和028是同一个作者,同样是无壳,使用VC++6.0编写,形式为Name/Serial格式。  测试程序  随机输入Name和Serial进行测试,与028类似,熟悉的界面和错误提示框,大胆猜测只是换了一个算法:D)。代码分析  将程序用OD加载开始分析,根据错误提示框中的字符串,查找所在程序段。  在程序的上方有一段循环计算的代码,这里有两个关键的指令,首先将bl和cl的值比较,如果不相等则跳转到错误提示,我们暂且标记一下,因为这一定是一

2021-04-16 21:06:21 181 1

原创 CrackMe练习-028

目录查壳程序测试代码分析分析结果查壳  该程序是使用VC++6.0编写的,无壳。程序测试  双击运行程序,又是熟悉的Name+Serial形式,我们随便输入一串字符,弹出如下的对话框。根据对话框提示的字符串,我们可以着手开始分析。代码分析  将程序拖入OD开始分析,使用中文搜索引擎查找ASCII字符串,可以上图中提示框的字符串"One of the Details you entered was wrong",然后双击进入。  如图所示,错误提示的代码上面有几个关键跳转,仔细分析后我们不

2021-04-16 15:43:52 206

原创 CrackMe练习-033

目录查壳程序测试代码分析第一个关键call第二个关键callSerial推断分析结果查壳  将CrackMe拖入PEiD进行查壳,可以看到程序是由汇编编写的,无壳。  程序测试  双击打开CrackMe,点击Rigster,输入Name和Serial,点击测试,弹出如下提示。那么我们便可以从这个错误提示字符串入手进行分析。    代码分析  将程序拖入OD开始分析,使用中文搜索引擎查找ASCII字符串,可以看到我们想要寻找的错误提示字符串"No luck there,mate!",如下图所

2021-04-16 11:04:30 196

原创 PE文件:(3)导入表

导入表导入表的概念导入表的结构手动加载导入表参考代码导入表的概念  可执行文件在进行加载时,需要导入一些动态库,即Dll文件。通过导入这些动态库,我们可以使用文件中提供的函数和功能,来为我们的可执行文件服务。这些Dll中的函数就称为导入函数。为了记录需要的动态库和导入函数,可执行文件在可选头的数据目录中维护了一张表,这张表记录了文件需要的所有动态库以及导入函数的信息,方便Windows加载器在加载PE文件时使用。这张表就是所谓的导入表,它被存储在数据目录的第二项。  可执行文件在使用动态库中的函数和代

2021-04-07 09:34:55 322

原创 PE文件:(2)VA、RVA和FileOffset的理解

PE文件基本概念文件对齐和内存对齐RVA和FileOffsetVA及重定向的概念基本概念  在PE文件的学习中,我们经常看到RVA,VA,文件偏移,内存偏移这些概念,这些术语到底是什么意思呢?  PE文件主要有两种状态,分别是加载和未加载。未加载时,PE文件内的数据被局限于一个文件内,空间较为有限。而在加载到进程的地址空间之后,PE文件拥有足够的空间来存放文件中的数据,这也就导致了区段存放的空间变大,即每个区段之间的空闲内存变大,因此,区段内的很多数据的地址相对于未加载时就需要往后偏移。  在上一篇

2021-04-06 17:13:22 1360

原创 PE文件:(1)基础知识

基础知识基本概念PE文件结构Dos头NT头(1)PE标志(2)文件头(3)可选头区段表总结基本概念  PE文件的全称是"Portable Executable File Format",也就是可移植的执行体,目前是Windows平台上的主流可执行文件格式。  PE文件使用的是一个平面地址空间,所有的代码和数据都合并在了一起,组成了一个完整的文件结构。文件内容被分成了不同的部分区段,区段中包含文件基本信息、数据、代码,各个区段按页大小对齐,每个区段都有自己的属性,如是否可读、可写和可执行。PE文件结构

2021-04-06 15:59:37 507

原创 用户层注入:(5)反射注入

目录反射的概念反射注入过程 注入程序 导出函数参考代码 注入程序 导出函数反射的概念  前几篇文章提到了远程线程注入、注册表注入、APC注入等注入方法,这些方法都有一个共同的问题,那么就是需要目标进程所在的计算机上存在对应的Dll文件,否则我们的注入程序调用LoadLibrary函数无法加载。即如果我们想跨计算机注入目标进程,就要将注入程序exe和动态库文件dll打包放到一个文件夹里并发送到目标计算机,但是一旦文件被接收,我们的dll文件就"落地"了,因此就会很容易被常规的杀毒软件检测并查杀。所以,我们

2021-03-15 10:46:14 653

原创 用户层注入:(4)APC注入

目录理解APC机制关键函数注入过程参考代码理解APC机制  以ReadFile函数为例,当我们在Ring3层调用该函数,会进一步调用Ntdll.dll的NtReadFile/ZwReadFile函数,然后函数进入内核层,调用Ntoskrnl.exe中的NtReadFile函数,这时,NtReadFile函数会创建一个IRP_MJ_READ类型的IRP,并将请求发送到对应的设备上,设备再根据IRP的类型调用对应的派遣函数。派遣函数在完成操作后,会调用IoCompleteRequest将IRP请求结束,并返

2021-03-14 18:13:17 379

原创 用户层注入:(3)DLL劫持注入

目录基本概念注入原理函数转发函数调用局限性基本概念  Windows的应用程序在加载进程所需的动态库时,会根据导入表一一加载。但是,我们的导入表中只保存有动态库的名称,系统如何知道这个动态库的完整路径并将其加载呢?  其实,在加载动态库时,系统会按照一定的顺序搜索各个目录来寻找指定的Dll文件。一般搜索顺序为:应用程序所在目录-->系统目录-->16位系统目录-->Windows目录-->运行程序的当前目录-->PATH环境变量。  这还与注册表项HKLM\Syst

2021-03-13 10:13:41 1105

原创 用户层注入:(2)注册表注入

目录基本概念注入原理实现过程参考代码局限性基本概念  我们知道,注册表是一个集中管理硬件、软件配置信息的数据库,其中存放着各种参数,直接控制着windows的启动、硬件驱动程序的装载以及应用程序的运行,并记录了各种硬件和软件的配置信息。注册表注入,顾名思义,就是将我们的想要进行的操作写入到注册表的配置信息里,通过系统加载我们的动态库完成注入。注入原理  当应用程序被加载时,应用程序会将User32.dll这一动态库映射到进程空间内,这时会触发User32动态库的DllMain函数中的DLL_PROC

2021-03-12 14:19:19 268

原创 用户层注入:(1)远程线程注入

目录一、主要思想二、注入过程三、主要函数四、参考代码五、注入结果一、主要思想  我们知道,进程在加载时,会查看PE文件的导入表,并根据导入表的内容将指定的Dll模块加载到进程地址空间内,因此我们可以使用诸如Kernel32.dll和User32.dll这些动态库的导出函数。  这些工作在exe文件加载时Windows系统便自动帮我们完成了。那么我们是否可以提出这样一个猜想:我们能否自己写一个Dll文件,然后通过一种方式,让目标进程将我们的Dll文件加载到自己的进程空间内,从而实现我们想要的操作呢? 

2021-03-10 18:56:43 155

原创 栈与队列算法设计:(3)八皇后问题

目录1.题目2.题目分析3.参考代码4.测试结果八皇后问题的解,共92个。十皇后问题的解,共724个。1.题目  八皇后问题是19世纪著名的数学家高斯于1850年提出的,问题是:在8X8的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列和同一斜线上。设计算法实现八皇后问题的求解。2.题目分析  1.为了解决八皇后问题,我们这里使用栈和递归的结合。   首先,我们构建出一个8X8的棋盘,这里选择二维数组保存每个格子,并且所有格子的值初始化为0。接着,我们从棋盘的第一

2020-08-07 23:32:10 1841

原创 栈与队列算法设计:(2)括号匹配

目录1.题目2.题目分析3.参考代码4.测试结果1.题目   假设一个算术表达式中可以包含三种括号:圆括号“(”和“)”,方括号“[”和“]”以及花括号”{“和”}“,且这三种括号可按任意的次序嵌套使用,请设计算法判断给定的表达式所包含的括号是否能正确配对。2.题目分析   1.首先,我们获得用户输入的表达式,同时判断左括号和右括号的数量是否相等,如果不相等直接返回匹配失败。其中左括号包括”(“、“[”、“{”,右括号包括“)”、“]”、“}”。BOOL CountMatch(char* Stri

2020-08-07 21:36:47 892

原创 栈与队列算法设计:(1)迷宫问题

目录1.题目2.题目分析 算法分析 算法实现3.参考代码4.测试结果1.题目  迷宫问题的求解是实验心理学中的一个经典问题,心理学家把一只老鼠从一个无顶盖的大盒子的入口处赶进迷宫,迷宫中设置很多隔墙,对前进方向形成了多处障碍,心理学家在迷宫的唯一出口处放置了一块奶酪,吸引老鼠在迷宫中寻找通路以到达出口。设计算法实现迷宫求解。2.题目分析 算法分析  1.这里我们使用的是栈来解决迷宫问题。   对于迷宫问题,我们常规的思维是——试错,即先随便找一条路,一直走下去,直到走到尽头,如果无法抵达出口,

2020-08-06 23:15:03 3290

原创 数据结构与算法2-2 栈与队列之队列

目录1.队列的概念 (1)队列的定义 (2)队列的特点 (3)队列的存储结构2.队列的基本操作 (1)顺序队  ①顺序队的定义  ②顺序队的状态 (2)链队1.队列的概念 (1)队列的定义  队列简称队,也是一种操作受限的线性表,它只允许在一端进行插入操作,在另一端进行删除操作的线性表。其中允许插入(也称入队,进队)的一端称为队尾(Rear),允许删除(也称出队)的一端称为队头(Front)。 (2)队列的特点  如下图所示,有一个有5个元素的队列,入队的顺序为a1、a2、a3、a4、a5,出队的

2020-08-02 00:00:16 171

原创 数据结构与算法2-1 栈与队列之栈

目录1.栈的概念 (1)栈的定义 (2)栈的特点 (3)栈的存储结构2.栈的基本操作 (1)顺序栈  ①顺序栈的定义  ②顺序栈的状态  ③顺序栈的入栈操作  ④顺序栈的出栈操作 (2)链栈  ①链栈的定义  ②链栈的状态  ③链栈的入栈操作  ④链栈的出栈操作 (3)两种栈的性能比较3.参考代码 (1)顺序栈 测试结果 (2)链栈 测试结果1.栈的概念 (1)栈的定义  栈是一种只能在一端进行插入或删除操作的线性表。其中允许进行插入和删除操作的一端被称为栈顶(Top)。栈顶由一个称为栈顶指针的位置指

2020-07-31 23:56:19 411

原创 线性表算法设计:(4)字符分类

目录1.题目2.题目分析1.题目  已知用户输入的一字符串中包含三类字符:字母,数字和其他字符。试编写算法,构造三个链表,使每个链表中只含有同一类字符。2.题目分析  怎么对字符进行分类呢?这似乎是这个问题的关键。我们知道,每个字符,都有其对应的ASCII码值,其中字符0-9对应的ASCII码为48-57,字符a-z对应的ASCII码为65-90,A-Z对应的ASCII码值为97-122,...

2020-07-30 19:05:26 209

原创 线性表算法设计:(3)约瑟夫环

目录题目题目分析参考代码测试结果题目  约瑟夫(Josephus)环问题。  约瑟夫环是由古罗马的史学家约瑟夫提出来的,他参加并记录了公元66-70年犹太人反抗罗马的起义。约瑟夫作为一个将军,设法守住了裘达伯特城达43天之后。在城市沦陷后,他和40名死硬的将士在附近的一个洞穴中避难。在那里,这些将士们表决说“要投降毋宁死”。于是,约瑟夫建议每个人轮流杀死他旁边的人,而这个顺序是由抽签决定的。约瑟夫有预谋地抓到了最后一签,并且,作为洞穴中的两个幸存者之一,他说服了他原先的牺牲品一起投降了罗马。  约瑟

2020-07-29 23:28:01 497

原创 线性表算法设计:(2)顺序表与单链表的逆置

目录题目题目分析(1)顺序表(2)单链表参考代码测试结果题目  设计一个算法,实现顺序表和单链表的逆置。题目分析(1)顺序表  顺序表的逆置比较容易,我们只需将顺序表对称两个元素相互交换,即一个元素和最后一个元素,第二个元素和倒数第二个元素…即可实现顺序表的逆置。这里我们使用for循环,每循环一次,一对数据完成交换,循环次数为顺序表长度/2。(2)单链表  单链表的逆置比起顺序表复杂一些,这里我们采用的是三指针法。  首先,我们定义三个临时指针,分别指向单链表的前三个结点。接着,我们将v1

2020-07-28 20:04:05 2579

原创 线性表算法设计:(1)顺序表元素的循环移动

目录1.题目2.题目分析3.参考代码4.测试结果1.题目  设计一个算法,对于一个存储着若干元素的顺序表,根据用户输入的移动方向和位数,实现对顺序表元素的循环移动。2.题目分析1.假设我们获得用户输入的方向和位数分别为左和3位,表示我们要将4号元素及其之后的元素全部前移3位,同时前3号元素移至数组尾部且保持顺序不变。我们想到的是创建一个临时数组,用来保存我们的前三号元素。2.接着,我们将数组的其他元素依次前移3位。3.最后,我们把临时数组里保存的前三个元素复制到顺序表的后三个位置,完成我们的

2020-07-28 18:57:07 659

原创 数据结构与算法1-3 线性表之双链表

目录1.双链表的概念(1)结点(2)双链表2.双链表的操作(1)结点和头指针的定义(2)插入结点 ① 头插法 ② 尾插法 ③ 随机插入(3)查找结点(4)删除结点(5)遍历链表`3.参考代码1.双链表的概念(1)结点  在讲双链表的结构之前,我们先来思考一个问题。我们知道,单链表的结构,使得我们可以在堆中随时分配内存来满足我们的需要,且根据头指针的值,我们可以通过每个结点的指针域遍历整个链表。但是这样的遍历也存在一定的问题,即每个结点只包含指向下一结点的指针域,这就导致我们只能从前往后遍历链表,为了解

2020-07-26 22:26:56 405 1

原创 数据结构与算法1-2 线性表之单链表

目录1.单链表的概念(1)结点(2)单链表2.单链表的特点(1)带头结点的单链表(2)不带头结点的单链表3.参考代码(1)结点和头指针的定义(2)单链表的遍历(3)求单链表的表长(3)向单链表中插入结点 ① 头插法1.单链表的概念(1)结点  在链表结构中,构成链表的基本单位就是结点,每个结点结构体一般包括数据域和指针域。在数据域中,包含用户想要存储的每个单位的信息;指针域则是存储下一结点的指针,由此才能将若干结点连接成为链表。结点的结构一般如下所示:         图1.结点的结构图(2)单

2020-07-17 20:25:18 202

原创 数据结构与算法1-1 线性表之顺序表

数据结构与算法-01 线性表之顺序表1.顺序表的概念  顺序表,就是把若干个元素按照其逻辑顺序,依次存储到从指定的存储位置开始的一块连续的存储空间中。其中,线性表中的第一个元素的存储位置就是指定的存储位置,第i+1个元素的存储位置紧接在第i个元素的存储位置的后面,这样元素的存储方式就构成了顺序表。2.顺序表的特点3.参考代码(1)顺序表的初始化(2)顺序表的遍历(3)查找表中的元素(4)向表中增加元素(5)从表中删除元素...

2020-07-16 16:29:44 373

空空如也

空空如也

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

TA关注的人

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