![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
滴水逆向第三期-实践
文章平均质量分 67
a11ure_1ove
自学逆向中,很菜勿喷
展开
-
滴水逆向——Win32_创建线程
进程是正在运行的程序的实例。一个进程至少有一个线程,一个进程中可以并发多个线程,每条线程同时执行不同的任务。不知道为什么两个线程的输出顺序一直改变,好像输出的"+“比”-"要慢。好像vs2019的线程有点多。原创 2023-08-18 16:43:36 · 238 阅读 · 0 评论 -
滴水逆向---资源文件_消息断点_ReverseTraining_3.exe
MAKEINTRESOURCE:这个宏用于将数字转换为char*类型。原创 2023-07-28 21:53:25 · 750 阅读 · 0 评论 -
滴水逆向——资源表
资源表位于PE结构中的数据目录表的第三项,下标为2。原创 2023-07-23 21:20:11 · 820 阅读 · 0 评论 -
滴水逆向---子窗口_消息处理函数
该代码来自51hook。原创 2023-07-18 19:08:50 · 836 阅读 · 1 评论 -
滴水逆向-ESP_EBP寻址_定位回调函数
ESP作为堆栈指针寄存器,存储栈顶指针指向的地址。但是当出现堆栈传参之类的操作时,栈顶发生了变化,就需要先对栈顶指针进行修正后再用ESP进行寻址,比较麻烦。原创 2023-07-17 21:38:23 · 901 阅读 · 1 评论 -
滴水三期-Win32---事件_消息_消息处理函数
Windows事件就是一个"动作",而消息则是用来描述这些"动作"的。原创 2023-07-15 20:06:01 · 189 阅读 · 1 评论 -
滴水逆向_Win32---宽字符
基于以上原因,Unicode组织推行出了Unicode标准,以适应世界范围内的所有国家的常用字符,Unicode字符集的编码范围是 0x0000 - 0x10FFFF但是,Unicode字符集的编码范围过大就导致一个字符需要1到3个字节进行表示,但是计算机无法判断当前字符需要几个字节。所以,UTF-8、UTF-16还有UTF-32就因此出现。UTF后面的数字表明至少使用多少个比特位来存储字符,也就是说,UTF-8至少需要1个字节存储字符,UTF-16至少需要2个字节,而UTF-32至少需要4个字节。原创 2023-07-13 21:22:05 · 766 阅读 · 1 评论 -
C++进阶---new&delete
也就是说,我们甚至可以直接用HeapAlloc函数进行内存分配,只是里面的参数太多,需要我们自己设置,太麻烦,而malloc是直接就能用的,所以我们平时用的是malloc。这个call的函数的最后有个地址0042d16c,这是个IAT表,所以这个call调用的并不是这个0042d16c,而是这个地址里面存的值。发现这次的call是个FF间接call,这个HeapAlloc函数就是malloc调用的最后的函数了。跟进这个地址,我们发现,地址的大小已经大变样了,7C开头的地址证明已经到dll的领空了。原创 2023-07-12 15:21:10 · 32 阅读 · 0 评论 -
C++进阶---友元&运算符重载
一个函数想访问一个类的私有成员时是不允许访问的,但是将这个函数声明成友元之后就可以访问了。原创 2023-07-10 22:08:35 · 36 阅读 · 0 评论 -
C++进阶---引用
1、引用类型是C++里面的类型2、引用类型只能赋值一次,不能重新赋值3、引用只是变量的一个别名4、引用可以理解成是编译器维护的一个指针,但并不占用空间5、使用引用可以像指针那样去访问、修改对象的内容,但更加安全。原创 2023-07-10 20:42:36 · 33 阅读 · 0 评论 -
C++进阶---模板
可以看到,我们如果需要对多种类型的数组进行查找,可以用模板定义一个类型T,这个类型可以对任意类型进行替换。当然,如果我们定义了。大致如此,main函数的arr数组存的类型暂时只有int,还没添加多个类型。另外,使用模板前后,我们程序的汇编代码是一模一样,没有改变。查找的变量类型均为int,若是要对多个类型一起进行查找,则需要用到模板。我们先举一个简单的例子:当一个项目的需求是实现一个折半查找功能,是。的时候,我们就会用到模板。原创 2023-07-08 20:58:32 · 48 阅读 · 0 评论 -
C++面向对象---绑定
1、只有virtual的函数是动态绑定2、动态绑定还有一个名字:多态多态可以理解为,一个函数只有一个相同的类型,却体现出了不同的行为public :int x;int y;y = 2;} };y = 5;A = 6;} };y = 8;B = 9;} };原创 2023-07-04 21:49:14 · 63 阅读 · 0 评论 -
C++面向对象---虚函数&继承
可以看出,在单继承无函数覆盖的情况下,子类Sub继承父类Base,先调用父类的构造函数,输出顺序正常。原创 2023-07-03 21:03:26 · 85 阅读 · 0 评论 -
C++面向对象---虚函数表
我们得出一个结论:只要我们加了virtual之后,我们的对象里面会多出4个字节进行中转,它指向一个数组,里面里面存的值才是我们要调用的函数的地址,这4个字节指向的数组就是虚函数表。也就是说,假设创建了一个base对象,它里面存的就是个this指针,this指针的前四个字节指向了一个数组,这个数组里面存的就是虚函数的地址,这个数组也就是虚函数表。我们发现,我们要调用的函数地址是edx里面的值,而edx存的是ecx中的值,而ecx存的就是this指针。我们回到ecx里面存的值40201c,查它里面的值。原创 2023-05-19 21:11:30 · 47 阅读 · 0 评论 -
C++面向对象-权限控制
public公有权限,类内类外均可访问protected保护权限:类内可以访问,类外子类可以访问父类的保护内容private私有权限,类内可以访问,类外不可以访问struct默认权限为公共,class默认为私有set只写权限,get只读权限。原创 2023-05-16 21:02:58 · 34 阅读 · 0 评论 -
C++面向对象---继承、构造、析构函数
1.没有返回值2.必须和类的名称一致3.构造函数是我们创建对象时调用的(用来初始化对象)当调用函数中有参数时,我们用的就是有参构造函数当调用函数中没有参数时,我们用的就是无参构造函数当有多个构造函数的时候,我们称之为重载构造函数。当有多个参数个数不同的函数时,我们称之为重载函数。原创 2023-05-13 21:29:37 · 32 阅读 · 0 评论 -
C++面向对象--This指针
空结构体的大小为1。因为C++不允许不同的对象拥有相同的地址。如果空结构体的大小为0,则用这个空结构体创建一个数组的时候,数组里面的每个对象的地址就会相同。编译器为每个空类或者空结构体都增加了一个虚设的字节(有的编译器可能加的更多),就可以保证他们的对象拥有彼此独立的地址。从反汇编可以看出,当结构体进行传参时采用的是复制操作,传递的是副本,将第一个参数从ebp-4中取出赋值给eax,将第二个参数从ebp-8中取出赋值给ecx。这两个参数都是结构体的首地址。编译器替我们多传的这个参数就是函数的this指针。原创 2023-05-09 21:24:05 · 31 阅读 · 0 评论 -
导入表注入
导入表注入就是把一个自己的dll程序加载进另一个exe进程的4GB内存空间。我们通过写进一张新的导入表来实现这个注入功能。下面贴出海哥在滴水逆向第三期给出的部分dll程序代码:首先是dll程序的头文件然后是它的源文件采用隐式调用的方法注入在刚打开注入后的程序时,发现弹出了Init()窗口,在关闭该程序时,又弹出了Destroy()窗口。也就是说,dll的入口在往4GB里面粘贴的时候会调用一次,在把这个dll从4GB空间里面拿出来的时候还会再调用一次。原创 2023-04-27 11:33:22 · 239 阅读 · 0 评论 -
解析绑定导入表
之前我们解析了导入表的结构,大致了解了导入表的打印流程。当时我们说,IAT表在PE文件加载前存储的内容是序号(Hint)和函数名称(Name[1])。但是现在还会有一种情况,就是在PE文件加载前就已经把函数的真正地址贴进IAT表里面了。在PE文件加载前,可以通过导入表,找到要用到哪些dll,再通过导出表依次找到它们的函数地址,然后通过RVA转FOA将这些绝对地址依次贴进IAT表中。这个操作就是绑定导入表的操作。原创 2023-04-22 18:59:36 · 150 阅读 · 0 评论 -
解析导入表
假设我们去一个饭店,服务员给我们一张菜单,上面写了有哪些菜,多少钱;这就相当于导出表。而作为顾客,我们也要填写一个单子,上面写了我们要吃什么,点的什么菜;这就相当于一张导入表。在数据目录中,第二个结构就是导入表:同样,从导入表结构中的成员Name指向dll名字可以看出,一个导入表对应一个Name,而一个Name对应一个dll。所以,如果需要导入多个dll,就需要多个导入表结构。因此,多个数据目录表里面的导入表的VirtualAddress也指向多个导入表结构。原创 2023-04-22 15:16:09 · 94 阅读 · 0 评论 -
移动导出表
为了保护程序,可以对exe程序的二进制代码进行加密操作。但是,各种表的信息和客户字节的代码以及数据都混在了一起,如若进行加密操作,系统在初始化时就会出现问题。原创 2023-04-16 14:48:34 · 50 阅读 · 0 评论 -
解析重定位表
每个程序都会有一个4GB的虚拟内存,不是真正的物理内存。就相当于玩原神这样的游戏,角色往前走,前面生成地图,后面删除地图,移动起来就相当于一个最多4GB大小的游戏世界。其中,高2G的是内核使用的空间。也就是说,3环程序处理底2G内存,内核程序处理高2G内存。而一个程序里面可以有许多个PE文件。其中,dll程序的PE文件通常贴在高位,一般像71B10000这样以7开头的地址很有可能就是dll程序。原创 2023-04-15 15:50:33 · 209 阅读 · 0 评论 -
解析导出表
假设现在有一个exe程序使用了一个dll,对于这个exe程序而言,dll文件就相当于一个黑盒子,里面装的内容exe一点也不清楚。所以什么是导出表?导出表就是dll的一份清单,里面记录了它有多少个函数,函数的地址等相关信息补充:exe并不是没有导出表,而是大部分exe没有导出表另外,数据目录表有16个,其中第一个就是导出表。原创 2023-04-03 20:57:42 · 174 阅读 · 0 评论 -
动态链接库
动态链接库(DLL) 是一个包含函数和数据的模块,它可以被其他模块(应用或 DLL)使用。原创 2023-03-27 21:12:37 · 213 阅读 · 0 评论 -
静态链接库
静态链接库就是你使用的.lib文件,库中的代码最后需要连接到你的可执行文件中去,所以静态连接的可执行文件一般比较大一些。格式如:#pragma comment(lib,“XXX.lib”)原创 2023-03-27 08:50:34 · 33 阅读 · 0 评论 -
滴水逆向第三期-fileBuffer_imageBuffer
本文详细介绍了一个PE文件从FileBuffer到ImageBuffer的具体过程原创 2023-03-20 21:03:54 · 456 阅读 · 0 评论 -
滴水逆向第三期-节表
1、联合体共享内存空间2、联合体的内存空间大小是其成员中内存最大成员的大小3、上图中两个联合体的意义不一样,第一个联合体的类型名是TestUnion;而第二个相当于创建了一个匿名的联合体,这个联合体声明了一个变量,变量名为TestUnion。原创 2023-03-12 17:23:29 · 261 阅读 · 0 评论 -
滴水逆向第三期:PE头解析_手动(1)
PE头解析_手动原创 2023-03-10 17:05:59 · 342 阅读 · 0 评论