羽夏笔记——Hook攻防基础
写在前面
本笔记是由本人独自整理出来的,图片来源于网络。本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正。 如有好的建议,欢迎反馈。码字不易,如果本篇文章有帮助你的,如有闲钱,可以打赏支持我的创作。如想转载,请把我的转载信息附在文章后面,并声明我的个人信息和本人博客地址即可,但必须事先通知我。
本篇文章主要是让读者对
Hook有一个最基础的了解,并不是详细介绍Hook的使用,如果有这个想法的请不要继续阅读,以免浪费时间。
️ 静态链接库的使用
1、将生成的.h与.lib文件复制到项目根目录,然后在代码中引用:
#include "xxxx.h"
#pragma comment(lib, "xxxx.lib")
2、将xxxx.H与xxxx.LIB文件复制到开发环境安装目录,与库文件放在一起然后在工程->设置->连接->对象/库模块中添加xxxx.lib。
️ 静态链接库的缺点
1、使用静态链接生成的可执行文件体积较大
2、包含相同的公共代码,造成浪费
️ 创建动态链接库
方法1、extern "C"_declspec(dllexport)调用约定 返回类型 函数名(参数列表);
方法2、使用.def文件:
EXPORTS
函数名@编号
函数名@编号 NONAME
使用序号导出的好处:
名字是一段程序就精华的注释,通过名字可以直接猜测到函数的功能通过使用序号,可以达到隐藏的目的
️ 显式使用动态链接库
- 步骤1
//定义函数指针,如:
typedef int (stdcall *lpPlus)(int,int);
typedef int (_stdcall *IpSub)(int, int);
- 步骤2
//声明函数指针变量,如:lpFuc1 myFuc;
lpSub mySub;
- 步骤3
//动态加载dl到内存中,如:
HINSTANCE hModule = LoadLibrary("MyLib.dll");
- 步骤4
//获取函数地址,如:
myFuc1 = (lpPlus)GetProcAddress(hModule,/*函数名*/);
myFuc2 = (IpSub)GetProcAddress(hModule,(char*)/*编号*/);
- 步骤5
//调用函数,如:
a = myFuc(/*参数列表*/);
- 步骤6
//释放动态链接库,如:
FreeLibrary(hModule);
️ 隐式使用动态链接库
步骤1:将*.dll *.lib放到工程目录下面
步骤2:将##pragma comment(lib,"DLL名.lib")添加到调用文件中
步骤3:加入函数的声明
declspec(dllimport) __stdcall int Fuc (int x,int y);
【注意】dll里面怎么声明的,步骤3就怎么声明
️ 什么是注入
所谓注入就是在第三方进程不知道或者不允许的情况下将模块或者代码写入对方进程空间,并设法执行的技术。
️ 已知的注入方式
远程线程注入、APC注入、消息钩子注入、注册表注入、导入表注入、输入法注入等等。
️ 远程线程注入步骤
1️⃣ Dll部分
新建动态链接库工程,在DLL_PROCESS_ATTACH写你想干事情的代码。
2️⃣ 注入工程部分
1、获取注入进程的句柄(OpenProcess/CreateProcess)
2、由于远程线程注入需要被注入线程的东西,调用LoadLibrary需要路径,需要分配内存,故调用VirtualAllocEx让注入进程获取一段内存,用来写字符串
3、用WriteProcessMemory往分配好的内存写路径字符串
4、获取Kernel32.dll的地址,每一个Kernel32.dll在进程的地址都是一样的,所以获取自己的就行了。
5、从获取的Kernel32.dll的地址得到LoadLibraryA的地址。
5、代码想执行,必须有线程,开一个远程线程,由于线程函数与LoadLibraryA的参数性质和个数是一样的,故可把LoadLibraryA当线程进行创建。
6、远程线程注入完毕,如果程序没有对抗措施就成功了
️ 模块隐藏之断链(只能搞定3环)
1、 TEB(Thread Environment Block ),它记录的相关线程的信息,每一个线程都有自己的TEB,FS:[0]即是当前线程的TEB。
mov eax,fs:[0]
2、 PEB(Process Environment Block,进程环境块)存放进程信息,每个进程都有自己的PEB信息,TEB偏移Ox30即当前进程的PEB。
mov eax,fs:[0x30]
mov PEB,eax
3、TEB与PEB都在用户空间(3环)
️ 模块是永远不可能真正隐藏的,就算断链、写驱动抹去0环的VAD树的模块名、抹去内存的PE指纹,重写3环的LoadLibrary,但真正函数实现在0环,0环是不能重写的,比你强的人还是能监控到。
️ 注入代码的注意事项
下面的注意事项由于会用到地址,拷贝的时候注意修改
1、全局变量
2、常量字符串
3、系统调用
4、调用其他函数
️ 注入代码步骤
1、用结构体打包需要拷贝到注入进程需要的数据
2、写一个注入进程需要的线程函数
3、获取进程句柄
4、给注入进程分配好需要的内存,并给结构体赋值
5、修正进程地址(因为增量链接的原因,直接拷贝只有一个jmp,jmp后的地址才是真地址)
6、拷贝线程代码(硬编码)和结构体
7、创建远程线
️ ShellCode
不依赖环境,放到任何地方都可以执行的机器码。
️ IAT Hook
每个程序都会有一个IAT表,当程序启动后,IAT表将填入函数地址,若修改里面的函数地址,指向自己函数的地址,每当程序调用该函数时,都会走自己的函数。
️ 操作流程
1、利用PE结构搜索要Hook的函数地址
2、设置页属性(VirtualProtect)为可读写,如果直接写程序会崩溃
3、修改,备份(如果恢复需要)
4、恢复页属性
️ 缺点
1、容易被检测到
2、只能Hook IAT表里的函数
️ 虚表Hook
一个类如果有虚函数,编译器会给其构建一个表,称之为虚表
找到需要修改的虚函数地址,修改虚表中的函数地址即可。
️ 保存寄存器
操作Hook准备:pushad/pushfd
恢复:popad/popfd
️ InlineHook(dll注入)
裸函数不能直接使用局部变量
1、找到要Hook的地址,覆盖jmp到你操作的函数地址,用Call可以干掉检测E9的一些人。
2、注意Hook用的函数设置为_declspec(naked),否则无法正确读取参数。也要注意保护寄存器。
3、注意跳回原函数
羽夏笔记——Hook攻防基础的更多相关文章
- 羽夏笔记——PE结构(不包含.Net)
写在前面 本笔记是由本人独自整理出来的,图片来源于网络.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇文章有帮助你 ...
- 羽夏笔记——Win32(非WinAPI)
写在前面 本笔记是由本人独自整理出来的,图片来源于网络.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇文章有帮助你 ...
- 羽夏笔记—— AT&T 与 GCC
写在前面 本文是本人根据<AT&T 汇编语言与 GCC 内嵌汇编简介>进一步整理,修改了一些错误,并删除我并不能复现代码相关的部分.该文章一是我对 AT&T 的学习记录 ...
- 羽夏逆向指引—— Hook
写在前面 此系列是本人一个字一个字码出来的,包括示例和实验截图.可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易,如果本篇文章有帮助你的, ...
- 羽夏看Linux内核——引导启动(下)
写在前面 此系列是本人一个字一个字码出来的,包括示例和实验截图.如有好的建议,欢迎反馈.码字不易,如果本篇文章有帮助你的,如有闲钱,可以打赏支持我的创作.如想转载,请把我的转载信息附在文章后面,并 ...
- 羽夏看Win系统内核——系统调用篇
写在前面 此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...
- (二)羽夏看C语言——容器
写在前面 由于此系列是本人一个字一个字码出来的,包括示例和实验截图.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇 ...
- (一)羽夏看C语言——简述
"羽夏看C语言"介绍什么 本系列从汇编的角度,比较翔实的介绍C语言.C++和C其实是一样的东西,C++的编译器只是更强大,更能帮助我们写代码,例如模板.没有特殊说明,本系列不会 ...
- 羽夏看Win系统内核——简述
写在前面 此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...
随机推荐
- [LeetCode]1.Two Sum 两数之和(Java)
原题地址:two-sum 题目描述: 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标. 你可以假设每 ...
- DBLink的使用(从A库使用SQL查询B库的数据)
DBLink的使用 情景:今天我需要从A数据库查询B数据库的数据,进行一些数据比对和联合查询的操作. 所以用到的DBLink,在此记录一下使用流程,希望能够帮助下一个小白,一步到位的解决问题. 一句话 ...
- [LeetCode]1528. 重新排列字符串
给你一个字符串 s 和一个 长度相同 的整数数组 indices . 请你重新排列字符串 s ,其中第 i 个字符需要移动到 indices[i] 指示的位置. 返回重新排列后的字符串. 示例 1: ...
- QT通过静态库调用Go
## 编写Go代码 package main import( "fmt" "C" ) //export test func test(str *C.char) ...
- Python3+PyMysql
原文地址(持续更新ing-):https://www.caituotuo.top/6bf90683.html 1. 安装PyMySQL pip3 install PyMySQL 2. 创建数据库 # ...
- 如何使用 Rancher Desktop 访问 Traefik Proxy 仪表板
Adrian Goins 最近举办了关于如何使用 K3s 和 Traefik 保护和控制边缘的 Kubernetes 大师班,演示了如何访问 K3s 的 Traefik Proxy 仪表板,可以通过以 ...
- [题解]Codeforces Round #254 (Div. 2) B - DZY Loves Chemistry
链接:http://codeforces.com/contest/445/problem/B 描述:n种药品,m个反应关系,按照一定顺序放进试管中.如果当前放入的药品与试管中的药品要反应,危险系数变为 ...
- 金融行业BI可视化报表,直观体验数据的价值
现在,数据已成为非常重要的资产.之前,人们只是把它当作一种附属品,由客户来办理业务,在系统中产生了这样的附属品.但如今,发现在客户办理业务这一信息中,蕴藏着一些客户的需求,积聚成千条这种信息,可以洞察 ...
- 报表工具为什么我推荐用Smartbi,数据分析师和初学者都能灵活运用
在很多人入门数据分析师或者投身大数据行业的时候,肯定会接触到报表工具,很多人这时候就会去使用一些Excel插件的报表工具,但是很多报表工具都是需要下载一系列的软件,配置各种复杂的环境.尤其是一些数据分 ...
- 自助BI工具:Tableau和Smartbi的对比(下)
上一篇我们已经将Tableau和Smartbi的自助功能分析了一部分,本文已3个重要的因素进行对比.分别从数据处理.数据可视化以及性价比方面进行分析.我们一起来看看这两个平台是各方面怎么样,帮助大家挑 ...