- 博客(151)
- 资源 (4)
- 收藏
- 关注
原创 linux内核获取未导出函数地址的两种方法
第一种是借助于kprobe机制,通过kprobe机制中会调用kallsyms_lookup_name函数并设置到kprobe结构体中返回的原理找到我们需要的函数地址如上逻辑可以看到其实就是调用的kallsyms_lookup_name函数来获取地址存到我们的addr中。
2024-06-09 13:07:00 299
原创 x64内核实验7-线程
ETHREAD和KPCR都有点大就不全贴出来了只说一些常用的字段,一般熟悉了内核机制的话看名字很多都能猜出来跟之前的进程结构体一样是可等待对象都有的头部结构体KTHREAD + 0x018 VOID* SListFaultAddress 上一次用户模式互锁单链表POP操作发生页面错误的地址。内核栈的原始栈位置(高地址)内核栈低地址内核栈的栈基址内核调用栈开始位置KTHREAD + 0x0C8 INT64 WaitStatus 等待的结果状态。
2023-10-07 20:57:19 1070
原创 x64内核实验6-进程
首先来看一下进程结构体完整的定义,然后我会介绍几个比较重要的字段属性下面是我从pdb文件导出的头文件,这个头文件可以直接复制到ida里导入成结构体使用的,其他结构体的头文件后面我会一起放出来给大家下载EPROCESS.h。
2023-10-07 13:19:40 286
原创 x64内核实验3-页机制的研究(1)
在白皮书的第三卷2.5章对控制寄存器有详细的介绍,下面是白皮书中CR寄存器的结构图(这里要说明一下cr4的第12位是由被使用的这个位在2.5章的后半部分有介绍是控制是否开启5级分页的位否则是四级分页)首先是smep和smap两个位,这部分因为之前的实验会用到所以已经在段机制的部分介绍过了,这里就不再赘述其余一些位置的功能后面用到了会继续介绍,这边有个结构的概念就可以了。
2023-10-05 15:19:54 379
原创 x64内核实验2-段机制的变化
x86下的段描述符结构图如下在x86环境下段描述符主要分为3个部分的内容:base、limit、attribute,而到了64位环境下段的限制越来越少,主要体现在base和limit已经不再使用而是直接置空,也就是默认强制为平坦模式ia-32e模式使用的是64位内核文件,legacy是兼容模式使用的还是32位内核文件,我们这里不关注兼容模式。
2023-10-05 03:14:50 179
原创 反SSDTHOOK的另一种思路-0环实现自己的系统调用
这也就导致了ssdthook可以挡下大部分的api调用,那如果我们进0环走另外一条路线的话不通过ssdt就可以做到规避掉hook而且也很难被人找到。7.恢复到原始的irql,防止后面读取目标进程内存时缺页无法换页上来,此时我们已经挂靠到了目标进程所以即便被线程切换也不会导致cr3被更新回去。驱动的样例代码如下,这里我直接用我前几个博客里用的那个架子来改了代码里也能会有一些用不到的全局变量大家不用管就行。8.读取目标进程的内存将要读取的内容放到0环空间暂存。1.定义读取目标内存的函数。
2023-10-02 14:40:07 335
原创 Windows驱动反调试的一种手段
DebugPort是在用windowsapi调试方式时候所使用的数据结构指针,那么如果我们能够循环清空这个值的话,就可以做到大部分windows调试api都无法正确调试进程。今天要介绍的是eprocess的0xbc位置。
2023-10-01 17:01:50 422
原创 驱动隐藏进程(eprocess断链)
具体的原理就不详细描述了,这种办法是最为基础的隐藏手段而且网上有很多文章,只不过我看了一些大部分都只是直接在driverEntry中写死的那种,所以我简单写了个三环0环交互的驱动代码供大家参考。进程在内核中存在一个双向链表将所有的活动进程串联起来,今天写的就是将我们的目标进程从这个链表中移除以达到隐藏进程的目的。
2023-10-01 16:55:20 996
原创 保护模式阶段测试-模拟3环0环调用
最近又复习了一下保护模式相关的内容,然后打算搞个能够把段页的大部分知识能够串联起来的测试代码。2.申请一个物理页里面填充一个数据结构,此数据结构中存放我们新的中断号。1.插入一个中断门,中断门的函数地址为3环传进来的那个。1.通过设备通信到0环告诉0环我新增加的函数地址。2.通过3环0环共享的数据结构取到新增加的中断号。0.编写一个函数读取高2g的地址内容。3.调用中断号读取高2G地址内容。接收到3环的函数地址。
2023-10-01 03:30:15 594
原创 3环断链以及断链后的检测方法
我们在3环注入代码很多时候会选择注入dll,因为纯粹的硬编码不方便写出大量功能,而且不容易维护所以很多时候我们会通过各种方式让我们的dll注入到目标地址空间中,其中有一些方式可以不需要我们自己对dll处理重定位而是借助pe加载器让系统帮助我们处理重定位,但是就会导致我们的dll会在目标的peb中可见,也就是留下了痕迹。比如说,我不通过模块链表来检测而是直接搜索内存找到有pe指纹的位置然后根据pe结构查看当前的模块名字,不是我自己的那就说明有人注入了模块进来。这时就可以通过3环断链的方式隐藏这一部分痕迹。
2023-09-03 19:13:27 814
原创 硬编码基础三(变长指令的查询方式)
modrm字段的具体信息在白皮书的2.1.5章的2-2表中有详细描述(2-1是16位模式下的这张表)在intel白皮书中的A附录中的A.3章节有一个opcode的map表。modrm的格式是2位的mod 3位的源寄存器 3位的r/m描述。E的意思可以在白皮书的2.1.2章节中找到具体的描述。要说的是当mod=100的时候表明了会跟随sib描述。sib的具体信息在白皮书的2-3的表中存在详细介绍。同理表中的其他写明了寄存器的行也是这样看的。modrm中的rm位决定了是否存在sib。E表示的是寄存器或者内存。
2023-08-21 21:48:29 820
原创 远程线程注入(简单样例以及原理)
我们今天通过一个简单的测试代码来了解一下模块注入的大体流程。这个模块中主要是创建了一个静态线程对象,循环打印内容。注入的目标是将我们的代码注入到目标进程的地址空间中。首先是没有注入的时候就是一直在打印。下面来看一下我们要注入的模块代码。然后是我们要注入的目标进程的代码。这个代码也很简单,就是循环打印。然后是存放我们的注入动作的代码。接下来我们来看一下注入的效果。
2023-08-20 02:00:11 837
原创 Windows内存注入(前置原理)
我们重设的eip可以指向我们插入的内存或是注入的dll地址,在执行我们的代码后在跳转回原先的eip位置(这里有很多种方式,也可以继续上面的操作吧eip设回去,也可以通过远跳转回去都可以)通过Windows提供的获取线程上下文api可以获取到线程当前的寄存器信息,这样我们就可以先暂停线程然后重设eip的值然后将我们更新后的上下文设置到线程里,在让其运行起来。:此函数用于减少目标线程的挂起计数,是其恢复争抢时间片。:此函数用于让目标线程挂起。:此函数用于获取线程上下文。:此函数用于重设线程上下文。
2023-08-18 23:27:35 456
原创 vs使用def导出文件简介
配置到导出格式时候可以通过NONANE选项使到处函数的符号名字为空,@X为导出的序号,此序号为导出表中的index,可以通过序号获取此函数的地址。1.首先需要创建一个dll项目,否则没地方配置使用def文件的指向。2.定义一系列函数并创建一个def文件。3.配置使用def文件的指向编译即可。
2023-08-13 12:47:18 1382
原创 _declspec(naked) 初试(裸函数)
declspec(naked)修饰可以生成一个“裸”函数, 使用后C编译器将生成不含函数框架的纯汇编代码,裸函数中什么都没有,所以也不能使用局部变量,只能全部用内嵌汇编实现。就是说_declspec(naked)修饰的函数编译器会默认里面全是汇编语句,对于这个函数内部实现编译器不会帮我们做任何处理,在调用的时候默认c调用约定去调用我们的裸函数。大部分时候应用层开发是用不到这个修饰的,不过也可以通过裸函数偶尔来巩固一下汇编也是不错的方式。可以看到外面调用这个test函数的地方是正常的去编译的。
2023-08-09 23:11:17 894
原创 保护模式中段选择子权限校验逻辑详解
RPL可能会削弱CPL的作用,例如当前CPL=0的进程要访问一个数据段,它把段选择符中的RPL设为3,这样虽然它对该段仍然只有特权为3的访问权限。RPL说明的是进程对段访问的请求权限(Request Privilege Level),是对于段选择子而言的,每个段选择子有自己的RPL,它说明的是进程对段访问的请求权限。CPL是当前进程的权限级别(Current Privilege Level),是当前正在执行的代码所在的段的特权级,存在于cs段选择子的后两位的低两位。dpl存在f的位置,拆分是1111。
2023-08-05 01:30:12 306
原创 c/c++编译过程
这是最重要的一个功能,c/c++就是借助头文件来实现多个单元之间的符号定义关系,在汇编中会通过.globl来描述一个符号说这个符号在编译之后依旧要保留,说连接器还需要这个符号,而一个单元在编译时会引入自己的头文件也就是函数定义,这部分里大多数函数默认是extern的等同于加了.globl,c++的public也是这个意思,这样编译出来来自头文件所定义的符号就不会丢失其他单元就可以通过引入跟当前单元相同的头文件保留相同的符号来链接这个单元了。里我们简单了解了elf文件的格式,编译就是产出目标文件的过程。
2023-06-24 15:30:32 1311 1
原创 程序编译连接加载过程详解
首先我们打开目标文件看一下上面的图就是目标文件的格式了,这里使用的是010editer,这个二进制编辑器很好用可以看到大致分为三部分,首先是header,然后是sectionheader,最后是symbiktable,下面我们来依次讲一讲这些部分都有什么用。上面蓝色底色的是elfheader的部分,elfheader这里存放的主要是一些描述信息。
2023-06-24 05:11:29 1036
原创 c++11在macOS下多线程问题:【no matching constructor for initialization of ‘std::thread‘】
c++问题解决
2023-03-11 19:40:50 815
原创 字符编码详解
字符编码计算机中的存储是以字节为单位的,能反映的也仅仅是数字而已,为了能够用数字将文字信息反映出来人们设计出了各种字符编码表,将数字与文字对应。一、ASCI编码1.原始Ascii编码原始ASCI使用1到127(0X00~0X7F)来对应常用的一些字母等文本,127到255则是扩展到一些不常用的类似于=号这种内容。但原始ASCI所支持的字符仅仅能够反映英文国家的使用场景。2.ASCI扩展编码对于某些地区是无法用原始ASCI编码来反映当地的语言的,所以就有了ASCI扩展编码的这种形式。扩展ASI
2022-11-21 16:54:04 912
原创 Linux内核源代码分析一(Linux0.12)
Linux 内核主要由 5 个模块构成,它们分别是:进程调度模块、内存管理模块、文件系统模块、进程间通信模块和网络接口模块。首先说一下pc机的启动流程,在加电后,80X86会先进入实模式并进入地址0XFFFF0开始自动执行代码,这个地址一般带表了BIOS的代码地址,PC的BIOS将会执行硬件检测和诊断功能,并在0地址进行中断向量的初始化,最后BIOS会将启动设备的第一个扇区读入地址0X7C00位置,并从这个位置开始执行代码。boot目录下包含三个汇编代码文件bootsect文件是在记录在磁盘的第一个扇区中,
2022-06-04 01:47:34 2659
idea整合ssm(maven)个人博客框架
2020-02-09
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人