写在前面

  本笔记是由本人独自整理出来的,图片来源于网络。本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正。 如有好的建议,欢迎反馈。码字不易,如果本篇文章有帮助你的,如有闲钱,可以打赏支持我的创作。如想转载,请把我的转载信息附在文章后面,并声明我的个人信息和本人博客地址即可,但必须事先通知我

本篇文章主要是让读者对Hook有一个最基础的了解,并不是详细介绍Hook的使用,如果有这个想法的请不要继续阅读,以免浪费时间。

️ 静态链接库的使用

1、将生成的.h与.lib文件复制到项目根目录,然后在代码中引用:

#include "xxxx.h"
#pragma comment(lib, "xxxx.lib")

2、将xxxx.Hxxxx.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攻防基础的更多相关文章

  1. 羽夏笔记——PE结构(不包含.Net)

    写在前面   本笔记是由本人独自整理出来的,图片来源于网络.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇文章有帮助你 ...

  2. 羽夏笔记——Win32(非WinAPI)

    写在前面   本笔记是由本人独自整理出来的,图片来源于网络.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇文章有帮助你 ...

  3. 羽夏笔记—— AT&T 与 GCC

    写在前面   本文是本人根据<AT&T 汇编语言与 GCC 内嵌汇编简介>进一步整理,修改了一些错误,并删除我并不能复现代码相关的部分.该文章一是我对 AT&T 的学习记录 ...

  4. 羽夏逆向指引—— Hook

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易,如果本篇文章有帮助你的, ...

  5. 羽夏看Linux内核——引导启动(下)

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.如有好的建议,欢迎反馈.码字不易,如果本篇文章有帮助你的,如有闲钱,可以打赏支持我的创作.如想转载,请把我的转载信息附在文章后面,并 ...

  6. 羽夏看Win系统内核——系统调用篇

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...

  7. (二)羽夏看C语言——容器

    写在前面   由于此系列是本人一个字一个字码出来的,包括示例和实验截图.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇 ...

  8. (一)羽夏看C语言——简述

    "羽夏看C语言"介绍什么   本系列从汇编的角度,比较翔实的介绍C语言.C++和C其实是一样的东西,C++的编译器只是更强大,更能帮助我们写代码,例如模板.没有特殊说明,本系列不会 ...

  9. 羽夏看Win系统内核——简述

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...

随机推荐

  1. Solution -「JOISC 2019」「LOJ #3036」指定城市

    \(\mathcal{Description}\)   Link.   给定一棵含 \(n\) 个结点的树,双向边权不相同.\(q\) 次询问,每次询问在树上标记 \(e\) 个点,标记的价值为所有趋 ...

  2. Java架构师必备技能:docker使用大全

    前言   java工程师成长为架构师是一个艰难且耗费心力的过程,不仅仅需要熟悉java体系内相关的技术,同时要掌握许多运维相关的操作技能,随着k8s逐渐成为微服务持续集成开发难以越过的基础设施之后,d ...

  3. zabbix-agentd;客户端开启多个端口。

    学习标杆:https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/8/html/configuring_basic ...

  4. 简述对CT,IT,ICT,OT的认识

    今天碰到一个关键词:CT.CT领域,所以给自己做一个科普. 网络:简述对CT,IT,ICT,OT的认识 一.通信技术-CT(Communication Technology) 最早的CT业被称为电信业 ...

  5. 苹果如何控制android手机,安卓手机怎么控制苹果?

    小编经常通过手机远程控制别人手机,帮助他人解决一些电脑问题,另外还经常需要通过远程电脑控制服务器,管理脚本之家的服务器等等,可能这些对大家都没有什么诱惑,今天笔者为大家带来一个非常有趣的手机控制电脑的 ...

  6. UML 包图 详细介绍

      6.1 包图的概念 包是一种常规用途的组合机制.UML中的一个包直接对应于Java中的一个包,C#中的命名空间.在Java中,一个包可能含有其他包.类或者同时含有这两者.进行建模时,通常使用逻辑性 ...

  7. 60天shell脚本计划-11/12-渐入佳境

    --作者:飞翔的小胖猪 --创建时间:2021年3月18日 --修改时间:2021年3月22日 说明 每日上传更新一个shell脚本,周期为60天.如有需求的读者可根据自己实际情况选用合适的脚本,也可 ...

  8. 60天shell脚本计划-1/12-渐入佳境

    --作者:飞翔的小胖猪 --创建时间:2021年1月27日 --修改时间:2021年2月1日 说明 每日上传更新一个shell脚本,周期为60天.如有需求的读者可根据自己实际情况选用合适的脚本,也可在 ...

  9. _IO_2_1_stdin_ 任意写及对 _IO_2_1_stdout_ 任意读的补充

    之前写过一篇 IO_FILE--leak 任意读,但是在学习的时候偷懒了,没有深入去看,这次碰到 winmt 师傅出的题,就傻眼了,故再写一篇博客来记录一下. 例题 ctfshow Incomplet ...

  10. Python:绘图添加中文标题

    (20条消息) Python绘图如何显示中文标题_wulei_1107103372的博客-CSDN博客_python画图中文标题 plt.rcParams['font.sans-serif'] = [ ...