1.知物由学 | 端游代码保护:从原生代码到游戏引擎
2.SafengineShielden软件加壳工具V2390官方版SafengineShielden软件加壳工具V2390官方版功能简介
3.Linux下的乱序Meltdown攻击实践(含代码)
4.Linux内核源代码导读图书目录
5.Webrtc源码分析 - JitterBuffer
6.英雄,请留步!壳源大王有令,码乱将List集合元素乱序者,序版方可进殿
知物由学 | 端游代码保护:从原生代码到游戏引擎
近年来,有什用移动端游戏迅速崛起,乱序手游源码程序凭借其便利性和趣味性,壳源吸引了海量玩家。码乱然而,序版为了追求更佳的有什用游戏体验,部分玩家选择在PC上使用模拟器操控手游,乱序虽在操作和沉浸感上有改善,壳源但性能方面仍有所欠缺。码乱
为了满足这类玩家需求,序版游戏厂商尝试将手游与PC整合,有什用实现跨平台体验。如《阴阳师》、《第五人格》、《荒野行动》等游戏支持PC端运行,相较于手机或模拟器,体验更佳。
然而,外挂现象也随PC端游戏的扩展而日益严重。PC版游戏面临应用权限混乱、取证困难等问题,令厂商陷入困境,同时为外挂提供了可乘之机。
反外挂通常涉及静态代码保护与动态运行对抗两大部分。本文聚焦静态代码保护,探索在易盾端游反外挂代码保护中,PE代码保护的应用及面向游戏引擎的代码保护策略,进而提出一种通用游戏逻辑代码保护方案。
1. 通用代码保护
1.1 PE代码保护概述
PE代码保护聚焦于原生代码保护,针对x架构的二进制文件(PE文件)进行保护。该技术已有多年历史,从世纪初开始发展,催生了如“UPX”壳等具有影响力的加固思路与加密算法。
PE加固技术主要分为整体加密、真值的源码混淆与虚拟机保护三类,旨在对抗静态分析与动态调试。
1)整体加密:通过压缩/加密壳与附属功能实现,如IAT加密、反调试与完整性校验。
2)混淆:包括花指令、指令变形、代码乱序与字符串加密等,旨在提升静态分析与动态调试难度。
3)虚拟机保护:引入私有指令集,将原生汇编指令转化为虚拟运行时指令,以实现保护。
1.2 游戏逻辑外挂原理
从攻击者视角,实现游戏外挂,主要关注两点:关键数值修改与关键函数操纵。传统代码保护对静态分析与动态调试具有较好防御效果,但针对特定游戏逻辑篡改类外挂,效果有限。
不同游戏引擎(如Unity3D、UE4)引入了运行时解释器,使得传统PE保护方案难以覆盖,从而提出了针对游戏引擎的保护方案。
2. 游戏引擎保护
易盾端游代码保护方案针对Unity3D引擎,包括Mono DLL整体加密、方法级加密、格式私有化、IL2CPP global-metadata 加密与指令抽取等技术。
2.1 Unity3D端游代码保护
1)Mono DLL整体加密:加密后的DLL格式改变,使用反编译工具无法解析。
2)方法级加密:关键IL指令抽离至外部,内存中无法完整逻辑。
3)格式私有化:关键加密信息用私有格式存储,运行时不会恢复。
4)IL2CPP global-metadata 加密:通过自定义加密算法保护解析文件,破坏符号解析。
5)IL2CPP 指令抽取:游戏核心代码抽离外部,配合乱序变形引擎,自助友情源码内存中无法完整获取。
2.2 通用游戏引擎保护方案
针对不同游戏引擎与开发语言,需设计通用且性能良好的保护方案。方案需兼顾通用性、性能与安全性,采用定制AST引擎解析源码,并结合混淆与少量核心代码虚拟化,以实现轻量级虚拟机保护。
3. 端游代码保护总结
代码保护是端游反外挂的关键,影响游戏体验与安全性。然而,仅依赖代码保护不足以应对所有外挂挑战。未来,将深入探讨运行时反外挂策略,为游戏安全提供更全面的解决方案。
SafengineShielden软件加壳工具V官方版SafengineShielden软件加壳工具V官方版功能简介
大家好,关于Safengine Shielden(软件加壳工具) V2.3.9.0 官方版,Safengine Shielden(软件加壳工具) V2.3.9.0 官方版功能简介这个很多人还不知道,现在让我们一起来看看吧!Safengine Shielden是一个非常优秀的软件加壳工具,功能包含软件授权系统,关键代码混淆、虚拟化,将以代码虚拟机为主,授权功能为辅助,提供入门级的软件加密安全方案。 Safengine Shielden可以为指定的应用程序添加一个保护壳,提供强大的代码虚拟机保护功能,有效避免应用程序被逆向破解,支持exe、scr、dll等多种文件,非常适合从事软件开发的用户为自己开发的软件加壳使用。主要特点
1、Safengine是一个具有反调试、反附加、动态自效验等功能,同时提供了对代码的变形、乱序和虚拟化等功能的des 源码 下载应用程序保护壳,是一款简单易用的软件保护工具,它改变您的软件执行流程,以达到阻碍自动分析,消耗破解时间、精力的目的。 2、Safengine的代码分析引擎将在保护应用程序时提供完整的分析,从而对应用程序进行系统化的保护,将您的原始代码移动和变形,并且加入无数垃圾代码和反调试、跟踪代码。 3、Safengine处理的范围是整个程序,而不是程序里的某一个过程。所以,即使您的关键代码在保护后未经变形,也需要耗费破解者很长的时间才能找到,而往往只是一行两行代码,穿插在数以万计的垃圾代码中,是极其隐蔽和猥琐的。 4、Safengine的代码虚拟机在同类产品中最稳定、最完善,整体运行架构线程安全,不会改变系统对受保护代码的线程的调度。虚拟处理器采用了逻辑门级的指令拆分,使用与非和加法两个基础运算指令实现了大部分复杂的x指令,并且使用了随机的虚拟寄存器参与运算,极大程度提高了代码保护的安全性。 5、在同类的软件保护壳中,Safengine提供了最完整的解决方案,集代码加密、虚拟化、授权于一体,并且每一项功能都可圈可点。主要功能
1、hero 网关源码代码识别引擎 代码识别引擎能分析您的程序,并且给壳提供一个结够性的程序框架信息。因此,壳可以自动把代码片断进行强化保护,而您无需在源代码内手动增加标记。此功能甚至可以对编译器自动生成的代码和程序标准库代码进行识别和保护,从而使现有分析工具无从下手。 2、代码乱序变形引擎 代码乱序功能能分析程序执行流程,并对其逻辑结构进行混淆Safengine Shielden支持的文件格式:
1、Win 可执行文件 ,*.exe; 2、Windows 屏幕保护程序 ,*.scr; 3、动态链接库 ,*.dll; 4、位 ActiveX 控件 ,*.ocx; 5、位驱动程序 ,*.sys;Linux下的Meltdown攻击实践(含代码)
北京时间年月日,Google Project Zero公开了Meltdown(熔毁)漏洞,指出该漏洞能够影响几乎所有的Intel CPU和部分的ARM CPU,于是相关的侧信道攻击方式由此开始走进大众的视野。
Meltdown攻击是一种直接针对底层硬件机制(CPU的乱序执行机制、Cache机制和异常处理机制)的时间侧信道攻击,它的基本原理如下所示:
这里对上图及上述条件作简单解释:从顶层程序的角度来看,指令A、B和C应该是顺序执行的,且由于指令A访问了非法地址的数据会触发异常,故指令B和C的操作不会被执行;然而,从底层硬件的角度来看,指令A、B和C满足乱序执行的条件,于是在下一指令所需要的数据准备完成后就可以立即开始下一指令的执行。在图中指令A的“阶段A_1”结束后,指令B由于所需要的数据已经准备完成故可立即开始执行;在图中指令B的“阶段B_1”结束后,指令C由于所需要的数据已经准备完成故可立即开始执行。若“阶段A_2”的执行时间大于“阶段B_1”的执行时间和“阶段C_1”的执行时间之和,则非法数据能够经过运算产生合法地址,且该合法地址的数据能够被放入L3_Cache中;若在指令A的“阶段A_2”结束后,检查出非法访问所引起的回滚冲刷不影响L3_Cache,则与非法数据相关的合法数据依然存在于L3_Cache中。最后,通过遍历访问合法地址的数据,并对访问时间进行计时,能够找到某个访问时间明显较短的合法数据,该数据的合法地址即为指令B中由非法数据经过运算后所得到的值,从而可以反推出原非法数据,于是间接地得到了非法地址中的数据。
随后将详细说明完整的Meltdown攻击是如何具体实施的,文中攻击实践的操作系统平台为虚拟机中的Ubuntu。此前,在虚拟机中的Ubuntu和某服务器中的某操作系统上也能够成功实施该Meltdown攻击,只是某些具体的实施步骤和本文有细微差别。
简单写一个字符设备驱动程序,该驱动程序运行在操作系统内核态,私有存储空间内有一段秘密信息。这里只实现了它的IOCTL函数、OPEN函数和READ函数,其中主要关注如下所示的READ函数(带注释的完整源代码已上传至Github):
该READ函数能够将内核空间中的秘密信息的存储地址反馈给用户空间中的一般用户程序,于是一般用户程序可通过直接调用该函数得到秘密信息的存储地址。然而,对于一般用户程序来说,通过该READ函数读取到的地址是一个不可访问的非法地址,其中的数据对一般用户程序不可见,也就是说一般用户程序无法通过正常的访问流程来获取该秘密信息。但是,随后的Meltdown攻击的对象即为该驱动程序,这一侧信道攻击方式可绕过操作系统的隔离间接地窃取到该秘密信息。
首先,编译该驱动程序的源代码,生成可加载的内核模块:
在加载编译生成的内核模块之前,先看一下操作系统中已经加载的内核模块,以作对比:
接下来,加载编译生成的内核模块;然后,再次查看操作系统中已经加载的内核模块:
对比以上两图,可以看出"Module"一列的第一行新增了内核模块"memdev",说明OS内核模块加载成功。
最后,在内核模块加载完成的基础上,还需要在/dev目录下创建对应的设备节点文件,从而一般用户程序可以通过该文件访问内核模块:
尝试调用该内核模块(带注释的完整源代码已整合进Meltdown攻击代码中并上传至Github):
至此,作为攻击对象的目标驱动程序已经被加载成为内核模块,且能够被一般用户程序正常调用。
首先,通过操作系统自带的文件查看是否存在Meltdown漏洞:
其次,通过Github上的spectre-meltdown-checker程序来查看是否存在Meltdown漏洞:
接下来,通过添加内核参数"nopti"以关闭操作系统的Meltdown补丁:
重启操作系统后再次查看是否存在Meltdown漏洞:
最后,通过运行Github上的meltdown-exploit程序来查看操作系统是否真的能够被Meltdown攻击窃取一些秘密信息:
至此,操作系统的Meltdown补丁已经被关闭,此时可通过Meltdown攻击窃取其中的部分秘密信息。
首先,分析Meltdown攻击的源代码(带注释的完整源代码已上传至Github):
1. 主函数内主要包括五个运行步骤,具体说明分别如下:
2. 主函数内最关键的函数为attack函数,其中主要包括四个步骤,具体说明分别如下:
3. attack函数内的核心部分是attack_core函数,该部分也即是整个Meltdown攻击的硬件机制缺陷利用点所在:
其中值得注意的是上述汇编代码的第八行、第九行和第十一行。第八行:对目标地址进行非法访问,将其中的字节数据放入寄存器al(寄存器rax的低8位);第九行:将寄存器rax左移位,相当于乘上(该乘数至少为一个Cache_Line的大小,否则攻击中使用的相邻存储地址会相互影响);第十一行:将非法访问的数据作为新地址的一部分,再访问新地址(rbx+rax*0x1)中的数据以将其载入Cache。在第八行的指令执行完后,以顺序执行的角度来看,由于第八行的指令进行了非法访问,故CPU会产生异常阻止接下来的指令执行;然而,由于乱序执行机制的存在,第九行和第十一行的指令会在第八行的指令的异常处理完成之前就开始执行,且CPU异常处理的回滚机制并不会改变L3_Cache中的内容,于是第九行的指令将秘密信息混入合法地址中,第十一行的指令将合法地址的信息混入L3_Cache中。在异常处理函数中简单地完成对相应异常的处理后,即可通过L3_Cache利用典型的"Flush+Reload"Cache攻击来反推出原秘密信息。
最后,编译并执行Meltdown文件,得出的Meltdown攻击结果如下所示:
至此,Meltdown攻击的具体实践成功完成。
以上三条防护措施只是所有可能的防护措施的一部分,也存在其它有效的针对Meltdown攻击的防护措施。
第1、2条防护措施需要对底层的硬件做出改动,对成本和性能的影响较大,在实际工程中难以接受其带来的负面作用;第3条防护措施是操作系统层面的漏洞修补,对成本和性能的影响相对较小,目前以各操作系统补丁的形式被实施(KAISER/KPTI)。
meltdownattack.com/
Meltdown: Reading Kernel Memory from User Space
github.com/paboldin/mel...
2. Linux驱动相关:
paper.seebug.org//
/article--1...
4. x汇编相关:
ibiblio.org/gferg/ldp/G...
blog.csdn.net/littlehed...
blog.chinaunix.net/uid-...
en.wikibooks.org/wiki/X...
5. 本文源代码相关:
github.com/hahaha...
Linux内核源代码导读图书目录
本书《Linux内核源代码导读》详细介绍了Linux内核的基础知识和核心模块,分为以下几个部分:第1章:x硬件基础
1.1 保护模式:探讨分页和分段机制,以及系统门和x寄存器的作用。
1.2 典型PC系统结构:介绍硬件和软件交互的基本概念。
第2章:基础知识2.1 AT&T与Intel汇编语法比较:讲解汇编语言的两种主要风格。
2.3 互斥与同步:原子操作、信号量、自旋锁、RCU机制和percpu变量的详细讲解。
2.4 内存屏障:探讨编译器、缓存和乱序执行对内存一致性的影响。
2.5 函数调用规范:高级语言的调用规则和注意事项。
第3章:Linux内核Makefile分析3.1 内核编译概述:理解Linux内核的编译流程和目标。
3.2-3.3 内核编译和链接脚本的深入解析。
后续章节涵盖Linux内核启动过程、内存管理、中断处理、信号机制、系统调用、时钟管理、进程管理、调度器、文件系统以及内核分析方法等内容。每一章都提供了深入浅出的解释,帮助读者逐步掌握Linux内核的工作原理和实现细节。扩展资料
本书根据最新的2.6.内核为基础。在讲述方式上,本书注重实例分析,尽量在讨论“如何做”的基础上,深入讨论为什么要这么做,从而实现本书的写作宗旨:“授人以渔”。在内容安排上,本书包含以下章节x硬件基础;基础知识;Linux内核Makefile分析;Linux内核启动;内存管理;中断和异常处理;系统调用;信号机制在类UNIX系统中;时钟机制;进程管理;调度器;文件系统;常用内核分析方法。Webrtc源码分析 - JitterBuffer
记录于纸,好于记录于心,这是历史的智慧。在WebRTC技术中,JitterBuffer扮演着关键角色,用于处理接收端的数据包抖动与缓存排序问题。其核心功能是记录数据包的正序、乱序和丢包情况,通过Nack列表标识,用于数据包的重传。每个数据包对应特定的序列号,确保理论上的递增或循环处理。以此判断帧frame的完整性,完整帧被送入待解码帧列表,等待解码和显示。对于非完整帧,JitterBuffer会依据超时时间与包间空洞大小决定是否丢弃,并可能请求关键帧的重新发送。
主要代码与注释分析如下,深入了解JitterBuffer的运行机制。
英雄,请留步!大王有令,将List集合元素乱序者,方可进殿
在开发微信小程序的问答对战中,我遇到了一个需求,要求问卷题目和选项的顺序随机化。起初,我用Random随机生成不重复的下标实现,但后来发现Collections类中的shuffle方法能更直接地满足这个需求,就像洗牌一样打乱元素顺序。shuffle方法背后是JDK的精心设计,尤其在处理ArrayList和LinkedList这类集合时,效率考量显得尤为重要。
shuffle方法的核心在于重载版本,它首先创建一个Random实例,然后根据集合的特性执行不同的操作。对于长度小于SHUFFLE_THRESHOLD(默认为5)的集合,或者实现了RandomAccess接口的集合,如ArrayList,它会使用for循环和swap方法进行快速的元素交换,避免了嵌套循环导致的低效。而对于LinkedList等非RandomAccess接口的集合,shuffle会先将其转换为数组,对数组进行乱序后,再重新放入链表,以优化查询性能。
这个例子提醒我们,即使是看似简单的代码,背后也有精心的设计和性能优化。对于初级开发者来说,从JDK源码中学习大师们的设计思路,对提高编程技巧和理解算法效率很有帮助。此外,推荐关注唯品会的GitHub项目vjto...,这里有丰富的Java工具和实用的库,可以帮助开发者更好地理解和实践。
2024-11-27 19:30
2024-11-27 18:59
2024-11-27 18:50
2024-11-27 18:37
2024-11-27 18:30
2024-11-27 17:44