Slight rebranding, add new README section, bump version to 2023.1

This commit is contained in:
LukeFZ
2023-12-01 09:53:01 +01:00
parent 5afe295ef0
commit 8755d99d63
6 changed files with 607 additions and 586 deletions

View File

@@ -9,7 +9,7 @@
<PublishTrimmed>false</PublishTrimmed> <PublishTrimmed>false</PublishTrimmed>
<RuntimeIdentifier>win-x64</RuntimeIdentifier> <RuntimeIdentifier>win-x64</RuntimeIdentifier>
<PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance> <PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
<Version>2021.1</Version> <Version>2023.1</Version>
<Company>Noisy Cow Studios</Company> <Company>Noisy Cow Studios</Company>
<Product>Il2CppInspector Command-Line Edition</Product> <Product>Il2CppInspector Command-Line Edition</Product>
<Copyright>(c) 2017-2021 Katy Coe - www.djkaty.com - www.github.com/djkaty</Copyright> <Copyright>(c) 2017-2021 Katy Coe - www.djkaty.com - www.github.com/djkaty</Copyright>

View File

@@ -4,7 +4,7 @@
<TargetFramework>net8.0</TargetFramework> <TargetFramework>net8.0</TargetFramework>
<AssemblyName>Il2CppInspector.Common</AssemblyName> <AssemblyName>Il2CppInspector.Common</AssemblyName>
<Authors>Katy Coe</Authors> <Authors>Katy Coe</Authors>
<Version>2021.1</Version> <Version>2023.1</Version>
<Company>Noisy Cow Studios</Company> <Company>Noisy Cow Studios</Company>
<Product>Il2CppInspector Shared Library</Product> <Product>Il2CppInspector Shared Library</Product>
<TargetsForTfmSpecificBuildOutput>$(TargetsForTfmSpecificBuildOutput);CopyProjectReferencesToPackage</TargetsForTfmSpecificBuildOutput> <TargetsForTfmSpecificBuildOutput>$(TargetsForTfmSpecificBuildOutput);CopyProjectReferencesToPackage</TargetsForTfmSpecificBuildOutput>

View File

@@ -1,22 +1,22 @@
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<OutputType>WinExe</OutputType> <OutputType>WinExe</OutputType>
<TargetFramework>net8.0-windows7.0</TargetFramework> <TargetFramework>net8.0-windows</TargetFramework>
<PublishSingleFile>true</PublishSingleFile> <PublishSingleFile>true</PublishSingleFile>
<!-- Plugins may require bass class library assemblies we're not using so disable trimming --> <!-- Plugins may require bass class library assemblies we're not using so disable trimming -->
<PublishTrimmed>false</PublishTrimmed> <PublishTrimmed>false</PublishTrimmed>
<RuntimeIdentifier>win-x64</RuntimeIdentifier> <RuntimeIdentifier>win-x64</RuntimeIdentifier>
<UseWPF>true</UseWPF> <UseWPF>true</UseWPF>
<AssemblyName>Il2CppInspector</AssemblyName> <AssemblyName>Il2CppInspector</AssemblyName>
<Version>2021.1</Version> <Version>2023.1</Version>
<Authors>Katy Coe</Authors> <Authors>Katy Coe, LukeFZ</Authors>
<Company>Noisy Cow Studios</Company> <Company>Noisy Cow Studios</Company>
<Product>Il2CppInspector Windows Edition</Product> <Product>Il2CppInspectorRedux Windows Edition</Product>
<ApplicationManifest>app.manifest</ApplicationManifest> <ApplicationManifest>app.manifest</ApplicationManifest>
<ApplicationIcon>Il2CppInspector.ico</ApplicationIcon> <ApplicationIcon>Il2CppInspector.ico</ApplicationIcon>
<AssemblyVersion>2021.1.0.0</AssemblyVersion> <AssemblyVersion>2023.1.0.0</AssemblyVersion>
<FileVersion>2021.1.0.0</FileVersion> <FileVersion>2023.1.0.0</FileVersion>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">

View File

@@ -1,488 +1,491 @@
<Window x:Class="Il2CppInspectorGUI.MainWindow" <Window x:Class="Il2CppInspectorGUI.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:Il2CppInspectorGUI" xmlns:local="clr-namespace:Il2CppInspectorGUI"
xmlns:gif="https://github.com/XamlAnimatedGif/XamlAnimatedGif" xmlns:gif="https://github.com/XamlAnimatedGif/XamlAnimatedGif"
mc:Ignorable="d" mc:Ignorable="d"
Title="Il2CppInspector" Height="850" Width="1100" Background="White" Title="Il2CppInspectorRedux" Height="850" Width="1100" Background="White"
WindowStartupLocation="CenterScreen" WindowStartupLocation="CenterScreen"
ContentRendered="MainWindow_OnContentRendered" ContentRendered="MainWindow_OnContentRendered"
Drop="MainWindow_OnDrop"> Drop="MainWindow_OnDrop">
<Window.Resources> <Window.Resources>
<!-- Image list --> <!-- Image list -->
<DataTemplate x:Key="ImageListTemplate"> <DataTemplate x:Key="ImageListTemplate">
<TextBlock> <TextBlock>
<TextBlock.Text> <TextBlock.Text>
<MultiBinding StringFormat="{}{2}-bit {1} ({0})"> <MultiBinding StringFormat="{}{2}-bit {1} ({0})">
<Binding Path="Package.BinaryImage.Format"></Binding> <Binding Path="Package.BinaryImage.Format"></Binding>
<Binding Path="Package.BinaryImage.Arch"></Binding> <Binding Path="Package.BinaryImage.Arch"></Binding>
<Binding Path="Package.BinaryImage.Bits"></Binding> <Binding Path="Package.BinaryImage.Bits"></Binding>
</MultiBinding> </MultiBinding>
</TextBlock.Text> </TextBlock.Text>
</TextBlock> </TextBlock>
</DataTemplate> </DataTemplate>
<!-- Namespace checkbox tree items --> <!-- Namespace checkbox tree items -->
<HierarchicalDataTemplate x:Key="NamespaceTreeItemTemplate" DataType="{x:Type local:CheckboxNode}" ItemsSource="{Binding Children}"> <HierarchicalDataTemplate x:Key="NamespaceTreeItemTemplate" DataType="{x:Type local:CheckboxNode}" ItemsSource="{Binding Children}">
<CheckBox Focusable="False" IsChecked="{Binding IsChecked}" VerticalAlignment="Center" Content="{Binding Name}"/> <CheckBox Focusable="False" IsChecked="{Binding IsChecked}" VerticalAlignment="Center" Content="{Binding Name}"/>
</HierarchicalDataTemplate> </HierarchicalDataTemplate>
</Window.Resources> </Window.Resources>
<!-- Enable/disable drag & drop dynamically --> <!-- Enable/disable drag & drop dynamically -->
<Window.Style> <Window.Style>
<Style TargetType="{x:Type Window}"> <Style TargetType="{x:Type Window}">
<Style.Triggers> <Style.Triggers>
<DataTrigger Binding="{Binding ElementName=grdFirstPage, Path=Visibility}" Value="Visible"> <DataTrigger Binding="{Binding ElementName=grdFirstPage, Path=Visibility}" Value="Visible">
<Setter Property="AllowDrop" Value="True"/> <Setter Property="AllowDrop" Value="True"/>
</DataTrigger> </DataTrigger>
<DataTrigger Binding="{Binding ElementName=btnSelectBinaryFile, Path=Visibility}" Value="Visible"> <DataTrigger Binding="{Binding ElementName=btnSelectBinaryFile, Path=Visibility}" Value="Visible">
<Setter Property="AllowDrop" Value="True"/> <Setter Property="AllowDrop" Value="True"/>
</DataTrigger> </DataTrigger>
</Style.Triggers> </Style.Triggers>
</Style> </Style>
</Window.Style> </Window.Style>
<!-- Window content --> <!-- Window content -->
<Grid> <Grid>
<!-- Main content --> <!-- Main content -->
<Grid Margin="5"> <Grid Margin="5">
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height ="100*" /> <RowDefinition Height ="100*" />
<RowDefinition Height ="40" /> <RowDefinition Height ="40" />
</Grid.RowDefinitions> </Grid.RowDefinitions>
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="330"></ColumnDefinition> <ColumnDefinition Width="330"></ColumnDefinition>
<ColumnDefinition Width="25"></ColumnDefinition> <ColumnDefinition Width="25"></ColumnDefinition>
<ColumnDefinition Width="*"></ColumnDefinition> <ColumnDefinition Width="*"></ColumnDefinition>
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<DockPanel DockPanel.Dock="Left"> <DockPanel DockPanel.Dock="Left">
<!-- List of images in the binary file --> <!-- List of images in the binary file -->
<Label DockPanel.Dock="Top" Foreground="{StaticResource WindowsBlue}" FontSize="18">Select image</Label> <Label DockPanel.Dock="Top" Foreground="{StaticResource WindowsBlue}" FontSize="18">Select image</Label>
<ListBox DockPanel.Dock="Top" Name="lstImages" ItemTemplate="{StaticResource ImageListTemplate}" Height="80" SelectionChanged="LstImages_OnSelectionChanged"/> <ListBox DockPanel.Dock="Top" Name="lstImages" ItemTemplate="{StaticResource ImageListTemplate}" Height="80" SelectionChanged="LstImages_OnSelectionChanged"/>
<!-- Footer text --> <!-- Footer text -->
<TextBlock DockPanel.Dock="Bottom" TextWrapping="WrapWithOverflow" Margin="5"> <TextBlock DockPanel.Dock="Bottom" TextWrapping="WrapWithOverflow" Margin="5">
If you find this tool useful, please donate to help support its continued development!<LineBreak/> If you find this tool useful, please donate to help support its continued development!<LineBreak/>
Donate via <Hyperlink NavigateUri="http://paypal.me/djkaty" RequestNavigate="Hyperlink_OnRequestNavigate">PayPal</Hyperlink><LineBreak/> Donate to LukeFZ via <Hyperlink NavigateUri="http://buymeacoffee.com/LukeFZ" RequestNavigate="Hyperlink_OnRequestNavigate">BuyMeACoffee</Hyperlink>
Donate with bitcoin:<LineBreak/><TextBox IsReadOnly="True">3FoRUqUXgYj8NY8sMQfhX6vv9LqR3e2kzz</TextBox><LineBreak/> Donate to LukeFZ via <Hyperlink NavigateUri="http://patreon.com/LukeFZ" RequestNavigate="Hyperlink_OnRequestNavigate">Patreon</Hyperlink>
<LineBreak/> Donate to djkaty via <Hyperlink NavigateUri="http://paypal.me/djkaty" RequestNavigate="Hyperlink_OnRequestNavigate">PayPal</Hyperlink><LineBreak/>
<Hyperlink NavigateUri="https://github.com/djkaty/Il2CppInspector" RequestNavigate="Hyperlink_OnRequestNavigate">Il2CppInspector on GitHub</Hyperlink><LineBreak/> Donate to djkaty with bitcoin:<LineBreak/><TextBox IsReadOnly="True">3FoRUqUXgYj8NY8sMQfhX6vv9LqR3e2kzz</TextBox><LineBreak/>
<Hyperlink NavigateUri="http://www.djkaty.com" RequestNavigate="Hyperlink_OnRequestNavigate">www.djkaty.com</Hyperlink><LineBreak/> <LineBreak/>
&#169; Katy Coe 2017-2021 <Hyperlink NavigateUri="https://github.com/LukeFZ/Il2CppInspectorRedux" RequestNavigate="Hyperlink_OnRequestNavigate">Il2CppInspectorRedux on GitHub</Hyperlink><LineBreak/>
</TextBlock> <Hyperlink NavigateUri="https://github.com/LukeFZ" RequestNavigate="Hyperlink_OnRequestNavigate">https://github.com/LukeFZ</Hyperlink><LineBreak/>
<Hyperlink NavigateUri="http://www.djkaty.com" RequestNavigate="Hyperlink_OnRequestNavigate">www.djkaty.com</Hyperlink><LineBreak/>
<!-- Image details view --> &#169; Katy Coe 2017-2021, LukeFZ 2023
<Label DockPanel.Dock="Top" Foreground="{StaticResource WindowsBlue}" FontSize="18">Image information</Label> </TextBlock>
<Grid DockPanel.Dock="Top" Name="gridImageDetails" DataContext="{Binding ElementName=lstImages, Path=SelectedItem.Package}"> <!-- Image details view -->
<Grid.RowDefinitions> <Label DockPanel.Dock="Top" Foreground="{StaticResource WindowsBlue}" FontSize="18">Image information</Label>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition> <Grid DockPanel.Dock="Top" Name="gridImageDetails" DataContext="{Binding ElementName=lstImages, Path=SelectedItem.Package}">
<RowDefinition Height="Auto"></RowDefinition> <Grid.RowDefinitions>
<RowDefinition Height="Auto"></RowDefinition> <RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition> <RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition> <RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition> <RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition> <RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition> <RowDefinition Height="Auto"></RowDefinition>
</Grid.RowDefinitions> <RowDefinition Height="Auto"></RowDefinition>
<Grid.ColumnDefinitions> <RowDefinition Height="Auto"></RowDefinition>
<ColumnDefinition Width="70*"></ColumnDefinition> <RowDefinition Height="Auto"></RowDefinition>
<ColumnDefinition Width="30*"></ColumnDefinition> </Grid.RowDefinitions>
</Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<Label Grid.Row="0" Grid.Column="0" Content="IL2CPP version"></Label> <ColumnDefinition Width="70*"></ColumnDefinition>
<Label Grid.Row="0" Grid.Column="1" Content="{Binding Path=Version}"></Label> <ColumnDefinition Width="30*"></ColumnDefinition>
<Label Grid.Row="1" Grid.Column="0" Content="Container format"></Label> </Grid.ColumnDefinitions>
<Label Grid.Row="1" Grid.Column="1" Content="{Binding Path=BinaryImage.Format}"></Label> <Label Grid.Row="0" Grid.Column="0" Content="IL2CPP version"></Label>
<Label Grid.Row="2" Grid.Column="0" Content="Container endianness"></Label> <Label Grid.Row="0" Grid.Column="1" Content="{Binding Path=Version}"></Label>
<Label Grid.Row="2" Grid.Column="1" Content="{Binding Path=BinaryImage.Endianness}"></Label> <Label Grid.Row="1" Grid.Column="0" Content="Container format"></Label>
<Label Grid.Row="3" Grid.Column="0" Content="Architecture"></Label> <Label Grid.Row="1" Grid.Column="1" Content="{Binding Path=BinaryImage.Format}"></Label>
<Label Grid.Row="3" Grid.Column="1" Content="{Binding Path=BinaryImage.Arch}"></Label> <Label Grid.Row="2" Grid.Column="0" Content="Container endianness"></Label>
<Label Grid.Row="4" Grid.Column="0" Content="Architecture word size"></Label> <Label Grid.Row="2" Grid.Column="1" Content="{Binding Path=BinaryImage.Endianness}"></Label>
<Label Grid.Row="4" Grid.Column="1" Content="{Binding Path=BinaryImage.Bits}" ContentStringFormat="{}{0}-bit"></Label> <Label Grid.Row="3" Grid.Column="0" Content="Architecture"></Label>
<Label Grid.Row="5" Grid.Column="0" Content="Code image-to-VA positive offset"></Label> <Label Grid.Row="3" Grid.Column="1" Content="{Binding Path=BinaryImage.Arch}"></Label>
<Label Grid.Row="5" Grid.Column="1" Content="{Binding Path=BinaryImage.GlobalOffset}" ContentStringFormat="0x{0:x8}"></Label> <Label Grid.Row="4" Grid.Column="0" Content="Architecture word size"></Label>
<Label Grid.Row="6" Grid.Column="0" Content="MetadataRegistration address"></Label> <Label Grid.Row="4" Grid.Column="1" Content="{Binding Path=BinaryImage.Bits}" ContentStringFormat="{}{0}-bit"></Label>
<Label Grid.Row="6" Grid.Column="1" Content="{Binding Path=Binary.MetadataRegistrationPointer}" ContentStringFormat="0x{0:x8}"></Label> <Label Grid.Row="5" Grid.Column="0" Content="Code image-to-VA positive offset"></Label>
<Label Grid.Row="7" Grid.Column="0" Content="CodeRegistration address"></Label> <Label Grid.Row="5" Grid.Column="1" Content="{Binding Path=BinaryImage.GlobalOffset}" ContentStringFormat="0x{0:x8}"></Label>
<Label Grid.Row="7" Grid.Column="1" Content="{Binding Path=Binary.CodeRegistrationPointer}" ContentStringFormat="0x{0:x8}"></Label> <Label Grid.Row="6" Grid.Column="0" Content="MetadataRegistration address"></Label>
<Label Grid.Row="8" Grid.Column="0" Content="Il2CppCodeRegistration function"></Label> <Label Grid.Row="6" Grid.Column="1" Content="{Binding Path=Binary.MetadataRegistrationPointer}" ContentStringFormat="0x{0:x8}"></Label>
<Label Grid.Row="8" Grid.Column="1" Content="{Binding Path=Binary.RegistrationFunctionPointer}" ContentStringFormat="0x{0:x8}"></Label> <Label Grid.Row="7" Grid.Column="0" Content="CodeRegistration address"></Label>
</Grid> <Label Grid.Row="7" Grid.Column="1" Content="{Binding Path=Binary.CodeRegistrationPointer}" ContentStringFormat="0x{0:x8}"></Label>
<Label Grid.Row="8" Grid.Column="0" Content="Il2CppCodeRegistration function"></Label>
<!-- Unity asset file button --> <Label Grid.Row="8" Grid.Column="1" Content="{Binding Path=Binary.RegistrationFunctionPointer}" ContentStringFormat="0x{0:x8}"></Label>
<Button Name="btnUnityAsset" Click="BtnUnityAsset_Click" DockPanel.Dock="Top" Margin="10" Padding="5" HorizontalAlignment="Left" VerticalAlignment="Top" FontSize="14" Width="260" Content="Get Unity version from asset file..." Style="{StaticResource LightBoxButton}"/> </Grid>
<!-- Save file buttons --> <!-- Unity asset file button -->
<Button Name="btnSaveMetadata" Click="BtnSaveMetadata_OnClick" DockPanel.Dock="Top" Margin="10" Padding="5" HorizontalAlignment="Left" VerticalAlignment="Top" FontSize="14" Width="260" Content="Save extracted/decrypted metadata..."> <Button Name="btnUnityAsset" Click="BtnUnityAsset_Click" DockPanel.Dock="Top" Margin="10" Padding="5" HorizontalAlignment="Left" VerticalAlignment="Top" FontSize="14" Width="260" Content="Get Unity version from asset file..." Style="{StaticResource LightBoxButton}"/>
<Button.Style>
<Style BasedOn="{StaticResource LightBoxButton}" TargetType="{x:Type Button}"> <!-- Save file buttons -->
<Style.Triggers> <Button Name="btnSaveMetadata" Click="BtnSaveMetadata_OnClick" DockPanel.Dock="Top" Margin="10" Padding="5" HorizontalAlignment="Left" VerticalAlignment="Top" FontSize="14" Width="260" Content="Save extracted/decrypted metadata...">
<DataTrigger Binding="{Binding ElementName=areaBusyIndicator, Path=Visibility}" Value="Visible"> <Button.Style>
<Setter Property="Button.IsEnabled" Value="False"/> <Style BasedOn="{StaticResource LightBoxButton}" TargetType="{x:Type Button}">
</DataTrigger> <Style.Triggers>
<MultiDataTrigger> <DataTrigger Binding="{Binding ElementName=areaBusyIndicator, Path=Visibility}" Value="Visible">
<MultiDataTrigger.Conditions> <Setter Property="Button.IsEnabled" Value="False"/>
<Condition Binding="{Binding ElementName=lstImages, Path=SelectedItem.Package.Metadata.IsModified}" Value="False" /> </DataTrigger>
<Condition Binding="{Binding Path=IsExtractedFromPackage}" Value="False" /> <MultiDataTrigger>
</MultiDataTrigger.Conditions> <MultiDataTrigger.Conditions>
<Setter Property="Button.IsEnabled" Value="False"/> <Condition Binding="{Binding ElementName=lstImages, Path=SelectedItem.Package.Metadata.IsModified}" Value="False" />
</MultiDataTrigger> <Condition Binding="{Binding Path=IsExtractedFromPackage}" Value="False" />
</Style.Triggers> </MultiDataTrigger.Conditions>
</Style> <Setter Property="Button.IsEnabled" Value="False"/>
</Button.Style> </MultiDataTrigger>
</Button> </Style.Triggers>
</Style>
<Button Name="btnSaveBinary" Click="BtnSaveBinary_OnClick" DockPanel.Dock="Top" Margin="10,2,10,10" Padding="5" HorizontalAlignment="Left" VerticalAlignment="Top" FontSize="14" Width="260" Content="Save extracted/decrypted binary..."> </Button.Style>
<Button.Style> </Button>
<Style BasedOn="{StaticResource LightBoxButton}" TargetType="{x:Type Button}">
<Style.Triggers> <Button Name="btnSaveBinary" Click="BtnSaveBinary_OnClick" DockPanel.Dock="Top" Margin="10,2,10,10" Padding="5" HorizontalAlignment="Left" VerticalAlignment="Top" FontSize="14" Width="260" Content="Save extracted/decrypted binary...">
<DataTrigger Binding="{Binding ElementName=areaBusyIndicator, Path=Visibility}" Value="Visible"> <Button.Style>
<Setter Property="Button.IsEnabled" Value="False"/> <Style BasedOn="{StaticResource LightBoxButton}" TargetType="{x:Type Button}">
</DataTrigger> <Style.Triggers>
<MultiDataTrigger> <DataTrigger Binding="{Binding ElementName=areaBusyIndicator, Path=Visibility}" Value="Visible">
<MultiDataTrigger.Conditions> <Setter Property="Button.IsEnabled" Value="False"/>
<Condition Binding="{Binding ElementName=lstImages, Path=SelectedItem.Package.Binary.IsModified}" Value="False" /> </DataTrigger>
<Condition Binding="{Binding Path=IsExtractedFromPackage}" Value="False" /> <MultiDataTrigger>
</MultiDataTrigger.Conditions> <MultiDataTrigger.Conditions>
<Setter Property="Button.IsEnabled" Value="False"/> <Condition Binding="{Binding ElementName=lstImages, Path=SelectedItem.Package.Binary.IsModified}" Value="False" />
</MultiDataTrigger> <Condition Binding="{Binding Path=IsExtractedFromPackage}" Value="False" />
</Style.Triggers> </MultiDataTrigger.Conditions>
</Style> <Setter Property="Button.IsEnabled" Value="False"/>
</Button.Style> </MultiDataTrigger>
</Button> </Style.Triggers>
</DockPanel> </Style>
<Separator Grid.Row="0" Grid.Column="1" Grid.RowSpan="2" Margin="5,5,10,5"> </Button.Style>
<Separator.LayoutTransform> </Button>
<RotateTransform Angle="90"></RotateTransform> </DockPanel>
</Separator.LayoutTransform> <Separator Grid.Row="0" Grid.Column="1" Grid.RowSpan="2" Margin="5,5,10,5">
</Separator> <Separator.LayoutTransform>
<RotateTransform Angle="90"></RotateTransform>
<!-- Image selection prompt that automatically disappears when an image is selected --> </Separator.LayoutTransform>
<Label Name="lblChooseImagePrompt" Grid.Row="0" Grid.Column="2" Grid.RowSpan="2" Foreground="{StaticResource WindowsBlue}" FontSize="24" </Separator>
HorizontalAlignment="Center" VerticalAlignment="Center">
<Label.Content>Select an image on the left</Label.Content> <!-- Image selection prompt that automatically disappears when an image is selected -->
<Label.Style> <Label Name="lblChooseImagePrompt" Grid.Row="0" Grid.Column="2" Grid.RowSpan="2" Foreground="{StaticResource WindowsBlue}" FontSize="24"
<Style> HorizontalAlignment="Center" VerticalAlignment="Center">
<Setter Property="Label.Visibility" Value="Hidden"/> <Label.Content>Select an image on the left</Label.Content>
<Style.Triggers> <Label.Style>
<DataTrigger Binding="{Binding ElementName=lstImages, Path=SelectedItem}" Value="{x:Null}"> <Style>
<Setter Property="Label.Visibility" Value="Visible"/> <Setter Property="Label.Visibility" Value="Hidden"/>
</DataTrigger> <Style.Triggers>
</Style.Triggers> <DataTrigger Binding="{Binding ElementName=lstImages, Path=SelectedItem}" Value="{x:Null}">
</Style> <Setter Property="Label.Visibility" Value="Visible"/>
</Label.Style> </DataTrigger>
</Label> </Style.Triggers>
</Style>
<!-- Output configuration --> </Label.Style>
<DockPanel Name="pnlOutputSettings" Grid.Row="0" Grid.Column="2" Grid.RowSpan="2"> </Label>
<!-- Show preferences only when an image is selected --> <!-- Output configuration -->
<DockPanel.Style> <DockPanel Name="pnlOutputSettings" Grid.Row="0" Grid.Column="2" Grid.RowSpan="2">
<Style>
<Setter Property="DockPanel.Visibility" Value="Visible"/> <!-- Show preferences only when an image is selected -->
<Style.Triggers> <DockPanel.Style>
<DataTrigger Binding="{Binding ElementName=lstImages, Path=SelectedItem}" Value="{x:Null}"> <Style>
<Setter Property="DockPanel.Visibility" Value="Hidden"/> <Setter Property="DockPanel.Visibility" Value="Visible"/>
</DataTrigger> <Style.Triggers>
</Style.Triggers> <DataTrigger Binding="{Binding ElementName=lstImages, Path=SelectedItem}" Value="{x:Null}">
</Style> <Setter Property="DockPanel.Visibility" Value="Hidden"/>
</DockPanel.Style> </DataTrigger>
</Style.Triggers>
<!-- Export button --> </Style>
<Button Name="btnExport" Click="BtnExport_OnClick" DockPanel.Dock="Bottom" Margin="2" HorizontalAlignment="Right" VerticalAlignment="Bottom" FontSize="18" Width="120" Content="Export"> </DockPanel.Style>
<Button.Style>
<Style BasedOn="{StaticResource LightBoxButton}" TargetType="{x:Type Button}"> <!-- Export button -->
<Style.Triggers> <Button Name="btnExport" Click="BtnExport_OnClick" DockPanel.Dock="Bottom" Margin="2" HorizontalAlignment="Right" VerticalAlignment="Bottom" FontSize="18" Width="120" Content="Export">
<DataTrigger Binding="{Binding ElementName=areaBusyIndicator, Path=Visibility}" Value="Visible"> <Button.Style>
<Setter Property="Button.IsEnabled" Value="False"/> <Style BasedOn="{StaticResource LightBoxButton}" TargetType="{x:Type Button}">
</DataTrigger> <Style.Triggers>
</Style.Triggers> <DataTrigger Binding="{Binding ElementName=areaBusyIndicator, Path=Visibility}" Value="Visible">
</Style> <Setter Property="Button.IsEnabled" Value="False"/>
</Button.Style> </DataTrigger>
</Button> </Style.Triggers>
</Style>
<DockPanel DockPanel.Dock="Top"> </Button.Style>
<!-- List of namespaces to export --> </Button>
<DockPanel DockPanel.Dock="Right" Width="230">
<Label DockPanel.Dock="Top" Foreground="{StaticResource WindowsBlue}" FontSize="18">Namespaces</Label> <DockPanel DockPanel.Dock="Top">
<TextBlock DockPanel.Dock="Top" TextWrapping="WrapWithOverflow" Margin="10,0,5,5">This only applies to C# prototypes output</TextBlock> <!-- List of namespaces to export -->
<DockPanel DockPanel.Dock="Right" Width="230">
<StackPanel DockPanel.Dock="Top" Margin="10,0,5,5" Orientation="Horizontal"> <Label DockPanel.Dock="Top" Foreground="{StaticResource WindowsBlue}" FontSize="18">Namespaces</Label>
<Button Margin="2,0,5,0" Width="103" Click="SelectAllNamespaces_Click">Select all</Button> <TextBlock DockPanel.Dock="Top" TextWrapping="WrapWithOverflow" Margin="10,0,5,5">This only applies to C# prototypes output</TextBlock>
<Button Width="103" Click="SelectNoneNamespaces_Click">Select none</Button>
</StackPanel> <StackPanel DockPanel.Dock="Top" Margin="10,0,5,5" Orientation="Horizontal">
<Button Margin="2,0,5,0" Width="103" Click="SelectAllNamespaces_Click">Select all</Button>
<TreeView DockPanel.Dock="Bottom" Name="trvNamespaces" ItemTemplate="{StaticResource NamespaceTreeItemTemplate}" Width="210" Margin="10,5,5,5"></TreeView> <Button Width="103" Click="SelectNoneNamespaces_Click">Select none</Button>
</DockPanel> </StackPanel>
<!-- Settings --> <TreeView DockPanel.Dock="Bottom" Name="trvNamespaces" ItemTemplate="{StaticResource NamespaceTreeItemTemplate}" Width="210" Margin="10,5,5,5"></TreeView>
<ScrollViewer Padding="6"> </DockPanel>
<StackPanel DockPanel.Dock="Left">
<Label Foreground="{StaticResource WindowsBlue}" FontSize="18">Configure output</Label> <!-- Settings -->
<ScrollViewer Padding="6">
<!-- C# code stubs output --> <StackPanel DockPanel.Dock="Left">
<RadioButton GroupName="grpOutputType" Name="rdoOutputCSharp" IsChecked="True" VerticalContentAlignment="Center" FontSize="18" Foreground="{StaticResource MicrosoftGreen}">C# prototypes</RadioButton> <Label Foreground="{StaticResource WindowsBlue}" FontSize="18">Configure output</Label>
<GroupBox Header="Layout" Margin="5" Padding="5">
<StackPanel> <!-- C# code stubs output -->
<StackPanel.Style> <RadioButton GroupName="grpOutputType" Name="rdoOutputCSharp" IsChecked="True" VerticalContentAlignment="Center" FontSize="18" Foreground="{StaticResource MicrosoftGreen}">C# prototypes</RadioButton>
<Style> <GroupBox Header="Layout" Margin="5" Padding="5">
<Style.Triggers> <StackPanel>
<DataTrigger Binding="{Binding ElementName=rdoOutputSolution, Path=IsChecked}" Value="True"> <StackPanel.Style>
<Setter Property="Control.IsEnabled" Value="False"/> <Style>
</DataTrigger> <Style.Triggers>
</Style.Triggers> <DataTrigger Binding="{Binding ElementName=rdoOutputSolution, Path=IsChecked}" Value="True">
</Style> <Setter Property="Control.IsEnabled" Value="False"/>
</StackPanel.Style> </DataTrigger>
</Style.Triggers>
<RadioButton Name="rdoLayoutSingle" IsChecked="True">Single file</RadioButton> </Style>
<RadioButton Name="rdoLayoutNamespace">File per namespace</RadioButton> </StackPanel.Style>
<RadioButton Name="rdoLayoutAssembly">File per assembly</RadioButton>
<RadioButton Name="rdoLayoutClass">File per class</RadioButton> <RadioButton Name="rdoLayoutSingle" IsChecked="True">Single file</RadioButton>
<RadioButton Name="rdoLayoutTree" Content="Tree layout"> <RadioButton Name="rdoLayoutNamespace">File per namespace</RadioButton>
<RadioButton.Style> <RadioButton Name="rdoLayoutAssembly">File per assembly</RadioButton>
<Style> <RadioButton Name="rdoLayoutClass">File per class</RadioButton>
<Style.Triggers> <RadioButton Name="rdoLayoutTree" Content="Tree layout">
<DataTrigger Binding="{Binding ElementName=rdoOutputSolution, Path=IsChecked}" Value="True"> <RadioButton.Style>
<Setter Property="RadioButton.IsChecked" Value="True"/> <Style>
</DataTrigger> <Style.Triggers>
</Style.Triggers> <DataTrigger Binding="{Binding ElementName=rdoOutputSolution, Path=IsChecked}" Value="True">
</Style> <Setter Property="RadioButton.IsChecked" Value="True"/>
</RadioButton.Style> </DataTrigger>
</RadioButton> </Style.Triggers>
</StackPanel> </Style>
</GroupBox> </RadioButton.Style>
</RadioButton>
<CheckBox Name="cbFlattenHierarchy" Margin="2" Content="Don't nest folders (flatten hierarchy)"> </StackPanel>
<CheckBox.Style> </GroupBox>
<Style>
<Style.Triggers> <CheckBox Name="cbFlattenHierarchy" Margin="2" Content="Don't nest folders (flatten hierarchy)">
<DataTrigger Binding="{Binding ElementName=rdoLayoutSingle, Path=IsChecked}" Value="True"> <CheckBox.Style>
<Setter Property="Control.IsEnabled" Value="False"/> <Style>
</DataTrigger> <Style.Triggers>
<DataTrigger Binding="{Binding ElementName=rdoLayoutAssembly, Path=IsChecked}" Value="True"> <DataTrigger Binding="{Binding ElementName=rdoLayoutSingle, Path=IsChecked}" Value="True">
<Setter Property="Control.IsEnabled" Value="False"/> <Setter Property="Control.IsEnabled" Value="False"/>
</DataTrigger> </DataTrigger>
</Style.Triggers> <DataTrigger Binding="{Binding ElementName=rdoLayoutAssembly, Path=IsChecked}" Value="True">
</Style> <Setter Property="Control.IsEnabled" Value="False"/>
</CheckBox.Style> </DataTrigger>
</CheckBox> </Style.Triggers>
</Style>
<!-- Sorting (only available with single file, namespace and assembly output --> </CheckBox.Style>
<GroupBox Margin="5" Padding="5"> </CheckBox>
<!-- Replace TextBlock with Label in header template so that it greys out when the GroupBox is disabled -->
<GroupBox.Header> <!-- Sorting (only available with single file, namespace and assembly output -->
<Label Content="Type sorting" Padding="0"/> <GroupBox Margin="5" Padding="5">
</GroupBox.Header> <!-- Replace TextBlock with Label in header template so that it greys out when the GroupBox is disabled -->
<GroupBox.Style> <GroupBox.Header>
<Style> <Label Content="Type sorting" Padding="0"/>
<Style.Triggers> </GroupBox.Header>
<DataTrigger Binding="{Binding ElementName=rdoLayoutClass, Path=IsChecked}" Value="True"> <GroupBox.Style>
<Setter Property="Control.IsEnabled" Value="False"/> <Style>
</DataTrigger> <Style.Triggers>
<DataTrigger Binding="{Binding ElementName=rdoLayoutTree, Path=IsChecked}" Value="True"> <DataTrigger Binding="{Binding ElementName=rdoLayoutClass, Path=IsChecked}" Value="True">
<Setter Property="Control.IsEnabled" Value="False"/> <Setter Property="Control.IsEnabled" Value="False"/>
</DataTrigger> </DataTrigger>
</Style.Triggers> <DataTrigger Binding="{Binding ElementName=rdoLayoutTree, Path=IsChecked}" Value="True">
</Style> <Setter Property="Control.IsEnabled" Value="False"/>
</GroupBox.Style> </DataTrigger>
<StackPanel> </Style.Triggers>
<RadioButton Name="rdoSortName" IsChecked="True">Alphabetical</RadioButton> </Style>
<RadioButton Name="rdoSortIndex">Type definition index</RadioButton> </GroupBox.Style>
</StackPanel> <StackPanel>
</GroupBox> <RadioButton Name="rdoSortName" IsChecked="True">Alphabetical</RadioButton>
<RadioButton Name="rdoSortIndex">Type definition index</RadioButton>
<CheckBox Name="cbSuppressMetadata" Margin="2">Suppress pointer, offset and index metadata comments</CheckBox> </StackPanel>
<CheckBox Name="cbMustCompile" Margin="2" Content="Attempt to generate output that compiles"> </GroupBox>
<CheckBox.Style>
<Style> <CheckBox Name="cbSuppressMetadata" Margin="2">Suppress pointer, offset and index metadata comments</CheckBox>
<Style.Triggers> <CheckBox Name="cbMustCompile" Margin="2" Content="Attempt to generate output that compiles">
<DataTrigger Binding="{Binding ElementName=rdoOutputSolution, Path=IsChecked}" Value="True"> <CheckBox.Style>
<Setter Property="CheckBox.IsChecked" Value="True"/> <Style>
<Setter Property="Control.IsEnabled" Value="False"/> <Style.Triggers>
</DataTrigger> <DataTrigger Binding="{Binding ElementName=rdoOutputSolution, Path=IsChecked}" Value="True">
</Style.Triggers> <Setter Property="CheckBox.IsChecked" Value="True"/>
</Style> <Setter Property="Control.IsEnabled" Value="False"/>
</CheckBox.Style> </DataTrigger>
</CheckBox> </Style.Triggers>
</Style>
<CheckBox Name="cbSeparateAttributes" Margin="2" Content="Place assembly-level attributes in separate files"> </CheckBox.Style>
<CheckBox.Style> </CheckBox>
<Style>
<Setter Property="CheckBox.IsChecked" Value="True"/> <CheckBox Name="cbSeparateAttributes" Margin="2" Content="Place assembly-level attributes in separate files">
<Setter Property="Control.IsEnabled" Value="False"/> <CheckBox.Style>
<Style.Triggers> <Style>
<DataTrigger Binding="{Binding ElementName=rdoLayoutAssembly, Path=IsChecked}" Value="True"> <Setter Property="CheckBox.IsChecked" Value="True"/>
<Setter Property="Control.IsEnabled" Value="True"/> <Setter Property="Control.IsEnabled" Value="False"/>
</DataTrigger> <Style.Triggers>
<DataTrigger Binding="{Binding ElementName=rdoLayoutTree, Path=IsChecked}" Value="True"> <DataTrigger Binding="{Binding ElementName=rdoLayoutAssembly, Path=IsChecked}" Value="True">
<Setter Property="Control.IsEnabled" Value="True"/> <Setter Property="Control.IsEnabled" Value="True"/>
</DataTrigger> </DataTrigger>
<DataTrigger Binding="{Binding ElementName=rdoOutputSolution, Path=IsChecked}" Value="True"> <DataTrigger Binding="{Binding ElementName=rdoLayoutTree, Path=IsChecked}" Value="True">
<Setter Property="CheckBox.IsChecked" Value="True"/> <Setter Property="Control.IsEnabled" Value="True"/>
<Setter Property="Control.IsEnabled" Value="False"/> </DataTrigger>
</DataTrigger> <DataTrigger Binding="{Binding ElementName=rdoOutputSolution, Path=IsChecked}" Value="True">
</Style.Triggers> <Setter Property="CheckBox.IsChecked" Value="True"/>
</Style> <Setter Property="Control.IsEnabled" Value="False"/>
</CheckBox.Style> </DataTrigger>
</CheckBox> </Style.Triggers>
</Style>
<Separator Margin="5,15,5,15"/> </CheckBox.Style>
</CheckBox>
<!-- Visual Studio solution -->
<RadioButton GroupName="grpOutputType" Name="rdoOutputSolution" VerticalContentAlignment="Center" FontSize="18" Foreground="{StaticResource MicrosoftGreen}">Visual Studio solution</RadioButton> <Separator Margin="5,15,5,15"/>
<TextBlock TextWrapping="WrapWithOverflow">Uses the settings above but forces tree layout, compilable output and separate assembly attributes</TextBlock>
<DockPanel> <!-- Visual Studio solution -->
<Button Name="btnUnityPath" DockPanel.Dock="Right" Width="70" Margin="4" Click="BtnUnityPath_OnClick">Browse</Button> <RadioButton GroupName="grpOutputType" Name="rdoOutputSolution" VerticalContentAlignment="Center" FontSize="18" Foreground="{StaticResource MicrosoftGreen}">Visual Studio solution</RadioButton>
<Label DockPanel.Dock="Left" Width="170" VerticalAlignment="Center">Unity editor path:</Label> <TextBlock TextWrapping="WrapWithOverflow">Uses the settings above but forces tree layout, compilable output and separate assembly attributes</TextBlock>
<TextBlock Name="txtUnityPath" DockPanel.Dock="Left" VerticalAlignment="Center" FlowDirection="RightToLeft" HorizontalAlignment="Right" ToolTip="{Binding RelativeSource={RelativeSource Self}, Path=Text}"/> <DockPanel>
</DockPanel> <Button Name="btnUnityPath" DockPanel.Dock="Right" Width="70" Margin="4" Click="BtnUnityPath_OnClick">Browse</Button>
<DockPanel> <Label DockPanel.Dock="Left" Width="170" VerticalAlignment="Center">Unity editor path:</Label>
<Button Name="btnUnityScriptPath" DockPanel.Dock="Right" Width="70" Margin="4" Click="BtnUnityScriptPath_OnClick">Browse</Button> <TextBlock Name="txtUnityPath" DockPanel.Dock="Left" VerticalAlignment="Center" FlowDirection="RightToLeft" HorizontalAlignment="Right" ToolTip="{Binding RelativeSource={RelativeSource Self}, Path=Text}"/>
<Label DockPanel.Dock="Left" Width="240" VerticalAlignment="Center">Unity script assemblies path:</Label> </DockPanel>
<TextBlock Name="txtUnityScriptPath" DockPanel.Dock="Left" VerticalAlignment="Center" FlowDirection="RightToLeft" HorizontalAlignment="Right" ToolTip="{Binding RelativeSource={RelativeSource Self}, Path=Text}"/> <DockPanel>
</DockPanel> <Button Name="btnUnityScriptPath" DockPanel.Dock="Right" Width="70" Margin="4" Click="BtnUnityScriptPath_OnClick">Browse</Button>
<Label DockPanel.Dock="Left" Width="240" VerticalAlignment="Center">Unity script assemblies path:</Label>
<Separator Margin="5,15,5,15"/> <TextBlock Name="txtUnityScriptPath" DockPanel.Dock="Left" VerticalAlignment="Center" FlowDirection="RightToLeft" HorizontalAlignment="Right" ToolTip="{Binding RelativeSource={RelativeSource Self}, Path=Text}"/>
</DockPanel>
<!-- Assembly shim DLLs -->
<RadioButton GroupName="grpOutputType" Name="rdoOutputDll" VerticalContentAlignment="Center" FontSize="18" Foreground="{StaticResource MicrosoftGreen}">.NET assembly shim DLLs</RadioButton> <Separator Margin="5,15,5,15"/>
<CheckBox Name="cbSuppressDllMetadata" Margin="2,10,2,2">Suppress output of all metadata attributes</CheckBox> <!-- Assembly shim DLLs -->
<RadioButton GroupName="grpOutputType" Name="rdoOutputDll" VerticalContentAlignment="Center" FontSize="18" Foreground="{StaticResource MicrosoftGreen}">.NET assembly shim DLLs</RadioButton>
<Separator Margin="5,15,5,15"/>
<CheckBox Name="cbSuppressDllMetadata" Margin="2,10,2,2">Suppress output of all metadata attributes</CheckBox>
<!-- Python script -->
<RadioButton GroupName="grpOutputType" Name="rdoOutputPy" VerticalContentAlignment="Center" FontSize="18" Foreground="{StaticResource MicrosoftGreen}">Python script for disassemblers</RadioButton> <Separator Margin="5,15,5,15"/>
<DockPanel>
<ComboBox Name="cboPyUnityVersion" DockPanel.Dock="Right" Margin="4"></ComboBox> <!-- Python script -->
<Label DockPanel.Dock="Left" Width="170" VerticalAlignment="Center" HorizontalAlignment="Left">Unity version (if known):</Label> <RadioButton GroupName="grpOutputType" Name="rdoOutputPy" VerticalContentAlignment="Center" FontSize="18" Foreground="{StaticResource MicrosoftGreen}">Python script for disassemblers</RadioButton>
</DockPanel> <DockPanel>
<DockPanel> <ComboBox Name="cboPyUnityVersion" DockPanel.Dock="Right" Margin="4"></ComboBox>
<ComboBox Name="cboPyTarget" DockPanel.Dock="Right" Margin="4" Width="80"></ComboBox> <Label DockPanel.Dock="Left" Width="170" VerticalAlignment="Center" HorizontalAlignment="Left">Unity version (if known):</Label>
<Label DockPanel.Dock="Left" Width="170" VerticalAlignment="Center" HorizontalAlignment="Left">Script target:</Label> </DockPanel>
</DockPanel> <DockPanel>
<ComboBox Name="cboPyTarget" DockPanel.Dock="Right" Margin="4" Width="80"></ComboBox>
<Separator Margin="5,15,5,15"/> <Label DockPanel.Dock="Left" Width="170" VerticalAlignment="Center" HorizontalAlignment="Left">Script target:</Label>
</DockPanel>
<!-- C++ scaffolding -->
<RadioButton GroupName="grpOutputType" Name="rdoOutputCpp" VerticalContentAlignment="Center" FontSize="18" Foreground="{StaticResource MicrosoftGreen}">C++ scaffolding / DLL injection project</RadioButton> <Separator Margin="5,15,5,15"/>
<DockPanel>
<ComboBox Name="cboCppUnityVersion" DockPanel.Dock="Right" Margin="4"></ComboBox> <!-- C++ scaffolding -->
<Label DockPanel.Dock="Left" Width="250" VerticalAlignment="Center" HorizontalAlignment="Left">Unity version (if known):</Label> <RadioButton GroupName="grpOutputType" Name="rdoOutputCpp" VerticalContentAlignment="Center" FontSize="18" Foreground="{StaticResource MicrosoftGreen}">C++ scaffolding / DLL injection project</RadioButton>
</DockPanel> <DockPanel>
<DockPanel> <ComboBox Name="cboCppUnityVersion" DockPanel.Dock="Right" Margin="4"></ComboBox>
<ComboBox Name="cboCppCompiler" DockPanel.Dock="Right" Margin="4" Width="80"> <Label DockPanel.Dock="Left" Width="250" VerticalAlignment="Center" HorizontalAlignment="Left">Unity version (if known):</Label>
<ComboBoxItem IsSelected="True">MSVC</ComboBoxItem> </DockPanel>
<ComboBoxItem>GCC</ComboBoxItem> <DockPanel>
</ComboBox> <ComboBox Name="cboCppCompiler" DockPanel.Dock="Right" Margin="4" Width="80">
<Label DockPanel.Dock="Left" Width="250" VerticalAlignment="Center" HorizontalAlignment="Left">Target C++ compiler for output:</Label> <ComboBoxItem IsSelected="True">MSVC</ComboBoxItem>
</DockPanel> <ComboBoxItem>GCC</ComboBoxItem>
</ComboBox>
<Separator Margin="5,15,5,15"/> <Label DockPanel.Dock="Left" Width="250" VerticalAlignment="Center" HorizontalAlignment="Left">Target C++ compiler for output:</Label>
</DockPanel>
<!-- JSON metadata -->
<RadioButton GroupName="grpOutputType" Name="rdoOutputJSON" VerticalContentAlignment="Center" FontSize="18" Foreground="{StaticResource MicrosoftGreen}">JSON metadata</RadioButton> <Separator Margin="5,15,5,15"/>
<DockPanel>
<ComboBox Name="cboJsonUnityVersion" DockPanel.Dock="Right" Margin="4"></ComboBox> <!-- JSON metadata -->
<Label DockPanel.Dock="Left" Width="170" VerticalAlignment="Center" HorizontalAlignment="Left">Unity version (if known):</Label> <RadioButton GroupName="grpOutputType" Name="rdoOutputJSON" VerticalContentAlignment="Center" FontSize="18" Foreground="{StaticResource MicrosoftGreen}">JSON metadata</RadioButton>
</DockPanel> <DockPanel>
<ComboBox Name="cboJsonUnityVersion" DockPanel.Dock="Right" Margin="4"></ComboBox>
</StackPanel> <Label DockPanel.Dock="Left" Width="170" VerticalAlignment="Center" HorizontalAlignment="Left">Unity version (if known):</Label>
</ScrollViewer> </DockPanel>
</DockPanel>
</DockPanel> </StackPanel>
</Grid> </ScrollViewer>
</DockPanel>
<!-- Background dimmer --> </DockPanel>
<Rectangle Name="rectModalLightBoxBackground" Fill="Black" Opacity="0.4"> </Grid>
<Rectangle.Style>
<Style> <!-- Background dimmer -->
<Setter Property="Rectangle.Visibility" Value="Hidden"></Setter> <Rectangle Name="rectModalLightBoxBackground" Fill="Black" Opacity="0.4">
<Style.Triggers> <Rectangle.Style>
<DataTrigger Binding="{Binding ElementName=grdFirstPage, Path=Visibility}" Value="Visible"> <Style>
<Setter Property="Rectangle.Visibility" Value="Visible" /> <Setter Property="Rectangle.Visibility" Value="Hidden"></Setter>
</DataTrigger> <Style.Triggers>
<DataTrigger Binding="{Binding ElementName=btnSelectBinaryFile, Path=Visibility}" Value="Visible"> <DataTrigger Binding="{Binding ElementName=grdFirstPage, Path=Visibility}" Value="Visible">
<Setter Property="Rectangle.Visibility" Value="Visible" /> <Setter Property="Rectangle.Visibility" Value="Visible" />
</DataTrigger> </DataTrigger>
<DataTrigger Binding="{Binding ElementName=areaBusyIndicator, Path=Visibility}" Value="Visible"> <DataTrigger Binding="{Binding ElementName=btnSelectBinaryFile, Path=Visibility}" Value="Visible">
<Setter Property="Rectangle.Visibility" Value="Visible" /> <Setter Property="Rectangle.Visibility" Value="Visible" />
</DataTrigger> </DataTrigger>
</Style.Triggers> <DataTrigger Binding="{Binding ElementName=areaBusyIndicator, Path=Visibility}" Value="Visible">
</Style> <Setter Property="Rectangle.Visibility" Value="Visible" />
</Rectangle.Style> </DataTrigger>
</Rectangle> </Style.Triggers>
</Style>
<!-- Light boxes --> </Rectangle.Style>
<Grid Name="grdFirstPage"> </Rectangle>
<Grid.RowDefinitions>
<RowDefinition Height ="*" /> <!-- Light boxes -->
<RowDefinition Height ="*" /> <Grid Name="grdFirstPage">
<RowDefinition Height ="Auto" /> <Grid.RowDefinitions>
</Grid.RowDefinitions> <RowDefinition Height ="*" />
<RowDefinition Height ="*" />
<Button Grid.Row="0" Name="btnSelectMetadataFile" Style="{StaticResource LightBoxButton}" Margin="100,100,100,25" Click="BtnSelectMetadataFile_OnClick"> <RowDefinition Height ="Auto" />
<TextBlock TextAlignment="Center"> </Grid.RowDefinitions>
<TextBlock FontSize="22">Option 1</TextBlock>
<LineBreak/> <Button Grid.Row="0" Name="btnSelectMetadataFile" Style="{StaticResource LightBoxButton}" Margin="100,100,100,25" Click="BtnSelectMetadataFile_OnClick">
<TextBlock>Select or drag &amp; drop an IL2CPP metadata file</TextBlock> <TextBlock TextAlignment="Center">
<LineBreak/> <TextBlock FontSize="22">Option 1</TextBlock>
<TextBlock FontSize="16">You can drag &amp; drop both the metadata and binary together</TextBlock> <LineBreak/>
</TextBlock> <TextBlock>Select or drag &amp; drop an IL2CPP metadata file</TextBlock>
</Button> <LineBreak/>
<Button Grid.Row="1" Name="btnSelectPackageFile" Style="{StaticResource LightBoxButton}" Margin="100,75,100,50" Click="BtnSelectPackageFile_OnClick"> <TextBlock FontSize="16">You can drag &amp; drop both the metadata and binary together</TextBlock>
<TextBlock TextAlignment="Center"> </TextBlock>
<TextBlock FontSize="22">Option 2</TextBlock> </Button>
<LineBreak/> <Button Grid.Row="1" Name="btnSelectPackageFile" Style="{StaticResource LightBoxButton}" Margin="100,75,100,50" Click="BtnSelectPackageFile_OnClick">
<TextBlock>Select or drag &amp; drop one or more APK files,<LineBreak/>an XAPK, AAB, IPA or Zip file</TextBlock> <TextBlock TextAlignment="Center">
<LineBreak/> <TextBlock FontSize="22">Option 2</TextBlock>
<TextBlock FontSize="16">Encrypted IPA files are not supported</TextBlock> <LineBreak/>
</TextBlock> <TextBlock>Select or drag &amp; drop one or more APK files,<LineBreak/>an XAPK, AAB, IPA or Zip file</TextBlock>
</Button> <LineBreak/>
<TextBlock FontSize="16">Encrypted IPA files are not supported</TextBlock>
<StackPanel Grid.Row="2" Orientation="Horizontal" HorizontalAlignment="Right"> </TextBlock>
<!-- Plugin options --> </Button>
<Button Name="btnPluginOptions" Style="{StaticResource LightBoxButton}" Click="BtnPluginOptions_Click" Margin="0,0,10,10" Padding="5" HorizontalAlignment="Right" VerticalAlignment="Bottom" FontSize="18" Width="180" Content="Manage plugins..."/>
<StackPanel Grid.Row="2" Orientation="Horizontal" HorizontalAlignment="Right">
<!-- Load options --> <!-- Plugin options -->
<Button Name="btnLoadOptions" Style="{StaticResource LightBoxButton}" Click="BtnLoadOptions_Click" Margin="0,0,10,10" Padding="5" HorizontalAlignment="Right" VerticalAlignment="Bottom" FontSize="18" Width="180" Content="Import options..."/> <Button Name="btnPluginOptions" Style="{StaticResource LightBoxButton}" Click="BtnPluginOptions_Click" Margin="0,0,10,10" Padding="5" HorizontalAlignment="Right" VerticalAlignment="Bottom" FontSize="18" Width="180" Content="Manage plugins..."/>
</StackPanel>
</Grid> <!-- Load options -->
<Button Name="btnSelectBinaryFile" Style="{StaticResource LightBoxButton}" Margin="100" Click="BtnSelectBinaryFile_OnClick" Visibility="Hidden"> <Button Name="btnLoadOptions" Style="{StaticResource LightBoxButton}" Click="BtnLoadOptions_Click" Margin="0,0,10,10" Padding="5" HorizontalAlignment="Right" VerticalAlignment="Bottom" FontSize="18" Width="180" Content="Import options..."/>
<TextBlock TextAlignment="Center"> </StackPanel>
<TextBlock>Select or drag &amp; drop an IL2CPP binary file</TextBlock> </Grid>
<LineBreak/> <Button Name="btnSelectBinaryFile" Style="{StaticResource LightBoxButton}" Margin="100" Click="BtnSelectBinaryFile_OnClick" Visibility="Hidden">
<TextBlock FontSize="16">You can also use a Linux process map (eg. maps.txt from GameGuardian)</TextBlock> <TextBlock TextAlignment="Center">
</TextBlock> <TextBlock>Select or drag &amp; drop an IL2CPP binary file</TextBlock>
</Button> <LineBreak/>
<TextBlock FontSize="16">You can also use a Linux process map (eg. maps.txt from GameGuardian)</TextBlock>
<!-- Back button --> </TextBlock>
<Button Name="btnBack" Margin="7" Padding="2" HorizontalAlignment="Left" VerticalAlignment="Bottom" FontSize="18" Width="120" Click="BtnBack_OnClick" Content="&lt;&lt; Back"> </Button>
<Button.Style>
<Style BasedOn="{StaticResource LightBoxButton}" TargetType="{x:Type Button}"> <!-- Back button -->
<Setter Property="Visibility" Value="Hidden"></Setter> <Button Name="btnBack" Margin="7" Padding="2" HorizontalAlignment="Left" VerticalAlignment="Bottom" FontSize="18" Width="120" Click="BtnBack_OnClick" Content="&lt;&lt; Back">
<Style.Triggers> <Button.Style>
<DataTrigger Binding="{Binding ElementName=grdFirstPage, Path=Visibility}" Value="Hidden"> <Style BasedOn="{StaticResource LightBoxButton}" TargetType="{x:Type Button}">
<Setter Property="Button.Visibility" Value="Visible"/> <Setter Property="Visibility" Value="Hidden"></Setter>
</DataTrigger> <Style.Triggers>
<DataTrigger Binding="{Binding ElementName=areaBusyIndicator, Path=Visibility}" Value="Visible"> <DataTrigger Binding="{Binding ElementName=grdFirstPage, Path=Visibility}" Value="Hidden">
<Setter Property="Button.IsEnabled" Value="False"/> <Setter Property="Button.Visibility" Value="Visible"/>
</DataTrigger> </DataTrigger>
</Style.Triggers> <DataTrigger Binding="{Binding ElementName=areaBusyIndicator, Path=Visibility}" Value="Visible">
</Style> <Setter Property="Button.IsEnabled" Value="False"/>
</Button.Style> </DataTrigger>
</Button> </Style.Triggers>
</Style>
<!-- Busy indicator --> </Button.Style>
<Border Name="areaBusyIndicator" Width="800" BorderThickness="1" CornerRadius="2" BorderBrush="Gray" HorizontalAlignment="Center" VerticalAlignment="Center" Background="White" SnapsToDevicePixels="True" Visibility="Hidden"> </Button>
<StackPanel Margin="60,40,60,40">
<TextBlock Name="txtBusyStatus" Foreground="{StaticResource WindowsBlue}" FontSize="24" HorizontalAlignment="Center" TextAlignment="Center">Getting things ready...</TextBlock> <!-- Busy indicator -->
<Image gif:AnimationBehavior.SourceUri="Resources/pizza.gif" Width="100" Margin="0,20,0,0" RenderOptions.BitmapScalingMode="Fant" /> <Border Name="areaBusyIndicator" Width="800" BorderThickness="1" CornerRadius="2" BorderBrush="Gray" HorizontalAlignment="Center" VerticalAlignment="Center" Background="White" SnapsToDevicePixels="True" Visibility="Hidden">
</StackPanel> <StackPanel Margin="60,40,60,40">
</Border> <TextBlock Name="txtBusyStatus" Foreground="{StaticResource WindowsBlue}" FontSize="24" HorizontalAlignment="Center" TextAlignment="Center">Getting things ready...</TextBlock>
</Grid> <Image gif:AnimationBehavior.SourceUri="Resources/pizza.gif" Width="100" Margin="0,20,0,0" RenderOptions.BitmapScalingMode="Fant" />
</Window> </StackPanel>
</Border>
</Grid>
</Window>

View File

@@ -1,69 +1,80 @@
 
Microsoft Visual Studio Solution File, Format Version 12.00 Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16 # Visual Studio Version 17
VisualStudioVersion = 16.0.29409.12 VisualStudioVersion = 17.8.34227.203
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bin2Object", "Bin2Object\Bin2Object\Bin2Object.csproj", "{55382D6C-01B6-4AFD-850C-7A79DAB6F270}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bin2Object", "Bin2Object\Bin2Object\Bin2Object.csproj", "{55382D6C-01B6-4AFD-850C-7A79DAB6F270}"
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Il2CppInspector", "Il2CppInspector.Common\Il2CppInspector.csproj", "{E4721466-CC6F-47EB-AD48-F4DE70D77E5C}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Il2CppInspector", "Il2CppInspector.Common\Il2CppInspector.csproj", "{E4721466-CC6F-47EB-AD48-F4DE70D77E5C}"
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Il2CppInspector.CLI", "Il2CppInspector.CLI\Il2CppInspector.CLI.csproj", "{EA4C27DF-4640-48DF-8CAF-5587884CAF30}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Il2CppInspector.CLI", "Il2CppInspector.CLI\Il2CppInspector.CLI.csproj", "{EA4C27DF-4640-48DF-8CAF-5587884CAF30}"
ProjectSection(ProjectDependencies) = postProject ProjectSection(ProjectDependencies) = postProject
{E4721466-CC6F-47EB-AD48-F4DE70D77E5C} = {E4721466-CC6F-47EB-AD48-F4DE70D77E5C} {E4721466-CC6F-47EB-AD48-F4DE70D77E5C} = {E4721466-CC6F-47EB-AD48-F4DE70D77E5C}
EndProjectSection EndProjectSection
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Il2CppTests", "Il2CppTests\Il2CppTests.csproj", "{389E4BDF-A749-4554-848B-32B3B6EE5684}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Il2CppTests", "Il2CppTests\Il2CppTests.csproj", "{389E4BDF-A749-4554-848B-32B3B6EE5684}"
ProjectSection(ProjectDependencies) = postProject ProjectSection(ProjectDependencies) = postProject
{E4721466-CC6F-47EB-AD48-F4DE70D77E5C} = {E4721466-CC6F-47EB-AD48-F4DE70D77E5C} {E4721466-CC6F-47EB-AD48-F4DE70D77E5C} = {E4721466-CC6F-47EB-AD48-F4DE70D77E5C}
EndProjectSection EndProjectSection
EndProject EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{46226B08-22BA-455E-8B99-F496E90EDCBC}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{46226B08-22BA-455E-8B99-F496E90EDCBC}"
ProjectSection(SolutionItems) = preProject ProjectSection(SolutionItems) = preProject
.editorconfig = .editorconfig .editorconfig = .editorconfig
docs\CSProj_Preview.png = docs\CSProj_Preview.png docs\CSProj_Preview.png = docs\CSProj_Preview.png
get-plugins.ps1 = get-plugins.ps1 get-plugins.ps1 = get-plugins.ps1
get-plugins.sh = get-plugins.sh get-plugins.sh = get-plugins.sh
docs\Ghidra_Guide.png = docs\Ghidra_Guide.png docs\Ghidra_Guide.png = docs\Ghidra_Guide.png
docs\Ghidra_Preview.png = docs\Ghidra_Preview.png docs\Ghidra_Preview.png = docs\Ghidra_Preview.png
docs\GUI_Preview.png = docs\GUI_Preview.png docs\GUI_Preview.png = docs\GUI_Preview.png
docs\IDA_Preview.png = docs\IDA_Preview.png docs\IDA_Preview.png = docs\IDA_Preview.png
README.md = README.md README.md = README.md
docs\VisualStudio_Preview.png = docs\VisualStudio_Preview.png docs\VisualStudio_Preview.png = docs\VisualStudio_Preview.png
EndProjectSection EndProjectSection
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Il2CppInspector.GUI", "Il2CppInspector.GUI\Il2CppInspector.GUI.csproj", "{A24D77DA-8A64-4AD3-956A-677A96F20373}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Il2CppInspector.GUI", "Il2CppInspector.GUI\Il2CppInspector.GUI.csproj", "{A24D77DA-8A64-4AD3-956A-677A96F20373}"
EndProject EndProject
Global Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".github", ".github", "{290A5778-CCBA-439B-BD5C-76D2D4848F6D}"
GlobalSection(SolutionConfigurationPlatforms) = preSolution EndProject
Debug|Any CPU = Debug|Any CPU Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "workflows", "workflows", "{452BE076-A87D-4731-B223-2E249C00EBC1}"
Release|Any CPU = Release|Any CPU ProjectSection(SolutionItems) = preProject
EndGlobalSection .github\workflows\build.yml = .github\workflows\build.yml
GlobalSection(ProjectConfigurationPlatforms) = postSolution EndProjectSection
{55382D6C-01B6-4AFD-850C-7A79DAB6F270}.Debug|Any CPU.ActiveCfg = Debug|Any CPU EndProject
{55382D6C-01B6-4AFD-850C-7A79DAB6F270}.Debug|Any CPU.Build.0 = Debug|Any CPU Global
{55382D6C-01B6-4AFD-850C-7A79DAB6F270}.Release|Any CPU.ActiveCfg = Release|Any CPU GlobalSection(SolutionConfigurationPlatforms) = preSolution
{55382D6C-01B6-4AFD-850C-7A79DAB6F270}.Release|Any CPU.Build.0 = Release|Any CPU Debug|Any CPU = Debug|Any CPU
{E4721466-CC6F-47EB-AD48-F4DE70D77E5C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU Release|Any CPU = Release|Any CPU
{E4721466-CC6F-47EB-AD48-F4DE70D77E5C}.Debug|Any CPU.Build.0 = Debug|Any CPU EndGlobalSection
{E4721466-CC6F-47EB-AD48-F4DE70D77E5C}.Release|Any CPU.ActiveCfg = Release|Any CPU GlobalSection(ProjectConfigurationPlatforms) = postSolution
{E4721466-CC6F-47EB-AD48-F4DE70D77E5C}.Release|Any CPU.Build.0 = Release|Any CPU {55382D6C-01B6-4AFD-850C-7A79DAB6F270}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{EA4C27DF-4640-48DF-8CAF-5587884CAF30}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {55382D6C-01B6-4AFD-850C-7A79DAB6F270}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EA4C27DF-4640-48DF-8CAF-5587884CAF30}.Debug|Any CPU.Build.0 = Debug|Any CPU {55382D6C-01B6-4AFD-850C-7A79DAB6F270}.Release|Any CPU.ActiveCfg = Release|Any CPU
{EA4C27DF-4640-48DF-8CAF-5587884CAF30}.Release|Any CPU.ActiveCfg = Release|Any CPU {55382D6C-01B6-4AFD-850C-7A79DAB6F270}.Release|Any CPU.Build.0 = Release|Any CPU
{EA4C27DF-4640-48DF-8CAF-5587884CAF30}.Release|Any CPU.Build.0 = Release|Any CPU {E4721466-CC6F-47EB-AD48-F4DE70D77E5C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{389E4BDF-A749-4554-848B-32B3B6EE5684}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E4721466-CC6F-47EB-AD48-F4DE70D77E5C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{389E4BDF-A749-4554-848B-32B3B6EE5684}.Debug|Any CPU.Build.0 = Debug|Any CPU {E4721466-CC6F-47EB-AD48-F4DE70D77E5C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{389E4BDF-A749-4554-848B-32B3B6EE5684}.Release|Any CPU.ActiveCfg = Release|Any CPU {E4721466-CC6F-47EB-AD48-F4DE70D77E5C}.Release|Any CPU.Build.0 = Release|Any CPU
{389E4BDF-A749-4554-848B-32B3B6EE5684}.Release|Any CPU.Build.0 = Release|Any CPU {EA4C27DF-4640-48DF-8CAF-5587884CAF30}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A24D77DA-8A64-4AD3-956A-677A96F20373}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {EA4C27DF-4640-48DF-8CAF-5587884CAF30}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A24D77DA-8A64-4AD3-956A-677A96F20373}.Debug|Any CPU.Build.0 = Debug|Any CPU {EA4C27DF-4640-48DF-8CAF-5587884CAF30}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A24D77DA-8A64-4AD3-956A-677A96F20373}.Release|Any CPU.ActiveCfg = Release|Any CPU {EA4C27DF-4640-48DF-8CAF-5587884CAF30}.Release|Any CPU.Build.0 = Release|Any CPU
{A24D77DA-8A64-4AD3-956A-677A96F20373}.Release|Any CPU.Build.0 = Release|Any CPU {389E4BDF-A749-4554-848B-32B3B6EE5684}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
EndGlobalSection {389E4BDF-A749-4554-848B-32B3B6EE5684}.Debug|Any CPU.Build.0 = Debug|Any CPU
GlobalSection(SolutionProperties) = preSolution {389E4BDF-A749-4554-848B-32B3B6EE5684}.Release|Any CPU.ActiveCfg = Release|Any CPU
HideSolutionNode = FALSE {389E4BDF-A749-4554-848B-32B3B6EE5684}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection {A24D77DA-8A64-4AD3-956A-677A96F20373}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
GlobalSection(ExtensibilityGlobals) = postSolution {A24D77DA-8A64-4AD3-956A-677A96F20373}.Debug|Any CPU.Build.0 = Debug|Any CPU
SolutionGuid = {A2F9DB35-5C65-4A94-8DD8-36FF9F3590C7} {A24D77DA-8A64-4AD3-956A-677A96F20373}.Release|Any CPU.ActiveCfg = Release|Any CPU
EndGlobalSection {A24D77DA-8A64-4AD3-956A-677A96F20373}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobal EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{290A5778-CCBA-439B-BD5C-76D2D4848F6D} = {46226B08-22BA-455E-8B99-F496E90EDCBC}
{452BE076-A87D-4731-B223-2E249C00EBC1} = {290A5778-CCBA-439B-BD5C-76D2D4848F6D}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {A2F9DB35-5C65-4A94-8DD8-36FF9F3590C7}
EndGlobalSection
EndGlobal

View File

@@ -1,23 +1,22 @@
# Development of Il2CppInspector is suspended # Il2CppInspectorRedux 2023.1
It is with great regret that I have to announce that development work on Il2CppInspector has been halted for the foreseeable future. Il2CppInspectorRedux helps you to reverse engineer IL2CPP applications, providing the most complete analysis currently available.
The reason for this is that due to health and changes in my personal life, I simply do not have time to commit to working on the project anymore. This is very frustrating for me but there is little I can really do about it. This is a continuation of [Il2CppInspector, by djkaty](https://github.com/djkaty/Il2CppInspector) which has suspended development, and contains some new features and support for new metadata versions.
Please feel free to fork the project and make improvements! You can also continue to post issues as I would like to have a compendium of bugs and problems saved in case that I or someone else does have the opportunity to get back to working on this. Please note though, that I won't be responding to issues or PRs going forward for the foreseeable future.
If you need IL2CPP tooling, I recommend my friend and colleague's excellent project [Cpp2IL](https://github.com/SamboyCoding/Cpp2IL) which is a work-in-progress tool to convert IL2CPP binaries directly back into IL code which can be easily viewed in dnSpy etc. This is a mammoth task so please do go and support his work on this amazing project!
Happy hacking,
Katy.
# Il2CppInspector 2021.1
Il2CppInspector helps you to reverse engineer IL2CPP applications, providing the most complete analysis currently available.
![Il2CppInspector GUI](docs/GUI_Preview.png) ![Il2CppInspector GUI](docs/GUI_Preview.png)
### Redux only features
* Support for metadata version 29 and 29.1, with full reconstruction of custom attributes
* Proper extraction of static array initializer contents with their correct length
* Proper support for v27.2+ Il2CppType
* Fixed support for v24.5
* Export of static metadata fields and IDA script support for importing them
* Support for [ThreadStatic] static fields
* Better heuristic for detecting metadata usages
* Performance improvements
### Main features ### Main features
* Output IL2CPP type definitions, metadata and method pointers as **[C# stub code](#creating-c-prototypes)** * Output IL2CPP type definitions, metadata and method pointers as **[C# stub code](#creating-c-prototypes)**
@@ -114,7 +113,7 @@ Nice to have:
* Automatically defeats certain basic obfuscation methods * Automatically defeats certain basic obfuscation methods
* Test chassis for automated integration testing of IL2CPP binaries * Test chassis for automated integration testing of IL2CPP binaries
Class library targets .NET Core 3.1. Built with Visual Studio 2019. Class library targets .NET 8. Built with Visual Studio 2019.
**NOTE**: Il2CppInspector is not a decompiler. It can provide you with the structure of an application and function addresses for every method so that you can easily jump straight to methods of interest in your disassembler. It does not attempt to recover the entire source code of the application. **NOTE**: Il2CppInspector is not a decompiler. It can provide you with the structure of an application and function addresses for every method so that you can easily jump straight to methods of interest in your disassembler. It does not attempt to recover the entire source code of the application.
@@ -332,6 +331,7 @@ Il2CppInspector generates the following data for IDA projects:
- Comments for all IL string literal metadata pointers containing the value of the string - Comments for all IL string literal metadata pointers containing the value of the string
- Names and types for some IL2CPP-specific data structures and functions - Names and types for some IL2CPP-specific data structures and functions
- Names and typed signatures for all IL2CPP API functions that could be identified - Names and typed signatures for all IL2CPP API functions that could be identified
- (Redux only) Names for all static metadata fields (PrivateImplementationDetails)
Example IDA C++ decompilation after applying Il2CppInspector (initialization code omitted for brevity): Example IDA C++ decompilation after applying Il2CppInspector (initialization code omitted for brevity):
@@ -566,6 +566,9 @@ The output schema is as follows:
- `symbols` (array) - `symbols` (array)
The virtual address, name and symbol type of every named (non-zero name length) and non-zero address function definition, type, field name and import (for ELF) defined in the binary. Not currently supported for PE files. The virtual address, name and symbol type of every named (non-zero name length) and non-zero address function definition, type, field name and import (for ELF) defined in the binary. Not currently supported for PE files.
- `fields` (array) (Redux only)
The virtual address and name of every static metadata field in the binary. Used for static array initializers such as the ones found in PrivateImplementationDetails.
### Universal IL2CPP Build Utility ### Universal IL2CPP Build Utility
Three Powershell scripts are provided to enable easy building and testing of IL2CPP binaries: Three Powershell scripts are provided to enable easy building and testing of IL2CPP binaries:
@@ -732,7 +735,9 @@ Unity version | IL2CPP version | Support
2020.1.11-2020.1.17 | 24.4 | Working 2020.1.11-2020.1.17 | 24.4 | Working
2020.2.0-2020.2.3 | 27 | Working 2020.2.0-2020.2.3 | 27 | Working
2020.2.4-2020.3.x | 27.1 | Working 2020.2.4-2020.3.x | 27.1 | Working
2021.1.0-2021.1.x | 27.2 | Partial 2021.1.0-2021.1.x | 27.2 | Working
2021.2.0-2021.2.x | 29 | Working
2021.3.0+ | 29.1 | Working
Please refer to the companion repository https://github.com/nneonneo/Il2CppVersions if you would like to track the changes between each IL2CPP release version. Please refer to the companion repository https://github.com/nneonneo/Il2CppVersions if you would like to track the changes between each IL2CPP release version.
@@ -744,11 +749,13 @@ Please check the binary file in a disassembler to ensure that it is a plain IL2C
### Support ### Support
If you found Il2CppInspector useful, you can really help support the project by making a small donation at http://paypal.me/djkaty! If you found Il2CppInspector useful, you can really help support the project by making a small donation!
You can also donate with bitcoin: 3FoRUqUXgYj8NY8sMQfhX6vv9LqR3e2kzz Donate to the author of Il2CppInspectorRedux, LukeFZ, via https://buymeacoffee.com/LukeFZ or https://patreon.com/LukeFZ
Much love! - Katy Donate to the author of the original Il2CppInspector, djkaty, via http://paypal.me/djkaty or with bitcoin: 3FoRUqUXgYj8NY8sMQfhX6vv9LqR3e2kzz
All donations are appreciated!
### Acknowledgements ### Acknowledgements