起因
怀旧一下windows 扫雷,结果发现界面大变样,变了好看了许多,但是广告也特别扎眼睛,所以就想干掉广告还世界一个清静。
目的
微软商店扫雷去广告。
经过
首先是想通过子窗口,字符串找到业务代码,但是均失败了,不得已要对程序深入分析,先通过导入表下断点找到业务代码的范围,最终发现业务代码是使用il2cpp 进行解释执行,接下来就需要研究il2cpp,之后得知unity 把c# 代码使用il2cpp继续二次编译,通过对GameAssembly.dll和global-metadata.data的反编译可以得到c#的类,方法和字符串信息,然后对应的代码地址,根据类名函数名找到相关业务代码进行patch,最终成功去掉广告。
源程序:
微软商店下载第一个
进入游戏选择任意模式可以发先下方有一个很大的广告窗口。
程序目录:
传统思路:
(1)先用spy++ 找到子窗口,处理 creatwindows。
spy++ 查看一下窗口,没有子窗口,此路不通。
(2)查找字符串,看看那里使用了相关字符串,patch 相关代码。
x64dbg 附加也找不到字符串。此路不通。
(3)上调试器对导入表下断点分析,根据导入表提示寻找业务逻辑在那里。
dll模块的导入表就是该模快用到的其他模块的功能,所以对导入表下断点可以帮我们尽快找到业务逻辑代码,减少额外信息的干扰。
接下来就是导入表下断点,从而进一步找到功能逻辑代码在哪,首先把系统dll 排除掉。
经过调试发现程序的逻辑在GameAssembly.dll 中,观察右边的符号名称,il2cpp看起来像个解释器,对高级代码进行解释执行,比如获取类,获取方法等。
继续调试发现,程序逻辑确实是不断的获取类的信息然后在执行更加验证了我的想法。以下跳转的地址就是获取类的信息然后去执行。
所以接下来就需要研究一下il2cpp的原理,有没有办法反编译为高级代码。毕竟直接分析工作量太大了。
深入分析:
(1)分析il2cpp 作用,并找到global-metadata.data。
通过一些特征字符串并查阅资料该游戏是unity开发,使用il2cpp 打包
il2cpp是一种将其他的高级语言转化为标准c++ 代码的技术。
参考https://docs.unity.cn/cn/2019.4/Manual/IL2CPP-HowItWorks.html
IL2CPP 的工作原理:
使用 IL2CPP 开始构建时,Unity 会自动执行以下步骤:
将 Unity Scripting API 代码编译为常规 .NET DLL(托管程序集)。
应用托管字节码剥离。此步骤可显著减小构建的游戏大小。
将所有托管程序集转换为标准 C++ 代码。
使用本机平台编译器编译生成的 C++ 代码和 IL2CPP 的运行时部分。
将代码链接到可执行文件或 DLL,具体取决于目标平台。
接下来就是需要找到 被打包的c#代码的信息在哪,c# java 这种解释执行的语言执行时需要类的信息, 不管用什么样技术手段这里东西一定存在某个地方。
从unity 官网可以看到 存储文件是global-metadata.data
。
其中global-metadata.data 中有C#中的方法名、属性名、类名,字符串等。
(2)反编译GameAssembly.dll和global-metadata.data
接下来看看有没办法反编译一下,找到工具
可以通过Il2CppDumper dump 。https://github.com/Perfare/Il2CppDumper
使用Il2CppDumper 弹出两个文件选择框 先选择GameAssembly.dll 在选择global-metadata.data
然后当前文件夹出现DummyDll目录
其中Assemble-CSharp.dll 就是c#写的业务逻辑。
(3)使用反编译工具查看Assembly-CSharp.dll,这里用dnspy,
下面看c#的业务逻辑
发现这里没有代码,观察右边有RVA 和VA 这里其实对应的函数在GameAssembly.dll
Ida 打开GameAssembly.dll ,0x1807C1FD0对应的汇编代码
(4)接下来根据这些类和函数名大推测业务逻辑最终找到广告的类:
这里看到程序右下有个红色的按钮,猜测名字包含 buttonclose 然后在dnspy里搜索
找到这个可疑的类
X64dbg中先对onCloseAdButtonClick下断点,然后点击 那个红× 关闭按钮,发现断点来了说明找对地方了, 接下来就是对把初始化函数干掉,这样这个button 就不能正常创建了
最后做验证使用x64dbg patch 0x1808FDC50 ,广告消失了,干净的窗口
总结:
对于使用il2cpp 打包的程序,先找到对应的类的信息字符串等数据,
使用Il2CppDumper 弹出两个文件选择框 先选择GameAssembly.dll 在选择global-metadata.data,得到Assembly-CSharp.dll c#相关类和函数等信息
根据反编译分析业务逻辑,根据函数的rva 算出实际代码地址去下断点调试