├── .gitignore
├── preview1.PNG
├── preview2.PNG
├── unitydump
├── iOS-Dump
│ ├── System.dll
│ ├── Il2CppDumper
│ ├── mscorlib.dll
│ ├── Mono.Cecil.dll
│ ├── System.Core.dll
│ ├── System.Data.dll
│ ├── System.Xml.dll
│ ├── Xamarin.iOS.dll
│ ├── Il2CppDumper.exe
│ ├── Mono.Security.dll
│ ├── Newtonsoft.Json.dll
│ ├── System.Numerics.dll
│ ├── System.Xml.Linq.dll
│ ├── System.aotdata.arm64
│ ├── mscorlib.aotdata.arm64
│ ├── Mono.Cecil.aotdata.arm64
│ ├── System.Core.aotdata.arm64
│ ├── System.Data.aotdata.arm64
│ ├── System.Web.Services.dll
│ ├── System.Xml.aotdata.arm64
│ ├── Xamarin.iOS.aotdata.arm64
│ ├── Il2CppDumper.aotdata.arm64
│ ├── Mono.Security.aotdata.arm64
│ ├── Newtonsoft.Json.aotdata.arm64
│ ├── System.Numerics.aotdata.arm64
│ ├── System.Xml.Linq.aotdata.arm64
│ ├── System.Runtime.Serialization.dll
│ ├── System.Web.Services.aotdata.arm64
│ ├── System.Runtime.Serialization.aotdata.arm64
│ ├── config.json
│ ├── il2cpp_header_to_ghidra.py
│ ├── il2cpp_header_to_binja.py
│ ├── Il2CppBinaryNinja
│ │ ├── plugin.json
│ │ └── __init__.py
│ ├── ida_py3.py
│ ├── ida.py
│ ├── ghidra.py
│ ├── ida_with_struct_py3.py
│ ├── ida_with_struct.py
│ ├── ghidra_wasm.py
│ └── ghidra_with_struct.py
├── Assets.xcassets
│ ├── Contents.json
│ ├── AppIcon.appiconset
│ │ ├── il2.png
│ │ └── Contents.json
│ ├── background.imageset
│ │ ├── background.png
│ │ └── Contents.json
│ ├── gradient.imageset
│ │ ├── genshin-impact-28.jpg
│ │ └── Contents.json
│ └── AccentColor.colorset
│ │ └── Contents.json
├── Preview Content
│ └── Preview Assets.xcassets
│ │ └── Contents.json
├── unitydumpApp.swift
├── CreditsView.swift
└── ContentView.swift
├── unitydump.xcodeproj
├── project.xcworkspace
│ ├── contents.xcworkspacedata
│ ├── xcuserdata
│ │ ├── mini.xcuserdatad
│ │ │ └── UserInterfaceState.xcuserstate
│ │ └── huynguyen.xcuserdatad
│ │ │ └── UserInterfaceState.xcuserstate
│ └── xcshareddata
│ │ ├── IDEWorkspaceChecks.plist
│ │ └── swiftpm
│ │ └── Package.resolved
├── xcuserdata
│ ├── mini.xcuserdatad
│ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ └── huynguyen.xcuserdatad
│ │ └── xcschemes
│ │ └── xcschememanagement.plist
└── project.pbxproj
├── README.md
├── LICENSE
└── entitlements.plist
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
--------------------------------------------------------------------------------
/preview1.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/34306/unitydump-iOS/HEAD/preview1.PNG
--------------------------------------------------------------------------------
/preview2.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/34306/unitydump-iOS/HEAD/preview2.PNG
--------------------------------------------------------------------------------
/unitydump/iOS-Dump/System.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/34306/unitydump-iOS/HEAD/unitydump/iOS-Dump/System.dll
--------------------------------------------------------------------------------
/unitydump/iOS-Dump/Il2CppDumper:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/34306/unitydump-iOS/HEAD/unitydump/iOS-Dump/Il2CppDumper
--------------------------------------------------------------------------------
/unitydump/iOS-Dump/mscorlib.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/34306/unitydump-iOS/HEAD/unitydump/iOS-Dump/mscorlib.dll
--------------------------------------------------------------------------------
/unitydump/iOS-Dump/Mono.Cecil.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/34306/unitydump-iOS/HEAD/unitydump/iOS-Dump/Mono.Cecil.dll
--------------------------------------------------------------------------------
/unitydump/iOS-Dump/System.Core.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/34306/unitydump-iOS/HEAD/unitydump/iOS-Dump/System.Core.dll
--------------------------------------------------------------------------------
/unitydump/iOS-Dump/System.Data.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/34306/unitydump-iOS/HEAD/unitydump/iOS-Dump/System.Data.dll
--------------------------------------------------------------------------------
/unitydump/iOS-Dump/System.Xml.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/34306/unitydump-iOS/HEAD/unitydump/iOS-Dump/System.Xml.dll
--------------------------------------------------------------------------------
/unitydump/iOS-Dump/Xamarin.iOS.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/34306/unitydump-iOS/HEAD/unitydump/iOS-Dump/Xamarin.iOS.dll
--------------------------------------------------------------------------------
/unitydump/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/unitydump/iOS-Dump/Il2CppDumper.exe:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/34306/unitydump-iOS/HEAD/unitydump/iOS-Dump/Il2CppDumper.exe
--------------------------------------------------------------------------------
/unitydump/iOS-Dump/Mono.Security.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/34306/unitydump-iOS/HEAD/unitydump/iOS-Dump/Mono.Security.dll
--------------------------------------------------------------------------------
/unitydump/iOS-Dump/Newtonsoft.Json.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/34306/unitydump-iOS/HEAD/unitydump/iOS-Dump/Newtonsoft.Json.dll
--------------------------------------------------------------------------------
/unitydump/iOS-Dump/System.Numerics.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/34306/unitydump-iOS/HEAD/unitydump/iOS-Dump/System.Numerics.dll
--------------------------------------------------------------------------------
/unitydump/iOS-Dump/System.Xml.Linq.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/34306/unitydump-iOS/HEAD/unitydump/iOS-Dump/System.Xml.Linq.dll
--------------------------------------------------------------------------------
/unitydump/iOS-Dump/System.aotdata.arm64:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/34306/unitydump-iOS/HEAD/unitydump/iOS-Dump/System.aotdata.arm64
--------------------------------------------------------------------------------
/unitydump/iOS-Dump/mscorlib.aotdata.arm64:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/34306/unitydump-iOS/HEAD/unitydump/iOS-Dump/mscorlib.aotdata.arm64
--------------------------------------------------------------------------------
/unitydump/iOS-Dump/Mono.Cecil.aotdata.arm64:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/34306/unitydump-iOS/HEAD/unitydump/iOS-Dump/Mono.Cecil.aotdata.arm64
--------------------------------------------------------------------------------
/unitydump/iOS-Dump/System.Core.aotdata.arm64:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/34306/unitydump-iOS/HEAD/unitydump/iOS-Dump/System.Core.aotdata.arm64
--------------------------------------------------------------------------------
/unitydump/iOS-Dump/System.Data.aotdata.arm64:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/34306/unitydump-iOS/HEAD/unitydump/iOS-Dump/System.Data.aotdata.arm64
--------------------------------------------------------------------------------
/unitydump/iOS-Dump/System.Web.Services.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/34306/unitydump-iOS/HEAD/unitydump/iOS-Dump/System.Web.Services.dll
--------------------------------------------------------------------------------
/unitydump/iOS-Dump/System.Xml.aotdata.arm64:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/34306/unitydump-iOS/HEAD/unitydump/iOS-Dump/System.Xml.aotdata.arm64
--------------------------------------------------------------------------------
/unitydump/iOS-Dump/Xamarin.iOS.aotdata.arm64:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/34306/unitydump-iOS/HEAD/unitydump/iOS-Dump/Xamarin.iOS.aotdata.arm64
--------------------------------------------------------------------------------
/unitydump/iOS-Dump/Il2CppDumper.aotdata.arm64:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/34306/unitydump-iOS/HEAD/unitydump/iOS-Dump/Il2CppDumper.aotdata.arm64
--------------------------------------------------------------------------------
/unitydump/iOS-Dump/Mono.Security.aotdata.arm64:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/34306/unitydump-iOS/HEAD/unitydump/iOS-Dump/Mono.Security.aotdata.arm64
--------------------------------------------------------------------------------
/unitydump/Preview Content/Preview Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/unitydump/iOS-Dump/Newtonsoft.Json.aotdata.arm64:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/34306/unitydump-iOS/HEAD/unitydump/iOS-Dump/Newtonsoft.Json.aotdata.arm64
--------------------------------------------------------------------------------
/unitydump/iOS-Dump/System.Numerics.aotdata.arm64:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/34306/unitydump-iOS/HEAD/unitydump/iOS-Dump/System.Numerics.aotdata.arm64
--------------------------------------------------------------------------------
/unitydump/iOS-Dump/System.Xml.Linq.aotdata.arm64:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/34306/unitydump-iOS/HEAD/unitydump/iOS-Dump/System.Xml.Linq.aotdata.arm64
--------------------------------------------------------------------------------
/unitydump/iOS-Dump/System.Runtime.Serialization.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/34306/unitydump-iOS/HEAD/unitydump/iOS-Dump/System.Runtime.Serialization.dll
--------------------------------------------------------------------------------
/unitydump/Assets.xcassets/AppIcon.appiconset/il2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/34306/unitydump-iOS/HEAD/unitydump/Assets.xcassets/AppIcon.appiconset/il2.png
--------------------------------------------------------------------------------
/unitydump/iOS-Dump/System.Web.Services.aotdata.arm64:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/34306/unitydump-iOS/HEAD/unitydump/iOS-Dump/System.Web.Services.aotdata.arm64
--------------------------------------------------------------------------------
/unitydump/Assets.xcassets/background.imageset/background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/34306/unitydump-iOS/HEAD/unitydump/Assets.xcassets/background.imageset/background.png
--------------------------------------------------------------------------------
/unitydump/iOS-Dump/System.Runtime.Serialization.aotdata.arm64:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/34306/unitydump-iOS/HEAD/unitydump/iOS-Dump/System.Runtime.Serialization.aotdata.arm64
--------------------------------------------------------------------------------
/unitydump/Assets.xcassets/gradient.imageset/genshin-impact-28.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/34306/unitydump-iOS/HEAD/unitydump/Assets.xcassets/gradient.imageset/genshin-impact-28.jpg
--------------------------------------------------------------------------------
/unitydump.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/unitydump/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/unitydump.xcodeproj/project.xcworkspace/xcuserdata/mini.xcuserdatad/UserInterfaceState.xcuserstate:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/34306/unitydump-iOS/HEAD/unitydump.xcodeproj/project.xcworkspace/xcuserdata/mini.xcuserdatad/UserInterfaceState.xcuserstate
--------------------------------------------------------------------------------
/unitydump.xcodeproj/project.xcworkspace/xcuserdata/huynguyen.xcuserdatad/UserInterfaceState.xcuserstate:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/34306/unitydump-iOS/HEAD/unitydump.xcodeproj/project.xcworkspace/xcuserdata/huynguyen.xcuserdatad/UserInterfaceState.xcuserstate
--------------------------------------------------------------------------------
/unitydump/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "il2.png",
5 | "idiom" : "universal",
6 | "platform" : "ios",
7 | "size" : "1024x1024"
8 | }
9 | ],
10 | "info" : {
11 | "author" : "xcode",
12 | "version" : 1
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/unitydump.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/unitydump/unitydumpApp.swift:
--------------------------------------------------------------------------------
1 | //
2 | // unitydumpApp.swift
3 | // unitydump
4 | //
5 | // Created by Huy Nguyen on 13/06/2023.
6 | //
7 |
8 | import SwiftUI
9 |
10 | @main
11 | struct unitydumpApp: App {
12 | var body: some Scene {
13 | WindowGroup {
14 | ContentView()
15 | }
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/unitydump.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved:
--------------------------------------------------------------------------------
1 | {
2 | "pins" : [
3 | {
4 | "identity" : "auxiliaryexecute",
5 | "kind" : "remoteSourceControl",
6 | "location" : "https://github.com/Lakr233/AuxiliaryExecute",
7 | "state" : {
8 | "revision" : "5a36e877cb371583c539503f476856ea714108b9",
9 | "version" : "2.0.0"
10 | }
11 | }
12 | ],
13 | "version" : 2
14 | }
15 |
--------------------------------------------------------------------------------
/unitydump/Assets.xcassets/background.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "background.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/unitydump/Assets.xcassets/gradient.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "genshin-impact-28.jpg",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/unitydump.xcodeproj/xcuserdata/mini.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | unitydump.xcscheme_^#shared#^_
8 |
9 | orderHint
10 | 0
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/unitydump.xcodeproj/xcuserdata/huynguyen.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | unitydump.xcscheme_^#shared#^_
8 |
9 | orderHint
10 | 0
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/unitydump/iOS-Dump/config.json:
--------------------------------------------------------------------------------
1 | {
2 | "DumpMethod": true,
3 | "DumpField": true,
4 | "DumpProperty": true,
5 | "DumpAttribute": true,
6 | "DumpFieldOffset": true,
7 | "DumpMethodOffset": true,
8 | "DumpTypeDefIndex": true,
9 | "GenerateDummyDll": true,
10 | "GenerateStruct": true,
11 | "DummyDllAddToken": true,
12 | "RequireAnyKey": true,
13 | "ForceIl2CppVersion": false,
14 | "ForceVersion": 16,
15 | "ForceDump": true,
16 | "NoRedirectedPointer": false
17 | }
18 |
19 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # unitydump-iOS
2 | An il2cppdumper application for iOS devices. Support both rootful and rootless!
3 |
4 | # Made by [34306](https://github.com/34306) and [しまりん](https://github.com/straight-tamago)
5 |
6 | # Usage (check release for iPA)
7 | * The 1st line is the directory to decrypted UnityFramework/BinaryExecute. Recommend using iGameGod to decrypted it!
8 | * The 2nd line is the directory to global-metadata.dat file, placed somewhere in /Data/Managed/metadata/
9 | * The 3rd line is the directory to output, you can set it if you want or default is /var/mobile/Documents/Dump/
10 | # It will take a while to running depends on the game file size.
11 |
12 |
13 |
14 | [MIT. Il2CppDumper](https://github.com/Perfare/Il2CppDumper)
15 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2023 Huy Nguyen
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/entitlements.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | com.apple.private.persona-mgmt
6 |
7 | com.apple.private.security.storage.AppDataContainers
8 |
9 | com.apple.private.spawn-subsystem-root
10 |
11 | get-task-allow
12 |
13 | platform-application
14 |
15 | task_for_pid-allow
16 |
17 | com.apple.security.get-task-allow
18 |
19 | com.apple.security.exception.files.absolute-path.read-write
20 |
21 | /
22 | /private/preboot/
23 | /var/
24 | /var/mobile/Documents
25 | /private/var/
26 | /private/var/mobile/Documents
27 |
28 | com.apple.private.security.sandbox
29 |
30 | com.apple.private.security.no-sandbox
31 |
32 | com.apple.private.security.container
33 |
34 | com.apple.private.security.no-container
35 |
36 | com.apple.private.security.container-required
37 |
38 |
39 |
40 |
--------------------------------------------------------------------------------
/unitydump/iOS-Dump/il2cpp_header_to_ghidra.py:
--------------------------------------------------------------------------------
1 | import re
2 |
3 | header = "typedef unsigned __int8 uint8_t;\n" \
4 | "typedef unsigned __int16 uint16_t;\n" \
5 | "typedef unsigned __int32 uint32_t;\n" \
6 | "typedef unsigned __int64 uint64_t;\n" \
7 | "typedef __int8 int8_t;\n" \
8 | "typedef __int16 int16_t;\n" \
9 | "typedef __int32 int32_t;\n" \
10 | "typedef __int64 int64_t;\n" \
11 | "typedef __int64 intptr_t;\n" \
12 | "typedef __int64 uintptr_t;\n" \
13 | "typedef unsigned __int64 size_t;\n"
14 |
15 |
16 | def main():
17 | fixed_header_data = ""
18 | with open("il2cpp.h", 'r') as f:
19 | print("il2cpp.h opened...")
20 | original_header_data = f.read()
21 | print("il2cpp.h read...")
22 | fixed_header_data = re.sub(r": (\w+) {", r"{\n \1 super;", original_header_data)
23 | print("il2cpp.h data fixed...")
24 | print("il2cpp.h closed.")
25 | with open("il2cpp_ghidra.h", 'w') as f:
26 | print("il2cpp_ghidra.h opened...")
27 | f.write(header)
28 | print("header written...")
29 | f.write(fixed_header_data)
30 | print("fixed data written...")
31 | print("il2cpp_ghidra.h closed.")
32 |
33 |
34 | if __name__ == '__main__':
35 | print("Script started...")
36 | main()
37 |
--------------------------------------------------------------------------------
/unitydump/iOS-Dump/il2cpp_header_to_binja.py:
--------------------------------------------------------------------------------
1 | import re
2 |
3 | data = open("./il2cpp.h").read()
4 |
5 | builtin = ["void", "intptr_t", "uint32_t", "uint16_t", "int32_t", "uint8_t", "bool",
6 | "int64_t", "uint64_t", "double", "int16_t", "int8_t", "float", "uintptr_t",
7 | "const", "union", "{", "};", "il2cpp_array_size_t", "il2cpp_array_lower_bound_t",
8 | "struct", "Il2CppMethodPointer"]
9 | structs = []
10 | notfound = []
11 | header = ""
12 |
13 | for line in data.splitlines():
14 | if line.startswith("struct") or line.startswith("union"):
15 | struct = line.split()[1]
16 | if struct.endswith(";"):
17 | struct = struct[:-1]
18 | structs.append(struct)
19 | if line.startswith("\t"):
20 | struct = line[1:].split()[0]
21 | if struct == "struct":
22 | struct = line[1:].split()[1]
23 | if struct.endswith("*"):
24 | struct = struct[:-1]
25 | if struct.endswith("*"):
26 | struct = struct[:-1]
27 | if struct in builtin:
28 | continue
29 | if struct not in structs and struct not in notfound:
30 | notfound.append(struct)
31 | for struct in notfound:
32 | header += f"struct {struct};" + "\n"
33 | to_replace = re.findall("struct (.*) {\n};", data)
34 | for item in to_replace:
35 | data = data.replace("struct "+item+" {\n};", "")
36 | data = data.replace("\t"+item.split()[0]+" ", "\tvoid *")
37 | data = data.replace("\t struct "+item.split()[0]+" ", "\t void *")
38 | data = re.sub(r": (\w+) {", r"{\n\t\1 super;", data)
39 | with open("./il2cpp_binja.h", "w") as f:
40 | f.write(header)
41 | f.write(data)
42 |
--------------------------------------------------------------------------------
/unitydump/iOS-Dump/Il2CppBinaryNinja/plugin.json:
--------------------------------------------------------------------------------
1 | {
2 | "pluginmetadataversion": 2,
3 | "name": "Il2CppDumper",
4 | "type": [
5 | "core",
6 | "ui",
7 | "binaryview"
8 | ],
9 | "api": [
10 | "python3"
11 | ],
12 | "description": "Add Il2Cpp structs and method signatures",
13 | "longdescription": "",
14 | "license": {
15 | "name": "MIT",
16 | "text": "Copyright (c) 2022 Il2CppDumper contributors\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE."
17 | },
18 | "platforms": [
19 | "Darwin",
20 | "Linux",
21 | "Windows"
22 | ],
23 | "installinstructions": {
24 | "Darwin": "Install Il2CppDumper",
25 | "Linux": "Install Il2CppDumper",
26 | "Windows": "Install Il2CppDumper"
27 | },
28 | "dependencies": {
29 | },
30 | "version": "1.0.0",
31 | "author": "Il2CppDumper contributors",
32 | "minimumbinaryninjaversion": 3164
33 | }
34 |
--------------------------------------------------------------------------------
/unitydump/iOS-Dump/ida_py3.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | import json
3 |
4 | processFields = [
5 | "ScriptMethod",
6 | "ScriptString",
7 | "ScriptMetadata",
8 | "ScriptMetadataMethod",
9 | "Addresses",
10 | ]
11 |
12 | imageBase = idaapi.get_imagebase()
13 |
14 | def get_addr(addr):
15 | return imageBase + addr
16 |
17 | def set_name(addr, name):
18 | ret = idc.set_name(addr, name, SN_NOWARN | SN_NOCHECK)
19 | if ret == 0:
20 | new_name = name + '_' + str(addr)
21 | ret = idc.set_name(addr, new_name, SN_NOWARN | SN_NOCHECK)
22 |
23 | def make_function(start, end):
24 | next_func = idc.get_next_func(start)
25 | if next_func < end:
26 | end = next_func
27 | if idc.get_func_attr(start, FUNCATTR_START) == start:
28 | ida_funcs.del_func(start)
29 | ida_funcs.add_func(start, end)
30 |
31 | path = idaapi.ask_file(False, '*.json', 'script.json from Il2cppdumper')
32 | data = json.loads(open(path, 'rb').read().decode('utf-8'))
33 |
34 | if "Addresses" in data and "Addresses" in processFields:
35 | addresses = data["Addresses"]
36 | for index in range(len(addresses) - 1):
37 | start = get_addr(addresses[index])
38 | end = get_addr(addresses[index + 1])
39 | make_function(start, end)
40 |
41 | if "ScriptMethod" in data and "ScriptMethod" in processFields:
42 | scriptMethods = data["ScriptMethod"]
43 | for scriptMethod in scriptMethods:
44 | addr = get_addr(scriptMethod["Address"])
45 | name = scriptMethod["Name"]
46 | set_name(addr, name)
47 |
48 | if "ScriptString" in data and "ScriptString" in processFields:
49 | index = 1
50 | scriptStrings = data["ScriptString"]
51 | for scriptString in scriptStrings:
52 | addr = get_addr(scriptString["Address"])
53 | value = scriptString["Value"]
54 | name = "StringLiteral_" + str(index)
55 | idc.set_name(addr, name, SN_NOWARN)
56 | idc.set_cmt(addr, value, 1)
57 | index += 1
58 |
59 | if "ScriptMetadata" in data and "ScriptMetadata" in processFields:
60 | scriptMetadatas = data["ScriptMetadata"]
61 | for scriptMetadata in scriptMetadatas:
62 | addr = get_addr(scriptMetadata["Address"])
63 | name = scriptMetadata["Name"]
64 | set_name(addr, name)
65 | idc.set_cmt(addr, name, 1)
66 |
67 | if "ScriptMetadataMethod" in data and "ScriptMetadataMethod" in processFields:
68 | scriptMetadataMethods = data["ScriptMetadataMethod"]
69 | for scriptMetadataMethod in scriptMetadataMethods:
70 | addr = get_addr(scriptMetadataMethod["Address"])
71 | name = scriptMetadataMethod["Name"]
72 | methodAddr = get_addr(scriptMetadataMethod["MethodAddress"])
73 | set_name(addr, name)
74 | idc.set_cmt(addr, name, 1)
75 | idc.set_cmt(addr, '{0:X}'.format(methodAddr), 0)
76 |
77 | print('Script finished!')
78 |
79 |
--------------------------------------------------------------------------------
/unitydump/iOS-Dump/ida.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | import json
3 |
4 | processFields = [
5 | "ScriptMethod",
6 | "ScriptString",
7 | "ScriptMetadata",
8 | "ScriptMetadataMethod",
9 | "Addresses",
10 | ]
11 |
12 | imageBase = idaapi.get_imagebase()
13 |
14 | def get_addr(addr):
15 | return imageBase + addr
16 |
17 | def set_name(addr, name):
18 | ret = idc.set_name(addr, name, SN_NOWARN | SN_NOCHECK)
19 | if ret == 0:
20 | new_name = name + '_' + str(addr)
21 | ret = idc.set_name(addr, new_name, SN_NOWARN | SN_NOCHECK)
22 |
23 | def make_function(start, end):
24 | next_func = idc.get_next_func(start)
25 | if next_func < end:
26 | end = next_func
27 | if idc.get_func_attr(start, FUNCATTR_START) == start:
28 | ida_funcs.del_func(start)
29 | ida_funcs.add_func(start, end)
30 |
31 | path = idaapi.ask_file(False, '*.json', 'script.json from Il2cppdumper')
32 | data = json.loads(open(path, 'rb').read().decode('utf-8'))
33 |
34 | if "Addresses" in data and "Addresses" in processFields:
35 | addresses = data["Addresses"]
36 | for index in range(len(addresses) - 1):
37 | start = get_addr(addresses[index])
38 | end = get_addr(addresses[index + 1])
39 | make_function(start, end)
40 |
41 | if "ScriptMethod" in data and "ScriptMethod" in processFields:
42 | scriptMethods = data["ScriptMethod"]
43 | for scriptMethod in scriptMethods:
44 | addr = get_addr(scriptMethod["Address"])
45 | name = scriptMethod["Name"].encode("utf-8")
46 | set_name(addr, name)
47 |
48 | if "ScriptString" in data and "ScriptString" in processFields:
49 | index = 1
50 | scriptStrings = data["ScriptString"]
51 | for scriptString in scriptStrings:
52 | addr = get_addr(scriptString["Address"])
53 | value = scriptString["Value"].encode("utf-8")
54 | name = "StringLiteral_" + str(index)
55 | idc.set_name(addr, name, SN_NOWARN)
56 | idc.set_cmt(addr, value, 1)
57 | index += 1
58 |
59 | if "ScriptMetadata" in data and "ScriptMetadata" in processFields:
60 | scriptMetadatas = data["ScriptMetadata"]
61 | for scriptMetadata in scriptMetadatas:
62 | addr = get_addr(scriptMetadata["Address"])
63 | name = scriptMetadata["Name"].encode("utf-8")
64 | set_name(addr, name)
65 | idc.set_cmt(addr, name, 1)
66 |
67 | if "ScriptMetadataMethod" in data and "ScriptMetadataMethod" in processFields:
68 | scriptMetadataMethods = data["ScriptMetadataMethod"]
69 | for scriptMetadataMethod in scriptMetadataMethods:
70 | addr = get_addr(scriptMetadataMethod["Address"])
71 | name = scriptMetadataMethod["Name"].encode("utf-8")
72 | methodAddr = get_addr(scriptMetadataMethod["MethodAddress"])
73 | set_name(addr, name)
74 | idc.set_cmt(addr, name, 1)
75 | idc.set_cmt(addr, '{0:X}'.format(methodAddr), 0)
76 |
77 | print 'Script finished!'
78 |
79 |
--------------------------------------------------------------------------------
/unitydump/iOS-Dump/ghidra.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | import json
3 |
4 | processFields = [
5 | "ScriptMethod",
6 | "ScriptString",
7 | "ScriptMetadata",
8 | "ScriptMetadataMethod",
9 | "Addresses",
10 | ]
11 |
12 | functionManager = currentProgram.getFunctionManager()
13 | baseAddress = currentProgram.getImageBase()
14 | USER_DEFINED = ghidra.program.model.symbol.SourceType.USER_DEFINED
15 |
16 | def get_addr(addr):
17 | return baseAddress.add(addr)
18 |
19 | def set_name(addr, name):
20 | name = name.replace(' ', '-')
21 | createLabel(addr, name, True, USER_DEFINED)
22 |
23 | def make_function(start):
24 | func = getFunctionAt(start)
25 | if func is None:
26 | createFunction(start, None)
27 |
28 | f = askFile("script.json from Il2cppdumper", "Open")
29 | data = json.loads(open(f.absolutePath, 'rb').read().decode('utf-8'))
30 |
31 | if "ScriptMethod" in data and "ScriptMethod" in processFields:
32 | scriptMethods = data["ScriptMethod"]
33 | monitor.initialize(len(scriptMethods))
34 | monitor.setMessage("Methods")
35 | for scriptMethod in scriptMethods:
36 | addr = get_addr(scriptMethod["Address"])
37 | name = scriptMethod["Name"].encode("utf-8")
38 | set_name(addr, name)
39 | monitor.incrementProgress(1)
40 |
41 | if "ScriptString" in data and "ScriptString" in processFields:
42 | index = 1
43 | scriptStrings = data["ScriptString"]
44 | monitor.initialize(len(scriptStrings))
45 | monitor.setMessage("Strings")
46 | for scriptString in scriptStrings:
47 | addr = get_addr(scriptString["Address"])
48 | value = scriptString["Value"].encode("utf-8")
49 | name = "StringLiteral_" + str(index)
50 | createLabel(addr, name, True, USER_DEFINED)
51 | setEOLComment(addr, value)
52 | index += 1
53 | monitor.incrementProgress(1)
54 |
55 | if "ScriptMetadata" in data and "ScriptMetadata" in processFields:
56 | scriptMetadatas = data["ScriptMetadata"]
57 | monitor.initialize(len(scriptMetadatas))
58 | monitor.setMessage("Metadata")
59 | for scriptMetadata in scriptMetadatas:
60 | addr = get_addr(scriptMetadata["Address"])
61 | name = scriptMetadata["Name"].encode("utf-8")
62 | set_name(addr, name)
63 | setEOLComment(addr, name)
64 | monitor.incrementProgress(1)
65 |
66 | if "ScriptMetadataMethod" in data and "ScriptMetadataMethod" in processFields:
67 | scriptMetadataMethods = data["ScriptMetadataMethod"]
68 | monitor.initialize(len(scriptMetadataMethods))
69 | monitor.setMessage("Metadata Methods")
70 | for scriptMetadataMethod in scriptMetadataMethods:
71 | addr = get_addr(scriptMetadataMethod["Address"])
72 | name = scriptMetadataMethod["Name"].encode("utf-8")
73 | methodAddr = get_addr(scriptMetadataMethod["MethodAddress"])
74 | set_name(addr, name)
75 | setEOLComment(addr, name)
76 | monitor.incrementProgress(1)
77 |
78 | if "Addresses" in data and "Addresses" in processFields:
79 | addresses = data["Addresses"]
80 | monitor.initialize(len(addresses))
81 | monitor.setMessage("Addresses")
82 | for index in range(len(addresses) - 1):
83 | start = get_addr(addresses[index])
84 | make_function(start)
85 | monitor.incrementProgress(1)
86 |
87 | print 'Script finished!'
88 |
--------------------------------------------------------------------------------
/unitydump/iOS-Dump/ida_with_struct_py3.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | import json
3 |
4 | processFields = [
5 | "ScriptMethod",
6 | "ScriptString",
7 | "ScriptMetadata",
8 | "ScriptMetadataMethod",
9 | "Addresses",
10 | ]
11 |
12 | imageBase = idaapi.get_imagebase()
13 |
14 | def get_addr(addr):
15 | return imageBase + addr
16 |
17 | def set_name(addr, name):
18 | ret = idc.set_name(addr, name, SN_NOWARN | SN_NOCHECK)
19 | if ret == 0:
20 | new_name = name + '_' + str(addr)
21 | ret = idc.set_name(addr, new_name, SN_NOWARN | SN_NOCHECK)
22 |
23 | def make_function(start, end):
24 | next_func = idc.get_next_func(start)
25 | if next_func < end:
26 | end = next_func
27 | if idc.get_func_attr(start, FUNCATTR_START) == start:
28 | ida_funcs.del_func(start)
29 | ida_funcs.add_func(start, end)
30 |
31 | path = idaapi.ask_file(False, '*.json', 'script.json from Il2cppdumper')
32 | hpath = idaapi.ask_file(False, '*.h', 'il2cpp.h from Il2cppdumper')
33 | parse_decls(open(hpath, 'r').read(), 0)
34 | data = json.loads(open(path, 'rb').read().decode('utf-8'))
35 |
36 | if "Addresses" in data and "Addresses" in processFields:
37 | addresses = data["Addresses"]
38 | for index in range(len(addresses) - 1):
39 | start = get_addr(addresses[index])
40 | end = get_addr(addresses[index + 1])
41 | make_function(start, end)
42 |
43 | if "ScriptMethod" in data and "ScriptMethod" in processFields:
44 | scriptMethods = data["ScriptMethod"]
45 | for scriptMethod in scriptMethods:
46 | addr = get_addr(scriptMethod["Address"])
47 | name = scriptMethod["Name"]
48 | set_name(addr, name)
49 | signature = scriptMethod["Signature"]
50 | if apply_type(addr, parse_decl(signature, 0), 1) == False:
51 | print("apply_type failed:", hex(addr), signature)
52 |
53 | if "ScriptString" in data and "ScriptString" in processFields:
54 | index = 1
55 | scriptStrings = data["ScriptString"]
56 | for scriptString in scriptStrings:
57 | addr = get_addr(scriptString["Address"])
58 | value = scriptString["Value"]
59 | name = "StringLiteral_" + str(index)
60 | idc.set_name(addr, name, SN_NOWARN)
61 | idc.set_cmt(addr, value, 1)
62 | index += 1
63 |
64 | if "ScriptMetadata" in data and "ScriptMetadata" in processFields:
65 | scriptMetadatas = data["ScriptMetadata"]
66 | for scriptMetadata in scriptMetadatas:
67 | addr = get_addr(scriptMetadata["Address"])
68 | name = scriptMetadata["Name"]
69 | set_name(addr, name)
70 | idc.set_cmt(addr, name, 1)
71 | if scriptMetadata["Signature"] is not None:
72 | signature = scriptMetadata["Signature"]
73 | if apply_type(addr, parse_decl(signature, 0), 1) == False:
74 | print("apply_type failed:", hex(addr), signature)
75 |
76 | if "ScriptMetadataMethod" in data and "ScriptMetadataMethod" in processFields:
77 | scriptMetadataMethods = data["ScriptMetadataMethod"]
78 | for scriptMetadataMethod in scriptMetadataMethods:
79 | addr = get_addr(scriptMetadataMethod["Address"])
80 | name = scriptMetadataMethod["Name"]
81 | methodAddr = get_addr(scriptMetadataMethod["MethodAddress"])
82 | set_name(addr, name)
83 | idc.set_cmt(addr, name, 1)
84 | idc.set_cmt(addr, '{0:X}'.format(methodAddr), 0)
85 |
86 | print('Script finished!')
87 |
88 |
--------------------------------------------------------------------------------
/unitydump/iOS-Dump/ida_with_struct.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | import json
3 |
4 | processFields = [
5 | "ScriptMethod",
6 | "ScriptString",
7 | "ScriptMetadata",
8 | "ScriptMetadataMethod",
9 | "Addresses",
10 | ]
11 |
12 | imageBase = idaapi.get_imagebase()
13 |
14 | def get_addr(addr):
15 | return imageBase + addr
16 |
17 | def set_name(addr, name):
18 | ret = idc.set_name(addr, name, SN_NOWARN | SN_NOCHECK)
19 | if ret == 0:
20 | new_name = name + '_' + str(addr)
21 | ret = idc.set_name(addr, new_name, SN_NOWARN | SN_NOCHECK)
22 |
23 | def make_function(start, end):
24 | next_func = idc.get_next_func(start)
25 | if next_func < end:
26 | end = next_func
27 | if idc.get_func_attr(start, FUNCATTR_START) == start:
28 | ida_funcs.del_func(start)
29 | ida_funcs.add_func(start, end)
30 |
31 | path = idaapi.ask_file(False, '*.json', 'script.json from Il2cppdumper')
32 | hpath = idaapi.ask_file(False, '*.h', 'il2cpp.h from Il2cppdumper')
33 | parse_decls(open(hpath, 'rb').read(), 0)
34 | data = json.loads(open(path, 'rb').read().decode('utf-8'))
35 |
36 | if "Addresses" in data and "Addresses" in processFields:
37 | addresses = data["Addresses"]
38 | for index in range(len(addresses) - 1):
39 | start = get_addr(addresses[index])
40 | end = get_addr(addresses[index + 1])
41 | make_function(start, end)
42 |
43 | if "ScriptMethod" in data and "ScriptMethod" in processFields:
44 | scriptMethods = data["ScriptMethod"]
45 | for scriptMethod in scriptMethods:
46 | addr = get_addr(scriptMethod["Address"])
47 | name = scriptMethod["Name"].encode("utf-8")
48 | set_name(addr, name)
49 | signature = scriptMethod["Signature"].encode("utf-8")
50 | if apply_type(addr, parse_decl(signature, 0), 1) == False:
51 | print "apply_type failed:", hex(addr), signature
52 |
53 | if "ScriptString" in data and "ScriptString" in processFields:
54 | index = 1
55 | scriptStrings = data["ScriptString"]
56 | for scriptString in scriptStrings:
57 | addr = get_addr(scriptString["Address"])
58 | value = scriptString["Value"].encode("utf-8")
59 | name = "StringLiteral_" + str(index)
60 | idc.set_name(addr, name, SN_NOWARN)
61 | idc.set_cmt(addr, value, 1)
62 | index += 1
63 |
64 | if "ScriptMetadata" in data and "ScriptMetadata" in processFields:
65 | scriptMetadatas = data["ScriptMetadata"]
66 | for scriptMetadata in scriptMetadatas:
67 | addr = get_addr(scriptMetadata["Address"])
68 | name = scriptMetadata["Name"].encode("utf-8")
69 | set_name(addr, name)
70 | idc.set_cmt(addr, name, 1)
71 | if scriptMetadata["Signature"] is not None:
72 | signature = scriptMetadata["Signature"].encode("utf-8")
73 | if apply_type(addr, parse_decl(signature, 0), 1) == False:
74 | print "apply_type failed:", hex(addr), signature
75 |
76 | if "ScriptMetadataMethod" in data and "ScriptMetadataMethod" in processFields:
77 | scriptMetadataMethods = data["ScriptMetadataMethod"]
78 | for scriptMetadataMethod in scriptMetadataMethods:
79 | addr = get_addr(scriptMetadataMethod["Address"])
80 | name = scriptMetadataMethod["Name"].encode("utf-8")
81 | methodAddr = get_addr(scriptMetadataMethod["MethodAddress"])
82 | set_name(addr, name)
83 | idc.set_cmt(addr, name, 1)
84 | idc.set_cmt(addr, '{0:X}'.format(methodAddr), 0)
85 |
86 | print 'Script finished!'
87 |
88 |
--------------------------------------------------------------------------------
/unitydump/iOS-Dump/ghidra_wasm.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | import json
3 |
4 | from wasm import WasmLoader
5 | from wasm.analysis import WasmAnalysis
6 | from ghidra.util.task import ConsoleTaskMonitor
7 |
8 | monitor = ConsoleTaskMonitor()
9 | WasmLoader.loadElementsToTable(currentProgram, WasmAnalysis.getState(currentProgram).module, 0, 0, 0, monitor)
10 |
11 | runScript("analyze_dyncalls.py")
12 |
13 | processFields = [
14 | "ScriptMethod",
15 | "ScriptString",
16 | "ScriptMetadata",
17 | "ScriptMetadataMethod",
18 | "Addresses",
19 | ]
20 |
21 | functionManager = currentProgram.getFunctionManager()
22 | progspace = currentProgram.addressFactory.getAddressSpace("ram")
23 | USER_DEFINED = ghidra.program.model.symbol.SourceType.USER_DEFINED
24 |
25 | def get_addr(addr):
26 | return progspace.getAddress(addr)
27 |
28 | def set_name(addr, name):
29 | name = name.replace(' ', '-')
30 | createLabel(addr, name, True, USER_DEFINED)
31 |
32 | def make_function(start):
33 | func = getFunctionAt(start)
34 | if func is None:
35 | createFunction(start, None)
36 |
37 | f = askFile("script.json from Il2cppdumper", "Open")
38 | data = json.loads(open(f.absolutePath, 'rb').read().decode('utf-8'))
39 |
40 |
41 | if "ScriptMethod" in data and "ScriptMethod" in processFields:
42 | scriptMethods = data["ScriptMethod"]
43 | dynCallNamespace = currentProgram.symbolTable.getNamespace("dynCall", None)
44 | monitor.initialize(len(scriptMethods))
45 | monitor.setMessage("Methods")
46 | for scriptMethod in scriptMethods:
47 | offset = scriptMethod["Address"]
48 | sig = scriptMethod["TypeSignature"]
49 | symbolName = "func_%s_%d" % (sig, offset)
50 | symbol = currentProgram.symbolTable.getSymbols(symbolName, dynCallNamespace)
51 | if len(symbol) > 0:
52 | addr = symbol[0].address
53 | name = scriptMethod["Name"].encode("utf-8")
54 | set_name(addr, name)
55 | else:
56 | print "Warning at %s:" % scriptMethod["Name"]
57 | print "Symbol %s not found!" % symbolName
58 | monitor.incrementProgress(1)
59 |
60 | if "ScriptString" in data and "ScriptString" in processFields:
61 | index = 1
62 | scriptStrings = data["ScriptString"]
63 | monitor.initialize(len(scriptStrings))
64 | monitor.setMessage("Strings")
65 | for scriptString in scriptStrings:
66 | addr = get_addr(scriptString["Address"])
67 | value = scriptString["Value"].encode("utf-8")
68 | name = "StringLiteral_" + str(index)
69 | createLabel(addr, name, True, USER_DEFINED)
70 | setEOLComment(addr, value)
71 | index += 1
72 | monitor.incrementProgress(1)
73 |
74 | if "ScriptMetadata" in data and "ScriptMetadata" in processFields:
75 | scriptMetadatas = data["ScriptMetadata"]
76 | monitor.initialize(len(scriptMetadatas))
77 | monitor.setMessage("Metadata")
78 | for scriptMetadata in scriptMetadatas:
79 | addr = get_addr(scriptMetadata["Address"])
80 | name = scriptMetadata["Name"].encode("utf-8")
81 | set_name(addr, name)
82 | setEOLComment(addr, name)
83 | monitor.incrementProgress(1)
84 |
85 | if "ScriptMetadataMethod" in data and "ScriptMetadataMethod" in processFields:
86 | scriptMetadataMethods = data["ScriptMetadataMethod"]
87 | monitor.initialize(len(scriptMetadataMethods))
88 | monitor.setMessage("Metadata Methods")
89 | for scriptMetadataMethod in scriptMetadataMethods:
90 | addr = get_addr(scriptMetadataMethod["Address"])
91 | name = scriptMetadataMethod["Name"].encode("utf-8")
92 | methodAddr = get_addr(scriptMetadataMethod["MethodAddress"])
93 | set_name(addr, name)
94 | setEOLComment(addr, name)
95 | monitor.incrementProgress(1)
96 |
97 | if "Addresses" in data and "Addresses" in processFields:
98 | pass
99 |
100 | print 'Script finished!'
101 |
--------------------------------------------------------------------------------
/unitydump/CreditsView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Credits.swift
3 | // unitydump
4 | //
5 | // Created by Huy Nguyen on 16/06/2023.
6 | //
7 |
8 | import SwiftUI
9 |
10 | struct CreditsView: View {
11 | @Environment(\.colorScheme) var colorScheme
12 |
13 | var body: some View {
14 | ScrollView {
15 | VStack {
16 | creditView(imageURL: URL(string: "https://avatars.githubusercontent.com/34306"), githubname: "34306", name: "Huy Nguyen (34306)", description: "Idea and initial commit 😭")
17 | creditView(imageURL: URL(string: "https://avatars.githubusercontent.com/straight-tamago"), githubname: "straight-tamago", name: "しまりん (straight-tamago)", description: "Fixed most of things in this app 🤣🥰")
18 | }
19 | .padding()
20 | .padding()
21 | }
22 | .listStyle(.insetGrouped)
23 | .navigationBarTitleDisplayMode(.inline)
24 | .preferredColorScheme(colorScheme)
25 | .background(
26 | Image("background")
27 | .resizable()
28 | .ignoresSafeArea()
29 | .scaledToFill()
30 | .blur(radius: 4)
31 | .opacity(0.5)
32 | )
33 | }
34 |
35 |
36 | private func creditView(imageURL: URL?, githubname: String, name: String, description: String) -> some View {
37 | Button(action: {
38 | if let url = URL(string: "https://github.com/\(githubname)") {
39 | UIApplication.shared.open(url)
40 | }
41 | }) {
42 | HStack {
43 | if #available(iOS 15.0, *) {
44 | AsyncImage(url: imageURL, content: { image in
45 | image.resizable()
46 | .aspectRatio(contentMode: .fit)
47 | .frame(maxWidth: 35, maxHeight: 35)
48 | .cornerRadius(20)
49 | }, placeholder: {
50 | ProgressView()
51 | .frame(maxWidth: 35, maxHeight: 35)
52 | })
53 | } else {
54 | // Fallback on earlier versions
55 | if let imageURL = imageURL,
56 | let data = try? Data(contentsOf: imageURL),
57 | let uiImage = UIImage(data: data) {
58 | Image(uiImage: uiImage)
59 | .resizable()
60 | .aspectRatio(contentMode: .fit)
61 | .frame(maxWidth: 35, maxHeight: 35)
62 | .cornerRadius(20)
63 | } else {
64 | Image(systemName: "person.fill")
65 | .resizable()
66 | .aspectRatio(contentMode: .fit)
67 | .frame(maxWidth: 35, maxHeight: 35)
68 | .cornerRadius(20)
69 | }
70 | }
71 |
72 | VStack(alignment: .leading) {
73 | Text(name)
74 | .font(.headline.weight(.bold))
75 | .frame(maxWidth: .infinity, alignment: .leading)
76 | Text(description)
77 | .font(.system(size: 13))
78 | .foregroundColor(fontColor)
79 | .frame(maxWidth: .infinity, alignment: .leading)
80 | }
81 | }
82 | .foregroundColor(fontColor)
83 | }
84 | }
85 |
86 | private var fontColor: Color {
87 | return colorScheme == .dark ? Color(red: 0.4, green: 0.7, blue: 0.9) : Color(red: 0.88, green: 0.08, blue: 0.52)
88 | }
89 | }
90 |
91 | struct CreditsView_Previews: PreviewProvider {
92 | static var previews: some View {
93 | CreditsView()
94 | }
95 | }
96 |
--------------------------------------------------------------------------------
/unitydump/iOS-Dump/Il2CppBinaryNinja/__init__.py:
--------------------------------------------------------------------------------
1 | from binaryninja import *
2 | from os.path import exists
3 |
4 | def get_addr(bv: BinaryView, addr: int):
5 | imageBase = bv.start
6 | return imageBase + addr
7 |
8 | class Il2CppProcessTask(BackgroundTaskThread):
9 | def __init__(self, bv: BinaryView, script_path: str,
10 | header_path: str):
11 | BackgroundTaskThread.__init__(self, "Il2Cpp start", True)
12 | self.bv = bv
13 | self.script_path = script_path
14 | self.header_path = header_path
15 | self.has_types = False
16 |
17 | def process_header(self):
18 | self.progress = "Il2Cpp types (1/3)"
19 | with open(self.header_path) as f:
20 | result = self.bv.parse_types_from_string(f.read())
21 | length = len(result.types)
22 | i = 0
23 | for name in result.types:
24 | i += 1
25 | if i % 100 == 0:
26 | percent = i / length * 100
27 | self.progress = f"Il2Cpp types: {percent:.2f}%"
28 | if self.bv.get_type_by_name(name):
29 | continue
30 | self.bv.define_user_type(name, result.types[name])
31 |
32 | def process_methods(self, data: dict):
33 | self.progress = f"Il2Cpp methods (2/3)"
34 | scriptMethods = data["ScriptMethod"]
35 | length = len(scriptMethods)
36 | i = 0
37 | for scriptMethod in scriptMethods:
38 | if self.cancelled:
39 | self.progress = "Il2Cpp cancelled, aborting"
40 | return
41 | i += 1
42 | if i % 100 == 0:
43 | percent = i / length * 100
44 | self.progress = f"Il2Cpp methods: {percent:.2f}%"
45 | addr = get_addr(self.bv, scriptMethod["Address"])
46 | name = scriptMethod["Name"].replace("$", "_").replace(".", "_")
47 | signature = scriptMethod["Signature"]
48 | func = self.bv.get_function_at(addr)
49 | if func != None:
50 | if func.name == name:
51 | continue
52 | if self.has_types:
53 | func.function_type = signature
54 | else:
55 | func.name = scriptMethod["Name"]
56 |
57 | def process_strings(self, data: dict):
58 | self.progress = "Il2Cpp strings (3/3)"
59 | scriptStrings = data["ScriptString"]
60 | i = 0
61 | for scriptString in scriptStrings:
62 | i += 1
63 | if self.cancelled:
64 | self.progress = "Il2Cpp cancelled, aborting"
65 | return
66 | addr = get_addr(self.bv, scriptString["Address"])
67 | value = scriptString["Value"]
68 | var = self.bv.get_data_var_at(addr)
69 | if var != None:
70 | var.name = f"StringLiteral_{i}"
71 | self.bv.set_comment_at(addr, value)
72 |
73 | def run(self):
74 | if exists(self.header_path):
75 | self.process_header()
76 | else:
77 | log_warn("Header file not found")
78 | if self.bv.get_type_by_name("Il2CppClass"):
79 | self.has_types = True
80 | data = json.loads(open(self.script_path, 'rb').read().decode('utf-8'))
81 | if "ScriptMethod" in data:
82 | self.process_methods(data)
83 | if "ScriptString" in data:
84 | self.process_strings(data)
85 |
86 | def process(bv: BinaryView):
87 | scriptDialog = OpenFileNameField("Select script.json", "script.json", "script.json")
88 | headerDialog = OpenFileNameField("Select il2cpp_binja.h", "il2cpp_binja.h", "il2cpp_binja.h")
89 | if not get_form_input([scriptDialog, headerDialog], "script.json from Il2CppDumper"):
90 | return log_error("File not selected, try again!")
91 | if not exists(scriptDialog.result):
92 | return log_error("File not found, try again!")
93 | task = Il2CppProcessTask(bv, scriptDialog.result, headerDialog.result)
94 | task.start()
95 |
96 | PluginCommand.register("Il2CppDumper", "Process file", process)
97 |
--------------------------------------------------------------------------------
/unitydump/iOS-Dump/ghidra_with_struct.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | import json
3 |
4 | from ghidra.app.util.cparser.C import CParserUtils
5 | from ghidra.app.cmd.function import ApplyFunctionSignatureCmd
6 |
7 | processFields = [
8 | "ScriptMethod",
9 | "ScriptString",
10 | "ScriptMetadata",
11 | "ScriptMetadataMethod",
12 | "Addresses",
13 | ]
14 |
15 | functionManager = currentProgram.getFunctionManager()
16 | baseAddress = currentProgram.getImageBase()
17 | USER_DEFINED = ghidra.program.model.symbol.SourceType.USER_DEFINED
18 |
19 | def get_addr(addr):
20 | return baseAddress.add(addr)
21 |
22 | def set_name(addr, name):
23 | try:
24 | name = name.replace(' ', '-')
25 | createLabel(addr, name, True, USER_DEFINED)
26 | except:
27 | print("set_name() Failed.")
28 |
29 | def set_type(addr, type):
30 | # Requires types (il2cpp.h) to be imported first
31 | newType = type.replace("*"," *").replace(" "," ").strip()
32 | dataTypes = getDataTypes(newType)
33 | addrType = None
34 | if len(dataTypes) == 0:
35 | if newType == newType[:-2] + " *":
36 | baseType = newType[:-2]
37 | dataTypes = getDataTypes(baseType)
38 | if len(dataTypes) == 1:
39 | dtm = currentProgram.getDataTypeManager()
40 | pointerType = dtm.getPointer(dataTypes[0])
41 | addrType = dtm.addDataType(pointerType, None)
42 | elif len(dataTypes) > 1:
43 | print("Conflicting data types found for type " + type + "(parsed as '" + newType + "')")
44 | return
45 | else:
46 | addrType = dataTypes[0]
47 | if addrType is None:
48 | print("Could not identify type " + type + "(parsed as '" + newType + "')")
49 | else:
50 | try:
51 | createData(addr, addrType)
52 | except ghidra.program.model.util.CodeUnitInsertionException:
53 | print("Warning: unable to set type (CodeUnitInsertionException)")
54 |
55 |
56 | def make_function(start):
57 | func = getFunctionAt(start)
58 | if func is None:
59 | try:
60 | createFunction(start, None)
61 | except:
62 | print("Warning: Unable to create function")
63 |
64 | def set_sig(addr, name, sig):
65 | try:
66 | typeSig = CParserUtils.parseSignature(None, currentProgram, sig, False)
67 | except ghidra.app.util.cparser.C.ParseException:
68 | print("Warning: Unable to parse")
69 | print(sig)
70 | print("Attempting to modify...")
71 | # try to fix by renaming the parameters
72 | try:
73 | newSig = sig.replace(", ","ext, ").replace("\)","ext\)")
74 | typeSig = CParserUtils.parseSignature(None, currentProgram, newSig, False)
75 | except:
76 | print("Warning: also unable to parse")
77 | print(newSig)
78 | print("Skipping.")
79 | return
80 | if typeSig is not None:
81 | try:
82 | typeSig.setName(name)
83 | ApplyFunctionSignatureCmd(addr, typeSig, USER_DEFINED, False, True).applyTo(currentProgram)
84 | except:
85 | print("Warning: unable to set Signature. ApplyFunctionSignatureCmd() Failed.")
86 |
87 | f = askFile("script.json from Il2cppdumper", "Open")
88 | data = json.loads(open(f.absolutePath, 'rb').read().decode('utf-8'))
89 |
90 | if "ScriptMethod" in data and "ScriptMethod" in processFields:
91 | scriptMethods = data["ScriptMethod"]
92 | monitor.initialize(len(scriptMethods))
93 | monitor.setMessage("Methods")
94 | for scriptMethod in scriptMethods:
95 | addr = get_addr(scriptMethod["Address"])
96 | name = scriptMethod["Name"].encode("utf-8")
97 | set_name(addr, name)
98 | monitor.incrementProgress(1)
99 |
100 | if "ScriptString" in data and "ScriptString" in processFields:
101 | index = 1
102 | scriptStrings = data["ScriptString"]
103 | monitor.initialize(len(scriptStrings))
104 | monitor.setMessage("Strings")
105 | for scriptString in scriptStrings:
106 | addr = get_addr(scriptString["Address"])
107 | value = scriptString["Value"].encode("utf-8")
108 | name = "StringLiteral_" + str(index)
109 | createLabel(addr, name, True, USER_DEFINED)
110 | setEOLComment(addr, value)
111 | index += 1
112 | monitor.incrementProgress(1)
113 |
114 | if "ScriptMetadata" in data and "ScriptMetadata" in processFields:
115 | scriptMetadatas = data["ScriptMetadata"]
116 | monitor.initialize(len(scriptMetadatas))
117 | monitor.setMessage("Metadata")
118 | for scriptMetadata in scriptMetadatas:
119 | addr = get_addr(scriptMetadata["Address"])
120 | name = scriptMetadata["Name"].encode("utf-8")
121 | set_name(addr, name)
122 | setEOLComment(addr, name)
123 | monitor.incrementProgress(1)
124 | if scriptMetadata["Signature"]:
125 | set_type(addr, scriptMetadata["Signature"].encode("utf-8"))
126 |
127 | if "ScriptMetadataMethod" in data and "ScriptMetadataMethod" in processFields:
128 | scriptMetadataMethods = data["ScriptMetadataMethod"]
129 | monitor.initialize(len(scriptMetadataMethods))
130 | monitor.setMessage("Metadata Methods")
131 | for scriptMetadataMethod in scriptMetadataMethods:
132 | addr = get_addr(scriptMetadataMethod["Address"])
133 | name = scriptMetadataMethod["Name"].encode("utf-8")
134 | methodAddr = get_addr(scriptMetadataMethod["MethodAddress"])
135 | set_name(addr, name)
136 | setEOLComment(addr, name)
137 | monitor.incrementProgress(1)
138 |
139 | if "Addresses" in data and "Addresses" in processFields:
140 | addresses = data["Addresses"]
141 | monitor.initialize(len(addresses))
142 | monitor.setMessage("Addresses")
143 | for index in range(len(addresses) - 1):
144 | start = get_addr(addresses[index])
145 | make_function(start)
146 | monitor.incrementProgress(1)
147 |
148 | if "ScriptMethod" in data and "ScriptMethod" in processFields:
149 | scriptMethods = data["ScriptMethod"]
150 | for scriptMethod in scriptMethods:
151 | addr = get_addr(scriptMethod["Address"])
152 | sig = scriptMethod["Signature"][:-1].encode("utf-8")
153 | name = scriptMethod["Name"].encode("utf-8")
154 | set_sig(addr, name, sig)
155 |
156 | print 'Script finished!'
157 |
--------------------------------------------------------------------------------
/unitydump/ContentView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ContentView.swift
3 | // unitydump
4 | //
5 | // Created by Huy Nguyen and しまりん on 15/06/2023.
6 | //
7 |
8 |
9 | import SwiftUI
10 | import UIKit
11 | import AuxiliaryExecute
12 |
13 | struct ContentView: View {
14 | @AppStorage("executableBinary")
15 | private var executableBinary: String = ""
16 | @AppStorage("globalMetadata")
17 | private var globalMetadata: String = ""
18 | @AppStorage("outputDirectory")
19 | private var outputDirectory: String = "/var/mobile/Documents/unitydump"
20 |
21 | @State private var processing: Bool = false
22 | @State private var showingAlert: Bool = false
23 | @State private var message: String = ""
24 |
25 | @State private var updateAvailable = false
26 | private let version = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
27 |
28 | var body: some View {
29 | NavigationView {
30 | VStack {
31 | VStack(alignment: .center) {
32 | Text("Make sure the binary is decrypted.\nNot support encrypted\nglobal-metadata.dat")
33 | .font(.headline)
34 | .padding()
35 | .multilineTextAlignment(.center)
36 | .lineLimit(nil)
37 | }
38 |
39 | NavigationLink(
40 | destination: CreditsView(),
41 | label: {
42 | HStack {
43 | Text("Credits")
44 | Image(systemName: "chevron.right")
45 | }
46 | .foregroundColor(.blue.opacity(0.7))
47 | .font(.system(size: 20))
48 | }
49 | )
50 |
51 | TextField("Path to UnityFramework/BinaryExecute", text: self.$executableBinary)
52 | .textFieldStyle(RoundedBorderTextFieldStyle())
53 | .padding()
54 | .disabled(self.processing)
55 |
56 | TextField("Path to global-metadata.dat", text: self.$globalMetadata)
57 | .textFieldStyle(RoundedBorderTextFieldStyle())
58 | .padding()
59 | .disabled(self.processing)
60 |
61 | TextField("Output Directory Path", text: self.$outputDirectory)
62 | .textFieldStyle(RoundedBorderTextFieldStyle())
63 | .padding()
64 | .disabled(self.processing)
65 |
66 |
67 | HStack {
68 | Button(action: {
69 | self.processing = true
70 | DispatchQueue.global().async {
71 | self.Il2CppDumper(
72 | executableBinary: self.executableBinary,
73 | globalMetadata: self.globalMetadata,
74 | outputDirectory: self.outputDirectory
75 | )
76 | self.processing = false
77 | }
78 | }) {
79 | Text("il2CppDumper!")
80 | .foregroundColor(.white)
81 | .padding()
82 | .background(Color.blue)
83 | .cornerRadius(10)
84 | }
85 | .disabled(self.processing || self.executableBinary == "" || self.globalMetadata == "" || self.outputDirectory == "")
86 | .opacity(self.processing || self.executableBinary == "" || self.globalMetadata == "" || self.outputDirectory == "" ? 0.5 : 1)
87 |
88 | if self.processing {
89 | ProgressView()
90 | .padding()
91 | }
92 | }
93 | }
94 | .frame(maxWidth: .infinity, maxHeight: .infinity)
95 | .background(
96 | Image("gradient")
97 | .ignoresSafeArea()
98 | .scaledToFill()
99 | .blur(radius: 15)
100 | .opacity(0.7)
101 | )
102 | .padding()
103 | .alert(isPresented: self.$showingAlert) {
104 | Alert(title: Text(self.message))
105 | }
106 | .onAppear{
107 | self.fetchLatestRelease()
108 | }
109 | .toolbar {
110 | ToolbarItem(placement: .navigationBarLeading){
111 | Text("unitydump-iOS v\(self.version)")
112 | .font(.headline)
113 | }
114 | ToolbarItem(placement: .navigationBarTrailing){
115 | Button(action: {
116 | if let url = URL(string: "https://github.com/34306/unitydump-iOS") {
117 | UIApplication.shared.open(url)
118 | }
119 | }) {
120 | ZStack(alignment: .topTrailing) {
121 | Image(systemName: "sparkles")
122 | if self.updateAvailable {
123 | Rectangle()
124 | .foregroundColor(.red)
125 | .frame(width: 9, height: 9)
126 | .cornerRadius(60)
127 | }
128 | }
129 | }
130 | }
131 | ToolbarItem(placement: .navigationBarTrailing){
132 | Button(action: {
133 | self.openFilza()
134 | }) {
135 | Image(systemName: "folder")
136 | }
137 | }
138 | }
139 | }
140 | .navigationViewStyle(.stack)
141 | }
142 |
143 | private func Il2CppDumper(executableBinary: String, globalMetadata: String, outputDirectory: String) {
144 | let appName = (executableBinary as NSString).lastPathComponent
145 | let dateFormatter = DateFormatter()
146 | dateFormatter.dateFormat = "yyyy-MM-dd_HH:mm:ss"
147 | let timestamp = dateFormatter.string(from: Date())
148 |
149 | try? FileManager.default.createDirectory(atPath: "\(outputDirectory)/\(appName)/\(timestamp)", withIntermediateDirectories: true)
150 | let Il2CppDumper = Bundle.main.url(forResource: "iOS-Dump/Il2CppDumper", withExtension: nil)!
151 |
152 | let command = Il2CppDumper.path
153 | let args = [executableBinary, globalMetadata, "\(outputDirectory)/\(appName)/\(timestamp)"]
154 | let env = ["PATH": "\(Il2CppDumper.path.replacingOccurrences(of: "/Il2CppDumper", with: "")):$PATH"]
155 |
156 | var output = ""
157 | let receipt = AuxiliaryExecute.spawn(command: command, args: args, environment: env, output: { output += $0 })
158 | if receipt.exitCode != 0 {
159 | self.showAlert("Error when running the script! Please checking the file (decrypted or not) or path to the file is correct!")
160 | return
161 | }
162 |
163 | let dumpExists = FileManager.default.fileExists(atPath: "\(outputDirectory)/\(appName)/\(timestamp)/dump.cs")
164 | self.showAlert(dumpExists ? "All done!\nEnjoy hacking your game 🥰" : "Unknown error\n\(receipt.stderr)")
165 | }
166 |
167 | private func openFilza() {
168 | let appName = (self.executableBinary as NSString).lastPathComponent
169 | if !FileManager.default.fileExists(atPath: "\(self.outputDirectory)/\(appName)") {
170 | self.showAlert("dump.cs NotFound")
171 | return
172 | }
173 | if let url = URL(string: "filza://\(self.outputDirectory)/\(appName)") {
174 | if UIApplication.shared.canOpenURL(URL(string: "filza://")!) {
175 | UIApplication.shared.open(url)
176 | } else {
177 | self.showAlert("Filza not installed")
178 | }
179 | }
180 | }
181 |
182 | private func showAlert(_ message: String) {
183 | self.message = message
184 | self.showingAlert = true
185 | }
186 |
187 | private func fetchLatestRelease() {
188 | let url = URL(string: "https://api.github.com/repos/34306/unitydump-iOS/releases/latest")!
189 | URLSession.shared.dataTask(with: url) { data, response, error in
190 | if let data = data {
191 | do {
192 | let o = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as! [String: Any]
193 | guard let l = o["tag_name"] else { return }
194 | if "unitydump-iOS-"+self.version != l as! String {
195 | self.updateAvailable = true
196 | }
197 | } catch {
198 | print(error)
199 | }
200 | }
201 | }.resume()
202 | }
203 | }
204 |
205 | struct ContentView_Previews: PreviewProvider {
206 | static var previews: some View {
207 | ContentView()
208 | }
209 | }
210 |
--------------------------------------------------------------------------------
/unitydump.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 56;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 0092EE572A38AD8400B9F819 /* unitydumpApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0092EE562A38AD8400B9F819 /* unitydumpApp.swift */; };
11 | 0092EE592A38AD8400B9F819 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0092EE582A38AD8400B9F819 /* ContentView.swift */; };
12 | 0092EE5B2A38AD8500B9F819 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0092EE5A2A38AD8500B9F819 /* Assets.xcassets */; };
13 | 0092EE5E2A38AD8500B9F819 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0092EE5D2A38AD8500B9F819 /* Preview Assets.xcassets */; };
14 | 0096B0E62A3B51DC007B54A7 /* AuxiliaryExecute in Frameworks */ = {isa = PBXBuildFile; productRef = 0096B0E52A3B51DC007B54A7 /* AuxiliaryExecute */; };
15 | 0096B0E92A3BED9F007B54A7 /* CreditsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0096B0E82A3BED9F007B54A7 /* CreditsView.swift */; };
16 | 3DE674F72A3C61D9001BCB02 /* iOS-Dump in Resources */ = {isa = PBXBuildFile; fileRef = 3DE674F62A3C61D9001BCB02 /* iOS-Dump */; };
17 | /* End PBXBuildFile section */
18 |
19 | /* Begin PBXFileReference section */
20 | 0092EE532A38AD8400B9F819 /* unitydump.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = unitydump.app; sourceTree = BUILT_PRODUCTS_DIR; };
21 | 0092EE562A38AD8400B9F819 /* unitydumpApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = unitydumpApp.swift; sourceTree = ""; };
22 | 0092EE582A38AD8400B9F819 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; };
23 | 0092EE5A2A38AD8500B9F819 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
24 | 0092EE5D2A38AD8500B9F819 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; };
25 | 0096B0E82A3BED9F007B54A7 /* CreditsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreditsView.swift; sourceTree = ""; };
26 | 3DE674F62A3C61D9001BCB02 /* iOS-Dump */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = "iOS-Dump"; path = "unitydump/iOS-Dump"; sourceTree = SOURCE_ROOT; };
27 | /* End PBXFileReference section */
28 |
29 | /* Begin PBXFrameworksBuildPhase section */
30 | 0092EE502A38AD8400B9F819 /* Frameworks */ = {
31 | isa = PBXFrameworksBuildPhase;
32 | buildActionMask = 2147483647;
33 | files = (
34 | 0096B0E62A3B51DC007B54A7 /* AuxiliaryExecute in Frameworks */,
35 | );
36 | runOnlyForDeploymentPostprocessing = 0;
37 | };
38 | /* End PBXFrameworksBuildPhase section */
39 |
40 | /* Begin PBXGroup section */
41 | 0092EE4A2A38AD8400B9F819 = {
42 | isa = PBXGroup;
43 | children = (
44 | 0092EE552A38AD8400B9F819 /* unitydump */,
45 | 0092EE542A38AD8400B9F819 /* Products */,
46 | );
47 | sourceTree = "";
48 | };
49 | 0092EE542A38AD8400B9F819 /* Products */ = {
50 | isa = PBXGroup;
51 | children = (
52 | 0092EE532A38AD8400B9F819 /* unitydump.app */,
53 | );
54 | name = Products;
55 | sourceTree = "";
56 | };
57 | 0092EE552A38AD8400B9F819 /* unitydump */ = {
58 | isa = PBXGroup;
59 | children = (
60 | 0092EE562A38AD8400B9F819 /* unitydumpApp.swift */,
61 | 0092EE582A38AD8400B9F819 /* ContentView.swift */,
62 | 0096B0E82A3BED9F007B54A7 /* CreditsView.swift */,
63 | 0092EE5A2A38AD8500B9F819 /* Assets.xcassets */,
64 | 3DE674F62A3C61D9001BCB02 /* iOS-Dump */,
65 | 0092EE5C2A38AD8500B9F819 /* Preview Content */,
66 | );
67 | path = unitydump;
68 | sourceTree = "";
69 | };
70 | 0092EE5C2A38AD8500B9F819 /* Preview Content */ = {
71 | isa = PBXGroup;
72 | children = (
73 | 0092EE5D2A38AD8500B9F819 /* Preview Assets.xcassets */,
74 | );
75 | path = "Preview Content";
76 | sourceTree = "";
77 | };
78 | /* End PBXGroup section */
79 |
80 | /* Begin PBXNativeTarget section */
81 | 0092EE522A38AD8400B9F819 /* unitydump */ = {
82 | isa = PBXNativeTarget;
83 | buildConfigurationList = 0092EE772A38AD8500B9F819 /* Build configuration list for PBXNativeTarget "unitydump" */;
84 | buildPhases = (
85 | 0092EE4F2A38AD8400B9F819 /* Sources */,
86 | 0092EE502A38AD8400B9F819 /* Frameworks */,
87 | 0092EE512A38AD8400B9F819 /* Resources */,
88 | );
89 | buildRules = (
90 | );
91 | dependencies = (
92 | );
93 | name = unitydump;
94 | packageProductDependencies = (
95 | 0096B0E52A3B51DC007B54A7 /* AuxiliaryExecute */,
96 | );
97 | productName = unitydump;
98 | productReference = 0092EE532A38AD8400B9F819 /* unitydump.app */;
99 | productType = "com.apple.product-type.application";
100 | };
101 | /* End PBXNativeTarget section */
102 |
103 | /* Begin PBXProject section */
104 | 0092EE4B2A38AD8400B9F819 /* Project object */ = {
105 | isa = PBXProject;
106 | attributes = {
107 | BuildIndependentTargetsInParallel = 1;
108 | LastSwiftUpdateCheck = 1430;
109 | LastUpgradeCheck = 1430;
110 | TargetAttributes = {
111 | 0092EE522A38AD8400B9F819 = {
112 | CreatedOnToolsVersion = 14.3.1;
113 | };
114 | };
115 | };
116 | buildConfigurationList = 0092EE4E2A38AD8400B9F819 /* Build configuration list for PBXProject "unitydump" */;
117 | compatibilityVersion = "Xcode 14.0";
118 | developmentRegion = en;
119 | hasScannedForEncodings = 0;
120 | knownRegions = (
121 | en,
122 | Base,
123 | );
124 | mainGroup = 0092EE4A2A38AD8400B9F819;
125 | packageReferences = (
126 | 0096B0E42A3B51DC007B54A7 /* XCRemoteSwiftPackageReference "AuxiliaryExecute" */,
127 | );
128 | productRefGroup = 0092EE542A38AD8400B9F819 /* Products */;
129 | projectDirPath = "";
130 | projectRoot = "";
131 | targets = (
132 | 0092EE522A38AD8400B9F819 /* unitydump */,
133 | );
134 | };
135 | /* End PBXProject section */
136 |
137 | /* Begin PBXResourcesBuildPhase section */
138 | 0092EE512A38AD8400B9F819 /* Resources */ = {
139 | isa = PBXResourcesBuildPhase;
140 | buildActionMask = 2147483647;
141 | files = (
142 | 3DE674F72A3C61D9001BCB02 /* iOS-Dump in Resources */,
143 | 0092EE5E2A38AD8500B9F819 /* Preview Assets.xcassets in Resources */,
144 | 0092EE5B2A38AD8500B9F819 /* Assets.xcassets in Resources */,
145 | );
146 | runOnlyForDeploymentPostprocessing = 0;
147 | };
148 | /* End PBXResourcesBuildPhase section */
149 |
150 | /* Begin PBXSourcesBuildPhase section */
151 | 0092EE4F2A38AD8400B9F819 /* Sources */ = {
152 | isa = PBXSourcesBuildPhase;
153 | buildActionMask = 2147483647;
154 | files = (
155 | 0092EE592A38AD8400B9F819 /* ContentView.swift in Sources */,
156 | 0096B0E92A3BED9F007B54A7 /* CreditsView.swift in Sources */,
157 | 0092EE572A38AD8400B9F819 /* unitydumpApp.swift in Sources */,
158 | );
159 | runOnlyForDeploymentPostprocessing = 0;
160 | };
161 | /* End PBXSourcesBuildPhase section */
162 |
163 | /* Begin XCBuildConfiguration section */
164 | 0092EE752A38AD8500B9F819 /* Debug */ = {
165 | isa = XCBuildConfiguration;
166 | buildSettings = {
167 | ALWAYS_SEARCH_USER_PATHS = NO;
168 | CLANG_ANALYZER_NONNULL = YES;
169 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
170 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
171 | CLANG_ENABLE_MODULES = YES;
172 | CLANG_ENABLE_OBJC_ARC = YES;
173 | CLANG_ENABLE_OBJC_WEAK = YES;
174 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
175 | CLANG_WARN_BOOL_CONVERSION = YES;
176 | CLANG_WARN_COMMA = YES;
177 | CLANG_WARN_CONSTANT_CONVERSION = YES;
178 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
179 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
180 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
181 | CLANG_WARN_EMPTY_BODY = YES;
182 | CLANG_WARN_ENUM_CONVERSION = YES;
183 | CLANG_WARN_INFINITE_RECURSION = YES;
184 | CLANG_WARN_INT_CONVERSION = YES;
185 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
186 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
187 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
188 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
189 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
190 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
191 | CLANG_WARN_STRICT_PROTOTYPES = YES;
192 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
193 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
194 | CLANG_WARN_UNREACHABLE_CODE = YES;
195 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
196 | COPY_PHASE_STRIP = NO;
197 | DEBUG_INFORMATION_FORMAT = dwarf;
198 | ENABLE_STRICT_OBJC_MSGSEND = YES;
199 | ENABLE_TESTABILITY = YES;
200 | GCC_C_LANGUAGE_STANDARD = gnu11;
201 | GCC_DYNAMIC_NO_PIC = NO;
202 | GCC_NO_COMMON_BLOCKS = YES;
203 | GCC_OPTIMIZATION_LEVEL = 0;
204 | GCC_PREPROCESSOR_DEFINITIONS = (
205 | "DEBUG=1",
206 | "$(inherited)",
207 | );
208 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
209 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
210 | GCC_WARN_UNDECLARED_SELECTOR = YES;
211 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
212 | GCC_WARN_UNUSED_FUNCTION = YES;
213 | GCC_WARN_UNUSED_VARIABLE = YES;
214 | IPHONEOS_DEPLOYMENT_TARGET = 14.0;
215 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
216 | MTL_FAST_MATH = YES;
217 | ONLY_ACTIVE_ARCH = YES;
218 | SDKROOT = iphoneos;
219 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
220 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
221 | };
222 | name = Debug;
223 | };
224 | 0092EE762A38AD8500B9F819 /* Release */ = {
225 | isa = XCBuildConfiguration;
226 | buildSettings = {
227 | ALWAYS_SEARCH_USER_PATHS = NO;
228 | CLANG_ANALYZER_NONNULL = YES;
229 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
230 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
231 | CLANG_ENABLE_MODULES = YES;
232 | CLANG_ENABLE_OBJC_ARC = YES;
233 | CLANG_ENABLE_OBJC_WEAK = YES;
234 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
235 | CLANG_WARN_BOOL_CONVERSION = YES;
236 | CLANG_WARN_COMMA = YES;
237 | CLANG_WARN_CONSTANT_CONVERSION = YES;
238 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
239 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
240 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
241 | CLANG_WARN_EMPTY_BODY = YES;
242 | CLANG_WARN_ENUM_CONVERSION = YES;
243 | CLANG_WARN_INFINITE_RECURSION = YES;
244 | CLANG_WARN_INT_CONVERSION = YES;
245 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
246 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
247 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
248 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
249 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
250 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
251 | CLANG_WARN_STRICT_PROTOTYPES = YES;
252 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
253 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
254 | CLANG_WARN_UNREACHABLE_CODE = YES;
255 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
256 | COPY_PHASE_STRIP = NO;
257 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
258 | ENABLE_NS_ASSERTIONS = NO;
259 | ENABLE_STRICT_OBJC_MSGSEND = YES;
260 | GCC_C_LANGUAGE_STANDARD = gnu11;
261 | GCC_NO_COMMON_BLOCKS = YES;
262 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
263 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
264 | GCC_WARN_UNDECLARED_SELECTOR = YES;
265 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
266 | GCC_WARN_UNUSED_FUNCTION = YES;
267 | GCC_WARN_UNUSED_VARIABLE = YES;
268 | IPHONEOS_DEPLOYMENT_TARGET = 14.0;
269 | MTL_ENABLE_DEBUG_INFO = NO;
270 | MTL_FAST_MATH = YES;
271 | SDKROOT = iphoneos;
272 | SWIFT_COMPILATION_MODE = wholemodule;
273 | SWIFT_OPTIMIZATION_LEVEL = "-O";
274 | VALIDATE_PRODUCT = YES;
275 | };
276 | name = Release;
277 | };
278 | 0092EE782A38AD8500B9F819 /* Debug */ = {
279 | isa = XCBuildConfiguration;
280 | buildSettings = {
281 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
282 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
283 | CODE_SIGN_IDENTITY = "Apple Development";
284 | CODE_SIGN_STYLE = Automatic;
285 | CURRENT_PROJECT_VERSION = 1;
286 | DEVELOPMENT_ASSET_PATHS = "\"unitydump/Preview Content\"";
287 | DEVELOPMENT_TEAM = WQL5MJWHM6;
288 | ENABLE_PREVIEWS = YES;
289 | GENERATE_INFOPLIST_FILE = YES;
290 | INFOPLIST_KEY_CFBundleDisplayName = unitydump;
291 | INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
292 | INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
293 | INFOPLIST_KEY_UILaunchScreen_Generation = YES;
294 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
295 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
296 | INFOPLIST_KEY_UIUserInterfaceStyle = Light;
297 | IPHONEOS_DEPLOYMENT_TARGET = 14.0;
298 | LD_RUNPATH_SEARCH_PATHS = (
299 | "$(inherited)",
300 | "@executable_path/Frameworks",
301 | );
302 | MARKETING_VERSION = 1.3;
303 | PRODUCT_BUNDLE_IDENTIFIER = com.34306.unitydump;
304 | PRODUCT_NAME = "$(TARGET_NAME)";
305 | PROVISIONING_PROFILE_SPECIFIER = "";
306 | SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
307 | SUPPORTS_MACCATALYST = NO;
308 | SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
309 | SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
310 | SWIFT_EMIT_LOC_STRINGS = YES;
311 | SWIFT_VERSION = 5.0;
312 | TARGETED_DEVICE_FAMILY = "1,2";
313 | };
314 | name = Debug;
315 | };
316 | 0092EE792A38AD8500B9F819 /* Release */ = {
317 | isa = XCBuildConfiguration;
318 | buildSettings = {
319 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
320 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
321 | CODE_SIGN_IDENTITY = "Apple Development";
322 | CODE_SIGN_STYLE = Automatic;
323 | CURRENT_PROJECT_VERSION = 1;
324 | DEVELOPMENT_ASSET_PATHS = "\"unitydump/Preview Content\"";
325 | DEVELOPMENT_TEAM = WQL5MJWHM6;
326 | ENABLE_PREVIEWS = YES;
327 | GENERATE_INFOPLIST_FILE = YES;
328 | INFOPLIST_KEY_CFBundleDisplayName = unitydump;
329 | INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
330 | INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
331 | INFOPLIST_KEY_UILaunchScreen_Generation = YES;
332 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
333 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
334 | INFOPLIST_KEY_UIUserInterfaceStyle = Light;
335 | IPHONEOS_DEPLOYMENT_TARGET = 14.0;
336 | LD_RUNPATH_SEARCH_PATHS = (
337 | "$(inherited)",
338 | "@executable_path/Frameworks",
339 | );
340 | MARKETING_VERSION = 1.3;
341 | PRODUCT_BUNDLE_IDENTIFIER = com.34306.unitydump;
342 | PRODUCT_NAME = "$(TARGET_NAME)";
343 | PROVISIONING_PROFILE_SPECIFIER = "";
344 | SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
345 | SUPPORTS_MACCATALYST = NO;
346 | SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
347 | SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
348 | SWIFT_EMIT_LOC_STRINGS = YES;
349 | SWIFT_VERSION = 5.0;
350 | TARGETED_DEVICE_FAMILY = "1,2";
351 | };
352 | name = Release;
353 | };
354 | /* End XCBuildConfiguration section */
355 |
356 | /* Begin XCConfigurationList section */
357 | 0092EE4E2A38AD8400B9F819 /* Build configuration list for PBXProject "unitydump" */ = {
358 | isa = XCConfigurationList;
359 | buildConfigurations = (
360 | 0092EE752A38AD8500B9F819 /* Debug */,
361 | 0092EE762A38AD8500B9F819 /* Release */,
362 | );
363 | defaultConfigurationIsVisible = 0;
364 | defaultConfigurationName = Release;
365 | };
366 | 0092EE772A38AD8500B9F819 /* Build configuration list for PBXNativeTarget "unitydump" */ = {
367 | isa = XCConfigurationList;
368 | buildConfigurations = (
369 | 0092EE782A38AD8500B9F819 /* Debug */,
370 | 0092EE792A38AD8500B9F819 /* Release */,
371 | );
372 | defaultConfigurationIsVisible = 0;
373 | defaultConfigurationName = Release;
374 | };
375 | /* End XCConfigurationList section */
376 |
377 | /* Begin XCRemoteSwiftPackageReference section */
378 | 0096B0E42A3B51DC007B54A7 /* XCRemoteSwiftPackageReference "AuxiliaryExecute" */ = {
379 | isa = XCRemoteSwiftPackageReference;
380 | repositoryURL = "https://github.com/Lakr233/AuxiliaryExecute";
381 | requirement = {
382 | kind = upToNextMajorVersion;
383 | minimumVersion = 2.0.0;
384 | };
385 | };
386 | /* End XCRemoteSwiftPackageReference section */
387 |
388 | /* Begin XCSwiftPackageProductDependency section */
389 | 0096B0E52A3B51DC007B54A7 /* AuxiliaryExecute */ = {
390 | isa = XCSwiftPackageProductDependency;
391 | package = 0096B0E42A3B51DC007B54A7 /* XCRemoteSwiftPackageReference "AuxiliaryExecute" */;
392 | productName = AuxiliaryExecute;
393 | };
394 | /* End XCSwiftPackageProductDependency section */
395 | };
396 | rootObject = 0092EE4B2A38AD8400B9F819 /* Project object */;
397 | }
398 |
--------------------------------------------------------------------------------