在 mac osx 使用 Il2CppDumper 遇到的坑
Perfare大神的Il2CppDumper支援 .NET Core了!
Intro
最近研究reverse,剛好之前有看過unity遊戲的逆向
很久以前連組語都看不太懂,亂逆一通,想說再重新玩玩看,練練手
剛好發現Il2CppDumper更新了! 因為我用的是mac osx,
所以決定將新版Il2CppDumper 在mac上compile一次,這樣就不用開vm了!
配置與所需資源
- My mac osx is v10.15.4
- 其他版本與linux不確定,但理論上支援NET Core都應該可用
- .NET Core v3.1.404 (不是.NET喔)
- mono v6.12.0.107
- Il2CppDumper v6.4.19 (or higher) source code
坑
一開始開開心心的把netcore裝好,source code載好
就滿懷期待的cd進Il2CppDumper然後
dotnet build --runtime osx-x64
結果直接報錯….
The reference assemblies for framework ".NETFramework,Version=v4.7.2" were not found
由於完全沒搞C#的經驗,根本看不懂這是什麼問題…
所以想說那就照他講的,安裝.NETFramework吧,但一查,怎麼沒mac osx的載點…
mac根本不能直裝…
解法
後來終於在這找到了類似問題的解決方法
先下載最新的mono,再將.csproj檔的開頭處加上:
<Import Project="netfx.props" />
所以Il2CppDumper.csproj看起來會長這樣
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="netfx.props" />
<PropertyGroup>
以下省略
...
在csproj的同一目錄下,touch netfx.props
寫入以下內容:
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. -->
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<!-- When compiling .NET SDK 2.0 projects targeting .NET 4.x on Mono using 'dotnet build' you -->
<!-- have to teach MSBuild where the Mono copy of the reference asssemblies is -->
<TargetIsMono Condition="$(TargetFramework.StartsWith('net4')) and '$(OS)' == 'Unix'">true</TargetIsMono>
<!-- Look in the standard install locations -->
<BaseFrameworkPathOverrideForMono Condition="'$(BaseFrameworkPathOverrideForMono)' == '' AND '$(TargetIsMono)' == 'true' AND EXISTS('/Library/Frameworks/Mono.framework/Versions/Current/lib/mono')">/Library/Frameworks/Mono.framework/Versions/Current/lib/mono</BaseFrameworkPathOverrideForMono>
<BaseFrameworkPathOverrideForMono Condition="'$(BaseFrameworkPathOverrideForMono)' == '' AND '$(TargetIsMono)' == 'true' AND EXISTS('/usr/lib/mono')">/usr/lib/mono</BaseFrameworkPathOverrideForMono>
<BaseFrameworkPathOverrideForMono Condition="'$(BaseFrameworkPathOverrideForMono)' == '' AND '$(TargetIsMono)' == 'true' AND EXISTS('/usr/local/lib/mono')">/usr/local/lib/mono</BaseFrameworkPathOverrideForMono>
<!-- If we found Mono reference assemblies, then use them -->
<FrameworkPathOverride Condition="'$(BaseFrameworkPathOverrideForMono)' != '' AND '$(TargetFramework)' == 'net45'">$(BaseFrameworkPathOverrideForMono)/4.5-api</FrameworkPathOverride>
<FrameworkPathOverride Condition="'$(BaseFrameworkPathOverrideForMono)' != '' AND '$(TargetFramework)' == 'net451'">$(BaseFrameworkPathOverrideForMono)/4.5.1-api</FrameworkPathOverride>
<FrameworkPathOverride Condition="'$(BaseFrameworkPathOverrideForMono)' != '' AND '$(TargetFramework)' == 'net452'">$(BaseFrameworkPathOverrideForMono)/4.5.2-api</FrameworkPathOverride>
<FrameworkPathOverride Condition="'$(BaseFrameworkPathOverrideForMono)' != '' AND '$(TargetFramework)' == 'net46'">$(BaseFrameworkPathOverrideForMono)/4.6-api</FrameworkPathOverride>
<FrameworkPathOverride Condition="'$(BaseFrameworkPathOverrideForMono)' != '' AND '$(TargetFramework)' == 'net461'">$(BaseFrameworkPathOverrideForMono)/4.6.1-api</FrameworkPathOverride>
<FrameworkPathOverride Condition="'$(BaseFrameworkPathOverrideForMono)' != '' AND '$(TargetFramework)' == 'net462'">$(BaseFrameworkPathOverrideForMono)/4.6.2-api</FrameworkPathOverride>
<FrameworkPathOverride Condition="'$(BaseFrameworkPathOverrideForMono)' != '' AND '$(TargetFramework)' == 'net47'">$(BaseFrameworkPathOverrideForMono)/4.7-api</FrameworkPathOverride>
<FrameworkPathOverride Condition="'$(BaseFrameworkPathOverrideForMono)' != '' AND '$(TargetFramework)' == 'net471'">$(BaseFrameworkPathOverrideForMono)/4.7.1-api</FrameworkPathOverride>
<FrameworkPathOverride Condition="'$(BaseFrameworkPathOverrideForMono)' != '' AND '$(TargetFramework)' == 'net472'">$(BaseFrameworkPathOverrideForMono)/4.7.2-api</FrameworkPathOverride>
<EnableFrameworkPathOverride Condition="'$(BaseFrameworkPathOverrideForMono)' != ''">true</EnableFrameworkPathOverride>
<!-- Add the Facades directory. Not sure how else to do this. Necessary at least for .NET 4.5 -->
<AssemblySearchPaths Condition="'$(BaseFrameworkPathOverrideForMono)' != ''">$(FrameworkPathOverride)/Facades;$(AssemblySearchPaths)</AssemblySearchPaths>
</PropertyGroup>
</Project>
現在,就可以開心的dotnet build --runtime osx-x64
囉!
同理linux的--runtime
就改個linux-x64
即可
build完後可以在Debug/netcoreapp3.1/osx-64
中使用Il2CppDumper了!
usage: ./Il2CppDumper <executable-file> <global-metadata>
後記與閒聊
完全沒搞過C#,不會配置,網路上教學也少(至少我找不到),這篇主要是分享給跟我一樣的新手
同是天涯淪落人XD