《加密与解密 》第四版读书笔记2

news2024/12/26 23:36:40
1、注入技术
1.1注入技术的背景

        在Windows操作系统中,各个进程的内存空间是相互独立的,虽然能通过函数VirtualQueryEx/VirtualProtectEx查询、设置目标进程的内存信息和页属性,通过函数ReadProcessMemory/WriteProcessMemory对目标进程的内存空间进行读写,但是这样操作繁琐(例如获取一个二级指针的内容就需要2次跨进程读内存),更重要的是不能跨进程执行自己的代码。因此使用DLL注入目标进程再执行相关的操作是优先使用的一种手段,不仅避免了快进场操作带来的繁琐过程及安全限制上的问题,更重要的是能够直接执行我们的代码,从而更方便的执行Hook、Patch操作等。通常情况下,程序加载DLL的时机主要有以下3个:1)进程创建阶段加载导入表中的DLL,俗称“静态输入”;2)通过调用LoadLibrary(Ex)主动加载,称为动态加载;3)由于系统机制的要求,必须加载系统预设的一些基础服务模块(如shell扩展模块、网络服务接口模块或者输入法模块等);

1.2DLL注入方法

        1.2.1、改变程序运行流程使其主动加载目标DLL

        程序运行的容器是进程,真正的活动是进程中的线程。因此改变程序流程的通常做法是改变线程EIP、创建新线程或修改目标进程内的某些代码,使其执行LoadLibrary(Ex)来加载目标DLL

       1、CreateRemoteThread法:其基本思路是在目标进程中申请一块内存并向其中写入DLL路径,然后调用CreateRemoteThread函数在目标进程中创建一个线程,线程函数的地址就是LoadLibraryA(W),参数就是存放DLL的内存指针。之所以把LoadLibraryA(W)作为线程函数,是因为它刚好只有一个参数。

        2、RtlCreateUserThread法:RtCreateUserThread函数是Rtl执行体的一部分,与CreateRemoteThread类似,最终都要调用NtCreateThreadEx来创建线程实体。但是它一般只用来创建一些特殊的线程。此法暂时不熟悉,待熟悉后再回来填这个坑。

        3、QueueUserApc/NtQueueAPCThread注入法:APC是异步过程调用的缩写,它是一种软中断机制,当一个线程从等待状态(线程调用SleepEx、SignalObjectAndWait、MsgWaitForMultiple、ObjectsEx、WaitForMultipleObjectsEx、WaitForSingleObjectEx函数时会进入可唤醒状态)中苏醒时,它会检测有没有APC交付给自己,如果有它就会执行这些APC过程。APC有两种形式:由系统产生的APC称为内核APC,由应用程序产生的APC称为用户模式APC。在用户层,我们可以像创建远线程一样,利用QueueUserApc把过程添加到目标线程的APC队列里面,等这个线程恢复运行时,就会执行我们插入的APC过程了。在用户模式添加APC之后,线程不会直接调用APC函数,只有当线程被唤醒时才会调用。

        4、SetThreadContext法:正在执行的线程可以被SuspendThread函数暂停执行,然后系统就会把此时线程的上下文环境保存下来。当使用ResumeThread恢复线程的执行时,系统就会把之前保存的上下文环境回复使线程从之前保存的eip开始执行。在注入DLL时,可以将目标进程中的线程暂停,然后向其写入shellcode,把线程的CONTEXT的eip设置为Shellcode的地址,这样线程恢复时就会先执行我们的shellcode了。在shellcode中加载目标DLL,然后再跳回原始的eip执行。对于原来的线程而言,好像什么都没发生一样。

        1.2.2、利用系统机制加载DLL

        操作系统提供的某些系统机制是依赖一些基础服务模块(可能是操作系统提供也可能是第三方提供的)实现,当进程主动或者被动触发了这些系统机制时,就会在适当的时候主动加载这些模块。因此,可以制定一个符合该规范的DLL,将其注册为系统服务模块,这样就可以合法的进入目标进程了。

        1、SetWindowHookEx消息钩子注入:消息钩子是Windows提供的一种消息过滤和预处理机制,可以通过API SetWindowHookEx安装一个用于过滤特定类型消息的钩子函数。

        2、输入法注入:输入法是一类特殊的程序,一般有外挂式和输入法接口式IME两种实现形式。外挂式注入比较简单,它通常是一个exe文件,通过模拟一些Windows输入消息向当前处于活动状态的编辑窗口输入文字,一个显著的优点是输入法只要启动,就可以在所有进程中使用。但是其缺点包括实现困难、兼容性差。IME实际上是一个符合Windows平台输入法接口规范的DLL,Windows为这个DLL定义了一系列标准接口。

2、Hook技术

        Hook中文译为挂钩或者钩子其关键就是通过一定的手段埋下钩子,钩住我们关心的重要流程,然后对执行过程进行干预。“插入特定代码以干预程序的执行流程”就是Hook的奥义。从流程上看,原来的直接调用过程被修改后绕了个弯,经过我们自定义的处理过程才达到真正的目标函数处,因此这一过程也称为“Detour”。插入的这个与函数接口完全相同的函数称为Detour函数。Hook分为两类:一类是通过修改数据(通常是引用的函数地址)进行hook,另一类则直接修改函数内的指令进行hook。类似于C语言中的指针,第一种hook是修改指针的指向,第二种hook直接是修改指针指向的内容的值。各种名目繁多的hook,总结起来其实就只有两种,Address Hook和Inline Hook。

        2.1、Address Hook

        是指通过修改数据进行hook的方法。当然并非随意修改“数据”都可以达到hook的目的。此处的“数据”通常是指一些函数的地址(也可能是偏移量),这就是称其为“Address Hook”的原因。它们通常存放在各类表或者结构中或者某个指定的地址处,亦或特定的寄存器,它们有一个共同点就是在某个时刻会成为程序执行过程中的eip。只要把这些地址替换成我们的Detour函数地址,就可以轻松拿到程序的控制权了。

        2.1.1 PE中的IAT hook:IAT hook具体指某个模块的IAT,所以它的作用范围只针对被Hook的模块,且必须在以静态链接的方式调用API时才生效,使用LoadLibrary或者GetProcAddress进行动态调用时无效(在其他模块调用被hook的API时也没有影响)。

        2.1.2 PE中的EAT:EAT输出表与IAT不同,它存放的不是函数地址,而是函数地址的偏移,使用时需要加上模块基址。所以在进行hook的时候,也要用Detour函数的地址减去被hook模块的基址。在hook之后,所有试图通过输出表获取函数地址的行为都会受到影响(主程序及其导入表中所有模块的IAT在程序初始化时就已经被填充了,因此,之后通过IAT进行调用不受EAT hook的影响)。

        2.1.3 IDT:系统的中断描述符表IDT是操作系统在处理中断机制时使用的一张表,当中断发生时,操作系统通过IDT查询中断的处理函数。IDT的表基址存放在idtr寄存器中,表内项目数存放在idtl中,每个中断项的中断处理函数(或者叫中断处理例程)称为ISR。

        2.2、Inline Hook

        Inline hook是指直接修改指令的hook,与Address hook相比更容易理解,也没有那么多形式。因此其关键是转移程序的执行流程,所以一般使用jmp、call、retn之类的转移指令,主要包括以下几种形式:1)jmp xxxx (5字节),直接跳转到某地址;2)push xxxx/retn (6字节),通过压栈返回实现跳转;3)mov eax, xxxxxx/jmp eax(7字节),先将转移地址放入寄存器,再实现跳转,之所以使用eax来临时保存转移地址,是因为eax寄存器通常用于保存函数的返回值,在函数入口处修改它不会影响函数的执行结果;4)call hook(更换指令或者输入表);50HotPatch Hook,一个短跳加一个长跳,暂时不熟悉。

3、堆栈溢出
        3.1、栈溢出的原理

        栈是向低地址方向生长的,而变量在栈中是向高地址方向生长的,因此,当栈里面的变量被赋予的值超过其最大缓冲区的大小时,就会覆盖前面push到栈里面的返回地址,导致函数在返回时发生错误,这就是栈溢出。如下图所示,栈变量按照生命先后顺序逐渐从高地址向低地址扩展(图中变量a、b、c的相对地址),但是数组的地址却是相反的,数组是按照低地址向高地址扩展的,即数组中索引大的元素位于高地址(更接近于栈帧基址ebp),索引越小的元素位于低地址(离栈帧基址ebp越远),如果向数组写入超过数组长度的内容,则会导致数组之前的变量甚至函数返回地址被覆盖掉。

4、shellcode

        shellcode实际上是一段可以独立执行的代码(也可以认为是一段填充数据),在触发了缓冲区溢出漏洞并获取eip指针的控制权后,通常会将eip指针指向Shellcode以完成漏洞利用过程。Shellcode的工作流程如下图:

        Shellcode在漏洞样本中的存在形式一般为一段可以自主运行的汇编代码,它不依赖于任何编译环境,也不能调用API函数名来实现功能,它只能通过主动查找DLL基址并获取API地址的方式来实现API调用,然后根据功能调用相应的API函数来完成其自身的功能,Shellcode一般分为两个模块:基本模块和功能模块,如下图所示:

        基本模块用于实现shellcode初始运行、获取kernel基址以及获取API地址的过程。获取kernel基址的常见方法包括暴力搜索、异常处理链表搜索和TEB搜索。TEB查找的原理如下:在NT内核系统中,fs寄存器指向TEB结构。TEB+0x30指向PEB结构,PEB+0xc指向PEB_LDR_DATA结构,PEB_LDR_DATA+0x1c处存放着程序加载的动态库链接地址,第1个指向ntdll.dll,第2个就是Kernel32.dll的基址,如下图所示:

        从DLL文件中获取API地址的方法如下:1)在DLL基址+0x3c处获得e_lfname的地址,即可获得PE文件头;2)在PE文件头0x78偏移处得到函数导出表的地址;3)在导出表的0x1c偏移处获得AddressOfFunctions的地址,在导出表的0x20偏移处获得AddressOfNames的地址,在导出表0x24处获得AddressOfNameOrdinalse的地址;4)AddressOfFunctions函数地址数组和AddressOfNames函数名数组通过AddressOfNameOrdinalse一一对应。

        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1995597.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第八天 排行榜功能

排行榜分析: 榜单分为两类: 实时榜单:也就是本赛季的榜单 历史榜单:也就是历史赛季的榜单 之前一个积分记录明细表 要知道,每个用户都可能会有数十甚至上百条积分记录,当用户规模达到百万规模&#xff…

C#调用c++的dll方法,动态调用c++dll的方法

文章目录 一、创建c的dll1.新建项目2.删除vs自建的.cpp和.h文件3.新建Algorithm.h和Algorithm.cpp4.编译c1.编译2.解决报错3.再次编译可以看到已经成功。4.查看成功输出的dll。 二、创建c#项目1.创建一个console控制台程序。2.把dll拷贝到c#生成的程序根目录。3.在c#的program.…

WPF自定义控件的应用(DynamicResource的使用方法)

1 DynamicResource的使用方法 可以在字典文件 的抬头区写入数&#xff1a; <SolidColorBrush x:Key"PrimaryBackgroundColor" Color"#FFABAdB3"/><SolidColorBrush x:Key"TextBox.MouseOver.Border" Color"#FF7EB4EA"/>&l…

得-物任务脚本

得某物任务脚本 该脚本主要用于自动化执行“得物”APP中的一些日常任务和活动&#xff0c;包括签到、任务完成、奖励领取等操作。使用了多个第三方库来加密、签名和发送请求。 任务的定时执行 脚本通过定时任务&#xff08;cron&#xff09;设置在每天的11:10执行。使用的依…

通用人工智能的中国道路

朱松纯 北京大学智能学院院长 北京大学人工智能研究院院长 《为机器立心》、《为人文赋理》 1 什么是“人”——解构人文的认知架构与UV理论 从物体&#xff0c;到生命体、智能体、智人。。。 生命度&#xff08;Animacy&#xff09;&#xff1a;物体与智能体的边界&#xff0…

LLC数字控制TMS320F28034,4-DSP的epwm配置介绍

LLC数字控制TMS320F28034&#xff0c;4-DSP的epwm配置介绍 1 TMS320F280341.1 概述1.2 PWM详细介绍 2 TMS320F28034 PWM功能框图2.1 ePWM功能模块2.2 ePWM功能寄存器框图 3 TMS320F28034 PWM初始化流程4 结合项目设计5 代码设计5.1 PWM初始化程序5.2 工程代码 6 总结 配套代码示…

OpenCV图像滤波(9)getGaussianKernel()函数的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 功能描述 cv::getGaussianKernel() 是 OpenCV 中的一个函数&#xff0c;用于生成一维高斯核。这种核通常用于实现高斯模糊滤波器&#xff0c;该滤波器可以…

系统编程 day6 文件5

今天编写小程序实现minishell&#xff08;简易版文件操作命令函数编写以及实现&#xff09; 编写过程&#xff0c;以及部分代码展示 终端实现minishell部分功能展示

fastadmin 实现标签打印

项目场景如图&#xff0c;需要打印一批条形码或者二维码&#xff0c;除了市面上成熟的标签机之外&#xff0c;今天挑战一下使用普通的打印机不干胶贴纸&#xff0c;实现低成本的标签打印&#xff1b; 项目框架基于 fastadmin&#xff1a; 1、项目对应的js添加打印按钮的事件监…

C语言指针详解-包过系列(二)目录版

C语言指针详解-包过系列&#xff08;二&#xff09;目录版 1、数组名的深入理解1.1、数组名的本质1.2、数组名本质的两个例外1.2.1、sizeof&#xff08;数组名&#xff09;1.2.2、&数组名 2、使用指针访问数组3、一维数组传参本质4、二级指针4.1、二级指针介绍4.2、二级指针…

5个国内大厂的AI写真神器,连影楼老板都在用!看看你用过几个

大家好&#xff0c;我是程序员X小鹿&#xff0c;前互联网大厂程序员&#xff0c;自由职业2年&#xff0c;也一名 AIGC 爱好者&#xff0c;持续分享更多前沿的「AI 工具」和「AI副业玩法」&#xff0c;欢迎一起交流~ 如果你的女朋友再缠着你&#xff0c;要你陪她去拍写真&#x…

kickstart自动脚本制作

克隆7主机&#xff0c;配置网络 安装图形 yum group install "Server with GUI" -y 有的话直接切换 init 5 关闭 Vmware dhcp 安装图形化生成kickstar自动安装脚本的工具 yum install system-config-kickstart -y 配置http 安装 yum install httpd -y 启动服务…

Advanced IP Scanner - 网络扫描工具介绍

Advanced IP Scanner 是一款免费、快速且用户友好的网络扫描工具。它能够帮助用户扫描局域网&#xff08;LAN&#xff09;中的所有设备&#xff0c;提供详细的设备信息&#xff0c;包括IP地址、MAC地址、设备名称和厂商信息。该工具对IT管理员和普通用户都非常有用&#xff0c;…

CMake内置模块

2024年8月9日&#xff0c;周五晚上 很久没写博客了&#xff0c;主要是最近很长一段时间都在备考研究生 简介 CMake附带了一系列内置模块&#xff0c;这些模块提供了许多常用的功能和宏&#xff0c;以帮助用户在构建项目时完成各种任务。 CMake的内置模块有哪些&#xff1f; …

解锁创意之门:如何使用DALL·E-3创作惊艳的图像

在这个视觉驱动的时代&#xff0c;图像已经成为表达创意和传递信息的重要媒介。最近&#xff0c;OpenAI发布了新一代的图像生成模型——DALLE-3&#xff0c;它以其卓越的生成能力和细致的图像质量迅速成为了创意工作者的热门工具。今天&#xff0c;我将带你一步步了解如何使用D…

springboot中小型酒店管理系统02793

摘要 随着互联网和移动技术的快速发展&#xff0c;酒店行业也面临着巨大的变革和机遇。传统的酒店管理方式存在着信息不透明、预订流程繁琐等问题&#xff0c;无法满足现代消费者对便捷、高效、个性化服务的需求。因此&#xff0c;开发中小型酒店管理系统具有重要的意义。本文旨…

[论文阅读]Mobility-Aware Cooperative Caching in VEC Based on CAFR

论文&#xff1a;Mobility-Aware Cooperative Caching in Vehicular Edge Computing Based on Asynchronous Federated and DRL JSTSP 2022 基于异步联邦和深度强化学习的车载边缘计算移动感知协同缓存 一、Introduction background&#xff1a; 随着车联网&#xff08;IoV&…

数据结构--单链

#include "link.h" plink get_head() { plink pmalloc(sizeof(Link)); if(pNULL) { printf("申情节点失败\n"); return NULL; } p->len0; p->nextNULL; return p; } void head_insert(plink L,int a) {…

AI动漫生成工具,文生图转换图生视频功能,低成本使用AI工具做项目。AI工具搭建开发。

目录 前言&#xff1a; 一、AI文生动漫有哪些功能&#xff1f; 二、如何低价使用AI工具&#xff1f; 三、AI工具适合现在做哪些互联网项目&#xff1f; 总结&#xff1a; 前言&#xff1a; AI动漫原理就是通过文字描述来生成图片&#xff0c;然后对文本配上语音和音乐生成…

[极客大挑战 2019]FinalSQL1

打开题目 sql注入&#xff0c;点击1试一下 点击2试一下 点击3试一下 点击4 点击5 id6试一下 感觉是sql盲注了 编写脚本 import requests import string from time import sleep url "http://9da9cb18-3096-413a-9476-8a177ffec31a.node4.buuoj.cn:81/search.php?id0^(…