Cs1.6找基地址
找基地址最近在搞FPS的外挂研究,拿CS1.6学的,不得不说,像是一个新的领域,学得确实让我感到心力交瘁,就例如这次的找基地址,让人难受
又干到凌晨了,我真服了,记录下找基地址的辛酸泪,以免忘掉
找自身坐标这个算是比较好找的了,分为X,Y,Z坐标,最快的方法就是去找Z坐标,因为这个比较好控制变大,变小,所以很容易就能找到
不断筛选,筛了个大概,然后一般是选择绿色的,因为绿色的是相对固定的,不是堆栈空间
把它们添加到下栏里边
点击数值可以进行排序
剩下的就是瞅着顺眼的数值就整体用来半分法,一直找到修改后人物会飞天的效果(记得要锁定)
要让人物产生飞天的效果应该只有自己可以,不能让对面玩家飞起来,因为在真实环境下,对面人物的坐标都在服务器上,就算改了,也只是在你的本地视觉上稍微飞天了(超级快就被服务器修正了),所以我们能实现飞天的只有自己(有时候服务器还会修正,看游戏本身吧)
最终追到了俩基地址,貌似改哪个都行,都能产生飞天的效果(貌似还不止两个….)
浏览周围的数据,还能找到自身人物的X,Y坐标.随便记录下
12345自身X坐标:hw.dll+10F7F60-8自身Y坐标:hw. ...
Windows内核(13)——TSS任务段和中断门初探
Windows参考文章: Linux 学习笔记(九):基于 TSS 的进程切换-CSDN博客
任务状态段TSS及TSS描述符、局部描述符表LDT及LDT描述符_tss段描述符-CSDN博客
保护模式第六讲-IDT表-中断门 陷阱门 任务门 - iBinary - 博客园 (cnblogs.com)
上一节的通过Cr3任意读写如何防?
如何在自己运行的时候cr3是正确的,但是别的进程拿的时候是错误的?
中断/系统调用钩子
在操作系统级别拦截系统调用或中断处理程序,并在适当的时候修改 CR3。通过这种方式,可以在当前进程执行时使用正确的 CR3,而在其他进程尝试获取 CR3 时返回伪造的值。
实现步骤:
钩住所有对 CR3 的访问,包括直接读取寄存器、查询系统状态等。
当检测到当前进程访问时,返回正确的 CR3;否则,返回伪造的 CR3。
特权指令拦截
在具有硬件虚拟化技术(如 Intel VT-x、AMD-V)的环境中,可以通过设置控制寄存器的访问权限,使用虚拟化技术拦截对 CR3 的访问。
实现步骤:
使用虚拟化技术将自己运行在虚拟机内,虚拟机管理 ...
Windows内核(12)——通过CR3修改进程内存
Windows修改对方进程内存步骤1.获取对方进程的页目录表
2.让自己程序的Cr3=对方进程的页目录表
3.然后执行自己程序,访问对方进程的内存地址,就可以对对方的内存进行操作
4.再还原成自己程序的Cr3
以上步骤有几个值得思考的问题问题11.为什么把自己进程的Cr3修改为对方进程的页目录表还是可以执行自己的代码?自己的虚拟地址按照cr3进行查表,查出来的物理地址不会变吗??
这是有要求的,自己的程序必须是驱动,这样才能运行在系统的高两G。而高两G是享有一样的页表的,才能保证在进程间共享
问题22.CPU在切换线程的时候,CR3会改变,那咋整
有时候我们写的驱动程序不一定只有一个线程,那么假设我们有两个线程,一个线程去执行将自己的cr3修改为一个三环进程的cr3,当修改成功后,好巧不巧,cpu将进程切换了,正巧切换成自己程序的另一个线程,那么cr3可能就会被改回原来的cr3,此时线程继续执行,因为cr3已经不是对方进程的了,因此访问对方进程就会崩溃,系统蓝屏。
那如何解决这个问题?
提升IRQL?别以为稳了,因为如果碰巧要访问的地址是分页内存,被交换到了硬盘上,那就直接 ...
Windows内核(11)——分页机制(2-9-9-12)
Windows分页机制 2-9-9-12名词解释:PTE(Page Table Entry):页表项
PTE是页表中的一个条目,用于存储一个页面的物理地址和一些控制信息,比如页面是否有效、是否可读写等。通过页表,可以将虚拟地址转换为物理地址。
PDE(Page Directory Entry):页目录项
PDE是页目录中的一个条目,用于指向一个页表。每个PDE包含指向页表的物理地址和控制信息。页目录本身是一个包含多个PDE的表,用于管理多个页表。
PTT(Page Table):页表
页表是一个结构,包含多个PTE。每个PTE指向一个物理页的地址。页表用于虚拟地址到物理地址的转换。在分层页表结构中,一个页表对应一个页目录项。
PDI(Page Directory Index):页目录索引
PDI是虚拟地址的一部分,用于索引页目录中的某个PDE。通过PDI,操作系统可以找到页目录中对应的PDE,从而找到指向的页表。
页目录索引(PDI, Page Directory Index):用于查找页目录中的某个页目录项(PDE)。
页表索引(PTI, Page Table Ind ...
Windows内核(10)——分页机制(10-10-12)
Windows分页机制(10-10-12)参考文章:https://github.com/0voice/kernel_memory_management/blob/main/%E2%9C%8D%20%E6%96%87%E7%AB%A0/%E4%B8%80%E6%96%87%E5%B8%A6%E4%BD%A0%E4%BA%86%E8%A7%A3%EF%BC%8C%E8%99%9A%E6%8B%9F%E5%86%85%E5%AD%98%E3%80%81%E5%86%85%E5%AD%98%E5%88%86%E9%A1%B5%E3%80%81%E5%88%86%E6%AE%B5%E3%80%81%E6%AE%B5%E9%A1%B5%E5%BC%8F%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86.md
为什么要用分页机制?因为分段机制效率低,是为了解决分段粒度大,因为段需要整段的加载进内存以及整段换出,造成内存碎片大,不易于管理,虽然可以通过将段置换出磁盘再加载的方式减少碎片,但是效率实在太低
分页管理通过划分物理空间为一块块固定大小的页与之对应,能够将程序分割成一页 ...
IDA位段的应用
IDA位段设置位段我们创建这个位段,以下是代码:
12345678910struct{ uint8_t isCatch : 1; // 1 if this represents a catch funclet, 0 otherwise uint8_t isSeparated : 1; // 1 if this function has separated code segments, 0 otherwise uint8_t BBT : 1; // Flags set by Basic Block Transformations uint8_t UnwindMap : 1; // Existence of Unwind Map RVA uint8_t TryBlockMap : 1; // Existence of Try Block Map RVA uint8_t EHs ...
Windows内核(9)——保护模式下的内存管理(分段机制)
Windows保护模式下的内存管理:注:主要参考来自 内核第二讲,内存保护的实现,以及知识简介,局部描述符,全局描述符. - iBinary - 博客园 (cnblogs.com)
Win32汇编–Windows 的内存管理机制 - 木屐 - 博客园 (cnblogs.com) (来源小甲鱼)
80386指的是32位系统
三种模式实模式: 指的是操作系统在启动的时候,这时候访问的内存都是实际的物理内存.也就是在这个时机,系统会在实模式下填写全局描述符表 GDT
保护模式: 当各种表填写好了,那么我们的内存也被保护了.这个是否我们的进程就不会直接访问物理地址了.进而产生了保护行为,我们的内存就有了 可读 可写,可执行一说了.
虚拟86模式: 操作系统启动的是否,运行的都是实际的16位汇编.那么现在我们假设有一个16位程序要启动.那么修改了我们物理地址的内存,那么保护模式不就没用了.所以为了防止这一情况的产生,操作系统做了一个虚拟86模式,也就是说可以运行16位汇编程序.
保护模式如何保护内存操作系统启动的会从实模式启动,然后会切换到保护模式,此时操作系统会通过做表,然后通过查表, ...
Windows内核(8)——多线程&内核
Windows多线程创建&同步创建线程 PsCreateSystemThread 是一个用于创建内核模式线程的函数。
123456789NTSTATUS PsCreateSystemThread( OUT PHANDLE ThreadHandle, IN ULONG DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, IN HANDLE ProcessHandle OPTIONAL, OUT PCLIENT_ID ClientId OPTIONAL, IN PKSTART_ROUTINE StartRoutine, IN PVOID StartContext);
**ThreadHandle (OUT PHANDLE)**:
类型:输出参数,指向一个句柄变量。
描述:当线程创建成功时,此参数将返回线程的句柄。你可以使用此句柄来操作线程,例如关闭线程句柄或获取线程状态。
**DesiredAccess (IN ULONG)**:
类型:输入参数。
描述: ...
Windows内核(7)——内核API介绍
Windows内核内核API的使用关于内存检查的API123MmIsAddressValid();//查表检测该页是否有效 一般是0x12345678 & 0xffff000 ,操作系统申请没有一个字节,而是以页为单位ProbeForRead(); //只能检测UserBuffer,而且要用异常处理,而且参数为0的时候不干事ProbeForWrite();//只能检测UserBuffer,而且要用异常处理,而且参数为0的时候不干事
关于字符串的API以 Rtl(Runtime Library)开头的函数命名源自 Windows 操作系统的运行时库(Runtime Library),这些库提供了一组基本函数,用于支持操作系统和驱动程序的开发。Rtl 函数主要用于以下几个方面:
字符串操作:包括 Unicode 和 ANSI 字符串的初始化、复制、比较、转换等操作。
内存管理:提供内存分配、释放、复制等基本功能。
其他基础操作:如列表操作、异常处理等。
12345678910RtlInitUnicodeString();//初始化一个 UNICODE_STRIN ...
Windows内核(6)——内核调试
Windows内核环境配置:学习系统内核程序是如何运行的,分析程序的运行就必须用到调试,要调试就要能下断点
Windows系统当处于调试状态的时候,所有进程都会被挂起,除了一个调试子系统,用来与本机(Windbg)通过串口进行交互,传递调试指令
Win7+WmWare+Windbg双机调试看这个博客吧,很详细
https://cloud.tencent.com/developer/article/1470241
嘿嘿嘿配好了
注意注意,一定要在系统启动的时候,打开Windbg才能调试上!
X86的Windbg有个bug,就是寄存器窗口没有值,这个可以去github上面下载一个dll
放在同个文件夹即可
然后执行命令:
1!WingDbg.regfix #注意大小写
值得注意的是,命令为:Wingdbg而不是Windbg,虽然我也不知道为什么
这下寄存器窗口就有值了
建议界面可以弄得和OD和x96dbg一样,然后点击保存工作界面:
然后再次进入Windbg的时候,如果没有自动还原工作界面,可以自行打开
Open Workspace
调试驱动程序旧版Windbg首先我们要编译 ...