Add all the extra comments
This commit is contained in:
@@ -393,6 +393,7 @@ subprojects { p ->
|
|||||||
|
|
||||||
// Sqlite Database
|
// Sqlite Database
|
||||||
// librariesLocation isn't used because it's too long for replacing paths in native libraries
|
// librariesLocation isn't used because it's too long for replacing paths in native libraries
|
||||||
|
// Allowing strings larger than the original string would require shifting the entire binary's contents
|
||||||
transform(NativeTransformer) {
|
transform(NativeTransformer) {
|
||||||
before {
|
before {
|
||||||
relocate "org.sqlite", "dh_sqlite", {
|
relocate "org.sqlite", "dh_sqlite", {
|
||||||
|
|||||||
@@ -9,7 +9,12 @@ class NativeRelocator
|
|||||||
private static final Path rootDirectory = Path.of(System.getProperty("user.dir"), "relocate_natives");
|
private static final Path rootDirectory = Path.of(System.getProperty("user.dir"), "relocate_natives");
|
||||||
private static final Path cacheRoot = rootDirectory.resolve("cache");
|
private static final Path cacheRoot = rootDirectory.resolve("cache");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initializes the NativeRelocator by preparing the environment if necessary.
|
||||||
|
* Executes the appropriate preparation script based on the OS.
|
||||||
|
*
|
||||||
|
* @throws Exception if the preparation script fails or an unsupported OS is detected.
|
||||||
|
*/
|
||||||
NativeRelocator() throws Exception
|
NativeRelocator() throws Exception
|
||||||
{
|
{
|
||||||
if (rootDirectory.resolve(".venv").toFile().exists())
|
if (rootDirectory.resolve(".venv").toFile().exists())
|
||||||
@@ -46,7 +51,12 @@ class NativeRelocator
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reads and prints the output and error streams of a process asynchronously.
|
||||||
|
*
|
||||||
|
* @param process The process whose streams should be read.
|
||||||
|
* @return A CompletableFuture that completes once all output has been processed.
|
||||||
|
*/
|
||||||
private static CompletableFuture<Void> readOutputStreams(Process process)
|
private static CompletableFuture<Void> readOutputStreams(Process process)
|
||||||
{
|
{
|
||||||
return CompletableFuture.runAsync(() -> {
|
return CompletableFuture.runAsync(() -> {
|
||||||
@@ -79,6 +89,14 @@ class NativeRelocator
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Replaces occurrences of a target string in a byte array, ensuring null termination.
|
||||||
|
*
|
||||||
|
* @param byteArray The byte array where replacements should occur.
|
||||||
|
* @param target The string to replace.
|
||||||
|
* @param replacement The replacement string (must not be longer than the target).
|
||||||
|
* @throws IllegalArgumentException if the replacement is longer than the target.
|
||||||
|
*/
|
||||||
private void replaceInNullTerminatedStrings(byte[] byteArray, String target, String replacement)
|
private void replaceInNullTerminatedStrings(byte[] byteArray, String target, String replacement)
|
||||||
{
|
{
|
||||||
if (target.length() < replacement.length())
|
if (target.length() < replacement.length())
|
||||||
@@ -117,6 +135,14 @@ class NativeRelocator
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Runs an external script to fix a modified binary and returns the processed content.
|
||||||
|
*
|
||||||
|
* @param outputFilePath Path to store the processed binary.
|
||||||
|
* @param content The original binary content.
|
||||||
|
* @return The modified binary content.
|
||||||
|
* @throws Exception if the process execution fails.
|
||||||
|
*/
|
||||||
public byte[] fixModifiedBinary(Path outputFilePath, byte[] content) throws Exception
|
public byte[] fixModifiedBinary(Path outputFilePath, byte[] content) throws Exception
|
||||||
{
|
{
|
||||||
ProcessBuilder processBuilder = new ProcessBuilder();
|
ProcessBuilder processBuilder = new ProcessBuilder();
|
||||||
@@ -147,6 +173,15 @@ class NativeRelocator
|
|||||||
return Files.readAllBytes(outputFilePath);
|
return Files.readAllBytes(outputFilePath);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Processes a binary file, applying string replacements and fixing modifications.
|
||||||
|
*
|
||||||
|
* @param outputPath The output file path relative to the cache directory.
|
||||||
|
* @param content The binary content to process.
|
||||||
|
* @param replacements A map of string replacements to apply.
|
||||||
|
* @return The modified binary content.
|
||||||
|
* @throws Exception if processing fails.
|
||||||
|
*/
|
||||||
public byte[] processBinary(String outputPath, byte[] content, Map<String, String> replacements) throws Exception
|
public byte[] processBinary(String outputPath, byte[] content, Map<String, String> replacements) throws Exception
|
||||||
{
|
{
|
||||||
Path outputFilePath = cacheRoot.resolve(outputPath);
|
Path outputFilePath = cacheRoot.resolve(outputPath);
|
||||||
|
|||||||
@@ -4,23 +4,28 @@ import subprocess
|
|||||||
import download_codesign
|
import download_codesign
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
|
# Parse the input binary & xit if binary is invalid
|
||||||
output_path = sys.argv[1]
|
output_path = sys.argv[1]
|
||||||
binary = lief.parse(sys.stdin.buffer.read())
|
binary = lief.parse(sys.stdin.buffer.read())
|
||||||
|
|
||||||
if binary is None:
|
if binary is None:
|
||||||
exit(1)
|
exit(1)
|
||||||
|
|
||||||
|
# Remove signature from Mac binaries
|
||||||
if isinstance(binary, lief.MachO.Binary):
|
if isinstance(binary, lief.MachO.Binary):
|
||||||
binary.remove_signature()
|
binary.remove_signature()
|
||||||
|
|
||||||
|
# Write the modified binary to the output path
|
||||||
binary.write(output_path)
|
binary.write(output_path)
|
||||||
|
|
||||||
|
# Sign Mac binaries (required to make them usable because apple)
|
||||||
if isinstance(binary, lief.MachO.Binary):
|
if isinstance(binary, lief.MachO.Binary):
|
||||||
print(f"Signing {output_path}...")
|
print(f"Signing {output_path}...")
|
||||||
|
|
||||||
|
# Check if the Apple code-signing files are available, if not, download them
|
||||||
if not Path("./apple-codesign/COPYING").exists():
|
if not Path("./apple-codesign/COPYING").exists():
|
||||||
download_codesign.download_and_unpack()
|
download_codesign.download_and_unpack()
|
||||||
|
|
||||||
|
# Run the code-signing process
|
||||||
sign_process = subprocess.Popen(["./apple-codesign/rcodesign", "sign", output_path], shell=False,
|
sign_process = subprocess.Popen(["./apple-codesign/rcodesign", "sign", output_path], shell=False,
|
||||||
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||||
sign_process.wait()
|
sign_process.wait()
|
||||||
|
|||||||
Reference in New Issue
Block a user