4.13(LoadLibrary)

news2024/11/27 22:26:58

接着之前预习的知识,我观察的自己编译出来的bin

LoadLibraryExA

LoadLibraryExA函数进去,现时用RtInitAnsiString函数初始化了ANSI的计数字符串,底层是调用了LoadLibraryExW函数,在LoadLibrarExW函数里做了unicode的计数字符串的初始化,这里过后主要看都了路径(path)函数,我看了LoadLibrarExW底层一路到LoadDL函数,没看懂,然后一路跳出来,最后就是释放最开始的字符串的函数了
在这里插入图片描述RtlAnsistringTounicodestring
RtlInitansistringEx
LdrGetolIPath
LdrLoadDLL
RtIfreeUnicodestring
RtlReleasePath

GetProcAdderss

GetProcAdderss用的底层函数GetProcAddressforcaller,同样内部也是做计数字符串的初始化,然后底层函数是LdrGetProcedureAddressForCaller,进入这个函数又看到了RtlAcquireSRWLockExclusive函数,这个函数进行读写,应该是获取地址,这里没有跟进去,后面跳出来了RtIReleasesRhLockExcIusive又做了释放,奇怪的是释放后又再次掉用了RtIAcqurieRhLockExcIusive,大致是这样
在这里插入图片描述

讲解

在学长的电脑上看到的

RtlpImageNtHeader

RtlImageDirectoryEntryToData

LdrLoadDll

LdrpCreateDllSection

ZwMapViewOfSection

NtUnmapViewOfSection

LdrpAllocateDataTableEntry

LdrpFetchAddressOfEntryPoint

ZwProtectVirtualMemory

DecodeSystemPointer

EncodeSystemPointer
其实LoadLibrary 核心流程其实是:把一个DLL 拷贝到内存,然后解析DLL PE结构中的导入表,把该DLL 所需要的DLL模块,都加载到内存,然后处理导入函数从stub到真正函数指针的过程,所有函数指针处理完之后,就可以返回了

RtlpImageNtHeader、RtlImageDirectoryEntryToData 这两个函数操作,PE结构,获取PE头,获取导入表项的
加载DLL 的时候,首先从文件到内存,那么既然需要找文件,就会有很多默认的路径,去搜索并打开文件
打开文件,读取到内存之后,就需要把DLL 模块内容,映射到进程内存中
ZwMapViewOfSection 映射
NtUnmapViewOfSection 解除映射
DLL 装入内存后,DLL内存区域的不同的节,用途不同,所以内存赋予的内存属性也不一样
和之前我们学过的,内存申请函数VirtualAlloc 的参数中提到一样,最常用的读 写 执行
一般存数据的是只读,代码节,必须得赋予可执行属性内存,才能最后跑起来
ZwProtectVirtualMemory 这个函数就可以修改内存的属性,其顶层函数是VirtuallProtect(应该是这个)

那么有一个问题:如果每次加载一个动态链接库,到同一个地址上,是不是使用GetProcAddress 获取同一个函数的指针地址值是相同的?

答案是显而易见的,相同的

如果每次基址都一样,硬编码地址值之后,就能直接这个函数了,这个就涉及到一个安全问题,一段注入EXE的SHELLCODE,能很简单获取到系统接口地址,是不是就能很容易的搞事情了

PIE(要记得,学安全技术,一定要懂得这个东西产生的背景)在这里插入图片描述

也叫漏洞利用缓解及对抗技术ALSR ,ALSR地址空间布局随机化
不过,PE结构上有个项,可以关闭这个地址空间布局随机化,所有SHELLCODE 加载之后,第一件事,就是去找所用函数的指针,没有例外
所以在获取函数指针的途径上,一定会有各种技术,来提高这个操作的门槛
还有就是刚才提到的两个函数,在比较新的windows上才有: EncodePointer/DecodePointer,
在传递函数指针的过程中,对指针值,进行编码解密的一个处理
ALSR 开启后,每次加载的DLL基址,都会不同所以做DLL函数HOOK ,或者是捞函数指针,就不太容易了
在很早以前,那种恶意代码中,经常发现硬编码的函数指针
就是利用基址,重复的特性
目前shellcode 做法,就是寻找,进程的DLL保存指针,获取到kernel32的基址,之后,自己遍历PE结构,获取函数指针
进程空间中,也存在,一种监控程序的HOOK,IAT HOOK,通过在PE加载时,把PE导入表函数地址改了,先走监控函数,再走系统函数来达到监控的目的
杀软的HOOk,是做在内核层的,而且WINDOWS 是不希望第三方程序去监控系统底层接口的
只不过,现在搞内核钩子的难度比较大而已
而且稳定性,这块很考验功夫的
IAT钩子,最致命的一点,就是仅仅在加载时做完操作了
所以对抗手法就是,病毒实现把原始函数的入口点若干字节,crc 存好,用之前先匹配crc,crc不对,直接退
还有一种对抗手法,就是单独复制一份DLL到内存,用自己复制这份DLL的代码
不是用LoadLibrary 加载,而是自定义的加载函数
其实,知道懂得原理,就能写出来 链接:
https://www.cnblogs.com/StudyCat/p/16001615.html
(链接帖子里面的信息一定要认知看)
PE内存加载,内存执行SHELLCODE,目前已经是恶意代码用得最多的方式
传统的安全软件,大多是基于文件的
而且,内存不好搞监控
搞PE,动态加载,就绕不开PE结构
有种极限方法,是把函数头搞出来,然后改汇编跳到,HOOK之后,的DLL代码上
只要能绕过HOOK代码就行
什么是HOOK?
https://blog.csdn.net/qq_36381855/article/details/79962673
说白了,HOOK对抗,比的就是谁更猥琐
对于汇编代码修改,这块,安全技术上,对抗手法,就是局部代码crc校验
英雄联盟用的TP ,里面全是好几个线程,校验关键crc
就是不停的去读取那块代码,然后算CRC,CRC校验失败,直接下狠手
本课的另一个函数,GetProcAddress ,其实就是PE结构的导出表的结构的解析
RtlAcquireSRWLockExclusive 这个是一个同步手段
类似自旋锁的东西
如果需要访问需要遵循读写分离的内存区域时,就需要用到
拿锁,之后,非该线程的代码时不允许访问目标块的
只有拿锁的,释放锁之后,才能访问LdrGetProcedureAddress

这节课的知识点,关联的几个好玩的编码项目:PE内存加载,进程hollow 技术https://jev0n.com/2020/03/11/65.html
虽然这个IATHook 技术很老,但是也要看用的地方
进程hollow 简单点,就是把当前进程代码挖空,给进程换代码
卸载当前进程的代码块,就用NtUnmapViewOfSection
必须对PE结构熟悉,才能搞
https://zhuanlan.zhihu.com/p/30990104?from_voters_page=true

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

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

相关文章

分子生物学 第三章 基因、基因组及基因组学

文章目录第三章 基因、基因组及基因组学第一节 基因1 基因认识的三个阶段2 基因的特征(1)跳跃基因(2)断裂基因3 基因的分类4 基因的结构5 基因的大小6 基因的数目第二节 基因组1 基因组的概念2 噬菌体基因组3 细菌基因组以大肠杆菌(原核生物的代表)为研究对象4 酵母基因组以酵母…

Python之拯救Xubuntu22.04误删/usr/bin/python3.10(二十二)

0.首先删除/usr/bin/python3.10,会导致以下错误: <1>.报错1: ModuleNotFoundError: No module named ‘apt_pkg’ <2>.报错2: bash: /usr/lib/command-not-found: /usr/bin/python3: 解释器错误: 没有那个文件或目录 <3>.报错3: 通过亲身操作,以下步骤可…

【Linux】来写一个tcp的服务端+客户端

本文首发于 慕雪的寒舍 今天让我们来写一个tcp的服务器/客户端代码。 完整代码见我的gitee 链接 阅读本文前&#xff0c;建议先阅读&#x1f449; udp服务器 由于本文采用自建图床&#xff0c;CSDN可能因带宽不够&#xff0c;出现外链图片缓存失败。 1.基本框架 tcp的服务器…

walt 调度算法

Walt 算法 WALT负载统计原理_walt算法_森森浅浅笙笙的博客-CSDN博客 CPU负载均衡之WALT学习【转】_mb5fdcad0be2e90的技术博客_51CTO博客 1、A task’s demand is the maximum of its contribution to the most recently completed window and its average demand over the p…

webgl-attribute、uniform、varying三者的区别

通用js: let canvas document.getElementById(webgl) canvas.width window.innerWidth canvas.height window.innerHeight let ctx canvas.getContext(webgl) attribute&#xff1a; 范围: 只适用于vertexShader&#xff0c;将js代码中的数据传递给vertexShader。 使用方…

知识图谱扩充|蜕变测试|蜕变关系

目录 前言&#xff1a;概念定义 什么是蜕变测试&#xff1f; 那么&#xff0c;怎么进行蜕变测试呢&#xff1f; 1. 生成蜕变关系 a 等价关系 b 混排关系 c 交集关系 d 并集关系 2. 生成蜕变用例 3. 执行蜕变用例 4. 校验蜕变关系 学术报告 一、蜕变测试MT 二、蜕变…

【id:32】【20分】B. Date(类与构造)

题目描述 下面是一个日期类的定义&#xff0c;请在类外实现其所有的方法&#xff0c;并在主函数中生成对象测试之。 注意&#xff0c;在判断明天日期时&#xff0c;要加入跨月、跨年、闰年的判断 例如9.月30日的明天是10月1日&#xff0c;12月31日的明天是第二年的1月1日 2月…

vue2路由(下)

编程式路由导航 通过点击按钮实现push和replace俩种模式的跳转 实现&#xff1a;就是通过$router原型里面的方法 也能实现路由的跳转和后退&#xff0c;分别采用的是$router里面的black和forward方法 感觉就是BOM对象中的history对象里面的方法 正是前进&#xff0c;后是后…

快鲸scrm | 三个步骤,快速打造企业长效私域营销阵地

快鲸scrm对企业微信私域流量玩法进行系统梳理&#xff0c;把企业微信用户运营拆解为“获客”、“转化”和“服务”这三个关键步骤&#xff0c;从点到面&#xff0c;为企业私域运营提供可行性的解决方案。 一、构建私域流量管理机制 用户是企业发展的基础&#xff0c;用户增长对…

三电技术之电控技术

三电技术之电控技术 1 基本功能 整车控制系统能够实现对汽车动力、舒适度、安全性以及能耗等多方面进行调整优化&#xff0c;配合大数据让电动汽车拥有更好的操作性和可靠性&#xff0c;具体来讲整车控制器对电动汽车主要有以下功能&#xff1a; 数据交互管理&#xff1a;整…

mybatis-plus-join MPJ连表查询 这样写太香了!

mybatis-plus作为mybatis的增强工具&#xff0c;它的出现极大的简化了开发中的数据库操作&#xff0c;但是长久以来&#xff0c;它的联表查询能力一直被大家所诟病。一旦遇到left join或right join的左右连接&#xff0c;你还是得老老实实的打开xml文件&#xff0c;手写上一大段…

【unity实战】用对象池设计制作Dash冲锋残影的效果

什么是对象池? 在Unity中,对象池是一种重复使用游戏对象的技术。使用对象池的好处是可以减少游戏对象的创建和销毁,从而提高游戏的性能。如果不使用对象池,每次需要创建游戏对象时,都需要调用Unity的Instantiate函数,这会导致内存分配和垃圾回收的开销。而使用对象池,可…

李宏毅 深度学习【持续更新】

目录pytorch快速入门csdn快速入门OS包PIL包Opencv包Dataset类Tensorboard的使用torchvision.transforms 的使用torchvision中数据集的使用DataLoader的使用(torch.utils.data)神经网络的搭建nn.Module深度学习 李宏毅Chatgpt1 研究方向2 Chatgpt学习的步骤3 Fine tune vs. Prom…

【Linux内网穿透】使用SFTP工具快速实现内网穿透

文章目录内网穿透简介1. 查看地址2.局域网测试连接3.创建tcp隧道3.1. 安装cpolar4.远程访问5.固定TCP地址内网穿透简介 是一种通过公网将内网服务暴露出来的技术&#xff0c;可以使得内网服务可以被外网访问。以下是内网穿透的一些应用&#xff1a; 远程控制&#xff1a;通过内…

九【springboot】

Springboot一 Spring Boot是什么二 SpringBoot的特点1.独立运行的spring项目三 配置开发环境四 配置开发环境五 创建 Spring Boot 项目1.在 IntelliJ IDEA 欢迎页面左侧选择 Project &#xff0c;然后在右侧选择 New Project&#xff0c;如下图2.在新建工程界面左侧&#xff0c…

深入理解PyTorch中的train()、eval()和no_grad()

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️&#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

【数据结构】栈的实现

&#x1f61b;作者&#xff1a;日出等日落 &#x1f4d8; 专栏&#xff1a;数据结构 &#x1f339; 如果说&#xff0c;读书是在奠定人生的基石&#xff0c;在梳理人生的羽毛&#xff0c;那么&#xff0c;实践&#xff0c;就是在构建人生的厅堂&#xff0c;历练人生的翅膀。是不…

阿里P7晒工资条,看完好扎心了……

前几天&#xff0c;有位老粉私信我&#xff0c;说看到某95后学弟晒出阿里P7的工资单&#xff0c;他是真酸了…想狠补下技术&#xff0c;努力冲一把大厂。 为了帮到他&#xff0c;也为了大家能在最短的时间内做面试复习&#xff0c;我把软件测试面试系列都汇总在这一篇文章了。 …

自然语言处理: 知识图谱的十年

动动发财的小手&#xff0c;点个赞吧&#xff01; NLP 中结合结构化和非结构化知识的研究概况 自 2012 年谷歌推出知识图谱 (KG) 以来&#xff0c;知识图谱 (KGs) 在学术界和工业界都引起了广泛关注 (Singhal, 2012)。作为实体之间语义关系的表示&#xff0c;知识图谱已被证明与…

ECharts 横向柱状图自动滚动

核心代码 const seriesList [120, 200, 150, 80, 70, 110, 130, 120, 200, 150, 120, 200]; const xAxisList [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]; const dataZoomEndValue 6; // 数据窗口范围的结束数值(一次性展示几个) dataZoom: [{show: false, // 是否显示滑动…