滴水逆向三期
文章平均质量分 80
滴水逆向三期
Revival_S
这个作者很懒,什么都没留下…
展开
-
滴水逆向三期实践17:导入表注入
在动态链接库一章提到DllMain,这里再回顾一次当dll被加载进4GB空间时,会调用一次DllMain(入口方法)当程序执行完了要把dll从4GB空间被卸载,也会调用一次DllMain注入的本质就是想方设法把自己的dll扔到别人进程的4GB空间里而前面导入表一章在最后提到,只有在PE文件内隐式调用(静态使用)时才会在调用者PE文件的导入表内出现该 dll 的名字和相关函数,若为显示调用(动态使用),则这个被调用的dll名和相关函数不会在调用者导入表内出现。那么反过来也就是说,写原创 2021-11-10 22:22:36 · 2570 阅读 · 4 评论 -
滴水逆向三期实践17:绑定导入表
上一章最后讲到,打印导入表时如果打印的某些 exe 比如 xp系统自带的 记事本 即notepad.exe(win10 的 notepad.exe已经没有这种情况了),那上面打印的结果就不一定是如上一章所说的了,因为我们默认了 FirstThunk 也就是IAT 表的内容不是函数编号就是函数名的 RVA,实际上在文件中的 IAT 表仍然有第三种情况,这就是本章讲的内容了IAT 表在文件中存储的内容未必是序号和函数名的 RVA,还有可能直接就是上章讲的文件运行加载进内存后呈现的真正的函数地址。而这个.原创 2021-11-10 16:48:36 · 1178 阅读 · 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 · 2821 阅读 · 0 评论 -
滴水逆向三期实践15:根据重定位表修正地址
占坑原创 2021-10-28 21:47:58 · 2509 阅读 · 10 评论 -
滴水逆向三期实践14:移动重定位表
重定位表的移动相比导出表就简单太多了,因为重定位表相当于只有一个大表。统计一下这个“大表”的大小,全部移动到新节就行了。因为是使用下一块 VirtualAddress 和 SizeOfBlock是否全0来判断重定位表是否结束的,所以拷贝的时候也把这8字节的全0内容也加上一起拷贝进新节。最后修改数据目录中的 VirtualAddress指向新节 RVA 即可。代码有详细注释#include "Currency.h"#include "windows.h"#include "st...原创 2021-10-28 21:43:44 · 685 阅读 · 0 评论 -
滴水逆向三期实践13:移动导出表
为什么要移动各种表?1、这些表是编译器生成的,里面存储了非常重要的信息。2、在程序启动的时候,系统会根据这些表做初始化的工作:比如,将用到的DLL中的函数地址存储到 IAT 表中(IAT表后面会讲)3、为了保护程序,可以对.exe的二进制代码进行加密操作,但问题是:我们知道数据目录的各种表是存在各个节里的,而exe的代码的信息也是在节里,表与客户字节的代码和数据都混在一起了,如果进行加密(加壳),那系统在初始化的时候会出问题!综上,学会移动各种表,是对程序加密/破解的基础。移动导原创 2021-10-28 20:38:08 · 1111 阅读 · 2 评论 -
滴水逆向三期实践12:进程4GB空间,重定位表
双击一个exe就打开了一个进程,相应的会有属于这个进程的独立的 4GB空间,当然这个空间是虚拟的,假的。相当于游戏中玩家前进生成新地图,身后删除地图,移动起来相当于有一个很大的世界。即用到的地方按需分配,就是进程的4GB空间。具体由操作系统调度。和实际物理内存不是一个概念。低2G为用户空间,前后64K不会被分配,0-FFFF用于做各种无效检查(空指针就只向这里)后64K 7FFF0000 - 8000000用来做内核的交互。高2G空间是内核使用的。由主模块 exe加若干辅...原创 2021-10-28 19:41:04 · 761 阅读 · 0 评论 -
滴水逆向三期实践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 · 1252 阅读 · 0 评论 -
滴水逆向三期实践附:前后使用到的PE相关函数合集 Currency.h
课上海东说尽量把常用函数放进一个头文件中,附带实现.cpp这里作一个 Currency.h 和Currency.cpp函数基本是前面出现过的,包含功能和输入输出说明。后面的文章也会使用到大部分。首先是Currency.h#pragma once#include "windows.h"//函数声明 //************************************************************************** ...原创 2021-10-28 09:51:30 · 963 阅读 · 0 评论 -
滴水逆向三期实践10:动态链接库
使用静态链接生成的可执行文件体积较大,造成浪费我们常用的printf、memcpy、strcpy等就来自这种静态库有维护性问题。不方便修改库中实现,修改后所有使用静态库的都要重新链接一遍因为静态库相当于copy源码,所以如果a.exe 和b.exe 都用的同一套静态库,这两个exe中含有大量重复代码。先把程序运行起来,再将库链接进来——动态链接exe在可执行程序中没有相应库的代码,当软件运行起来再把库代码拷到内存。所以使用动态库的软件不需要重新链接,修改动态库即可修复库的问题(即头原创 2021-10-27 20:26:43 · 907 阅读 · 1 评论 -
滴水逆向三期实践9:静态链接库
windows中静态链接库通常是 .lib文件,在大型工程中,不同开发人员写的代码需要相互调用,首先不可能copy源码给调用者,其次一个模块可能包含多个函数,而通常一个函数就是一个.cpp会被编译成一个.obj 文件,但不一定每个函数都被写进调用代码中,如果把这些 obj文件全部链接成exe,会产生大量冗余代码,其次就是量大后不好操作。于是可以把多个obj 做成一个 lib静态库,静态库会自动判断调用了其中哪些程序,用到哪个function就相当于将那个函数的实现”抄”进来(但这里的”抄”也只是抄编..原创 2021-10-27 17:14:29 · 518 阅读 · 0 评论 -
滴水逆向三期实践5:新增节
如图,是新增节的大致思路,标红的位置为我们新增的部分,如果在已存在的节表后存在可以继续插入节表的空间,那么就多加一个节表。有了节表就要有对应的节,于是需要在文件末尾添加新的节存放代码或数据。上述思路具体为:1、判断是否有足够的空间,可以添加一个节表.判断条件:SizeOfHeader - (DOS + dos stub+ PE标记 + 标准PE头 + 可选PE头 + 已存在节表)>= 2个节表的大小为什么要两个节表的大小,因为除了根据SizeOfHeader判断头大小外..原创 2021-09-29 09:59:24 · 1154 阅读 · 8 评论 -
滴水逆向三期实践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 · 2146 阅读 · 2 评论 -
滴水逆向三期实践2:PE节表解析
书接上回节表,就是在NT_HEADER之后紧接着的那块区域,有多个相同结构的节表,整个区域就是个结构体数组,具体有多少个这样相同的节表结构在COFF头(FILE_HEADER)的 NumberOfSections字段。所以要遍历节表,只需 for 循环 NumberOfSections 次即可节表各字段说明如下,后续有更详细的解析:1、Name 8个字节 一般情况下是以"\0"结尾的ASCII吗字符串来标识的名称,内容可以自定义. 注意:该名称并不遵守必须以...原创 2021-09-22 15:50:31 · 1330 阅读 · 1 评论 -
滴水逆向三期实践6:扩大节
扩大节:1、拉伸到内存(只是逻辑上,实际代码操作并不需要这一步),需要注入的代码为 ShellCode2、分配一块新的空间:SizeOfImage + sizeof ( ShellCode)3、扩大节,修改最后一个节的 SizeOfRawData 和 VirtualSize OrgSecSize= max ( SizeOfRawData 或 VirtualSize内存对齐后的值 ) ∵有些初始化数据未全部写入文件,VirtualSize可能比SizeOfRawData...原创 2021-09-29 15:35:14 · 731 阅读 · 0 评论 -
滴水逆向三期实践7:合并节
会不会有极端情况,DOS stub的空间也不足,NT头和节表不能抬升,节表和第一节之间也没有空隙插入新节,这种情况如何加入自己的代码呢?就需要到合并节,将全部的节(一般文件都有两个以上的节)合并成一个节,那就可以有空隙增加自己的节表了。这里不搞那么复杂了,只做合并节,将全部节合并成一个后文件仍然可用即可。合并节: 1、拉伸到内存 (这里是真的拉伸到一块内存空间) 2、将第一个节的内存大小、文件大小改成一样 VirtualSize =...原创 2021-09-29 16:21:36 · 737 阅读 · 0 评论 -
滴水逆向三期实践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 · 1627 阅读 · 1 评论 -
滴水逆向三期实践4:节空白区
还记得节与节之间无论是文件中还是内存中都会存在一定的空白区(空隙)。那么可不可以往这里面注入代码呢?节表 VirtualSize(Misc)是指节的真实大小,暂且相信这个值的真实性。(后面有更可靠的方法)那么如果注入代码(硬编码)长度 加上VirtualSize仍然没有超过(覆盖)下一个节在文件中的位置 ,即 ( VirtualSize + 即注入代码长度 ) <SizeOfRawData那么就可以往PE文件中注入代码了。在此之前,还需要知道一点其他的知识为了效果显著...原创 2021-09-22 21:47:07 · 1027 阅读 · 1 评论 -
滴水逆向三期实践8:数据目录
数据目录即可选头OPTIONAL_HEADER的最后一项,是一个16个元素的结构体数组每个数组元素都是相同的结构体,结构体包含一个DWORD VirtualAddress是个内存偏移地址(RVA)指向一张表,若为0表示没有。注意,这个地址指向的表位置都是存在于各个节表中的,具体在哪个节表不好说。Size表示VirtualAddress指向的表的长度,通常没用,基本是废值了,平时也不会用它。数据目录: 1、我们所了解的PE分为头和节,在每个节中,都包含了我...原创 2021-09-29 16:48:12 · 497 阅读 · 0 评论