mirror of
https://git.ely.my.id/Tenshi/Hi3-Patcher
synced 2026-11-04 21:46:48 +01:00
57 lines
2.4 KiB
Markdown
57 lines
2.4 KiB
Markdown
# Architecture
|
|
|
|
`format/` holds reusable binary-format parsing; `patch/` holds the patch
|
|
logic. Patch modules depend on `format/`, `android/` and `util/`, never on
|
|
each other.
|
|
|
|
## format/
|
|
|
|
All reads are bounds-checked; malformed input returns an error instead of
|
|
panicking.
|
|
|
|
- **bytes** — little/big-endian integer reads and writes, slicing,
|
|
power-of-two alignment.
|
|
- **pe** — PE32+ (x86-64) reader. Validates headers and section ranges;
|
|
provides section lookup, RVA→offset mapping, data directories, export
|
|
lookup, and a stricter image-bound check used by ACE and HoYoKProtect.
|
|
Patches add their own layout checks on top.
|
|
- **elf** — ARM64 shared-object reader. Validates headers and
|
|
section/segment ranges; provides sections, segments, `.dynsym` symbols,
|
|
RELA entries, and address→file-offset mapping through `PT_LOAD`.
|
|
- **dex** — field access, checksum recompute (SHA-1 + Adler-32), string
|
|
and `const-string` lookup, and `append_string`, which inserts a
|
|
`string_data_item` before the annotations section and relocates every
|
|
later offset, map entry and header field.
|
|
- **unity** — UnityFS v6 bundles and serialized-file `TextAsset`s.
|
|
`rebuild` re-encodes only changed blocks and re-verifies the result.
|
|
`replace_script` and `Bundle::replace_node` resize a TextAsset or
|
|
bundle node, rewriting object offsets, the header size and the node
|
|
directory. Blocks may be uncompressed or LZ4.
|
|
|
|
## patch/
|
|
|
|
`region` maps the Windows client's `ChannelConfig`
|
|
(`ChannelName`/`BundleIdentifier`) to one of six PC regions
|
|
(CN/GLB/JP/KR/TW/SEA) with its SDK key and environment id.
|
|
|
|
Single-file Windows writes (RSA, ACE, HoYoKProtect) use
|
|
`util::replace::verified`: write a sibling temporary file, flush, read it
|
|
back, re-check the target for concurrent changes, persist, re-verify. The
|
|
dispatch patch replaces its three files together and rolls back on
|
|
failure.
|
|
|
|
## android/
|
|
|
|
`toolchain` finds Build-Tools and Java 17+, or downloads them (SHA-256
|
|
verified). `sign::signed_patch` runs a patch's repack, which drops the old
|
|
signature entries, into a temporary APK, then zip-aligns it
|
|
(`-P 16 -f 4`), signs and verifies it with `apksigner`, and writes
|
|
`<name>_patched.apk`.
|
|
|
|
## cli/
|
|
|
|
`interactive` is the terminal menu (no arguments). `args` parses
|
|
`<command> --flag value` (or `--flag=value`) and validates the whole
|
|
command line before running the patch, then reports via exit code and
|
|
optional JSON.
|