【dll解密】Dll加壳保护方案分析修复

分析背景
NGame游戏海外版出现了破解版,该版本在dump出游戏的dll中不能直接通过反编译工具查看修改后的游戏代码,导致无法确定外挂修改的直接逻辑点。本文主要针对AssemblyCSharp.dll模版,分析其dll保护的方法。

分析过程
1、拿到Encrypt_Assembly-CSharp.dll,拖进reflector中查看,发现文件不能被解析,提示说无效的COFF 头。
在这里插入图片描述
2、用010Editor打开Encrypt_Assembly-CSharp.dll查看文件,如下:

在这里插入图片描述
熟悉的MZ头,后面的“This program cannot be run in DOS mode”还被改成了黑客 网址,再看看后面的数据,基本确定是PE格式了。再看看这个网址,应该是这个组织把游戏给hack了再加上壳的。我们用010Editor来解析下这个PE文件,得到如下图在这里插入图片描述
可以得出DOS头通过e_lfanew解析出了NT头,但是奇怪的是NT头却没有解析出Section,让我们查看下NT头是否有不符合COFF格式的项。展开NT头,发现下面的Signature值有误,应该只是“PE”即 0x4550 两个字符,修改之。
在这里插入图片描述
修改后,重新运行下PE模板,就可以看到被解析的Section了。再次拖进reflector去解析dll,发现有如下错误:
在这里插入图片描述
我们知道,DataDirectory是PE文件很重要的一个结构,在 IMAGE_OPTIONAL_HEADER下的最后的位置,一般在NT头偏移+0x60的位置,像导入表,导出表,重定位表的RVA和size都放在这里。正常的DataDirectory有16项,分别如下:
在这里插入图片描述
以前的第15项是装 COM_DESCRIPTOR Directory 的RVA和size的,后来MS没有用这个,就把这个项装CLR信息了,也就是 .Net的所有信息。如果出现了reflector上面的DataDirectory数目不对的问题,那应该就是反编译器读取DataDirectory项数的时候出现了问题,也就是IMAGE_OPTIONAL_HEADER中的NumberOfRvaAndSizes错了,实质上应该是0x10才对,修复之,保存。
在这里插入图片描述
顺便查看一下我们要的CLR数据的RVA和size信息:
在这里插入图片描述
RVA为0x2008,size为 0x48

5、拖到reflector看看解析结果,如下:
在这里插入图片描述
出现了不允许非负数的情况,在这个时候,首先应该考虑到ILSpy的异常栈回溯查看问题,如下:
在这里插入图片描述
然而笔者觉得打log应该也是看不清的,但是唯一可以马上得出的两点结论是,metadata数量相关的索引被改成了负数,导致越界。

6、一般笔者分析metadata会利用CFF Explorer,把修复了部分的Encrypt_Assembly-CSharp.dll拖进CFF Explorer 中,发现了如下异常:
在这里插入图片描述
经验告诉我这个是Metadata Header的NumberOfStream 被改大了,改回 5就行了,正常的CLR数据一般只有5个流,分别为#~,#Strings,#US,#Blob,#GUID。

7、下面我们找到CLR的头去修复NumberOfStream,首先已知CLR头在0x2008位置,这个是虚拟地址,现在SectionHeader里面看看我们的这个虚拟地址落在哪个段上面:
在这里插入图片描述
原来是在.text段(其实一般也是在这个段中),根据虚拟地址0x2000和文件偏移的基址0x200转换下虚拟地址0x2008的文件地址,得到其文件偏移为 0x208。查看下这个位置的数据,如下:
在这里插入图片描述
这72个字节的结构是这样的:
在这里插入图片描述
NumberOfStream在MetaData里面,IMAGE_DATA_DIRECTORY结构就是RVA和size组成的。所以,在CLR头也就是.net目录结构头偏移 +8的位置可以得到MetaData的RVA为0x2F4E6C,转换成文件地址为 0x2F4E6C – 0x2000 + 0x200 = 0x2F306C。我们去0x2F306C的位置看看:
在这里插入图片描述
熟悉的BSJB出现在眼前,这个就是Metadata Header。红圈部分就是NumberOfStreams,修改成5即可,保存。

8、拖进CFF Explorer正常解析了,然后结果如下图:
在这里插入图片描述
9、这个时候用反编译器还是不能解析的,因为游戏逻辑是保存在#中的,那么我们进入#里面的Tables看看是否解析成功,发现CFF Explorer卡死了,和预期一样。正常的dll文件应该在点击Tables的时候会显示出每一个Table及其项数。
在这里插入图片描述
这里说一下MaskValid的意义,把这个值变成二进制表示为:
在这里插入图片描述
上面的最右边(最低位)为索引00,该值为 1,表示存在该表(为0即表示不存在),该表名为Module,如下:
在这里插入图片描述
其余类推。统计了一下,总共有24个1。是不是理论上会有24个表存在呢?其实不是的,细心的读者会发现第43个1没有对应的表,所以0x1E093FB7BF57值只能代表23个表。

10、我们看看#~保存的表的位置:在这里插入图片描述
可以看到,在MetaData头偏移 +0x6C 的位置保存着我们的#~的header,也就是0x2F306C + 0x6C = 0x2F30D8 的位置。如下蓝色覆盖的地方为我们的#~的header:
在这里插入图片描述
这个时候很容易就想到了为什么reflector会出现这样的情景:
在这里插入图片描述
其实很容易能够想到只要把这三个数据的高位字节(小端存储)patch成00就可以了,然而抱着严谨的态度我们还是去看看NGame破解版的libmono.so到底是怎么解析这一块数据的,查看开源的mono代码找到相关的解析位置load_tables,然后反汇编libmono.so即可,如下:
在这里插入图片描述
这个函数破解版和原版的解析方式是一致的,可以看出load_tables只取了低位24个字节。而到了这里我们可以知道reflector和ILSpy解析了32个字节所以导致出错了,我们把这三个数据的高位字节patch成00,保存下。

11、用reflector或者ILspy查看修复后的Encrypt_Assembly-CSharp.dll,如下:
在这里插入图片描述
原理总结
外挂针对dll的保护处理主要包括如下四个方面:

1、修改NT头的Signature。

2、修改IMAGE_OPTIONAL_HEADER中的NumberOfRvaAndSizes。

3、修改了CLR头指向的MetaData中的NumberOfStream。

4、修改了MetaData指向的#~堆中的tables数据项数。

外挂保护dll做的工作本质还是对抗主流的反编译器,防止其他人对外挂进行分析,实质上对mono源码基本没有进行大的修改。只要掌握一定的PE和.Net文件结构格式知识,就可以直接修复被修改的数据。

外网也存在一些修改elf文件的so保护机制,针对的是链接视图甚至是执行视图的修改,也是防止静态分析工具如IDA等进行分析,但是本质也是没有动linker所需要用到的数据。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【动手学深度学习-pytorch】 9.4 双向循环神经网络

在序列学习中,我们以往假设的目标是: 在给定观测的情况下 (例如,在时间序列的上下文中或在语言模型的上下文中), 对下一个输出进行建模。 虽然这是一个典型情景,但不是唯一的。 还可能发生什么其…

【LVGL-使用SquareLine Studio设计器 】

LVGL-使用SquareLine Studio设计器 ■ 简介■ 安装■ SquareLine Studio移植到工程 ■ 简介 SquareLine Studio 设计器是一个付费软件。 ■ 安装 SquareLine Studio 设计器的下载地址 我们点击“WINDOWS”下载 SquareLine Studio 设计器,下载完成之后我们就会得到…

GIS硬核入门,二维地图是如何使用WGS84坐标系来转换成墨卡托投影的xyz地图瓦片切片的详细原理

前言 二维地图一般分成两种,一种是简化的道路地图视图,一种是卫星拍摄的高清影像地图。 四种坐标概念理解: 经度和纬度,对应地球上唯一的一个点(例如:Google 使用世界大地测量系统 WGS84 标准&#xff0…

Day49:WEB攻防-文件上传存储安全OSS对象分站解析安全解码还原目录执行

目录 文件-解析方案-目录执行权限&解码还原 目录执行权限 解码还原 文件-存储方案-分站存储&OSS对象 分站存储 OSS对象存储 知识点: 1、文件上传-安全解析方案-目录权限&解码还原 2、文件上传-安全存储方案-分站存储&OSS对象 文件-解析方案-目…

数据结构之二叉树由浅入深(四)

目录 题外话 正题 第一题 第一题思路 第一题代码详解 第二题 第二题思路 第二题代码详解 第三题 第三题思路 第三题代码及详解 第四题 第四题思路 第四题代码及详解 第五题 第五题思路 第五题代码及详解 题外话 本来昨天就想写完这篇文章,怎么样是不是很大胆?…

ttkbootstrap界面美化系列之Notebook(四)

在简单的界面设计中,Notebook也是常用的组件之一,Notebook组件的引入可以根据标签来切换不同的界面。使得界面更有层次感,不必都挤在一个界面上。在tkinter中就有Notebook组件,在ttkbootstrap中,同样也对Notebook进行了…

Flutter开发之objectbox

Flutter开发之objectbox 在之前进行iOS开发的时候使用WCDB去进行管理数据库很方便,它支持ORM(Object-Relational Mapping,对象关系映射),用于实现面向对象编程语言里不同类型系统的数据之间的转换。 那么在Flutter开发…

d3dcompiler_43.dll丢失的解决方法,快速解决win10系统错误问题

当系统提示“d3dcompiler_43.dll缺失”时,意味着计算机中缺少这一关键性动态链接库文件。该文件作为DirectX 3D编译器组件的一部分,对于许多依赖于DirectX技术的应用程序或游戏至关重要。这个错误通常会导致游戏或应用程序无法正常运行。为了解决这个问题…

java Web洗衣店管理系统用eclipse定制开发mysql数据库BS模式java编程jdbc

一、源码特点 JSP 洗衣店管理系统是一套完善的web设计系统,对理解JSP java 编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,eclipse开发,数据库为Mysql5.0,使用…

记一次dubbo provider获取不到dubbo.tag问题排查

1. 背景 项目里通过dubbo.taggray传递灰度标,但是上游consumer已经在attachment里面设置dubbo.gray了,下游却拿不到 2. 排查过程 2.1. 前提 先把源码下载下来,方便排查 详细可见:tps://blog.csdn.net/qq_26012495/article/det…

9、jenkins微服务持续集成(一)

文章目录 一、流程说明二、源码概述三、本地部署3.1 SpringCloud微服务部署本地运行微服务本地部署微服务3.2 静态Web前端部署四、Docker快速入门一、流程说明 Jenkins+Docker+SpringCloud持续集成流程说明 大致流程说明: 开发人员每天把代码提交到Gitlab代码仓库Jenkins从G…

烟草行业率先布局新质生产力,中国烟草11省40家公司已上线实在Agent数字员工

为了更好赋能烟草行业数智化转型发展需求,各地烟草集团公司都开始陆续展开数智化赋能培训。近日,杭州烟草临安分公司举办“人工智能作为企业新质生产力发展的落地探索”论坛会议,实在智能受邀出席,聚焦“TARS大模型及实在Agent数字…

武汉星起航:引领跨境电商新潮流,一站式服务助合作伙伴成功起航

武汉星起航电子商务有限公司是一家集自营亚马逊跨境电商与亚马逊卖家孵化服务于一体的公司。在创始人张振邦先生的引领下,公司凭借深厚的电子商务运营经验和对行业的深刻洞察,积极响应国家大力发展跨境电商行业的号召,为刚起步和未起步的合作…

vue3封装Element表格自适应

表格高度自适应 分页跟随表格之后 1. 满屏时出现滚动条 2. 不满屏时不显示滚动条 坑 表格设置maxHeight后不出现滚动条 解决方案 表格外层元素设置max-height el-table–fit 设置高度100% .table-box {max-height: calc(100% - 120px); } .el-table--fit {height: 100%; }示例代…

会声会影剪刀为什么灰色 会声会影分割素材的方法 会声会影视频制作教程 会声会影2023旗舰版下载 会声会影快捷键

会声会影是一款操作简单,功能齐全,适合新手使用的视频剪辑软件。在使用会声会影剪辑的过程中,我们一般需要使用【剪刀工具】,但有时会声会影剪刀是灰色无法使用的状态,这个时候该怎么办呢?本文将为大家介绍…

pytest--python的一种测试框架--简介

一、什么是接口测试 接口测试是软件测试的一种类型,用于验证不同软件系统之间的接口是否按照设计规范进行通信和交互。接口测试通常涉及以下方面: 功能性验证:确认接口按照规范执行预期的功能。 性能测试:验证接口在不同负载条…

木地板 VS 瓷砖,不同风格应该怎么选?福州中宅装饰,福州装修

不同装修风格应该怎么选择地板铺贴材质?是选择木地板还是瓷砖?以下分点阐述: ①现代简约风格 推荐使用瓷砖。因为瓷砖的表面光滑,能反射出灯光的倒影,营造出简洁明亮的视觉效果。同时,瓷砖耐磨、易清洁&am…

CNN卷积神经网络股票价格预测

部分代码: %% 清空环境变量 warning off % 关闭报警信息 close all % 关闭开启的图窗 clear % 清空变量 clc % 清空命令行 %% 重构数据 data_Trend xlsread("dataguOne.xlsx") dT …

idea-创建java8的springboot项目

现在使用IDEA创建 Spring Boot 项目,jdk 版本最低要求为 17。Spring Boot 官方在全力维护 3.x 版本,而 Spring Boot 3.x 对 jdk 版本的最低要求为17。 如果需要继续使用 jdk8,则需要修改 Server URL ,改成:https://st…

electron的学习基础汇总

通过学习electron了解一下做项目中好奇的问题,我觉得下面这张图就可以说明一切了,就是在初次创建并显示主窗口后,一切都将建立在渲染进程和主进程的通信上,而用的技术就是ipcMain和ipcRender,那么渲染进程如何与主进程…