自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Rivival_S 的博客

神经病人思维广,弱智儿童欢乐多

  • 博客(49)
  • 收藏
  • 关注

原创 滴水逆向三期实践17:导入表注入

在动态链接库一章提到DllMain,这里再回顾一次当dll被加载进4GB空间时,会调用一次DllMain(入口方法)当程序执行完了要把dll从4GB空间被卸载,也会调用一次DllMain注入的本质就是想方设法把自己的dll扔到别人进程的4GB空间里而前面导入表一章在最后提到,只有在PE文件内隐式调用(静态使用)时才会在调用者PE文件的导入表内出现该 dll 的名字和相关函数,若为显示调用(动态使用),则这个被调用的dll名和相关函数不会在调用者导入表内出现。那么反过来也就是说,写

2021-11-10 22:22:36 2286 4

原创 滴水逆向三期实践17:绑定导入表

上一章最后讲到,打印导入表时如果打印的某些 exe 比如 xp系统自带的 记事本 即notepad.exe(win10 的 notepad.exe已经没有这种情况了),那上面打印的结果就不一定是如上一章所说的了,因为我们默认了 FirstThunk 也就是IAT 表的内容不是函数编号就是函数名的 RVA,实际上在文件中的 IAT 表仍然有第三种情况,这就是本章讲的内容了IAT 表在文件中存储的内容未必是序号和函数名的 RVA,还有可能直接就是上章讲的文件运行加载进内存后呈现的真正的函数地址。而这个.

2021-11-10 16:48:36 1088 1

原创 滴水逆向三期实践16:IAT表和导入表

IAT表在我们调用 dll函数的时候,发现代码中的汇编,是通过间接寻址的。也就是不直接 call函数地址,而是通过一个中间地址再跳转的。比如调用MessageBox这类系统函数的时候(这也是个 dll中的函数),那么它的汇编会为 call dword ptr [ (004322d4) ]通过间接寻址,004322d4里面存的是X就可以跳到X,这个X变量可以任意指定。004322d4是.exe领空的,而间接寻址的X可以不是.exe领空,比如这次运行中X会变为77d5050b,就跳到了.dll ...

2021-11-09 21:18:41 2535

原创 滴水逆向三期实践15:根据重定位表修正地址

占坑

2021-10-28 21:47:58 2167 10

原创 滴水逆向三期实践14:移动重定位表

重定位表的移动相比导出表就简单太多了,因为重定位表相当于只有一个大表。统计一下这个“大表”的大小,全部移动到新节就行了。因为是使用下一块 VirtualAddress 和 SizeOfBlock是否全0来判断重定位表是否结束的,所以拷贝的时候也把这8字节的全0内容也加上一起拷贝进新节。最后修改数据目录中的 VirtualAddress指向新节 RVA 即可。代码有详细注释#include "Currency.h"#include "windows.h"#include "st...

2021-10-28 21:43:44 620

原创 滴水逆向三期实践13:移动导出表

为什么要移动各种表?1、这些表是编译器生成的,里面存储了非常重要的信息。2、在程序启动的时候,系统会根据这些表做初始化的工作:比如,将用到的DLL中的函数地址存储到 IAT 表中(IAT表后面会讲)3、为了保护程序,可以对.exe的二进制代码进行加密操作,但问题是:我们知道数据目录的各种表是存在各个节里的,而exe的代码的信息也是在节里,表与客户字节的代码和数据都混在一起了,如果进行加密(加壳),那系统在初始化的时候会出问题!综上,学会移动各种表,是对程序加密/破解的基础。移动导

2021-10-28 20:38:08 998 2

原创 滴水逆向三期实践12:进程4GB空间,重定位表

双击一个exe就打开了一个进程,相应的会有属于这个进程的独立的 4GB空间,当然这个空间是虚拟的,假的。相当于游戏中玩家前进生成新地图,身后删除地图,移动起来相当于有一个很大的世界。即用到的地方按需分配,就是进程的4GB空间。具体由操作系统调度。和实际物理内存不是一个概念。低2G为用户空间,前后64K不会被分配,0-FFFF用于做各种无效检查(空指针就只向这里)后64K 7FFF0000 - 8000000用来做内核的交互。高2G空间是内核使用的。由主模块 exe加若干辅...

2021-10-28 19:41:04 696

原创 滴水逆向三期实践11:导出表

前面提到头OPTIONAL_HEADER的最后一项,是一个16个元素的结构体数组,为数据目录。而数据目录项的第一个结构,就是动态链接库中经常提到的 导出表.typedef struct _IMAGE_DATA_DIRECTORY { DWORD VirtualAddress; DWORD Size; } IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIR...

2021-10-28 10:51:09 1138

原创 滴水逆向三期实践附:前后使用到的PE相关函数合集 Currency.h

课上海东说尽量把常用函数放进一个头文件中,附带实现.cpp这里作一个 Currency.h 和Currency.cpp函数基本是前面出现过的,包含功能和输入输出说明。后面的文章也会使用到大部分。首先是Currency.h#pragma once#include "windows.h"//函数声明 //************************************************************************** ...

2021-10-28 09:51:30 814

原创 滴水逆向三期实践10:动态链接库

使用静态链接生成的可执行文件体积较大,造成浪费我们常用的printf、memcpy、strcpy等就来自这种静态库有维护性问题。不方便修改库中实现,修改后所有使用静态库的都要重新链接一遍因为静态库相当于copy源码,所以如果a.exe 和b.exe 都用的同一套静态库,这两个exe中含有大量重复代码。先把程序运行起来,再将库链接进来——动态链接exe在可执行程序中没有相应库的代码,当软件运行起来再把库代码拷到内存。所以使用动态库的软件不需要重新链接,修改动态库即可修复库的问题(即头

2021-10-27 20:26:43 775 1

原创 滴水逆向三期实践9:静态链接库

windows中静态链接库通常是 .lib文件,在大型工程中,不同开发人员写的代码需要相互调用,首先不可能copy源码给调用者,其次一个模块可能包含多个函数,而通常一个函数就是一个.cpp会被编译成一个.obj 文件,但不一定每个函数都被写进调用代码中,如果把这些 obj文件全部链接成exe,会产生大量冗余代码,其次就是量大后不好操作。于是可以把多个obj 做成一个 lib静态库,静态库会自动判断调用了其中哪些程序,用到哪个function就相当于将那个函数的实现”抄”进来(但这里的”抄”也只是抄编..

2021-10-27 17:14:29 454

原创 滴水逆向三期实践8:数据目录

数据目录即可选头OPTIONAL_HEADER的最后一项,是一个16个元素的结构体数组每个数组元素都是相同的结构体,结构体包含一个DWORD VirtualAddress是个内存偏移地址(RVA)指向一张表,若为0表示没有。注意,这个地址指向的表位置都是存在于各个节表中的,具体在哪个节表不好说。Size表示VirtualAddress指向的表的长度,通常没用,基本是废值了,平时也不会用它。数据目录: 1、我们所了解的PE分为头和节,在每个节中,都包含了我...

2021-09-29 16:48:12 437

原创 滴水逆向三期实践7:合并节

会不会有极端情况,DOS stub的空间也不足,NT头和节表不能抬升,节表和第一节之间也没有空隙插入新节,这种情况如何加入自己的代码呢?就需要到合并节,将全部的节(一般文件都有两个以上的节)合并成一个节,那就可以有空隙增加自己的节表了。这里不搞那么复杂了,只做合并节,将全部节合并成一个后文件仍然可用即可。合并节: 1、拉伸到内存 (这里是真的拉伸到一块内存空间) 2、将第一个节的内存大小、文件大小改成一样 VirtualSize =...

2021-09-29 16:21:36 607

原创 滴水逆向三期实践6:扩大节

扩大节:1、拉伸到内存(只是逻辑上,实际代码操作并不需要这一步),需要注入的代码为 ShellCode2、分配一块新的空间:SizeOfImage + sizeof ( ShellCode)3、扩大节,修改最后一个节的 SizeOfRawData 和 VirtualSize OrgSecSize= max ( SizeOfRawData 或 VirtualSize内存对齐后的值 ) ∵有些初始化数据未全部写入文件,VirtualSize可能比SizeOfRawData...

2021-09-29 15:35:14 603

原创 滴水逆向三期实践5:新增节

如图,是新增节的大致思路,标红的位置为我们新增的部分,如果在已存在的节表后存在可以继续插入节表的空间,那么就多加一个节表。有了节表就要有对应的节,于是需要在文件末尾添加新的节存放代码或数据。上述思路具体为:1、判断是否有足够的空间,可以添加一个节表.判断条件:SizeOfHeader - (DOS + dos stub+ PE标记 + 标准PE头 + 可选PE头 + 已存在节表)>= 2个节表的大小为什么要两个节表的大小,因为除了根据SizeOfHeader判断头大小外..

2021-09-29 09:59:24 1016 8

原创 滴水逆向三期实践4:节空白区

还记得节与节之间无论是文件中还是内存中都会存在一定的空白区(空隙)。那么可不可以往这里面注入代码呢?节表 VirtualSize(Misc)是指节的真实大小,暂且相信这个值的真实性。(后面有更可靠的方法)那么如果注入代码(硬编码)长度 加上VirtualSize仍然没有超过(覆盖)下一个节在文件中的位置 ,即 ( VirtualSize + 即注入代码长度 ) <SizeOfRawData那么就可以往PE文件中注入代码了。在此之前,还需要知道一点其他的知识为了效果显著...

2021-09-22 21:47:07 938 1

原创 滴水逆向三期实践3:FileBuffer-ImageBuffer

书接上回这张图上回已经有过了,这里加上更详细的说明设该文件文件对齐FileAlignment为200,内存对齐SectionAlignment为1000,则有如下节:节1:PointerToRawData 400 VirtualAddress 1000 节2:PointerToRawData 600 VirtualAddress 2000 节3:Poi...

2021-09-22 17:16:56 1429 1

原创 滴水逆向三期实践2:PE节表解析

书接上回节表,就是在NT_HEADER之后紧接着的那块区域,有多个相同结构的节表,整个区域就是个结构体数组,具体有多少个这样相同的节表结构在COFF头(FILE_HEADER)的 NumberOfSections字段。所以要遍历节表,只需 for 循环 NumberOfSections 次即可节表各字段说明如下,后续有更详细的解析:1、Name 8个字节 一般情况下是以"\0"结尾的ASCII吗字符串来标识的名称,内容可以自定义. 注意:该名称并不遵守必须以...

2021-09-22 15:50:31 1145 1

原创 滴水逆向三期实践1:PE头字段解析,附PE结构下载

视频资源详见网盘搜索 或 在线的B站滴水逆向三期其课件也能在CSDN或百度搜索到,以下部分为课件内容摘要,部分为自己的理解最后附上详细注释的自写代码PE(Portable Executable)文件,是windows上的可移植的可执行文件,常见的 .exe .dll .sys 等都是PE文件。那么PE文件和计算机网络的各种包头一样,都有自己独特的格式。这里有张PE格式图的部分截图,完整版链接:https://pan.baidu.com/s/1ToG2wc_qOi0BfrLTe...

2021-09-22 11:23:23 1950 2

原创 汇编语言:键盘录入8个16进制数,求出其中最大值并以16进制输出

要求:1.   掌握loop指令及循环程序设计方法。2.   掌握输入/输出代码编写。3.   学习移位指令的应用。代码:assume cs:codesgcodesg segment ;键盘输入8个16进制数(每个数二进制8位,即16进制2位),求出其中最大值并以16进制输出 mov cx,8h mov bh,0 ;bh是最大值s: mov ah,01h mov bl,0...

2018-05-05 13:00:42 3302

原创 汇编语言:键盘录入五个整数,编程实现求和

要求:1.   查看CPU和内存,用机器指令和汇编指令编程,查看对应机器指令2.   学习编程,编译,连接,跟踪;3.   要求编译链接后用debug跟踪执行代码:assume cs:codesgcodesg segment ;键盘输入5个8位的16进制数(每个数8位二进制,即2位十六进制),累加求和输出 和为16位 mov dx,0 ;这里存放累加和 mov cx,5hs...

2018-05-05 12:49:10 8689

原创 鼠标事件:用鼠标在黑框框中画出图形

在了解句柄的概念和宏定义的前提下,就可以利用windows.h 头文件用已经定义好的许多函数的结构体做出很多功能了比如读取鼠标状态信息(坐标,鼠标按键等)(如果编译完此程序鼠标移动,点击黑框框均无反应,那么在编译运行出现黑框框后,右键黑框框顶栏-&gt;属性-&gt;选项-&gt;在"编辑选项"中的第一个选项“快速编辑模式”的勾选去掉即可!)精简版:(详尽注释在下面的版本)#include &lt...

2018-04-06 14:49:16 582

原创 C语言坦克大战

C语言编写的坦克大战exe小游戏! (含有部分C++函数,不过不需要知道实现细节,主要用于键盘读取等)适合初学者学习的坦克大战代码,无图片,游戏全部功能画面显示全部由 printf 打印 注:本游戏win7可完美运行,win10的话,小坦克和子弹的打印会略有鬼畜(变形,只打印半边等)。win10完美运行方案:点击屏幕左下角"开始"界面,搜索框输入cmd,出现命令提示符的黑框框后,...

2018-03-21 18:56:14 43125 61

原创 蓝桥杯第八届C/C++ A组省赛(2017)第一题:迷宫

标题:迷宫X星球的一处迷宫游乐场建在某个小山坡上。它是由10x10相互连通的小房间组成的。房间的地板上写着一个很大的字母。我们假设玩家是面朝上坡的方向站立,则:L表示走到左边的房间,R表示走到右边的房间,U表示走到上坡方向的房间,D表示走到下坡方向的房间。X星球的居民有点懒,不愿意费力思考。他们更喜欢玩运气类的游戏。这个游戏也是如此!开始的时候,直升机把100名玩家放入一个个小房间内。玩家一定要按...

2018-03-20 23:29:36 763

原创 数据结构:设有一个不带头结点的单链表L,设计两个递归算法,del(L,x)删除单链表L中第一个值为x的节点,delall(L,x)删除单链表L中的最小节点值。

#include#includetypedef struct Lnode //单链表结构体{ int data; struct Lnode* next;} LinkNode;void DispList(LinkNode*L) //输出函数{ LinkNode*p=L; while(p!=NULL) { printf("%d ",p->data); p=p

2018-01-23 13:57:16 14657 3

原创 设定二维整数数组B[0..m-1,0..n-1]的数据在行,列方向上都按从小到大的顺序排序,且整形变量x中的数据在B中存在。设计一个算法,找出一对满足B[i][j]=x的I,j值,要求比较次数不超过m

#include#includevoid output(int a[5][6]){ for(int i=0;i<5;i++) { for(int j=0;j<6;j++) printf("%d ",a[i][j]); printf("\n"); }}void find(int a[5][6],int X){ int x=5,y=0; //从右上角

2018-01-23 13:54:50 4010 2

原创 数据结构:由有序数列创建一棵高度最小的二叉排序树与判断一 个序列是否为该二叉排序树中的一个合法查找序列

编写一个程序,对于给定的一个有序的关键字序列,创建一棵高度最小的二叉排序树。并判断一个序列是否为该二叉排序树中的一个合法的查找序列#include#includetypedef struct node{ int data; struct node *lchild,*rchild;} BSTNode;int *A; //全局变量ABSTNode* CreateBS

2018-01-23 13:47:52 3260

原创 数据结构:实现可变长字符串序列快速排序算法

某个待排序的序列式一个可变长的字符串序列,这些字符串一个接一个地存储于单个字符数组中,采用快速排序方法对这个字符串序列进行排序,并编写一个对以下数据进行排序的程序。#include#include#includetypedef struct{ int start; int length;} Node;char S[]={"whileifif-elsedo-whilefo

2018-01-23 13:41:27 863

原创 数据结构:不带权有向图的邻接矩阵和邻接表储存及求出入度实现

14.假设不带权有向图采用邻接矩阵G存储,设计实现以下功能的算法。(1) 求出图中每个顶点的入度。(2)求出图中每个顶点的出度。(3)求出图中出度为0的顶点数。15. 假设不带权有向图采用邻接表G存储,设计实现以下功能的算法。(1) 求出图中每个顶点的入度。(2)求出图中每个顶点的出度。(3)求出图中出度为0的顶点数。#include #include #de

2017-11-28 23:19:34 16157

原创 数据结构:简单算数表达式二叉树的构建和求值

内容:编写一个程序,先用二叉树来表示一个简单算术表达式,树的每一个结点包括一个运算符或者运算数。在简单算术表达式中只含+,-,*,/ 和一位正整数且格式正确(不包含括号),并且要先按照先乘除后加减的原则构造二叉树,然后由对应的二叉树计算该表达式的值。解:这里用非递归算法,根据对简单算数表达式的观察,如1+2*3-4/5  ,同一棵子树中+、- 号一定在*,/ 号的上层,而且在表达式中如果直

2017-11-23 21:56:56 19392 13

原创 数据结构:编写病人看病模拟程序(C/C 艹)

目的:掌握队列的算法设计。内容:(1)编写一个程序exp2-9.cpp,反映病人到医院排队看医生的情况。在病人排队过程中候诊.(2)护士从等待队列中国取出下一位病人的病历,该病人进入诊室就诊。#include#includetypedef struct pnode //节点结构体{ int medNum; struct pnode* n

2017-10-22 17:50:29 15349 6

原创 数据结构:职工信息的综合运算

目的:深入掌握单链表应用的算法设计。内容:设有一个职工文件emp.dat,每个职工记录包含职工编号(no),姓名(name),部门号(depno),和工资数(salary)信息。这几一个程序完成以下功能(1)从emp.dat文件中读取出职工记录,并建立一个带头结点链表。(这点不作要求,从键盘录入即可)(2)输入一个职工记录。(3)显示所有职工记录。(4)按编号no对所有职工记录

2017-10-22 17:37:19 18724 5

原创 数据结构:求集合差集(c/c++)

用带头结点的单链表表示整数集合,完成以下算法并分析时间复杂度:(1)设计一个算法求两个集合A和B的差集运算,即C=A-B,要求算法的空间复杂度为O(1),并释放单链表A和B中不需要的结点。(2)假设集合中的元素按递增排列,设计一个高效算法求两个集合A和B的差集运算,即C=A-B,要求算法的空间复杂度为O(1),并释放单链表A和B中不需要的结点。#include#includety

2017-10-22 17:08:37 9632 2

原创 数据结构:求集合并集

用带头结点的单链表表示整数集合,完成以下算法并分析时间复杂度:(1)设计一个算法求两个集合A和B的并集运算,要求不破坏原有的单链表A和B.(2)假设集合中的元素递增排列,设计一个高效算法求两个集合A和B的并集运算,要求不破坏原有的单链表A和B。#include#includetypedef struct LNode{ int data; struct LNode*

2017-10-22 17:01:14 10589

原创 数据结构: 单链表排序

设有一个带头结点的单链表L,结点的结构为(data, next),其中data为整数元素,next为后继结点的指针。设计一个算法,首先按递减次序输出该单链表中各结点的数据元素,然后释放所有结点占用的存储空间,并要求算法的空间复杂度为O(1)。#include #includetypedef struct LNode{ int data; struct LNode

2017-10-22 16:52:40 4540

原创 数据结构:求两个多项式的相加运算

目的:掌握线性表的应用和有序单链表的二路归并算法设计。内容:编写一个程序exp2-9.cpp,用单链表储存一元多项式,并实现两个多项式的相加运算 #include&lt;stdio.h&gt;#include&lt;stdlib.h&gt; typedef struct LNode{ int data; struct LNode* next;} LinkNode;...

2017-10-22 16:40:33 18868 4

原创 C语言入门:删除链表节点

删除节点:输入若干个正整数(输入-1为结束标志)建立一个单向链表再输入一个整数m,删除链表中值为m的所有结点。试编写相应程序。#include#includestruct a //结构a的定义{ int n; struct a *next;} A;struct a *creat() //建立链表函数{ int count=1,n; s

2017-10-22 16:35:16 2575

原创 数据结构:有人设计以下算法用于删除整数顺序表L中所有值在[x,y]范围内的元素,该算法显然不是高效的,请设计一个同样功能的高效算法。

(题目的算法略)#include #include #define MaxSize 50typedef int ElemType; typedef struct { ElemType data[MaxSize]; //存放顺序表元素 int length; //存放顺序表的长度} SqList; //顺序表的类型void CreateList(Sq

2017-10-22 16:24:02 11577

原创 C语言入门:奇数值节点链表

奇数值节点链表:输入若干个正整数(输入-1为结束标志)建立一个单向链表,头指针为L,将链表L中奇数值的节点重新组成一个新的链表NEW,并输出新建链表的信息。试编写相应程序。#include#includestruct a { //结构a的定义 int n; struct a *next;} A;struct a *creat() //建立链

2017-08-13 09:04:24 4224

原创 C语言入门:查找子串

查找子串:输入两个字符串s和t,在字符串s中查找子串t,输出起始位置,若不存在,则输出-1.要求自定义函数char*  search(char * s,char * t)返回子串t的首地址,若未找到,则返回NULL。试编写相应程序。#include #include #include char* search(char*s,char*t){ int size_t=strl

2017-08-12 17:37:47 18445

空空如也

空空如也

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

TA关注的人

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