61bcdefg / Hikari-LLVM15

A fork of Hikari Obfuscator [WIP]
575 stars 160 forks source link

String Encryption does not work in certain scenarios on arm64 with `-ON` (N>0) #110

Closed yujincheng08 closed 3 months ago

yujincheng08 commented 3 months ago

All tests are on LLVM-18.

Reproduce example:

class string_view {
public:
    string_view(const char* s): d(s), s(0) {}

private:
    const char* d;
    unsigned long s;
};

struct Test {
 [[gnu::weak]] Test(string_view);
};

[[gnu::visibility("default")]] void Try() {
    Test b("hello world");
}

Compile with optimization:

$ clang++ -mllvm -enable-strcry -shared -target aarch64-none-linux-gnu -O1 -nostdinc++ -nodefaultlibs x.cc
Running Hikari On x.cc
Running StringEncryption On _Z3Tryv
Doing Post-Run Cleanup
Hikari Out
Running Hikari On x.cc
Running StringEncryption On _Z3Tryv
Doing Post-Run Cleanup
Hikari Out
$ strings a.out | grep hello
hello world

Compile without optimization:

$ clang++ -mllvm -enable-strcry -shared -target aarch64-none-linux-gnu -O0 -nostdinc++ -nodefaultlibs x.cc
Running Hikari On x.cc
Running StringEncryption On _Z3Tryv
Running StringEncryption On _ZN11string_viewC2EPKc
Doing Post-Run Cleanup
Hikari Out
$ strings a.out | grep hello

In case of lto:

Compile with optimization:

$ clang++ -flto -fuse-ld=lld -Wl,-mllvm,-enable-strcry -shared -target aarch64-none-linux-gnu -O1 -nostdinc++ -nodefaultlibs x.cc
Running Hikari On x.cc
Doing Post-Run Cleanup
Hikari Out
Running Hikari On ld-temp.o
Running StringEncryption On _Z3Tryv
Doing Post-Run Cleanup
Hikari Out
$ strings a.out | grep hello
hello world

Compile without optimization:

$ clang++ -flto -fuse-ld=lld -Wl,-mllvm,-enable-strcry -shared -target aarch64-none-linux-gnu -O0 -nostdinc++ -nodefaultlibs x.cc
Running Hikari On x.cc
Running StringEncryption On _Z3Tryv
Running StringEncryption On _ZN11string_viewC2EPKc
Doing Post-Run Cleanup
Hikari Out
$ strings a.out | grep hello

On x86 and x86-64 it works.