阶段四:Spine 3.8.99 编辑器里挂上自建视图面板
目标:在 Spine 编辑器窗口内部加一个自己的视图面板(按钮 + 文字显示), 点击读取场景对象,并像原生面板一样出现在 Views 菜单、可停靠可折叠。 本轮打通: 1. 编辑器在我们自己的进程里完整启动 - 类加载器必须是 URLClassLoader 本身(自检要求) - Editor.main 必须在 AWT EDT 上调用 - jvm.cfg 第 21 行要以两个空格结尾 + -DSpineJava - Editor.D:I 版本号、fonts/、/tzax 资源、Java8 版 launcher.Launcher 替身 2. 3.8.99 全量解密 → 可读源码 - 字符串 17251/17461(伪造同名调用帧对齐 key) - 混淆动态派发还原 53871 处(调引导方法取 MemberName) 3. 自建视图 - agent 在内存里给 us 枚举加 spineView 常量(不改磁盘,避开完整性自检) - 面板 Actor 由外部反射填进 us.spineView.D - 复用已有图标做别名(不新建图片资源) 最终 "Spine View" 出现在 Views 菜单,可与 Tree 并排停靠、折叠展开 另外: - ViewPatcher/ViewAgent:视图枚举与面板挂载的字节码插桩 - DecAll/ObMap/rewrite_source:字符串解密、派发还原、可读源码生成 - 阶段四-视图面板挂载.md:完整记录做法与踩过的坑 不纳入版本管理:rea/(独立仓库)、tools 下的 JDK/Ghidra 工具链、 Spine.app 与 spine-lab 副本、从载荷派生的批量产物。
This commit is contained in:
commit
2e7ab7c33c
113 files changed
+25327
No files matched your search
@@ -0,0 +1 @@
|
||||
{"evidence_id":"ev_9b04f23052e3407e648ebc0041e3974dcb27b0143b60b2383d5421ca6e9f0ee9","subject":{"name":"Spine.app","digest":{"sha256":"3ae6f7d89dd215bc2af41c342e6f0da18e4879a367a792864af123cc932eddd6"},"local_path":"/Users/tianmokeji/Desktop/临时/spine加功能/Spine.app","format":"directory","architecture":null},"provider":{"id":"rea-artifact-graph","name":"REA safe artifact graph provider","version":"1"},"analysis_profile":null,"predicate_type":"rea.analysis","operation":"inspect_artifact","parameters":{"integrity_policy":"fail"},"raw_result":null,"normalized_result":{"inspection_id":"ai_b1669da28fcdcff85de83bb85c6f2cc17303c03200353fc1c778550a8f3a92f7","subject":{"manifest_id":"agm_82b508d4d559c723e0f2dd27c51e61eaf519031bb2c465ca4524b9c7ba692c74","root_artifact_id":"art_ae3243db850c220d5ab80b5cb8079ae70b9b833bb3b0254420a699b137b75a0e","root_sha256":"3ae6f7d89dd215bc2af41c342e6f0da18e4879a367a792864af123cc932eddd6","root_format":"directory"},"substeps":[{"substep_id":"ais_31c0e3c3ea51a057c0602b45c0f647d753fa1df1209b269fb746848c5cfbb89e","operation":"inventory_artifact","status":"completed","evidence_id":"ev_1f18fe9264db0c8d46d98d51641d533fae5bcb7c49ba7c92b06e9df4a44aced6","evidence":{"evidence_id":"ev_1f18fe9264db0c8d46d98d51641d533fae5bcb7c49ba7c92b06e9df4a44aced6","subject":{"name":"Spine.app","digest":{"sha256":"3ae6f7d89dd215bc2af41c342e6f0da18e4879a367a792864af123cc932eddd6"},"local_path":"/Users/tianmokeji/Desktop/临时/spine加功能/Spine.app","format":"directory","architecture":null},"provider":{"id":"rea-artifact-graph","name":"REA safe artifact graph provider","version":"1"},"analysis_profile":null,"predicate_type":"rea.analysis","operation":"inventory_artifact","parameters":{"integrity_policy":"fail"},"raw_result":null,"normalized_result":{"manifest":{"manifest_id":"agm_82b508d4d559c723e0f2dd27c51e61eaf519031bb2c465ca4524b9c7ba692c74","root_artifact_id":"art_ae3243db850c220d5ab80b5cb8079ae70b9b833bb3b0254420a699b137b75a0e","root_sha256":"3ae6f7d89dd215bc2af41c342e6f0da18e4879a367a792864af123cc932eddd6","root_format":"directory","graph_sha256":"d18481e958456ac2dc71cdc43211671100d49ca366b20f474c6ad7e328af11c0","node_count":185,"occurrence_count":239,"edge_count":238},"nodes":[{"artifact_id":"art_00afd2822ca673596e66205dadeffc761c4bd49d25be1e2fa7c41498ecde1300","format":"file","sha256":"5e4e6623a21a63f9bc16ea54af4133b8038e490c0d499a74676f9e5a61b9c5b2","size":2384,"media_type":null,"architecture":null,"content_state":"embedded","limitations":[]},{"artifact_id":"art_00b813901f721c0c8df140a505792c62c4579857d96aa50cdbb9b236a57a9144","format":"file","sha256":"299c2360b6155eb28990ec49cd21753f97e43442fe8fab03e04f3e213df43a66","size":1210,"media_type":null,"architecture":null,"content_state":"embedded","limitations":[]},{"artifact_id":"art_01025a6e14341a82c76634d2700f78272e5a93c717fa2d6f3bf82b5a23d9b84e","format":"file","sha256":"dcaf0e0e52b7cc073ded86c66117ea0fb6b91ae33eb4d3584a98902d586b1387","size":2594,"media_type":null,"architecture":null,"content_state":"embedded","limitations":[]},{"artifact_id":"art_029ea9766596fc6bcfc8e2eb5d51e7e3ee65c696183548d15bd202449e227d5f","format":"directory","sha256":"8bba921eb7f84133b3856d4d2352d0b7eb9d07774ce75fedb461a1bd51c8b059","size":0,"media_type":null,"architecture":null,"content_state":"virtual","limitations":[]},{"artifact_id":"art_0561f8eedecb675bf831c7b400e75dfbb3a1d7e6b7e02a91e76ba48035564434","format":"directory","sha256":"83a810c05768a4df008af38946a514628211e02684974b2c177d431d10be2269","size":0,"media_type":null,"architecture":null,"content_state":"virtual","limitations":[]},{"artifact_id":"art_061c6700f9c7043f1b12cee1dd964184128e56df771f58db5c580be2be667152","format":"file","sha256":"c8b99f33890887d27ad56fba9edd8ebbc668cfe0689168505a95613d1d4b32f8","size":1288,"media_type":null,"architecture":null,"content_state":"embedded","limitations":[]},{"artifact_id":"art_0915d610333f36edf46090c94528b94230afdb3707865849b48836062609d691","format":"file","sha256":"41f4d63e670d75f5936a895aae919e226f5d50c54b5b09db3ba4d7052a2c1554","size":1178,"media_type":null,"architecture":null,"content_state":"embedded","limitations":[]},{"artifact_id":"art_09c78588acba2970adea1787e5d4c9eec8296df85fdf105bd147033f01598ce8","format":"file","sha256":"e93dc8e2b930cdc39c0c618fe1b23e74e73002765ffea18440d8e9c4311ebdf1","size":11392,"media_type":null,"architecture":null,"content_state":"embedded","limitations":[]},{"artifact_id":"art_0cb4629ab6fe26684cfd515b50a275d46686056f4b06a02254389d914acb83c1","format":"mach-o","sha256":"7468546df6669959e25bf6d58c8a76b9969557457a08feb47c3794ef55ca1f82","size":123888,"media_type":null,"architecture":null,"content_state":"embedded","limitations":[]},{"artifact_id":"art_0ce386ea941a60972488e16a6f57e655cc84557d8cfa265a93cf84f6e6e54d0d","format":"mach-o","sha256":"a86a356ba1cecd35fb34044432d37790e1dd29a7dc18f7499b82a3a2119fade9","size":373088,"media_type":null,"architecture":null,"content_state":"embedded","limitations":[]},{"artifact_id":"art_0ce5a0009Line truncated
|
||||
Whitespace-only changes.
@@ -0,0 +1 @@
|
||||
{"evidence_id":"ev_de24dbaf976675fccca527eb5fc3ce078310ce52f606a3a6cceb816ef651649a","subject":{"name":"Spine","digest":{"sha256":"fea6e69af72dc5a3f38195f293b8af3d61b3bf4b3845b1069b6c3603384340f2"},"local_path":"/Users/tianmokeji/Desktop/临时/spine加功能/Spine.app/Contents/MacOS/Spine","format":"mach-o","architecture":"arm64"},"provider":{"id":"native-macos","name":"macOS native inspection utilities","version":null},"analysis_profile":null,"predicate_type":"rea.analysis","operation":"inspect_macho","parameters":{},"raw_result":null,"normalized_result":{"format":"mach-o","selected_architecture":{"name":"arm64","container_file_offset":0},"endian":"little","word_size":64,"file_type":"2","flags":["0x00200085"],"uuid":"0764A539-8C54-317A-B9B1-0BA2CA4874AC","entrypoints":{"items":[{"file_offset":16332}],"total":1,"exhaustive":true,"limitations":[]},"architectures":{"items":[{"name":"arm64","cpu_type":null,"cpu_subtype":null,"file_offset":null,"size":null,"alignment":null}],"total":1,"exhaustive":true,"limitations":[]},"build_metadata":{"items":[{"platform":"MACOS","minimum_os":"11.0","sdk":"14.5","tools":[{"name":"LD","version":"1053.12"}]}],"total":1,"exhaustive":true,"limitations":[]},"load_commands":{"items":[{"index":0,"kind":"LC_SEGMENT_64","fields":{"cmd":"LC_SEGMENT_64","cmdsize":72,"segname":"__PAGEZERO","vmaddr":0,"vmsize":4294967296,"fileoff":0,"filesize":0,"maxprot":0,"initprot":0,"nsects":0,"flags":0}},{"index":1,"kind":"LC_SEGMENT_64","fields":{"cmd":"LC_SEGMENT_64","cmdsize":872,"segname":"__TEXT","vmaddr":4294967296,"vmsize":32768,"fileoff":0,"filesize":32768,"maxprot":5,"initprot":5,"nsects":10,"flags":0}},{"index":2,"kind":"LC_SEGMENT_64","fields":{"cmd":"LC_SEGMENT_64","cmdsize":552,"segname":"__DATA_CONST","vmaddr":4295000064,"vmsize":16384,"fileoff":32768,"filesize":16384,"maxprot":3,"initprot":3,"nsects":6,"flags":16}},{"index":3,"kind":"LC_SEGMENT_64","fields":{"cmd":"LC_SEGMENT_64","cmdsize":712,"segname":"__DATA","vmaddr":4295016448,"vmsize":16384,"fileoff":49152,"filesize":16384,"maxprot":3,"initprot":3,"nsects":8,"flags":0}},{"index":4,"kind":"LC_SEGMENT_64","fields":{"cmd":"LC_SEGMENT_64","cmdsize":72,"segname":"__LINKEDIT","vmaddr":4295032832,"vmsize":32768,"fileoff":65536,"filesize":22000,"maxprot":1,"initprot":1,"nsects":0,"flags":0}},{"index":5,"kind":"LC_DYLD_INFO_ONLY","fields":{"cmd":"LC_DYLD_INFO_ONLY","cmdsize":48,"rebase_off":65536,"rebase_size":192,"bind_off":65728,"bind_size":536,"weak_bind_off":0,"weak_bind_size":0,"lazy_bind_off":66264,"lazy_bind_size":424,"export_off":66688,"export_size":32}},{"index":6,"kind":"LC_SYMTAB","fields":{"cmd":"LC_SYMTAB","cmdsize":24,"symoff":66840,"nsyms":39,"stroff":67640,"strsize":744}},{"index":7,"kind":"LC_DYSYMTAB","fields":{"cmd":"LC_DYSYMTAB","cmdsize":80,"ilocalsym":0,"nlocalsym":1,"iextdefsym":1,"nextdefsym":1,"iundefsym":2,"nundefsym":37,"tocoff":0,"ntoc":0,"modtaboff":0,"nmodtab":0,"extrefsymoff":0,"nextrefsyms":0,"indirectsymoff":67464,"nindirectsyms":44,"extreloff":0,"nextrel":0,"locreloff":0,"nlocrel":0}},{"index":8,"kind":"LC_LOAD_DYLINKER","fields":{"cmd":"LC_LOAD_DYLINKER","cmdsize":32,"name":"/usr/lib/dyld (offset 12)"}},{"index":9,"kind":"LC_UUID","fields":{"cmd":"LC_UUID","cmdsize":24,"uuid":"0764A539-8C54-317A-B9B1-0BA2CA4874AC"}},{"index":10,"kind":"LC_BUILD_VERSION","fields":{"cmd":"LC_BUILD_VERSION","cmdsize":32,"platform":1,"minos":"11.0","sdk":"14.5","ntools":1,"tool":3,"version":"1053.12"}},{"index":11,"kind":"LC_SOURCE_VERSION","fields":{"cmd":"LC_SOURCE_VERSION","cmdsize":16,"version":"0.0"}},{"index":12,"kind":"LC_MAIN","fields":{"cmd":"LC_MAIN","cmdsize":24,"entryoff":16332,"stacksize":0}},{"index":13,"kind":"LC_LOAD_DYLIB","fields":{"cmd":"LC_LOAD_DYLIB","cmdsize":96,"name":"/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation (offset 24)","time stamp":"2 Thu Jan 1 08:00:02 1970","current version":"2503.1.0","compatibility version":"300.0.0"}},{"index":14,"kind":"LC_LOAD_DYLIB","fields":{"cmd":"LC_LOAD_DYLIB","cmdsize":88,"name":"/System/Library/Frameworks/AppKit.framework/Versions/C/AppKit (offset 24)","time stamp":"2 Thu Jan 1 08:00:02 1970","current version":"2487.60.105","compatibility version":"45.0.0"}},{"index":15,"kind":"LC_LOAD_DYLIB","fields":{"cmd":"LC_LOAD_DYLIB","cmdsize":88,"name":"/System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa (offset 24)","time stamp":"2 Thu Jan 1 08:00:02 1970","current version":"24.0.0","compatibility version":"1.0.0"}},{"index":16,"kind":"LC_LOAD_DYLIB","fields":{"cmd":"LC_LOAD_DYLIB","cmdsize":56,"name":"/usr/lib/libobjc.A.dylib (offset 24)","time stamp":"2 Thu Jan 1 08:00:02 1970","current version":"228.0.0","compatibility version":"1.0.0"}},{"index":17,"kind":"LC_LOAD_DYLIB","fields":{"cmd":"LC_LOAD_DYLIB","cmdsize":56,"name":"/usr/lib/libSystem.B.dylib (offset 24)","time stamp":"2 Thu Jan 1 08:00:02 1970","current version":"1345.120.2","compatibility version":"1.0.0"}},{"index":18,"kind":"LC_LOAD_DYLIB","fields":{"cmd":"LC_LOAD_DYLLine truncated
|
||||
@@ -0,0 +1 @@
|
||||
{"evidence_id":"ev_8db26c98ef5a365354f5fc68ff26d5c8d0ab4d3ab273b09aba70753a958a5087","subject":{"name":"Spine","digest":{"sha256":"fea6e69af72dc5a3f38195f293b8af3d61b3bf4b3845b1069b6c3603384340f2"},"local_path":"/Users/tianmokeji/Desktop/临时/spine加功能/Spine.app/Contents/MacOS/Spine","format":"mach-o","architecture":"arm64"},"provider":{"id":"native-macos","name":"macOS native inspection utilities","version":null},"analysis_profile":null,"predicate_type":"rea.analysis","operation":"inspect_signature","parameters":{},"raw_result":null,"normalized_result":{"signed":true,"identifier":"Spine","team_identifier":null,"format":"Mach-O thin (arm64)","cdhashes":["e47d518d37f960a2e45a1b738056b57b00f885c7"],"hash_algorithms":["sha256"],"authorities":[],"designated_requirement":"cdhash H\"e47d518d37f960a2e45a1b738056b57b00f885c7\"","entitlements":{},"timestamp":null,"hardened_runtime":false,"provenance":[{"tool":"codesign","command":["/usr/bin/codesign","-d","--verbose=4","$ARTIFACT"],"tool_version":null,"version_reason":"Tool exposes no uniform stable version flag; executable SHA-256 is a prelaunch file sample and does not prove atomic OS image binding.","executable_sha256":"6f92f630759f1a7f3faa0bebe1b27b3565a44d5d44c15cc4ddead6b3af373f40","exit":{"code":0,"signal":null},"stdout_bytes":0,"stderr_bytes":832},{"tool":"codesign","command":["/usr/bin/codesign","-d","-r-","$ARTIFACT"],"tool_version":null,"version_reason":"Tool exposes no uniform stable version flag; executable SHA-256 is a prelaunch file sample and does not prove atomic OS image binding.","executable_sha256":"6f92f630759f1a7f3faa0bebe1b27b3565a44d5d44c15cc4ddead6b3af373f40","exit":{"code":0,"signal":null},"stdout_bytes":67,"stderr_bytes":95},{"tool":"codesign","command":["/usr/bin/codesign","-d","--entitlements",":-","$ARTIFACT"],"tool_version":null,"version_reason":"Tool exposes no uniform stable version flag; executable SHA-256 is a prelaunch file sample and does not prove atomic OS image binding.","executable_sha256":"6f92f630759f1a7f3faa0bebe1b27b3565a44d5d44c15cc4ddead6b3af373f40","exit":{"code":0,"signal":null},"stdout_bytes":184,"stderr_bytes":183}],"limitations":["Entitlements and designated requirements require separate bounded commands.","Inspected a digest-verified Mach-O byte snapshot; filesystem-bound signing context and trust validation are not examined."]},"confidence":"observed","authority":"shipped-artifact","environment":null,"limitations":["Entitlements and designated requirements require separate bounded commands.","Inspected a digest-verified Mach-O byte snapshot; filesystem-bound signing context and trust validation are not examined."],"relationship_coverage":null,"locations":[],"evidence_links":[]}
|
||||
@@ -0,0 +1 @@
|
||||
{"evidence_id":"ev_b21baaed28ef8ff188a0ef20956c5ff5258f22377164cbe1969e3866a758804b","subject":{"name":"Spine","digest":{"sha256":"fea6e69af72dc5a3f38195f293b8af3d61b3bf4b3845b1069b6c3603384340f2"},"local_path":"/Users/tianmokeji/Desktop/临时/spine加功能/Spine.app/Contents/MacOS/Spine","format":"mach-o","architecture":"arm64"},"provider":{"id":"rea-artifact-graph","name":"REA safe artifact graph provider","version":"1"},"analysis_profile":null,"predicate_type":"rea.analysis","operation":"trace_dylib_resolution","parameters":{},"raw_result":null,"normalized_result":{"root_path":"/Users/tianmokeji/Desktop/临时/spine加功能/Spine.app","target_sha256":"fea6e69af72dc5a3f38195f293b8af3d61b3bf4b3845b1069b6c3603384340f2","roots":[{"image":"Contents/MacOS/Spine","architecture":"arm64"},{"image":"Contents/MacOS/Spine_x86","architecture":"x86_64"},{"image":"Contents/MacOS/launcher/1/lib/jspawnhelper","architecture":"x86_64"},{"image":"Contents/MacOS/launcher/2/bin/ffmpeg-macos","architecture":"arm64"},{"image":"Contents/MacOS/launcher/2/bin/ffmpeg-macos-arm","architecture":"arm64"},{"image":"Contents/MacOS/launcher/2/bin/oxipng-macos","architecture":"arm64"},{"image":"Contents/MacOS/launcher/2/bin/oxipng-macos-arm","architecture":"arm64"},{"image":"Contents/MacOS/launcher/2/lib/jspawnhelper","architecture":"arm64"}],"images":[{"path":"Contents/MacOS/Spine","sha256":"fea6e69af72dc5a3f38195f293b8af3d61b3bf4b3845b1069b6c3603384340f2","parse_status":"parsed","reason":null,"slices":[{"architecture":"arm64","slice_offset":0,"slice_size":87536,"cpu_type":16777228,"cpu_subtype":0,"fat_cpu_type":null,"fat_cpu_subtype":null,"fat_alignment_exponent":null,"file_type":"execute","file_type_code":2,"platform":1,"platforms":[1],"install_name":null,"rpaths":["@executable_path/../Frameworks"],"dyld_environment":[],"code_signature_present":true}]},{"path":"Contents/MacOS/Spine_x86","sha256":"f7ca9cb634a1a81150c29e078edc7aacc99ec06181895f6d421847444ad387fd","parse_status":"parsed","reason":null,"slices":[{"architecture":"x86_64","slice_offset":0,"slice_size":54528,"cpu_type":16777223,"cpu_subtype":3,"fat_cpu_type":null,"fat_cpu_subtype":null,"fat_alignment_exponent":null,"file_type":"execute","file_type_code":2,"platform":1,"platforms":[1],"install_name":null,"rpaths":["@executable_path/../Frameworks"],"dyld_environment":[],"code_signature_present":true}]},{"path":"Contents/MacOS/launcher/1/lib/jspawnhelper","sha256":"35eea96a9f708da1c3b7b736f4a2a6d06478de769b8a02fc9da9911478992dac","parse_status":"parsed","reason":null,"slices":[{"architecture":"x86_64","slice_offset":0,"slice_size":15144,"cpu_type":16777223,"cpu_subtype":2147483651,"fat_cpu_type":null,"fat_cpu_subtype":null,"fat_alignment_exponent":null,"file_type":"execute","file_type_code":2,"platform":1,"platforms":[1],"install_name":null,"rpaths":[],"dyld_environment":[],"code_signature_present":false}]},{"path":"Contents/MacOS/launcher/2/bin/ffmpeg-macos","sha256":"7dc6231d735fabcec85e2892e68b620435aa2c9aa5ea8d33ee0a1ad1b1f330e8","parse_status":"parsed","reason":null,"slices":[{"architecture":"arm64","slice_offset":0,"slice_size":7727432,"cpu_type":16777228,"cpu_subtype":0,"fat_cpu_type":null,"fat_cpu_subtype":null,"fat_alignment_exponent":null,"file_type":"execute","file_type_code":2,"platform":1,"platforms":[1],"install_name":null,"rpaths":[],"dyld_environment":[],"code_signature_present":true}]},{"path":"Contents/MacOS/launcher/2/bin/ffmpeg-macos-arm","sha256":"7dc6231d735fabcec85e2892e68b620435aa2c9aa5ea8d33ee0a1ad1b1f330e8","parse_status":"parsed","reason":null,"slices":[{"architecture":"arm64","slice_offset":0,"slice_size":7727432,"cpu_type":16777228,"cpu_subtype":0,"fat_cpu_type":null,"fat_cpu_subtype":null,"fat_alignment_exponent":null,"file_type":"execute","file_type_code":2,"platform":1,"platforms":[1],"install_name":null,"rpaths":[],"dyld_environment":[],"code_signature_present":true}]},{"path":"Contents/MacOS/launcher/2/bin/oxipng-macos","sha256":"201b21e95b488e111857063bc71929704b892796badfd9b61dd9f05a699db1b7","parse_status":"parsed","reason":null,"slices":[{"architecture":"arm64","slice_offset":0,"slice_size":766608,"cpu_type":16777228,"cpu_subtype":0,"fat_cpu_type":null,"fat_cpu_subtype":null,"fat_alignment_exponent":null,"file_type":"execute","file_type_code":2,"platform":1,"platforms":[1],"install_name":null,"rpaths":[],"dyld_environment":[],"code_signature_present":true}]},{"path":"Contents/MacOS/launcher/2/bin/oxipng-macos-arm","sha256":"201b21e95b488e111857063bc71929704b892796badfd9b61dd9f05a699db1b7","parse_status":"parsed","reason":null,"slices":[{"architecture":"arm64","slice_offset":0,"slice_size":766608,"cpu_type":16777228,"cpu_subtype":0,"fat_cpu_type":null,"fat_cpu_subtype":null,"fat_alignment_exponent":null,"file_type":"execute","file_type_code":2,"platform":1,"platforms":[1],"install_name":null,"rpaths":[],"dyld_environment":[],"code_signature_present":true}]},{"path":"Contents/MacOS/launcher/2/lib/jspawnhelper","sha256":"35a5c7c56b0c7efc8e4Line truncated
|
||||
@@ -0,0 +1 @@
|
||||
{"evidence_id":"ev_58eeb4faed0e160239c43d5b217df18e7021acb5377b554f6b19547d2cf650ba","subject":{"name":"libjvm.dylib","digest":{"sha256":"6c1bd905b388177efd31128e19e6ea5e0e29ab88082d4a355deaf79874ff50b5"},"local_path":"/Users/tianmokeji/Desktop/临时/spine加功能/Spine.app/Contents/MacOS/launcher/2/lib/server/libjvm.dylib","format":"mach-o","architecture":"arm64"},"provider":{"id":"native-macos","name":"macOS native inspection utilities","version":null},"analysis_profile":null,"predicate_type":"rea.analysis","operation":"inspect_macho","parameters":{},"raw_result":null,"normalized_result":{"format":"mach-o","selected_architecture":{"name":"arm64","container_file_offset":0},"endian":"little","word_size":64,"file_type":"6","flags":["0x00900085"],"uuid":"71648639-9507-35C6-A994-683E656CFEA1","entrypoints":{"items":[],"total":0,"exhaustive":true,"limitations":[]},"architectures":{"items":[{"name":"arm64","cpu_type":null,"cpu_subtype":null,"file_offset":null,"size":null,"alignment":null}],"total":1,"exhaustive":true,"limitations":[]},"build_metadata":{"items":[{"platform":"MACOS","minimum_os":"11.0","sdk":"14.5","tools":[{"name":"LD","version":"1053.12"}]}],"total":1,"exhaustive":true,"limitations":[]},"load_commands":{"items":[{"index":0,"kind":"LC_SEGMENT_64","fields":{"cmd":"LC_SEGMENT_64","cmdsize":632,"segname":"__TEXT","vmaddr":0,"vmsize":8142848,"fileoff":0,"filesize":8142848,"maxprot":5,"initprot":5,"nsects":7,"flags":0}},{"index":1,"kind":"LC_SEGMENT_64","fields":{"cmd":"LC_SEGMENT_64","cmdsize":392,"segname":"__DATA_CONST","vmaddr":8142848,"vmsize":786432,"fileoff":8142848,"filesize":786432,"maxprot":3,"initprot":3,"nsects":4,"flags":16}},{"index":2,"kind":"LC_SEGMENT_64","fields":{"cmd":"LC_SEGMENT_64","cmdsize":552,"segname":"__DATA","vmaddr":8929280,"vmsize":49315840,"fileoff":8929280,"filesize":48906240,"maxprot":3,"initprot":3,"nsects":6,"flags":0}},{"index":3,"kind":"LC_SEGMENT_64","fields":{"cmd":"LC_SEGMENT_64","cmdsize":72,"segname":"__LINKEDIT","vmaddr":58245120,"vmsize":573440,"fileoff":57835520,"filesize":559488,"maxprot":1,"initprot":1,"nsects":0,"flags":0}},{"index":4,"kind":"LC_ID_DYLIB","fields":{"cmd":"LC_ID_DYLIB","cmdsize":48,"name":"@rpath/libjvm.dylib (offset 24)","time stamp":"1 Thu Jan 1 08:00:01 1970","current version":"1.0.0","compatibility version":"1.0.0"}},{"index":5,"kind":"LC_DYLD_INFO_ONLY","fields":{"cmd":"LC_DYLD_INFO_ONLY","cmdsize":48,"rebase_off":57835520,"rebase_size":12496,"bind_off":57848016,"bind_size":792,"weak_bind_off":0,"weak_bind_size":0,"lazy_bind_off":57848808,"lazy_bind_size":4608,"export_off":57853416,"export_size":4744}},{"index":6,"kind":"LC_SYMTAB","fields":{"cmd":"LC_SYMTAB","cmdsize":24,"symoff":57907176,"nsyms":450,"stroff":57916328,"strsize":7880}},{"index":7,"kind":"LC_DYSYMTAB","fields":{"cmd":"LC_DYSYMTAB","cmdsize":80,"ilocalsym":0,"nlocalsym":1,"iextdefsym":1,"nextdefsym":197,"iundefsym":198,"nundefsym":252,"tocoff":0,"ntoc":0,"modtaboff":0,"nmodtab":0,"extrefsymoff":0,"nextrefsyms":0,"indirectsymoff":57914376,"nindirectsyms":488,"extreloff":0,"nextrel":0,"locreloff":0,"nlocrel":0}},{"index":8,"kind":"LC_UUID","fields":{"cmd":"LC_UUID","cmdsize":24,"uuid":"71648639-9507-35C6-A994-683E656CFEA1"}},{"index":9,"kind":"LC_BUILD_VERSION","fields":{"cmd":"LC_BUILD_VERSION","cmdsize":32,"platform":1,"minos":"11.0","sdk":"14.5","ntools":1,"tool":3,"version":"1053.12"}},{"index":10,"kind":"LC_SOURCE_VERSION","fields":{"cmd":"LC_SOURCE_VERSION","cmdsize":16,"version":"0.0"}},{"index":11,"kind":"LC_LOAD_DYLIB","fields":{"cmd":"LC_LOAD_DYLIB","cmdsize":56,"name":"/usr/lib/libSystem.B.dylib (offset 24)","time stamp":"2 Thu Jan 1 08:00:02 1970","current version":"1345.120.2","compatibility version":"1.0.0"}},{"index":12,"kind":"LC_LOAD_DYLIB","fields":{"cmd":"LC_LOAD_DYLIB","cmdsize":104,"name":"/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (offset 24)","time stamp":"2 Thu Jan 1 08:00:02 1970","current version":"2503.1.0","compatibility version":"150.0.0"}},{"index":13,"kind":"LC_LOAD_DYLIB","fields":{"cmd":"LC_LOAD_DYLIB","cmdsize":48,"name":"/usr/lib/libc++.1.dylib (offset 24)","time stamp":"2 Thu Jan 1 08:00:02 1970","current version":"1700.255.5","compatibility version":"1.0.0"}},{"index":14,"kind":"LC_RPATH","fields":{"cmd":"LC_RPATH","cmdsize":32,"path":"@loader_path/. (offset 12)"}},{"index":15,"kind":"LC_RPATH","fields":{"cmd":"LC_RPATH","cmdsize":32,"path":"@loader_path/.. (offset 12)"}},{"index":16,"kind":"LC_FUNCTION_STARTS","fields":{"cmd":"LC_FUNCTION_STARTS","cmdsize":16,"dataoff":57858160,"datasize":49016}},{"index":17,"kind":"LC_DATA_IN_CODE","fields":{"cmd":"LC_DATA_IN_CODE","cmdsize":16,"dataoff":57907176,"datasize":0}},{"index":18,"kind":"LC_CODE_SIGNATURE","fields":{"cmd":"LC_CODE_SIGNATURE","cmdsize":16,"dataoff":57924208,"datasize":470800}}],"total":19,"exhaustive":true,"limitations":[]},"dependencies":{"items":[{"path":"@rpath/libjvm.dylib","kind":"LC_ID_DYLIB","current_version":"1.0.0","compatiLine truncated
|
||||
@@ -0,0 +1 @@
|
||||
{"evidence_id":"ev_1c87c2e11e2adc7afddcccbaf00635f15aa114d28d87b240cfee1687cdff6ca9","subject":{"name":"libjvm.dylib","digest":{"sha256":"c8b42b75d6a5536e9d633141289db72b508a3d804a879d74ccb6773fa03b8a9b"},"local_path":"/Users/tianmokeji/Desktop/临时/spine加功能/Spine.app/Contents/MacOS/launcher/1/lib/server/libjvm.dylib","format":"mach-o","architecture":"x86_64"},"provider":{"id":"native-macos","name":"macOS native inspection utilities","version":null},"analysis_profile":null,"predicate_type":"rea.analysis","operation":"inspect_macho","parameters":{},"raw_result":null,"normalized_result":{"format":"mach-o","selected_architecture":{"name":"x86_64","container_file_offset":0},"endian":"little","word_size":64,"file_type":"6","flags":["0x00910085"],"uuid":"B301D2B0-E23F-381E-AAD0-FECE002E9172","entrypoints":{"items":[],"total":0,"exhaustive":true,"limitations":[]},"architectures":{"items":[{"name":"x86_64","cpu_type":null,"cpu_subtype":null,"file_offset":null,"size":null,"alignment":null}],"total":1,"exhaustive":true,"limitations":[]},"build_metadata":{"items":[{"platform":"MACOSX","minimum_os":"10.10","sdk":"10.9","tools":[]}],"total":1,"exhaustive":true,"limitations":[]},"load_commands":{"items":[{"index":0,"kind":"LC_SEGMENT_64","fields":{"cmd":"LC_SEGMENT_64","cmdsize":952,"segname":"__TEXT","vmaddr":0,"vmsize":8540160,"fileoff":0,"filesize":8540160,"maxprot":7,"initprot":5,"nsects":11,"flags":0}},{"index":1,"kind":"LC_SEGMENT_64","fields":{"cmd":"LC_SEGMENT_64","cmdsize":872,"segname":"__DATA","vmaddr":8540160,"vmsize":1359872,"fileoff":8540160,"filesize":1085440,"maxprot":7,"initprot":3,"nsects":10,"flags":0}},{"index":2,"kind":"LC_SEGMENT_64","fields":{"cmd":"LC_SEGMENT_64","cmdsize":72,"segname":"__LINKEDIT","vmaddr":9900032,"vmsize":3640508,"fileoff":9629696,"filesize":3640508,"maxprot":7,"initprot":1,"nsects":0,"flags":0}},{"index":3,"kind":"LC_ID_DYLIB","fields":{"cmd":"LC_ID_DYLIB","cmdsize":48,"name":"@rpath/libjvm.dylib (offset 24)","time stamp":"1 Thu Jan 1 08:00:01 1970","current version":"1.0.0","compatibility version":"1.0.0"}},{"index":4,"kind":"LC_DYLD_INFO_ONLY","fields":{"cmd":"LC_DYLD_INFO_ONLY","cmdsize":48,"rebase_off":9629696,"rebase_size":15176,"bind_off":9644872,"bind_size":968,"weak_bind_off":9645840,"weak_bind_size":16,"lazy_bind_off":9645856,"lazy_bind_size":4096,"export_off":9649952,"export_size":4192}},{"index":5,"kind":"LC_SYMTAB","fields":{"cmd":"LC_SYMTAB","cmdsize":24,"symoff":9716560,"nsyms":57502,"stroff":10638700,"strsize":2631504}},{"index":6,"kind":"LC_DYSYMTAB","fields":{"cmd":"LC_DYSYMTAB","cmdsize":80,"ilocalsym":0,"nlocalsym":57100,"iextdefsym":57100,"nextdefsym":177,"iundefsym":57277,"nundefsym":225,"tocoff":0,"ntoc":0,"modtaboff":0,"nmodtab":0,"extrefsymoff":0,"nextrefsyms":0,"indirectsymoff":10636592,"nindirectsyms":527,"extreloff":0,"nextrel":0,"locreloff":0,"nlocrel":0}},{"index":7,"kind":"LC_UUID","fields":{"cmd":"LC_UUID","cmdsize":24,"uuid":"B301D2B0-E23F-381E-AAD0-FECE002E9172"}},{"index":8,"kind":"LC_VERSION_MIN_MACOSX","fields":{"cmd":"LC_VERSION_MIN_MACOSX","cmdsize":16,"version":"10.10","sdk":"10.9"}},{"index":9,"kind":"LC_SOURCE_VERSION","fields":{"cmd":"LC_SOURCE_VERSION","cmdsize":16,"version":"0.0"}},{"index":10,"kind":"LC_LOAD_DYLIB","fields":{"cmd":"LC_LOAD_DYLIB","cmdsize":56,"name":"/usr/lib/libSystem.B.dylib (offset 24)","time stamp":"2 Thu Jan 1 08:00:02 1970","current version":"1197.1.1","compatibility version":"1.0.0"}},{"index":11,"kind":"LC_LOAD_DYLIB","fields":{"cmd":"LC_LOAD_DYLIB","cmdsize":56,"name":"/usr/lib/libstdc++.6.dylib (offset 24)","time stamp":"2 Thu Jan 1 08:00:02 1970","current version":"60.0.0","compatibility version":"7.0.0"}},{"index":12,"kind":"LC_RPATH","fields":{"cmd":"LC_RPATH","cmdsize":32,"path":"@loader_path/. (offset 12)"}},{"index":13,"kind":"LC_RPATH","fields":{"cmd":"LC_RPATH","cmdsize":32,"path":"@loader_path/.. (offset 12)"}},{"index":14,"kind":"LC_FUNCTION_STARTS","fields":{"cmd":"LC_FUNCTION_STARTS","cmdsize":16,"dataoff":9654144,"datasize":62376}},{"index":15,"kind":"LC_DATA_IN_CODE","fields":{"cmd":"LC_DATA_IN_CODE","cmdsize":16,"dataoff":9716520,"datasize":0}},{"index":16,"kind":"LC_DYLIB_CODE_SIGN_DRS","fields":{"cmd":"LC_DYLIB_CODE_SIGN_DRS","cmdsize":16,"dataoff":9716520,"datasize":40}}],"total":17,"exhaustive":true,"limitations":[]},"dependencies":{"items":[{"path":"@rpath/libjvm.dylib","kind":"LC_ID_DYLIB","current_version":"1.0.0","compatibility_version":"1.0.0"},{"path":"/usr/lib/libSystem.B.dylib","kind":"LC_LOAD_DYLIB","current_version":"1197.1.1","compatibility_version":"1.0.0"},{"path":"/usr/lib/libstdc++.6.dylib","kind":"LC_LOAD_DYLIB","current_version":"60.0.0","compatibility_version":"7.0.0"}],"total":3,"exhaustive":true,"limitations":[]},"imports":{"items":[{"name":"__DefaultRuneLocale","address":null,"weak":null,"reexport":null,"source":"libSystem"},{"name":"__NSGetEnviron","address":null,"weak":null,"reexport":null,"source":"libSystem"},{"name":"__ZSt7nothrow","address":null,"weaLine truncated
|
||||
@@ -0,0 +1 @@
|
||||
{"error":"Analysis failed","code":"capability_unavailable","category":"unsupported_provider","message":"This analysis is unavailable for the current target. Choose another analysis or target.","retryable":false,"remediation":{"action":"This analysis is unavailable for the current target. Choose another analysis or target."},"details":{"provider_id":"native-macos","operation":"observe_native_ui","reason":"process-identity-unavailable: Selected application does not expose a launch time; stable PID reuse checks are unavailable"}}
|
||||
@@ -0,0 +1 @@
|
||||
{"evidence_id":"ev_2bf6740d94a700c99b536f2ff28ac6fe4c13b72a9f4ce3405571cbfc65c0abd0","subject":{"name":"libspine-editorarm64.dylib","digest":{"sha256":"2549d0b07be0926995628e0e887e72cf0812c80438a7cfb9d1935c88cad28c57"},"local_path":"/private/var/folders/jl/m50cxy0d7zzfd0448wzhj2bc0000gn/T/.spine/tianmokeji/4.3.26/libspine-editorarm64.dylib","format":"mach-o","architecture":"arm64"},"provider":{"id":"native-macos","name":"macOS native inspection utilities","version":null},"analysis_profile":null,"predicate_type":"rea.analysis","operation":"inspect_macho","parameters":{},"raw_result":null,"normalized_result":{"format":"mach-o","selected_architecture":{"name":"arm64","container_file_offset":0},"endian":"little","word_size":64,"file_type":"6","flags":["0x00118085"],"uuid":"C6696447-82AC-3DFF-837E-AA32C12F4C53","entrypoints":{"items":[],"total":0,"exhaustive":true,"limitations":[]},"architectures":{"items":[{"name":"arm64","cpu_type":null,"cpu_subtype":null,"file_offset":null,"size":null,"alignment":null}],"total":1,"exhaustive":true,"limitations":[]},"build_metadata":{"items":[{"platform":"MACOS","minimum_os":"10.7","sdk":"13.0","tools":[{"name":"LD","version":"820.1"}]}],"total":1,"exhaustive":true,"limitations":[]},"load_commands":{"items":[{"index":0,"kind":"LC_SEGMENT_64","fields":{"cmd":"LC_SEGMENT_64","cmdsize":872,"segname":"__TEXT","vmaddr":0,"vmsize":1146880,"fileoff":0,"filesize":1146880,"maxprot":5,"initprot":5,"nsects":10,"flags":0}},{"index":1,"kind":"LC_SEGMENT_64","fields":{"cmd":"LC_SEGMENT_64","cmdsize":712,"segname":"__DATA","vmaddr":1146880,"vmsize":49152,"fileoff":1146880,"filesize":49152,"maxprot":3,"initprot":3,"nsects":8,"flags":0}},{"index":2,"kind":"LC_SEGMENT_64","fields":{"cmd":"LC_SEGMENT_64","cmdsize":72,"segname":"__LINKEDIT","vmaddr":1196032,"vmsize":1867776,"fileoff":1196032,"filesize":1851408,"maxprot":1,"initprot":1,"nsects":0,"flags":0}},{"index":3,"kind":"LC_ID_DYLIB","fields":{"cmd":"LC_ID_DYLIB","cmdsize":64,"name":"target/libspine-editorarm64.dylib (offset 24)","time stamp":"1 Thu Jan 1 08:00:01 1970","current version":"0.0.0","compatibility version":"0.0.0"}},{"index":4,"kind":"LC_DYLD_INFO_ONLY","fields":{"cmd":"LC_DYLD_INFO_ONLY","cmdsize":48,"rebase_off":1196032,"rebase_size":40,"bind_off":1196072,"bind_size":1512,"weak_bind_off":1197584,"weak_bind_size":676544,"lazy_bind_off":1874128,"lazy_bind_size":2656,"export_off":1876784,"export_size":343640}},{"index":5,"kind":"LC_SYMTAB","fields":{"cmd":"LC_SYMTAB","cmdsize":24,"symoff":2229264,"nsyms":4525,"stroff":2337560,"strsize":671400}},{"index":6,"kind":"LC_DYSYMTAB","fields":{"cmd":"LC_DYSYMTAB","cmdsize":80,"ilocalsym":0,"nlocalsym":1,"iextdefsym":1,"nextdefsym":4423,"iundefsym":4424,"nundefsym":101,"tocoff":0,"ntoc":0,"modtaboff":0,"nmodtab":0,"extrefsymoff":0,"nextrefsyms":0,"indirectsymoff":2301664,"nindirectsyms":8973,"extreloff":0,"nextrel":0,"locreloff":0,"nlocrel":0}},{"index":7,"kind":"LC_UUID","fields":{"cmd":"LC_UUID","cmdsize":24,"uuid":"C6696447-82AC-3DFF-837E-AA32C12F4C53"}},{"index":8,"kind":"LC_BUILD_VERSION","fields":{"cmd":"LC_BUILD_VERSION","cmdsize":32,"platform":1,"minos":"10.7","sdk":"13.0","ntools":1,"tool":3,"version":"820.1"}},{"index":9,"kind":"LC_LOAD_DYLIB","fields":{"cmd":"LC_LOAD_DYLIB","cmdsize":56,"name":"/usr/lib/libSystem.B.dylib (offset 24)","time stamp":"2 Thu Jan 1 08:00:02 1970","current version":"1319.0.0","compatibility version":"1.0.0"}},{"index":10,"kind":"LC_LOAD_DYLIB","fields":{"cmd":"LC_LOAD_DYLIB","cmdsize":88,"name":"/System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa (offset 24)","time stamp":"2 Thu Jan 1 08:00:02 1970","current version":"23.0.0","compatibility version":"1.0.0"}},{"index":11,"kind":"LC_LOAD_DYLIB","fields":{"cmd":"LC_LOAD_DYLIB","cmdsize":48,"name":"/usr/lib/libc++.1.dylib (offset 24)","time stamp":"2 Thu Jan 1 08:00:02 1970","current version":"1300.32.0","compatibility version":"1.0.0"}},{"index":12,"kind":"LC_LOAD_DYLIB","fields":{"cmd":"LC_LOAD_DYLIB","cmdsize":88,"name":"/System/Library/Frameworks/AppKit.framework/Versions/C/AppKit (offset 24)","time stamp":"2 Thu Jan 1 08:00:02 1970","current version":"2297.0.0","compatibility version":"45.0.0"}},{"index":13,"kind":"LC_LOAD_DYLIB","fields":{"cmd":"LC_LOAD_DYLIB","cmdsize":56,"name":"/usr/lib/libobjc.A.dylib (offset 24)","time stamp":"2 Thu Jan 1 08:00:02 1970","current version":"228.0.0","compatibility version":"1.0.0"}},{"index":14,"kind":"LC_FUNCTION_STARTS","fields":{"cmd":"LC_FUNCTION_STARTS","cmdsize":16,"dataoff":2220424,"datasize":8840}},{"index":15,"kind":"LC_DATA_IN_CODE","fields":{"cmd":"LC_DATA_IN_CODE","cmdsize":16,"dataoff":2229264,"datasize":0}},{"index":16,"kind":"LC_CODE_SIGNATURE","fields":{"cmd":"LC_CODE_SIGNATURE","cmdsize":16,"dataoff":3008960,"datasize":38480}}],"total":17,"exhaustive":true,"limitations":[]},"dependencies":{"items":[{"path":"target/libspine-editorarm64.dylib","kind":"LC_ID_DYLIB","current_version":"0.0.0","compatibility_version":"0.0.0"},{"path":"/Line truncated
|
||||
@@ -0,0 +1,161 @@
|
||||
# 用 REA 分析 Spine.app — 首轮结果
|
||||
|
||||
日期:2026-10-15
|
||||
工具:REA (rea-agents 6.5.0),仓库来源 `https://github.com/morluto/rea.git`
|
||||
目标:`/Users/tianmokeji/Desktop/临时/spine加功能/Spine.app`(Spine 4.3.06 启动器 / 4.3.26 Professional 编辑器)
|
||||
|
||||
## 0. 怎么跑起来的
|
||||
|
||||
| 步骤 | 结果 |
|
||||
| --- | --- |
|
||||
| `git clone https://github.com/morluto/rea.git` | 直连 **卡死在 72KB**;换 `ghfast.top` 镜像也卡在 4.1MB |
|
||||
| `git -c http.version=HTTP/1.1 clone` | **成功**,68MB / 约 4 秒。沙箱代理下 HTTP/2 大包传输会中断,强制 HTTP/1.1 可绕过 |
|
||||
| `npm install -g rea-agents` | 安装 rea 6.5.0,CLI 可用 |
|
||||
| `rea doctor --client codex` | MCP 未注册;Hopper/Ghidra/IDA 均缺失(深度反汇编不可用) |
|
||||
|
||||
REA 的 MCP 注册需要重启客户端才生效,本轮全部走 **CLI**(REA 技能文档认可的同源路径)。
|
||||
|
||||
**踩坑**:REA 的 `inspect_plist` / `inspect_signature` / `observe-native-ui` 会现场用 `xcrun` 编译辅助进程,沙箱内会失败,必须放沙箱外执行。
|
||||
|
||||
## 1. 包结构(REA `inspect-artifact`)
|
||||
|
||||
- 图规模:185 节点 / 239 次出现 / 238 条边,`coverage.status = complete`
|
||||
- Info.plist:`CFBundleShortVersionString 4.3.06`、`LSMinimumSystemVersion 10.13`、文档类型 `.spine`
|
||||
- 签名(`inspect-signature`):**ad-hoc 签名**,`authorities: []`、`team_identifier: null`、`hardened_runtime: false`、无 entitlements
|
||||
|
||||
`/Applications/Spine.app` 与工作区副本的 `Contents/MacOS/Spine` SHA-256 完全一致(`fea6e69a…4340f2`),两个 libjvm 大小也一致 → 工作区副本即真实安装的等价副本。
|
||||
|
||||
## 2. 启动链路(REA `inspect-macho` + `trace-dylib-resolution`)
|
||||
|
||||
`Contents/MacOS/Spine` 只有 88KB,是纯原生启动器:
|
||||
|
||||
- 链接:Foundation / AppKit / Cocoa / libobjc / libSystem(**不含 libjvm**,JVM 是运行期 `dlopen` 进来的)
|
||||
- 内置字符串给出完整启动参数:
|
||||
|
||||
```
|
||||
-Djava.class.path=%@/Contents/MacOS/launcher/1/launcher.jar
|
||||
%@/Contents/MacOS/launcher/1/lib/jli/libjli.dylib → 失败则 %@/Contents/MacOS/launcher/2/lib/libjli.dylib
|
||||
%@/Contents/MacOS/launcher/1/lib/server/libjvm.dylib → 失败则 %@/Contents/MacOS/launcher/2/lib/server/libjvm.dylib
|
||||
JNI_CreateJavaVM
|
||||
主类候选:com/esotericsoftware/spine/editor/launcher/Launcher、com/esotericsoftware/spine/launcher/Launcher
|
||||
```
|
||||
|
||||
`launcher.jar` 只有 72 个条目 / 2MB(`s/*.class` 混淆包 + 一个 374KB 的 `Launcher.class`)——**它只是引导壳,不是编辑器本体**。
|
||||
|
||||
## 3. 真正的加固点在 launcher/2 的 libjvm(已实测确认)
|
||||
|
||||
REA 对两个 libjvm 的段对比:
|
||||
|
||||
| | launcher/1/libjvm.dylib | launcher/2/libjvm.dylib |
|
||||
| --- | --- | --- |
|
||||
| 文件大小 | 13.3 MB | **58.4 MB** |
|
||||
| `__TEXT` | 8.5 MB | 8.1 MB |
|
||||
| `__DATA` | 313 KB | **48,896,800 B(≈48.9MB,文件偏移 8,933,376)** |
|
||||
| HotSpot 调试段 `__dof_hotspot*` | 有 | **无** |
|
||||
| `lib/modules`(jimage) | **46,549,519 B 存在** | **不存在** |
|
||||
|
||||
`launcher/2/libjvm` 的 `__DATA` 前 1MiB 熵 **7.59 bit/byte**,且扫描不到 `PK\x03\x04` / `PK\x05\x06` / jimage magic → 是**加密载荷**,不是明文 jar。
|
||||
|
||||
配合缺 `modules` 仍能正常启动这一事实,结论是:
|
||||
|
||||
> launcher/2 把 Java 模块镜像(jimage)连同编辑器类一起搬进了 libjvm 的 `__DATA` 并加密,
|
||||
> 由打过补丁的 JVM 在加载时解密 —— 这就是「类不在 jar 里」的真正原因。
|
||||
|
||||
### 运行期到底加载了哪个?(零干扰实测)
|
||||
|
||||
对正在运行的 Spine(PID 91687)做 `lsof` / `vmmap` 只读采样:
|
||||
|
||||
```
|
||||
…/launcher/2/lib/libjli.dylib
|
||||
…/launcher/2/lib/server/libjvm.dylib ← 实际使用 launcher/2,不是 launcher/1
|
||||
```
|
||||
|
||||
即:**`launcher/1` 是引导尝试路径,真正的运行时是 `launcher/2`**,与第 3 节吻合。
|
||||
|
||||
## 4. 新发现:编辑器原生核心在临时目录里
|
||||
|
||||
同一份 `lsof` 显示编辑器真正的原生库并不是从 app 包里加载的,而是运行期解包到临时目录:
|
||||
|
||||
```
|
||||
$TMPDIR/.spine/tianmokeji/4.2.43/{libspine-editorarm64.dylib, libgdxarm64.dylib,
|
||||
libgdx-freetypearm64.dylib, libjglfwarm64.dylib,
|
||||
liblwjgl.dylib, openal.dylib}
|
||||
$TMPDIR/.spine/tianmokeji/L4.3.06/libjglfwarm64.dylib
|
||||
$TMPDIR/.spine/tianmokeji/4.3.26/libspine-editorarm64.dylib
|
||||
```
|
||||
|
||||
REA `inspect-macho` 对 `libspine-editorarm64.dylib`(3,047,440 B)的结果:
|
||||
|
||||
- install name `target/libspine-editorarm64.dylib`,依赖仅 Cocoa/AppKit/libSystem/libobjc/libc++
|
||||
- 导出符号(REA 导出列表)里最有价值的几条:
|
||||
|
||||
```
|
||||
_Java_com_esotericsoftware_spine_editor_Editor_licCheck
|
||||
_Java_com_esotericsoftware_spine_editor_Editor_register
|
||||
_Java_com_esotericsoftware_spine_editor_Editor_expire
|
||||
_Java_com_esotericsoftware_spine_editor_audio_Audio_pauseDeviceJni / resumeDeviceJni
|
||||
```
|
||||
|
||||
另外导出大量 **Eigen** 符号(`Eigen::Matrix`、`squared_edge_lengths`),说明网格/几何解算是 Eigen 在跑。
|
||||
|
||||
**这条信息对「在编辑器内部加粒子面板」很关键**:编辑器原生核心是**磁盘上、未加密、可直接分析的 dylib**,
|
||||
比拿 libjvm 里那 49MB 加密数据段要现实得多。
|
||||
|
||||
日志侧证据:`~/Library/Application Support/Spine/spine.log` →
|
||||
`Spine Launcher 4.3.06 (macOS Apple Silicon)` / `Starting: Spine 4.3.26 Professional`。
|
||||
|
||||
## 5. REA 运行时 UI 观测:被一个具体阻塞点挡住
|
||||
|
||||
REA 有 `observe-native-ui` / `capture-native-ui-scenario`(读取窗口的无障碍树 + 截图),
|
||||
本来最适合你现在的面板研究。实测报错:
|
||||
|
||||
```
|
||||
process-identity-unavailable: Selected application does not expose a launch time
|
||||
```
|
||||
|
||||
定位(读源码 + 实测):`rea/bridge/native/ReaNativeUI.swift` 用
|
||||
`NSRunningApplication.launchDate` 做 PID 复用校验,而当前实例由命令行直接 exec 启动,
|
||||
LaunchServices 没有登记它:
|
||||
|
||||
```
|
||||
pid=91687 bundleIdentifier=nil bundleURL=…/spine-lab/Spine.app launchDate=nil
|
||||
```
|
||||
|
||||
**解决办法**:让 Spine 由 LaunchServices 启动(`open -na <app> --args …` 或访达双击),
|
||||
新进程才有 `launchDate`,REA 的 UI 树观测即可通过。
|
||||
|
||||
## 6. 本轮结论清单
|
||||
|
||||
| 问题 | 状态 | 依据 |
|
||||
| --- | --- | --- |
|
||||
| 编辑器类为什么不在 jar 里 | 已答 | launcher.jar 仅 72 条目;launcher/2 无 `lib/modules`,libjvm `__DATA` 48.9MB 高熵 |
|
||||
| 实际运行哪个 libjvm | 已答(实测) | `lsof`/`vmmap`:launcher/2 |
|
||||
| 编辑器原生代码在哪 | 已答 | `$TMPDIR/.spine/<user>/<ver>/libspine-editorarm64.dylib` |
|
||||
| 编辑器原生库的 JNI 面 | 已答 | REA 导出:`Editor_licCheck/register/expire`、`Audio_*` |
|
||||
| 包内清单 / 签名 / plist | 已答 | REA inventory / signature / plist |
|
||||
| 深度反汇编(伪代码、函数、xrefs) | **未答** | 缺 Hopper/Ghidra/IDA 提供商 |
|
||||
| 编辑器窗口内面板运行时结构 | **未答** | 需要先解决 launchDate(见第 5 节) |
|
||||
|
||||
## 7. 建议的下一步
|
||||
|
||||
1. **装 Ghidra(免费)**:`GHIDRA_INSTALL_DIR` 指过去,REA 立刻能对
|
||||
`libspine-editorarm64.dylib`、`launcher/2/libjvm.dylib`、`libgdxarm64.dylib` 出伪代码与 xrefs。
|
||||
2. **用 LaunchServices 启动 Spine**,然后跑
|
||||
`rea capture-native-ui-scenario`,把编辑器面板/工具栏的无障碍树和可点击路径抓出来(可直接验证「窗口内面板是否可见、能否点」)。
|
||||
3. 面板注入目标从 libjvm 改为 **`libspine-editorarm64.dylib`**:磁盘未加密、有完整 JNI 导出、可被 LLDB/Frida 附着。
|
||||
4. 若要 REA 的 MCP 工具而非 CLI:`rea setup --client codex --dry-run --json` 看变更清单,
|
||||
确认后 `--yes` 并重启 Codex(注册写入 `~/.codex/config.toml`)。
|
||||
|
||||
## 8. 证据文件
|
||||
|
||||
| 文件 | 内容 |
|
||||
| --- | --- |
|
||||
| `rea-analysis/01-inspect-artifact.json` | 应用清单图(185 节点,含 SHA-256) |
|
||||
| `rea-analysis/02-macho-Spine.json` | 原生启动器 Mach-O(依赖、段、入口) |
|
||||
| `rea-analysis/03-signature.json` | ad-hoc 签名详情 |
|
||||
| `rea-analysis/04-dylib-resolution.json` | dyld 解析(8 个可执行根,含 ffmpeg/oxipng) |
|
||||
| `rea-analysis/05-macho-libjvm2.json` / `06-macho-libjvm1.json` | 两个 libjvm 段对比 |
|
||||
| `rea-analysis/07-native-ui.json` | 运行时 UI 观测尝试(记录阻塞原因) |
|
||||
| `rea-analysis/08-macho-spine-editor.json` | 编辑器原生库(约 1MB 导出/导入明细) |
|
||||
| `rea-analysis/tools/list-windows.swift` | 列出窗口 ID(配合 REA) |
|
||||
| `rea-analysis/tools/check-app-identity.swift` | 检查启动时间/LaunchServices 身份(定位第 5 节问题) |
|
||||
@@ -0,0 +1,21 @@
|
||||
import AppKit
|
||||
import Foundation
|
||||
|
||||
// Reports the LaunchServices identity REA relies on for one PID.
|
||||
// Usage: swift check-app-identity.swift <pid>
|
||||
|
||||
guard CommandLine.arguments.count > 1, let pid = Int32(CommandLine.arguments[1]) else {
|
||||
FileHandle.standardError.write(Data("usage: check-app-identity.swift <pid>\n".utf8))
|
||||
exit(2)
|
||||
}
|
||||
|
||||
guard let app = NSRunningApplication(processIdentifier: pid) else {
|
||||
print("pid=\(pid) NSRunningApplication=nil (process not registered with LaunchServices)")
|
||||
exit(0)
|
||||
}
|
||||
|
||||
print("pid=\(pid) bundleIdentifier=\(app.bundleIdentifier ?? "nil")")
|
||||
print("localizedName=\(app.localizedName ?? "nil")")
|
||||
print("bundleURL=\(app.bundleURL?.path ?? "nil")")
|
||||
print("launchDate=\(app.launchDate.map { String($0.timeIntervalSince1970) } ?? "nil")")
|
||||
print("activationPolicy=\(app.activationPolicy.rawValue)")
|
||||
@@ -0,0 +1,32 @@
|
||||
import CoreGraphics
|
||||
import Foundation
|
||||
|
||||
// Posts one synthetic left click at global screen coordinates.
|
||||
// Usage: swift click.swift <x> <y>
|
||||
|
||||
guard CommandLine.arguments.count > 2,
|
||||
let x = Double(CommandLine.arguments[1]),
|
||||
let y = Double(CommandLine.arguments[2])
|
||||
else {
|
||||
FileHandle.standardError.write(Data("usage: click.swift <x> <y>\n".utf8))
|
||||
exit(2)
|
||||
}
|
||||
|
||||
let point = CGPoint(x: x, y: y)
|
||||
let source = CGEventSource(stateID: .hidSystemState)
|
||||
|
||||
guard
|
||||
let move = CGEvent(mouseEventSource: source, mouseType: .mouseMoved, mouseCursorPosition: point, mouseButton: .left),
|
||||
let down = CGEvent(mouseEventSource: source, mouseType: .leftMouseDown, mouseCursorPosition: point, mouseButton: .left),
|
||||
let up = CGEvent(mouseEventSource: source, mouseType: .leftMouseUp, mouseCursorPosition: point, mouseButton: .left)
|
||||
else {
|
||||
FileHandle.standardError.write(Data("cannot create events\n".utf8))
|
||||
exit(1)
|
||||
}
|
||||
|
||||
move.post(tap: .cghidEventTap)
|
||||
usleep(120_000)
|
||||
down.post(tap: .cghidEventTap)
|
||||
usleep(80_000)
|
||||
up.post(tap: .cghidEventTap)
|
||||
print("clicked at \(Int(x)),\(Int(y))")
|
||||
@@ -0,0 +1,26 @@
|
||||
import CoreGraphics
|
||||
import Foundation
|
||||
|
||||
// Lists on-screen windows, optionally filtered by owning PID.
|
||||
// Usage: swift list-windows.swift [pid]
|
||||
|
||||
let filterPid: Int? = CommandLine.arguments.count > 1 ? Int(CommandLine.arguments[1]) : nil
|
||||
|
||||
guard
|
||||
let windows = CGWindowListCopyWindowInfo(
|
||||
[.optionOnScreenOnly, .excludeDesktopElements], kCGNullWindowID) as? [[String: Any]]
|
||||
else {
|
||||
FileHandle.standardError.write(Data("window list unavailable\n".utf8))
|
||||
exit(1)
|
||||
}
|
||||
|
||||
for window in windows {
|
||||
guard let pid = window[kCGWindowOwnerPID as String] as? Int else { continue }
|
||||
if let filterPid, pid != filterPid { continue }
|
||||
let id = window[kCGWindowNumber as String] as? Int ?? -1
|
||||
let owner = window[kCGWindowOwnerName as String] as? String ?? "?"
|
||||
let name = window[kCGWindowName as String] as? String ?? ""
|
||||
let layer = window[kCGWindowLayer as String] as? Int ?? -1
|
||||
let bounds = window[kCGWindowBounds as String] as? [String: Any] ?? [:]
|
||||
print("windowId=\(id) pid=\(pid) layer=\(layer) owner=\(owner) name=\(name) bounds=\(bounds)")
|
||||
}
|
||||
Reference in new issue
Block a user